/* This component provides double buffering. */
message_t messages[2]; // buffer allocation
- message_t* messagePtrs[2] = { &messages[0], &messages[1]};
+ message_t* ONE messagePtrs[2] = { &messages[0], &messages[1]};
// We store a separate receiveBuffer variable because indexing
// into a pointer array can be costly, and handling interrupts
// is time critical.
- uint8_t* receiveBuffer = (uint8_t*)(&messages[0]);
+ uint8_t* COUNT_NOK(sizeof(message_t)) receiveBuffer = (uint8_t* COUNT_NOK(sizeof(message_t)))(&messages[0]);
- uint8_t *sendBuffer = NULL;
+ uint8_t *COUNT_NOK(sizeof(message_t)) sendBuffer = NULL;
send_state_t sendState = SEND_STATE_IDLE;
uint8_t sendLen = 0;
uint8_t sendIndex = 0;
uint8_t receiveTaskPending = FALSE;
uart_id_t receiveTaskType = 0;
uint8_t receiveTaskWhich;
- message_t *receiveTaskBuf = NULL;
+ message_t * ONE_NOK receiveTaskBuf = NULL;
uint8_t receiveTaskSize = 0;
command error_t Send.send[uint8_t id](message_t* msg, uint8_t len) {
return (sizeof(message_t));
}
- command void* Send.getPayload[uint8_t id](message_t* m) {
- return m;
- }
-
- command void* Receive.getPayload[uint8_t id](message_t* m, uint8_t* len) {
- if (len != NULL) {
- *len = 0;
+ command void* Send.getPayload[uint8_t id](message_t* m, uint8_t len) {
+ if (len > sizeof(message_t)) {
+ return NULL;
+ }
+ else {
+ return m;
}
- return m;
- }
-
- command uint8_t Receive.payloadLength[uint8_t id](message_t* m) {
- return 0;
}
+
task void signalSendDone(){
error_t error;
}
bool isCurrentBufferLocked() {
- return (receiveState.which)? receiveState.bufZeroLocked : receiveState.bufOneLocked;
+ return (receiveState.which)? receiveState.bufOneLocked : receiveState.bufZeroLocked;
}
void lockCurrentBuffer() {
receiveTaskSize = recvIndex;
receiveBufferSwap();
receiveState.state = RECV_STATE_IDLE;
+ } else {
+ // we can't deliver the packet, better free the current buffer.
+ unlockBuffer(receiveState.which);
}
}
if (postsignalreceive){