]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/serial/SerialDispatcherP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / serial / SerialDispatcherP.nc
index fdcb5b6fe0548bcdc809b5039d253a6846dd3432..fd2946b19ab33424ad271e944c92bd1980b85825 100644 (file)
@@ -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) {
@@ -134,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;
 
@@ -191,7 +186,7 @@ implementation {
   }
 
   bool isCurrentBufferLocked() {
-    return (receiveState.which)? receiveState.bufZeroLocked : receiveState.bufOneLocked;
+    return (receiveState.which)? receiveState.bufOneLocked : receiveState.bufZeroLocked;
   }
 
   void lockCurrentBuffer() {
@@ -299,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){