X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fserial%2FSerialDispatcherP.nc;h=fd2946b19ab33424ad271e944c92bd1980b85825;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=cc85a3f3f530c511019ace6bc721ada7e588077b;hpb=1ba974b83d19fc41bf80acd52726f36f7f1df297;p=tinyos-2.x.git diff --git a/tos/lib/serial/SerialDispatcherP.nc b/tos/lib/serial/SerialDispatcherP.nc index cc85a3f3..fd2946b1 100644 --- a/tos/lib/serial/SerialDispatcherP.nc +++ b/tos/lib/serial/SerialDispatcherP.nc @@ -75,14 +75,14 @@ implementation { /* 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; @@ -94,7 +94,7 @@ implementation { 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) { @@ -102,13 +102,21 @@ implementation { return EBUSY; } - sendState = SEND_STATE_DATA; - sendId = id; - sendCancelled = FALSE; atomic { + sendIndex = call PacketInfo.offset[id](); + if (sendIndex > sizeof(message_header_t)) { + return ESIZE; + } + sendError = SUCCESS; sendBuffer = (uint8_t*)msg; - sendIndex = call PacketInfo.offset[id](); + sendState = SEND_STATE_DATA; + sendId = id; + sendCancelled = FALSE; + // If something we're starting past the header, something is wrong + // Bug fix from John Regehr + + // sendLen is where in the buffer the packet stops. // This is the length of the packet, plus its start point sendLen = call PacketInfo.dataLinkLength[id](msg, len) + sendIndex; @@ -126,21 +134,16 @@ implementation { 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; @@ -183,7 +186,7 @@ implementation { } bool isCurrentBufferLocked() { - return (receiveState.which)? receiveState.bufZeroLocked : receiveState.bufOneLocked; + return (receiveState.which)? receiveState.bufOneLocked : receiveState.bufZeroLocked; } void lockCurrentBuffer() { @@ -291,6 +294,9 @@ implementation { 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){