#include "radiopacketfunctions.h"
#include "message.h"
+#include "PacketAck.h"
/**
* This is the implementation of a really simple link layer.
message_t* rxBufPtr;
message_t rxBuf;
- /* packet vars */
- uint8_t seqNo; // for later use ...
-
/* state vars */
error_t splitStateError; // state of SplitControl interfaces
bool rxBusy; // blocks an incoming packet if the rxBuffer is in use
atomic {
rxBufPtr = &rxBuf;
txBufPtr = 0;
- seqNo = 0;
splitStateError = EOFF;
rxBusy = FALSE;
}
}
command error_t Send.send(message_t *msg, uint8_t len) {
- ++seqNo; // where to put?
- return call SendDown.send(msg, len);
+ if(getMetadata(msg)->ack != NO_ACK_REQUESTED) {
+ // ensure reasonable value
+ getMetadata(msg)->ack = ACK_REQUESTED;
+ }
+ return call SendDown.send(msg, len);
}
command error_t Send.cancel(message_t* msg) {
async event void SendDown.sendDone(message_t* msg, error_t error) {
atomic {
txBufPtr = msg;
- getMetadata(msg)->ack = 1; // this is rather stupid
}
if (error == SUCCESS) {
post SendDoneSuccessTask();
atomic {
if (rxBusy) {
msgPtr = msg;
- } else {
+ }
+ else {
rxBusy = TRUE;
msgPtr = rxBufPtr;
rxBufPtr = msg;
}
return msgPtr;
}
-
+
command void* Receive.getPayload(message_t* msg, uint8_t* len) {
return call Packet.getPayload(msg, len);
}
/* PacketAcknowledgements interface */
async command error_t PacketAcknowledgements.requestAck(message_t* msg) {
- return FAIL;
+ getMetadata(msg)->ack = ACK_REQUESTED;
+ return SUCCESS;
}
async command error_t PacketAcknowledgements.noAck(message_t* msg) {
- return SUCCESS;
+ getMetadata(msg)->ack = NO_ACK_REQUESTED;
+ return SUCCESS;
}
async command bool PacketAcknowledgements.wasAcked(message_t* msg) {
- return FALSE;
+ bool rVal = FALSE;
+ if(getMetadata(msg)->ack == WAS_ACKED) rVal = TRUE;
+ return rVal;
}
}