X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Ftossim%2FTossimPacketModelC.nc;h=f887efca2ce27ca22f1ff8f0f94f970bb4baf9b6;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=8e503ca645f959bde1ec5f1dfd3e33e8f367357c;hpb=8e596174e4b2dce8c4c2a48919c2e0c0352b6564;p=tinyos-2.x.git diff --git a/tos/lib/tossim/TossimPacketModelC.nc b/tos/lib/tossim/TossimPacketModelC.nc index 8e503ca6..f887efca 100644 --- a/tos/lib/tossim/TossimPacketModelC.nc +++ b/tos/lib/tossim/TossimPacketModelC.nc @@ -67,6 +67,7 @@ implementation { bool transmitting = FALSE; uint8_t sendingLength = 0; int destNode; + sim_event_t sendEvent; message_t receiveBuffer; @@ -77,6 +78,10 @@ implementation { command error_t Init.init() { dbg("TossimPacketModelC", "TossimPacketModelC: Init.init() called\n"); initialized = TRUE; + // We need to cancel in case an event is still lying around in the queue from + // before a reboot. Otherwise, the event will be executed normally (node is on), + // but its memory has been zeroed out. + sendEvent.cancelled = 1; return SUCCESS; } @@ -128,7 +133,7 @@ implementation { tossim_metadata_t* meta = getMetadata(ack); return meta->ack; } - + task void sendDoneTask() { message_t* msg = sending; tossim_metadata_t* meta = getMetadata(msg); @@ -136,7 +141,7 @@ implementation { meta->strength = 0; meta->time = 0; sending = FALSE; - signal Packet.sendDone(msg, SUCCESS); + signal Packet.sendDone(msg, running? SUCCESS:EOFF); } command error_t Packet.cancel(message_t* msg) { @@ -167,7 +172,6 @@ implementation { return SUCCESS; } - sim_event_t sendEvent; void send_backoff(sim_event_t* evt); void send_transmit(sim_event_t* evt); void send_transmit_done(sim_event_t* evt); @@ -210,6 +214,7 @@ implementation { delay *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec()); evt->time += delay; transmitting = TRUE; + call GainRadioModel.setPendingTransmission(); evt->handle = send_transmit; sim_queue_insert(evt); } @@ -240,7 +245,7 @@ implementation { void send_transmit(sim_event_t* evt) { sim_time_t duration; tossim_metadata_t* metadata = getMetadata(sending); - + duration = 8 * (sendingLength + sim_packet_header_length()); duration /= sim_csma_bits_per_symbol(); duration += sim_csma_preamble_length(); @@ -254,7 +259,7 @@ implementation { evt->handle = send_transmit_done; dbg("TossimPacketModelC", "PACKET: Broadcasting packet to everyone.\n"); - call GainRadioModel.putOnAirTo(destNode, sending, metadata->ack, evt->time, 0.0); + call GainRadioModel.putOnAirTo(destNode, sending, metadata->ack, evt->time, 0.0, 0.0); metadata->ack = 0; evt->time += (sim_csma_rxtx_delay() * (sim_ticks_per_sec() / sim_csma_symbols_per_sec())); @@ -269,7 +274,7 @@ implementation { sending = NULL; transmitting = FALSE; dbg("TossimPacketModelC", "PACKET: Signaling send done at %llu.\n", sim_time()); - signal Packet.sendDone(rval, SUCCESS); + signal Packet.sendDone(rval, running? SUCCESS:EOFF); } event void GainRadioModel.receive(message_t* msg) {