APP 4
Dependencies: mbed CRC16 mbed-rtos
Diff: MEF.cpp
- 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; }