return call Packet.getPayload(m, len);
}
- task void sendDoneTask() {
+ task void sendDoneTask() {
txMsgSendDonePtr = txMsgPtr;
txMsgPtr=NULL;
signal Send.sendDone(txMsgSendDonePtr, SUCCESS);
}
+ task void sendDoneNoAckTask() {
+ txMsgSendDonePtr = txMsgPtr;
+ txMsgPtr=NULL;
+ signal Send.sendDone(txMsgSendDonePtr, ENOACK);
+ }
+
+
command error_t SplitControl.start() {
error_t err;
err = call PhySplitControl.start();
- task void sendAck() {
- atomic {
- ((xe1205_metadata_t*)((uint8_t*)ackMsgPtr->footer + sizeof(xe1205_footer_t)))->length = sizeof(ackMsg_t);
- ((xe1205_header_t*)(&ackMsg.data - sizeof(xe1205_header_t)))->group = \
- (getHeader((message_t*)rxMsgPtr))->group;
- ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->type = \
- ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->type;
- ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->dest = \
- ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->source;
- ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->source = TOS_NODE_ID;
- ((ackMsg_t*)(ackMsgPtr->data))->pl = ackPayload;
-
- txMsgPtr = ackMsgPtr;
- }
- _len = sizeof(ackMsg_t);
- sendRadioOn(ACK_CODE);
- }
+ task void sendAck() {
+ atomic {
+ ((xe1205_metadata_t*)((uint8_t*)ackMsgPtr->footer + sizeof(xe1205_footer_t)))->length = sizeof(ackMsg_t);
+ ((xe1205_header_t*)(&ackMsg.data - sizeof(xe1205_header_t)))->group = \
+ (getHeader((message_t*)rxMsgPtr))->group;
+ ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->type = \
+ ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->type;
+ ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->dest = \
+ ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->source;
+ ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->source = TOS_NODE_ID;
+ ((ackMsg_t*)(ackMsgPtr->data))->pl = ackPayload;
+
+ txMsgPtr = ackMsgPtr;
+ }
+ _len = sizeof(ackMsg_t);
+ sendRadioOn(ACK_CODE);
+ }
command error_t Send.cancel(message_t* msg) {
/* Cancel is unsupported for now. */
txPhyHdr.length = _len;
txRunningCRC=0;
getMetadata(txMsgPtr)->length = _len;
- if (((xe1205_header_t*)( (uint8_t*)txMsgPtr->data - sizeof(xe1205_header_t)))->ack==1) {
+ if ((((xe1205_header_t*)( (uint8_t*)txMsgPtr->data - sizeof(xe1205_header_t)))->ack & 0x01)==0x01) {
call XE1205PhyRxTx.enableAck(TRUE);
}
txIndex = min(sizeof(xe1205_header_t) + _len + sizeof(xe1205_footer_t),
sendingAck=TRUE;
memcpy(txBuf, ackPreamble, sizeof(ackPreamble));
memcpy(txBuf + sizeof(pktPreamble), &txPhyHdr, sizeof(txPhyHdr));
-
- post signalPacketReceived();
+
break;
}
uint8_t sendDones = 0;
async event void XE1205PhyRxTx.sendFrameDone(error_t err) __attribute__ ((noinline)) {
sendDones++;
- if(sendingAck==FALSE)
- if(err==SUCCESS) {
+ if(sendingAck==FALSE) {
+ switch (err) {
+
+ case SUCCESS:
if (post sendDoneTask() != SUCCESS)
xe1205check(2, FAIL);
- } else {
+ break;
+
+ case ENOACK:
+ if(post sendDoneNoAckTask() !=SUCCESS)
+ xe1205check(2, FAIL);
+ break;
+
+ default:
if (post sendDoneFailTask() != SUCCESS)
xe1205check(2, FAIL);
}
- else {
+ } else {
+
txMsgPtr = NULL;
- sendingAck=FALSE;
+ sendingAck=FALSE;
+ post signalPacketReceived();
}
}
command void Packet.clear(message_t* msg) {
- memset(msg, 0, sizeof(message_t));
+ memset(getHeader(msg), 0, sizeof(xe1205_header_t));
+ memset(getFooter(msg), 0, sizeof(xe1205_footer_t));
+ memset(getMetadata(msg), 0, sizeof(xe1205_metadata_t));
}
command uint8_t Packet.payloadLength(message_t* msg) {
}
command void* Packet.getPayload(message_t* msg, uint8_t len) {
- if (len <= TOSH_DATA_LENGTH) {
- return (void*)msg->data;
- }
- else {
- return NULL;
- }
+ if (len <= TOSH_DATA_LENGTH) {
+ return (void*)msg->data;
+ }
+ else {
+ return NULL;
+ }
}
async command error_t PacketAcknowledgements.requestAck(message_t* msg) {
return datalen + sizeof(xe1205_header_t) + sizeof(xe1205_footer_t) + sizeof(xe1205_phy_header_t);
}
- task void signalPacketReceived() __attribute__ ((noinline)) {
+ task void signalPacketReceived() {
atomic {
getMetadata((message_t*) rxMsgPtr)->length = rxPhyHdr.length;
uint32_t nrxmsgs;
+
async event void XE1205PhyRxTx.rxFrameEnd(char* data, uint8_t len, error_t status) __attribute__ ((noinline)) {
if (status != SUCCESS){ return;}
(((getHeader((message_t*)rxMsgPtr))->ack)& 0x01)==1) {
post sendAck();
} else {
+ post signalPacketReceived();
+ }
+
+ }
+
+ async event void XE1205PhyRxTx.rxAckEnd(char* data, uint8_t len, error_t status) __attribute__ ((noinline)) {
+
+ sendingAck=FALSE;
+
+ if (status != SUCCESS) {
+ post sendDoneNoAckTask();
+ return;
+ }
+
+ if (rxBufPtr) {
+ post sendDoneNoAckTask();
+ return; // this could happen whenever rxFrameBegin was called with rxBufPtr still active
+ }
+
+ rxBufPtr = (data + sizeof(xe1205_phy_header_t));
+
+ checkCrcAndUnwhiten(rxBufPtr, rxPhyHdr.whitening, rxPhyHdr.length);
+
+ if (!getFooter(rxMsgPtr)->crc) {
+ post sendDoneNoAckTask();
atomic rxBufPtr = NULL;
- rxMsgPtr = signal Receive.receive(rxMsgPtr, rxMsgPtr->data, getMetadata(rxMsgPtr)->length);
+ return;
}
+
+ getMetadata((message_t*) rxMsgPtr)->strength = call XE1205PhyRssi.readRxRssi();
+ getMetadata((message_t*) rxMsgPtr)->length = rxPhyHdr.length;
+ if ((getHeader((message_t*)rxMsgPtr))->dest == TOS_NODE_ID) {
+ post sendDoneTask();
+ } else {
+ post sendDoneNoAckTask();
+ }
+ atomic rxBufPtr = NULL;
}
+
async event void XE1205PhyRssi.rssiDone(uint8_t _rssi) { }
}