[Tinyos-2-commits] CVS: tinyos-2.x/tos/lib/tossim CpmModelC.nc, 1.5, 1.6 GainRadioModel.nc, 1.4, 1.5 TossimPacketModelC.nc, 1.5, 1.6

Phil Levis scipio at users.sourceforge.net
Mon May 21 14:35:57 PDT 2007


Update of /cvsroot/tinyos/tinyos-2.x/tos/lib/tossim
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv622/tos/lib/tossim

Modified Files:
	CpmModelC.nc GainRadioModel.nc TossimPacketModelC.nc 
Log Message:
Improved accuracy of acknowledgement delivery by considering SNR
curves. Currently, ack reception is based on the same SNR/PRR curve
as packet delivery. This is pessimistic, due to the fact that acks
are shorter than packets. I need to measure the ARR/SNR curve to
put it something more accurate. Also, currently TOSSIM does not model
false positives, something I will be adding shortly.


Index: CpmModelC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/lib/tossim/CpmModelC.nc,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** CpmModelC.nc	17 May 2007 22:03:59 -0000	1.5
--- CpmModelC.nc	21 May 2007 21:35:54 -0000	1.6
***************
*** 60,63 ****
--- 60,64 ----
      sim_time_t end;
      double power;
+     double reversePower;
      bool lost;
      bool ack;
***************
*** 69,74 ****
--- 70,81 ----
  
    receive_message_t* allocate_receive_message();
+   void free_receive_message(receive_message_t* msg);
    sim_event_t* allocate_receive_event(sim_time_t t, receive_message_t* m);
  
+   bool shouldReceive(double SNR);
+   bool checkReceive(receive_message_t* msg);
+   double packetNoise(receive_message_t* msg);
+   double checkPrr(receive_message_t* msg);
+   
    double timeInMs()   {
      sim_time_t ftime = sim_time();
***************
*** 132,139 ****
    }
    
    void sim_gain_ack_handle(sim_event_t* evt)  {
!     if (outgoing != NULL && requestAck && sim_mote_is_on(sim_node())) {
!       signal Model.acked(outgoing);
      }
    }
  
--- 139,188 ----
    }
    
+   double arr_estimate_from_snr(double SNR) {
+     double beta1 = 1.3687;
+     double beta2 = 0.9187;
+     double SNR_lin = pow(10.0, SNR/10.0);
+     double X = fabs(SNR_lin-beta2);
+     double PSE = 0.5*erfc(beta1*sqrt(X/2));
+     double prr_hat = pow(1-PSE, 23*2);
+     dbg("CpmModelC,SNRLoss", "SNR is %lf, ARR is %lf\n", SNR, prr_hat);
+     if (prr_hat > 1)
+       prr_hat = 1;
+     else if (prr_hat < 0)
+       prr_hat = 0;
+ 	
+     return prr_hat;
+   }
+   
+   int shouldAckReceive(double snr) {
+     double prr = arr_estimate_from_snr(snr);
+     double coin = RandomUniform();
+     if ( (prr != 0) && (prr != 1) ) {
+       if (coin < prr)
+ 	prr = 1.0;
+       else
+ 	prr = 0.0;
+     }
+     return (int)prr;
+   }
+   
    void sim_gain_ack_handle(sim_event_t* evt)  {
!     // Four conditions must hold for an ack to be issued:
!     // 1) Transmitter is still sending a packet (i.e., not cancelled)
!     // 2) The packet requested an acknowledgment
!     // 3) The transmitter is on
!     // 4) The packet passes the SNR/ARR curve
!     if (requestAck && // This 
! 	outgoing != NULL &&
! 	sim_mote_is_on(sim_node())) {
!       receive_message_t* rcv = (receive_message_t*)evt->data;
!       double power = rcv->reversePower;
!       double noise = packetNoise(rcv);
!       double snr = power - noise;
!       if (shouldAckReceive(snr)) {
! 	signal Model.acked(outgoing);
!       }
      }
+     free_receive_message((receive_message_t*)evt->data);
    }
  
