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;
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;
}
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);
delay = sim_csma_rxtx_delay();
delay *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec());
evt->time += delay;
-
+ transmitting = TRUE;
evt->handle = send_transmit;
sim_queue_insert(evt);
}
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()));
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);
}
event void GainRadioModel.receive(message_t* msg) {
- if (running) {
+ if (running && !transmitting) {
signal Packet.receive(msg);
}
}
}
event bool GainRadioModel.shouldAck(message_t* msg) {
- if (running) {
+ if (running && !transmitting) {
return signal Packet.shouldAck(msg);
}
else {