]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc
stm25p: fix seek error
[tinyos-2.x.git] / tos / platforms / eyesIFX / byte_radio / Uart4b6bPhyP.nc
index c91e73f26a383e7d08873addd2beaa30c622d064..8976f47d6b34fe8c9bbaa6a05dabde7b957a185e 100644 (file)
@@ -47,11 +47,21 @@ module Uart4b6bPhyP {
     uses {
         interface RadioByteComm;
         interface Alarm<T32khz, uint16_t> as RxByteTimer;
-        // interface GeneralIO as Led3;
+#ifdef UART_DEBUG
+        interface SerialDebug;
+#endif
     }
 }
 implementation
 {
+#ifdef UART_DEBUG
+    void sdDebug(uint16_t p) {
+        call SerialDebug.putPlace(p);
+    }
+#else
+    void sdDebug(uint16_t p) {};
+#endif
+
     /* Module Definitions  */
     typedef enum {
         STATE_PREAMBLE,
@@ -73,10 +83,11 @@ implementation
     /* constants */
     enum {
         PREAMBLE_LENGTH=2,
-        BYTE_TIME=11,
+        BYTE_TIME=TDA5250_32KHZ_BYTE_TIME+3,
         PREAMBLE_BYTE=0x55,
         SYNC_BYTE=0xFF,
-        SFD_BYTE=0x83
+        SFD_BYTE=0x83,
+        SFD_BYTE2=0x7c
     };
     
     /** Module Global Variables  */
@@ -96,6 +107,9 @@ implementation
             numPreambles = PREAMBLE_LENGTH;
             byteTime = BYTE_TIME;
         }
+#ifdef UART_DEBUG
+        call SerialDebug.putShortDesc("U4b6bP");
+#endif
         return SUCCESS;
     }
     
