- if (outgoing != NULL && requestAck && sim_mote_is_on(sim_node())) {
- signal Model.acked(outgoing);
+ // 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);
+ }