***************
*** 156,161 ****
    }
  
!   void sim_gain_schedule_ack(int source, sim_time_t t) {
      sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t));
      ackEvent->mote = source;
      ackEvent->force = 1;
--- 205,211 ----
    }
  
!   void sim_gain_schedule_ack(int source, sim_time_t t, receive_message_t* r) {
      sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t));
+     
      ackEvent->mote = source;
      ackEvent->force = 1;
***************
*** 164,167 ****
--- 214,219 ----
      ackEvent->handle = sim_gain_ack_handle;
      ackEvent->cleanup = sim_queue_cleanup_event;
+     ackEvent->data = r;
+     
      sim_queue_insert(ackEvent);
    }
***************
*** 174,178 ****
      double PSE = 0.5*erfc(beta1*sqrt(X/2));
      double prr_hat = pow(1-PSE, 23*2);
!     dbg("CpmModelC", "SNR is %lf, PRR is %lf\n", SNR, prr_hat);
      if (prr_hat > 1)
        prr_hat = 1;
--- 226,230 ----
      double PSE = 0.5*erfc(beta1*sqrt(X/2));
      double prr_hat = pow(1-PSE, 23*2);
!     dbg("CpmModelC,SNR", "SNR is %lf, PRR is %lf\n", SNR, prr_hat);
      if (prr_hat > 1)
        prr_hat = 1;
***************
*** 228,231 ****
--- 280,286 ----
    
  
+   /* Handle a packet reception. If the packet is being acked,
+      pass the corresponding receive_message_t* to the ack handler,
+      otherwise free it. */
    void sim_gain_receive_handle(sim_event_t* evt) {
      receive_message_t* mine = (receive_message_t*)evt->data;
***************
*** 251,255 ****
      dbg("CpmModelC,SNRLoss", "Packet from %i to %i\n", (int)mine->source, (int)sim_node());
      if (!checkReceive(mine)) {
!       dbg("CpmModelC,SNRLoss", " - lost packet from as SNR was too low.\n");
        mine->lost = 1;
      }
--- 306,310 ----
      dbg("CpmModelC,SNRLoss", "Packet from %i to %i\n", (int)mine->source, (int)sim_node());
      if (!checkReceive(mine)) {
!       dbg("CpmModelC,SNRLoss", " - lost packet from %i as SNR was too low.\n", (int)mine->source);
        mine->lost = 1;
      }
***************
*** 266,270 ****
        if (mine->ack && signal Model.shouldAck(mine->msg)) {
          dbg_clear("CpmModelC", " scheduling ack.\n");
! 	sim_gain_schedule_ack(mine->source, sim_time() + 1); 
        }
        // We're searching for new packets again
--- 321,328 ----
        if (mine->ack && signal Model.shouldAck(mine->msg)) {
          dbg_clear("CpmModelC", " scheduling ack.\n");
! 	sim_gain_schedule_ack(mine->source, sim_time() + 1, mine);
!       }
!       else { // Otherwise free the receive_message_t*
! 	free_receive_message(mine);
        }
        // We're searching for new packets again
***************
*** 275,284 ****
        dbg_clear("CpmModelC,SNRLoss", "  -packet was lost.\n");
      }
-     free(mine);
    }
     
    // Create a record that a node is receiving a packet,
    // enqueue a receive event to figure out what happens.
!   void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg, bool receive, double power) {
      sim_event_t* evt;
      receive_message_t* list;
--- 333,341 ----
        dbg_clear("CpmModelC,SNRLoss", "  -packet was lost.\n");
      }
    }
     
    // Create a record that a node is receiving a packet,
    // enqueue a receive event to figure out what happens.
