]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/byte_radio/PacketSerializerP.nc
Proper MSP_BSL_FLAGS for telosa and telosb based platforms using TMI modular tos...
[tinyos-2.x.git] / tos / lib / byte_radio / PacketSerializerP.nc
index 73e172edd76addfe40a2e4c8ad2f79f1af0ea6c9..9ddbcce2b46f270cf8abf65373a7371538c9b2e8 100644 (file)
@@ -73,6 +73,9 @@ implementation {
   void TransmitNextByte();
   void ReceiveNextByte(uint8_t data);
 
+  typedef enum {
+      SFD_OFFSET = sizeof(message_header_t) - sizeof(message_radio_header_t) + 2
+  } pserializer_constants_t;
   
   /* Radio Init  */
   command error_t Init.init(){
@@ -100,8 +103,7 @@ implementation {
   }
   
   async event void PhyPacketTx.sendHeaderDone() {
-    signal RadioTimeStamping.transmittedSFD(0, (message_t*)txBufPtr); 
-    TransmitNextByte();
+      TransmitNextByte();
   }
 
   async event void RadioByteComm.txByteReady(error_t error) {
@@ -115,16 +117,22 @@ implementation {
   void TransmitNextByte() {
     message_radio_header_t* header = getHeader((message_t*) txBufPtr);
     if (byteCnt < header->length + sizeof(message_header_t) ) {  // send (data + header), compute crc
+        if(byteCnt == SFD_OFFSET) {
+            signal RadioTimeStamping.transmittedSFD(0, (message_t*)txBufPtr);
+        }
         crc = crcByte(crc, ((uint8_t *)(txBufPtr))[byteCnt]);
         call RadioByteComm.txByte(((uint8_t *)(txBufPtr))[byteCnt++]);
-    } else if (byteCnt == (header->length + sizeof(message_header_t))) {
+    }
+    else if (byteCnt == (header->length + sizeof(message_header_t))) {
       ++byteCnt;
       call RadioByteComm.txByte((uint8_t)crc);
-    } else if  (byteCnt == (header->length + sizeof(message_header_t)+1)) {
+    }
+    else if  (byteCnt == (header->length + sizeof(message_header_t)+1)) {
       ++byteCnt;
       call RadioByteComm.txByte((uint8_t)(crc >> 8));
-    } else { /* (byteCnt > (header->length + sizeof(message_header_t)+1)) */
-        call PhyPacketTx.sendFooter();  
+    }
+    else { /* (byteCnt > (header->length + sizeof(message_header_t)+1)) */
+        call PhyPacketTx.sendFooter();
     }
   }
 
@@ -139,7 +147,6 @@ implementation {
       crc = 0;
       getHeader(rxBufPtr)->length = sizeof(message_radio_header_t); 
       signal PhyReceive.receiveDetected();
-      signal RadioTimeStamping.receivedSFD(0);
     }
   }
 
@@ -159,7 +166,10 @@ implementation {
   void ReceiveNextByte(uint8_t data) { 
     message_radio_footer_t* footer = getFooter((message_t*)rxBufPtr);
     ((uint8_t *)(rxBufPtr))[byteCnt++] = data;
-    if ( byteCnt < getHeader(rxBufPtr)->length + sizeof(message_radio_header_t) ) {
+    if(byteCnt < getHeader(rxBufPtr)->length + sizeof(message_radio_header_t)) {
+      if(byteCnt == SFD_OFFSET) {
+          signal RadioTimeStamping.receivedSFD(0);
+      }
       crc = crcByte(crc, data);
       if (getHeader(rxBufPtr)->length > TOSH_DATA_LENGTH) { 
         // this packet is surely corrupt, so whatever...
@@ -193,11 +203,13 @@ implementation {
     return TOSH_DATA_LENGTH;
   }
 
-  command void* Packet.getPayload(message_t* msg, uint8_t* len) {
-    if (len != NULL) {
-      *len = (getHeader(msg))->length;
+  command void* Packet.getPayload(message_t* msg, uint8_t len) {
+    if (len <= TOSH_DATA_LENGTH) {
+      return (void*)msg->data;
+    }
+    else {
+      return NULL;
     }
-    return (void*)msg->data;
   }
   
   // Default events for radio send/receive coordinators do nothing.