]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Address concurrent RX/TX
authorsunheeyoon <sunheeyoon>
Tue, 16 Jun 2009 00:49:43 +0000 (00:49 +0000)
committersunheeyoon <sunheeyoon>
Tue, 16 Jun 2009 00:49:43 +0000 (00:49 +0000)
tos/lib/tossim/CpmModelC.nc
tos/lib/tossim/GainRadioModel.nc
tos/lib/tossim/TossimPacketModelC.nc

index 31477125c9d4d4936b2d4e76a39a9fa3a8c7476b..a1d500449bb9361a1765596f3195b33b8b6dcc55 100644 (file)
@@ -50,6 +50,8 @@ implementation {
   message_t* outgoing; // If I'm sending, this is my outgoing packet
   bool requestAck;
   bool receiving = 0;  // Whether or not I think I'm receiving a packet
+  bool transmitting = 0; // Whether or not I think I'm tranmitting a packet
+  sim_time_t TransmissionEndTime; // to check pending transmission
   struct receive_message;
   typedef struct receive_message receive_message_t;
 
@@ -392,6 +394,10 @@ implementation {
       dbg("CpmModelC,SNRLoss", "Lost packet from %i due to %i being mid-reception\n", source, sim_node());
       rcv->lost = 1;
     }
+    else if (transmitting && (rcv->start < TransmissionEndTime) && (TransmissionEndTime <= rcv->end)) {
+      dbg("CpmModelC,SNRLoss", "Lost packet from %i due to %i being mid-transmission, TransmissionEndTime %llu\n", source, sim_node(), TransmissionEndTime);
+      rcv->lost = 1;
+    }
     else {
       receiving = 1;
     }
@@ -421,9 +427,11 @@ implementation {
   }
 
   command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double power, double reversePower) {
+    receive_message_t* list;
     gain_entry_t* neighborEntry = sim_gain_first(sim_node());
     requestAck = ack;
     outgoing = msg;
+    TransmissionEndTime = endTime;
     dbg("CpmModelC", "Node %i transmitting to %i, finishes at %llu.\n", sim_node(), dest, endTime);
 
     while (neighborEntry != NULL) {
@@ -431,10 +439,21 @@ implementation {
       sim_gain_put(other, msg, endTime, ack, power + sim_gain_value(sim_node(), other), reversePower + sim_gain_value(other, sim_node()));
       neighborEntry = sim_gain_next(neighborEntry);
     }
+
+    list = outstandingReceptionHead;
+    while (list != NULL) {    
+      list->lost = 1;
+      dbg("CpmModelC,SNRLoss", "Lost packet from %i because %i has outstanding reception, startTime %llu endTime %llu\n", list->source, sim_node(), list->start, list->end);
+      list = list->next;
+    }
   }
     
 
-  
+  command void Model.checkPendingTransmission(bool isTransmitting) {
+    transmitting = isTransmitting;
+    dbg("CpmModelC", "checkPendingTransmission: transmitting %i @ %s\n", transmitting, sim_time_string());
+  }
+
   
  default event void Model.receive(message_t* msg) {}
 
index 8a3a40f8dc76742d433d97610ec517f0ac574fa1..22691d8d88b2d0d880d208f9b8ef9499de2ef968 100644 (file)
@@ -46,6 +46,7 @@ interface GainRadioModel {
 
   command void setClearValue(double value);
   command bool clearChannel();
+  command void checkPendingTransmission(bool isTransmitting);
   
   event void acked(message_t* msg);
   event void receive(message_t* msg);
index 42f3f3443907b234f90098b1e013ce4e2e8eb984..44222e465ad38e15c2678c376f35f8b38601aecf 100644 (file)
@@ -214,6 +214,7 @@ implementation {
       delay *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec());
       evt->time += delay;
       transmitting = TRUE;
+      call GainRadioModel.checkPendingTransmission(transmitting);
       evt->handle = send_transmit;
       sim_queue_insert(evt);
     }