]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/tossim/TossimPacketModelC.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / tossim / TossimPacketModelC.nc
index d503330fa154698b0c430127f50bb13fd8bc1cb4..f887efca2ce27ca22f1ff8f0f94f970bb4baf9b6 100644 (file)
@@ -64,8 +64,10 @@ implementation {
   uint8_t backoffCount;
   uint8_t neededFreeSamples;
   message_t* sending = NULL;
+  bool transmitting = FALSE;
   uint8_t sendingLength = 0;
   int destNode;
+  sim_event_t sendEvent;
   
   message_t receiveBuffer;
   
@@ -76,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;
   }
 
@@ -127,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);
@@ -135,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) {
@@ -166,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);
@@ -208,7 +213,8 @@ implementation {
       delay = sim_csma_rxtx_delay();
       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);
     }
@@ -239,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();
@@ -253,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()));
@@ -266,12 +272,13 @@ implementation {
   void send_transmit_done(sim_event_t* evt) {
     message_t* rval = sending;
     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) {
-    if (running) {
+    if (running && !transmitting) {
       signal Packet.receive(msg);
     }
   }
@@ -290,7 +297,7 @@ implementation {
   }
 
   event bool GainRadioModel.shouldAck(message_t* msg) {
-    if (running) {
+    if (running && !transmitting) {
       return signal Packet.shouldAck(msg);
     }
     else {