[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