!   void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg, bool receive, double power, double reversePower) {
      sim_event_t* evt;
      receive_message_t* list;
***************
*** 289,292 ****
--- 346,350 ----
      rcv->end = endTime;
      rcv->power = power;
+     rcv->reversePower = reversePower;
      rcv->msg = msg;
      rcv->lost = 0;
***************
*** 330,342 ****
    }
    
!   void sim_gain_put(int dest, message_t* msg, sim_time_t endTime, bool receive, double power) {
      int prevNode = sim_node();
      dbg("CpmModelC", "Enqueing reception event for %i at %llu with power %lf.\n", dest, endTime, power);
      sim_set_node(dest);
!     enqueue_receive_event(prevNode, endTime, msg, receive, power);
      sim_set_node(prevNode);
    }
  
!   command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double power) {
      gain_entry_t* neighborEntry = sim_gain_first(sim_node());
      requestAck = ack;
--- 388,400 ----
    }
    
!   void sim_gain_put(int dest, message_t* msg, sim_time_t endTime, bool receive, double power, double reversePower) {
      int prevNode = sim_node();
      dbg("CpmModelC", "Enqueing reception event for %i at %llu with power %lf.\n", dest, endTime, power);
      sim_set_node(dest);
!     enqueue_receive_event(prevNode, endTime, msg, receive, power, reversePower);
      sim_set_node(prevNode);
    }
  
!   command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double power, double reversePower) {
      gain_entry_t* neighborEntry = sim_gain_first(sim_node());
      requestAck = ack;
***************
*** 346,350 ****
      while (neighborEntry != NULL) {
        int other = neighborEntry->mote;
!       sim_gain_put(other, msg, endTime, ack && (other == dest), power + sim_gain_value(sim_node(), other));
        neighborEntry = sim_gain_next(neighborEntry);
      }
--- 404,408 ----
      while (neighborEntry != NULL) {
        int other = neighborEntry->mote;
!       sim_gain_put(other, msg, endTime, ack && (other == dest), power + sim_gain_value(sim_node(), other), reversePower + sim_gain_value(other, sim_node()));
        neighborEntry = sim_gain_next(neighborEntry);
      }
***************
*** 371,374 ****
     return (receive_message_t*)malloc(sizeof(receive_message_t));
   }
!  
  }
--- 429,435 ----
     return (receive_message_t*)malloc(sizeof(receive_message_t));
   }
! 
!  void free_receive_message(receive_message_t* msg) {
!    free(msg);
!  }
  }

Index: GainRadioModel.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/lib/tossim/GainRadioModel.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** GainRadioModel.nc	12 Dec 2006 18:23:32 -0000	1.4
--- GainRadioModel.nc	21 May 2007 21:35:54 -0000	1.5
***************
*** 42,46 ****
  			  bool ack,
  			  sim_time_t endTime,
! 			  double gain);
  
    command void setClearValue(double value);
--- 42,47 ----
  			  bool ack,
  			  sim_time_t endTime,
! 			  double gain,
! 			  double reverseGain);
  
    command void setClearValue(double value);

Index: TossimPacketModelC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/lib/tossim/TossimPacketModelC.nc,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** TossimPacketModelC.nc	19 Jan 2007 19:15:18 -0000	1.5
--- TossimPacketModelC.nc	21 May 2007 21:35:54 -0000	1.6
***************
*** 255,259 ****
  
      dbg("TossimPacketModelC", "PACKET: Broadcasting packet to everyone.\n");
!     call GainRadioModel.putOnAirTo(destNode, sending, metadata->ack, evt->time, 0.0);
      metadata->ack = 0;
  
--- 255,259 ----
  
      dbg("TossimPacketModelC", "PACKET: Broadcasting packet to everyone.\n");
!     call GainRadioModel.putOnAirTo(destNode, sending, metadata->ack, evt->time, 0.0, 0.0);
      metadata->ack = 0;
  



More information about the Tinyos-2-commits mailing list