@@ -121,18 +135,13 @@ implementation
     
     void resetState() {
         call RxByteTimer.stop();
-        switch(phyState) {
-                       case STATE_PREAMBLE:
-            case STATE_PREAMBLE_CODE:
-             case STATE_SFD2:
-                break;
-            default:
-                signal PhyPacketRx.recvFooterDone(FAIL);
-                break;
+        if(phyState >= STATE_DATA_HIGH) {
+            signal PhyPacketRx.recvFooterDone(FAIL);
+            sdDebug(10);
         }
-        phyState = STATE_PREAMBLE; 
+        phyState = STATE_PREAMBLE;
     }
-    
+
     async event void RxByteTimer.fired() {
         // no bytes have arrived, so...
         resetState();
@@ -188,6 +197,7 @@ implementation
         phyState = STATE_PREAMBLE;
         call RxByteTimer.stop();
         signal PhyPacketRx.recvFooterDone(SUCCESS);
+        sdDebug(20);
     }
 
     
@@ -204,7 +214,7 @@ implementation
     void TransmitNextByte() {
         switch(phyState) {
             case STATE_PREAMBLE:
-                if(preambleCount > 0) {
+                if(preambleCount > 1) {
                     preambleCount--;
                 } else {
                     phyState = STATE_SYNC;
@@ -219,10 +229,10 @@ implementation
                 phyState = STATE_SFD2;
                 call RadioByteComm.txByte(SFD_BYTE);
                 break;
-               case STATE_SFD2:
-               phyState = STATE_SFD3;
-               call RadioByteComm.txByte(SFD_BYTE);
-               break;
+            case STATE_SFD2:
+                phyState = STATE_SFD3;
+                call RadioByteComm.txByte(SFD_BYTE);
+                break;
             case STATE_SFD3:
                 phyState = STATE_HEADER_DONE;
                 call RadioByteComm.txByte(SFD_BYTE);
@@ -267,113 +277,123 @@ implementation
 
     /* Rx Done */
     async event void RadioByteComm.rxByteReady(uint8_t data) {
-      call RxByteTimer.start(byteTime);
-        ReceiveNextByte(data);
-    }
-
-    /* Receive the next Byte from the USART */
-    void ReceiveNextByte(uint8_t data) {
         uint8_t decodedByte;
         uint8_t low;
         uint8_t high;
         if((data == SFD_BYTE) && (phyState != STATE_SFD2) && (phyState != STATE_DATA_HIGH_OR_SFD)) {
             resetState();
-            phyState = STATE_SFD1;
+            phyState = STATE_SFD2;
             call RxByteTimer.start(byteTime<<1);
         }
-        switch(phyState) {
-            case STATE_PREAMBLE:
-                low = data & 0xf;
-                high = data >> 4;
-                if((low > 0) && (low < 0xf) && (high > 0) && (high < 0xf))
-                    phyState = STATE_PREAMBLE_CODE;
-                break;
-            case STATE_PREAMBLE_CODE:
-                low = data & 0xf;
-                high = data >> 4;
-                if((low == 0) || (low == 0xf) || (high == 0) || (high == 0xf))
-                    phyState = STATE_PREAMBLE;
-                break;
-               case STATE_SFD1:
-               phyState = STATE_SFD2;
-            break;
-            case STATE_SFD2:
-              if(data == SFD_BYTE) {
-                       call RxByteTimer.start(byteTime<<1);
-                       signal PhyPacketRx.recvHeaderDone(SUCCESS);
-                  phyState = STATE_DATA_HIGH_OR_SFD;
-              }
-              else {
-                resetState();
-              }
-            break;
-            case STATE_DATA_HIGH_OR_SFD:
-                if(data != SFD_BYTE) {
+        else {
+            switch(phyState) {
+                case STATE_SFD2:
+                    if(data == SFD_BYTE) {
+                        phyState = STATE_DATA_HIGH_OR_SFD;
+                        call RxByteTimer.start(byteTime << 1);
+                    }
+                    else {
+                        resetState();
+                    }
+                    break;
+                case STATE_DATA_HIGH_OR_SFD:    
+                    if(data != SFD_BYTE) {
+                        decodedByte = sixBitToNibble[data >> 2];
+                        if(decodedByte != ILLEGAL_CODE) {
+                            bufByte = decodedByte << 2;
+                            bufByte |= data & 0x03;
+                            bufByte <<= 2;
+                            phyState = STATE_DATA_MIDDLE;
+                            call RxByteTimer.stop();
+                            signal PhyPacketRx.recvHeaderDone(SUCCESS);
+                            call RxByteTimer.start(byteTime);
+                        }
+                        else {
+                            resetState();
+                        }
+                    }
+                    else {
+                        phyState = STATE_DATA_HIGH;
+                        call RxByteTimer.stop();
+                        signal PhyPacketRx.recvHeaderDone(SUCCESS);
+                        call RxByteTimer.start(byteTime);
+                    }
+                    break;
+                case STATE_DATA_HIGH:
                     decodedByte = sixBitToNibble[data >> 2];
                     if(decodedByte != ILLEGAL_CODE) {
                         bufByte = decodedByte << 2;
                         bufByte |= data & 0x03;
                         bufByte <<= 2;
                         phyState = STATE_DATA_MIDDLE;
+                        call RxByteTimer.start(byteTime);
                     }
                     else {
                         resetState();
                     }
-                }
-                else {
-                    phyState = STATE_DATA_HIGH;
-                }
-                break;
-            case STATE_DATA_HIGH:
-                decodedByte = sixBitToNibble[data >> 2];
-                if(decodedByte != ILLEGAL_CODE) {
-                    bufByte = decodedByte << 2;
-                    bufByte |= data & 0x03;
-                    bufByte <<= 2;
-                    phyState = STATE_DATA_MIDDLE;
-                }
-                else {
-                    resetState();
-                }
-                break;
-            case STATE_DATA_MIDDLE:
-                decodedByte = sixBitToNibble[((bufByte & 0x0f)<<2) | (data >> 4)];
-                if(decodedByte != ILLEGAL_CODE) {
-                    phyState = STATE_DATA_LOW;
-                    signal SerializerRadioByteComm.rxByteReady((bufByte & 0xf0) | decodedByte);
-                    bufByte = (data & 0x0f) << 2;
-                }
-                else {
-                    resetState();
-                }
-                break;
-            case STATE_DATA_LOW:
-                decodedByte = sixBitToNibble[bufByte | (data >> 6)];
-                if(decodedByte != ILLEGAL_CODE) {
-                    bufByte = (decodedByte << 4);
-                    decodedByte = sixBitToNibble[data & 0x3f];
+                    break;
+                case STATE_DATA_MIDDLE:
+                    decodedByte = sixBitToNibble[((bufByte & 0x0f)<<2) | (data >> 4)];
                     if(decodedByte != ILLEGAL_CODE) {
-                        phyState = STATE_DATA_HIGH;
-                        signal SerializerRadioByteComm.rxByteReady(bufByte | decodedByte);
+                        phyState = STATE_DATA_LOW;
+                        call RxByteTimer.stop();
+                        signal SerializerRadioByteComm.rxByteReady((bufByte & 0xf0) | decodedByte);
+                        bufByte = (data & 0x0f) << 2;
+                        call RxByteTimer.start(byteTime);
                     }
                     else {
                         resetState();
                     }
-                }
-                else {
-                    resetState();
-                }
-                break;
-                // maybe there will be a time.... we will need this. but for now there is no footer
-                //case STATE_FOOTER_START:
-                //phyState = STATE_FOOTER_DONE;
-                //break;
-                //case STATE_FOOTER_DONE:
-                //phyState = STATE_NULL;
-                //signal PhyPacketRx.recvFooterDone(TRUE);
-                //break;
-            default:
-                break;
+                    break;
+                case STATE_DATA_LOW:
+                    decodedByte = sixBitToNibble[bufByte | (data >> 6)];
+                    if(decodedByte != ILLEGAL_CODE) {
+                        bufByte = (decodedByte << 4);
+                        decodedByte = sixBitToNibble[data & 0x3f];
+                        if(decodedByte != ILLEGAL_CODE) {
+                            phyState = STATE_DATA_HIGH;
+                            call RxByteTimer.stop();
+                            signal SerializerRadioByteComm.rxByteReady(bufByte | decodedByte);
+                            call RxByteTimer.start(byteTime);
+                        }
+                        else {
+                            resetState();
+                        }
+                    }
+                    else {
+                        resetState();
+                    }
+                    break;
+                case STATE_PREAMBLE:
+                    low = data & 0xf;
+                    high = data >> 4;
+                    if((low > 0) && (low < 0xf) && (high > 0) && (high < 0xf)) {
+                        phyState = STATE_PREAMBLE_CODE;
+                        call RxByteTimer.start(byteTime);
+                    }
+                    break;
+                case STATE_PREAMBLE_CODE:
+                    low = data & 0xf;
+                    high = data >> 4;
+                    if((low == 0) || (low == 0xf) || (high == 0) || (high == 0xf)) {
+                        phyState = STATE_PREAMBLE;
+                    }
+                    else {
+                        call RxByteTimer.start(byteTime);
+                    }
+                    break;
+                    // maybe there will be a time.... we will need this. but for now there is no footer
+                    //case STATE_FOOTER_START:
+                    //phyState = STATE_FOOTER_DONE;
+                    //break;
+                    //case STATE_FOOTER_DONE:
+                    //phyState = STATE_NULL;
+                    //signal PhyPacketRx.recvFooterDone(TRUE);
+                    //break;
+                default:
+                    break;
+            }
         }
+        
     }
 }