APP 4

Dependencies:   mbed CRC16 mbed-rtos

Revision:
20:f0932bfe09ed
Parent:
16:cf433716f8d6
Child:
21:137d010e7469
Child:
22:b855dbf3a8c1
Child:
23:d41a23d8f2d7
--- a/MEF.cpp	Mon Feb 22 18:38:53 2016 +0000
+++ b/MEF.cpp	Tue Feb 23 00:22:49 2016 +0000
@@ -1,6 +1,16 @@
 #include "MEF.h"
 #include "CRC16.h"
 
+void MEF::init()
+{
+    m_InputBuffer.reset();
+    m_BSPayload.reset();
+    memset(m_CPayload, 0, 80);
+    m_Counter = 0;
+    m_DataSize = 0;
+    m_CRC = 0;
+}
+
 void MEF::ReceiveBit(bool bit)
 {
     switch (state)
@@ -11,8 +21,11 @@
                     m_Counter++;
                     if(m_Counter == 8 )
                     {
-                        state = START;
-                        m_Counter = 0;    
+                        if(preambleChecker())
+                        {
+                            state = START;
+                        }
+                        m_Counter = 0;
                     }
 
                 }break;
@@ -20,18 +33,21 @@
                 {
                     m_InputBuffer[m_Counter] = bit;
                     m_Counter++;
-                    if(m_Counter == 8 && startChecker())
+                    if(m_Counter == 8)
                     {
-                        state = TYPE;
-                        m_Counter = 0;
-                    }
-                    else
-                    {
-                        //BOOMBOOM
-                        _decodeError();
-                    }
-
-                    
+                        if(startChecker())
+                        {
+                            state = TYPE;
+                            m_Counter = 0;
+                        }
+                        else
+                        {
+                            //Bluboom
+                            _decodeError();
+                            state = PREAMBLE;
+                            init();                            
+                        }
+                    }                    
                 }break;
         case TYPE :
                 {
@@ -58,18 +74,16 @@
         case DATA :
                 {
                     m_BSPayload[m_Counter] = bit;
-                    if ((m_Counter % 8) == 0 && m_Counter != 0)
+                    if (((m_Counter + 1) % 8) == 0 && m_Counter != 0)
                     {
-                        m_CPayload[m_Counter / 8] = (m_BSPayload[m_Counter] << 0) | (m_BSPayload[m_Counter - 1] << 1) | (m_BSPayload[m_Counter - 2] << 2) | (m_BSPayload[m_Counter - 3] << 3) | (m_BSPayload[m_Counter - 4] << 4) | (m_BSPayload[m_Counter - 5] << 5) | (m_BSPayload[m_Counter - 6] << 6) | (m_BSPayload[m_Counter - 7] << 7);
+                        m_CPayload[(m_Counter + 1)/ 8 - 1] = (m_BSPayload[m_Counter] << 0) | (m_BSPayload[m_Counter - 1] << 1) | (m_BSPayload[m_Counter - 2] << 2) | (m_BSPayload[m_Counter - 3] << 3) | (m_BSPayload[m_Counter - 4] << 4) | (m_BSPayload[m_Counter - 5] << 5) | (m_BSPayload[m_Counter - 6] << 6) | (m_BSPayload[m_Counter - 7] << 7);
                     }
                     m_Counter++;
                     if(m_Counter == m_DataSize*8)
                     {
-                        
                         state = CRC16STATE;
-                        CRC16 crc16;
-                        m_CRC = crc16.calculateCRC16(m_CPayload, m_DataSize);
-                        m_Counter = 0;                            
+                        m_CRC = CRC16::calculateCRC16(m_CPayload, m_DataSize);
+                        m_Counter = 0;
                     }
                 }break;
         case CRC16STATE :
@@ -81,11 +95,13 @@
                         if(!compareCRC())
                         {
                             //BOOMBOOM
-                            _decodeError();    
+                            _decodeError();
+                            state = PREAMBLE;
+                            init();    
                         }
                         else
                         {
-                           state = END;     
+                           state = END;                               
                         }
                         m_Counter = 0;
                     }
@@ -95,18 +111,24 @@
                 {
                     m_InputBuffer[m_Counter] = bit;
                     m_Counter++;
-                    if(m_Counter == 8 && startChecker())
+                    if(m_Counter == 8)
                     {
-                        state = PREAMBLE;
-                        m_Counter = 0;
-                        //CALLBACK
-                        _decodeCallback(m_BSPayload);
+                        if(startChecker())
+                        {
+                            state = PREAMBLE;
+                            m_Counter = 0;
+                            //CALLBACK
+                            _decodeCallback(m_BSPayload, m_DataSize);   
+                        }
+                        else
+                        {
+                            //BOOMBOOM
+                            _decodeError();
+                            state = PREAMBLE;
+                            init();
+                        }
                     }
-                    else
-                    {
-                        //BOOMBOOM
-                        _decodeError();
-                    }
+
                 }break;           
     }
     _updateState(state);
@@ -147,23 +169,23 @@
 
 bool MEF::compareCRC()
 {
-    unsigned short incommingCRC = (m_InputBuffer[0] << 0) | 
-    (m_InputBuffer[1] << 1) | 
-    (m_InputBuffer[2] << 2) | 
-    (m_InputBuffer[3] << 3) | 
-    (m_InputBuffer[4] << 4) | 
-    (m_InputBuffer[5] << 5) | 
-    (m_InputBuffer[6] << 6) | 
-    (m_InputBuffer[7] << 7) | 
-    (m_InputBuffer[8] << 8) |
-    (m_InputBuffer[9] << 9) |
-    (m_InputBuffer[10] << 10) |
-    (m_InputBuffer[11] << 11) |
-    (m_InputBuffer[12] << 12) |
-    (m_InputBuffer[13] << 13) |
-    (m_InputBuffer[14] << 14) |
-    (m_InputBuffer[15] << 15);
-    
+    unsigned short incommingCRC = (m_InputBuffer[0] << 15) | 
+    (m_InputBuffer[1] << 14) | 
+    (m_InputBuffer[2] << 13) | 
+    (m_InputBuffer[3] << 12) | 
+    (m_InputBuffer[4] << 11) | 
+    (m_InputBuffer[5] << 10) | 
+    (m_InputBuffer[6] << 9) | 
+    (m_InputBuffer[7] << 8) | 
+    (m_InputBuffer[8] << 7) |
+    (m_InputBuffer[9] << 6) |
+    (m_InputBuffer[10] << 5) |
+    (m_InputBuffer[11] << 4) |
+    (m_InputBuffer[12] << 3) |
+    (m_InputBuffer[13] << 2) |
+    (m_InputBuffer[14] << 1) |
+    (m_InputBuffer[15] << 0);
+
     return m_CRC == incommingCRC;
 }