APP 4
Dependencies: mbed CRC16 mbed-rtos
MEF.cpp@15:ed9511c3aac6, 2016-02-22 (annotated)
- Committer:
- vinbel93
- Date:
- Mon Feb 22 18:11:37 2016 +0000
- Revision:
- 15:ed9511c3aac6
- Parent:
- 14:9505b98c6623
- Child:
- 16:cf433716f8d6
asdfasdfasdf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manl2003 | 10:51ee22e230c7 | 1 | #include "MEF.h" |
manl2003 | 12:715af3660c73 | 2 | #include "CRC16.h" |
manl2003 | 10:51ee22e230c7 | 3 | |
manl2003 | 10:51ee22e230c7 | 4 | void MEF::ReceiveBit(bool bit) |
manl2003 | 10:51ee22e230c7 | 5 | { |
manl2003 | 10:51ee22e230c7 | 6 | switch (state) |
manl2003 | 10:51ee22e230c7 | 7 | { |
manl2003 | 10:51ee22e230c7 | 8 | case PREAMBLE : |
manl2003 | 10:51ee22e230c7 | 9 | { |
manl2003 | 10:51ee22e230c7 | 10 | m_InputBuffer[m_Counter] = bit; |
manl2003 | 10:51ee22e230c7 | 11 | m_Counter++; |
manl2003 | 12:715af3660c73 | 12 | if(m_Counter == 8 ) |
manl2003 | 10:51ee22e230c7 | 13 | { |
manl2003 | 10:51ee22e230c7 | 14 | state = START; |
manl2003 | 10:51ee22e230c7 | 15 | m_Counter = 0; |
manl2003 | 10:51ee22e230c7 | 16 | } |
manl2003 | 10:51ee22e230c7 | 17 | |
manl2003 | 10:51ee22e230c7 | 18 | }break; |
manl2003 | 10:51ee22e230c7 | 19 | case START : |
manl2003 | 10:51ee22e230c7 | 20 | { |
manl2003 | 10:51ee22e230c7 | 21 | m_InputBuffer[m_Counter] = bit; |
manl2003 | 10:51ee22e230c7 | 22 | m_Counter++; |
manl2003 | 10:51ee22e230c7 | 23 | if(m_Counter == 8 && startChecker()) |
manl2003 | 10:51ee22e230c7 | 24 | { |
manl2003 | 10:51ee22e230c7 | 25 | state = TYPE; |
manl2003 | 10:51ee22e230c7 | 26 | m_Counter = 0; |
manl2003 | 10:51ee22e230c7 | 27 | } |
manl2003 | 12:715af3660c73 | 28 | else |
manl2003 | 12:715af3660c73 | 29 | { |
manl2003 | 12:715af3660c73 | 30 | //BOOMBOOM |
manl2003 | 12:715af3660c73 | 31 | _decodeError(); |
manl2003 | 12:715af3660c73 | 32 | } |
manl2003 | 10:51ee22e230c7 | 33 | |
manl2003 | 10:51ee22e230c7 | 34 | |
manl2003 | 10:51ee22e230c7 | 35 | }break; |
manl2003 | 10:51ee22e230c7 | 36 | case TYPE : |
manl2003 | 10:51ee22e230c7 | 37 | { |
manl2003 | 10:51ee22e230c7 | 38 | m_Counter ++; |
manl2003 | 10:51ee22e230c7 | 39 | if(m_Counter == 8) |
manl2003 | 10:51ee22e230c7 | 40 | { |
manl2003 | 10:51ee22e230c7 | 41 | state = LENGTH; |
manl2003 | 10:51ee22e230c7 | 42 | m_Counter = 0; |
manl2003 | 10:51ee22e230c7 | 43 | } |
manl2003 | 10:51ee22e230c7 | 44 | |
manl2003 | 10:51ee22e230c7 | 45 | }break; |
manl2003 | 10:51ee22e230c7 | 46 | case LENGTH : |
manl2003 | 10:51ee22e230c7 | 47 | { |
manl2003 | 10:51ee22e230c7 | 48 | m_InputBuffer[m_Counter] = bit; |
manl2003 | 10:51ee22e230c7 | 49 | m_Counter++; |
manl2003 | 10:51ee22e230c7 | 50 | if(m_Counter == 8) |
manl2003 | 10:51ee22e230c7 | 51 | { |
manl2003 | 10:51ee22e230c7 | 52 | state = DATA; |
manl2003 | 10:51ee22e230c7 | 53 | m_DataSize = calculateSize(); |
manl2003 | 10:51ee22e230c7 | 54 | m_Counter = 0; |
manl2003 | 10:51ee22e230c7 | 55 | } |
manl2003 | 10:51ee22e230c7 | 56 | |
manl2003 | 10:51ee22e230c7 | 57 | }break; |
manl2003 | 10:51ee22e230c7 | 58 | case DATA : |
manl2003 | 10:51ee22e230c7 | 59 | { |
manl2003 | 12:715af3660c73 | 60 | m_BSPayload[m_Counter] = bit; |
manl2003 | 12:715af3660c73 | 61 | if ((m_Counter % 8) == 0 && m_Counter != 0) |
manl2003 | 12:715af3660c73 | 62 | { |
manl2003 | 12:715af3660c73 | 63 | 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); |
manl2003 | 12:715af3660c73 | 64 | } |
manl2003 | 12:715af3660c73 | 65 | m_Counter++; |
manl2003 | 12:715af3660c73 | 66 | if(m_Counter == m_DataSize*8) |
manl2003 | 12:715af3660c73 | 67 | { |
manl2003 | 12:715af3660c73 | 68 | |
manl2003 | 12:715af3660c73 | 69 | state = CRC16STATE; |
manl2003 | 12:715af3660c73 | 70 | CRC16 crc16; |
manl2003 | 12:715af3660c73 | 71 | m_CRC = crc16.calculateCRC16(m_CPayload, m_DataSize); |
manl2003 | 12:715af3660c73 | 72 | m_Counter = 0; |
manl2003 | 12:715af3660c73 | 73 | } |
manl2003 | 10:51ee22e230c7 | 74 | }break; |
manl2003 | 12:715af3660c73 | 75 | case CRC16STATE : |
manl2003 | 10:51ee22e230c7 | 76 | { |
manl2003 | 12:715af3660c73 | 77 | m_InputBuffer[m_Counter] = bit; |
manl2003 | 12:715af3660c73 | 78 | m_Counter++; |
manl2003 | 12:715af3660c73 | 79 | if(m_Counter == 16) |
manl2003 | 12:715af3660c73 | 80 | { |
manl2003 | 12:715af3660c73 | 81 | if(!compareCRC()) |
manl2003 | 12:715af3660c73 | 82 | { |
manl2003 | 12:715af3660c73 | 83 | //BOOMBOOM |
manl2003 | 12:715af3660c73 | 84 | _decodeError(); |
manl2003 | 12:715af3660c73 | 85 | } |
manl2003 | 12:715af3660c73 | 86 | m_Counter = 0; |
manl2003 | 12:715af3660c73 | 87 | } |
manl2003 | 10:51ee22e230c7 | 88 | |
manl2003 | 10:51ee22e230c7 | 89 | }break; |
manl2003 | 10:51ee22e230c7 | 90 | case END : |
manl2003 | 10:51ee22e230c7 | 91 | { |
manl2003 | 12:715af3660c73 | 92 | m_InputBuffer[m_Counter] = bit; |
manl2003 | 12:715af3660c73 | 93 | m_Counter++; |
manl2003 | 12:715af3660c73 | 94 | if(m_Counter == 8 && startChecker()) |
manl2003 | 12:715af3660c73 | 95 | { |
manl2003 | 12:715af3660c73 | 96 | state = PREAMBLE; |
manl2003 | 12:715af3660c73 | 97 | m_Counter = 0; |
manl2003 | 12:715af3660c73 | 98 | //CALLBACK |
vinbel93 | 15:ed9511c3aac6 | 99 | _decodeCallback(m_BSPayload); |
manl2003 | 12:715af3660c73 | 100 | } |
manl2003 | 12:715af3660c73 | 101 | else |
manl2003 | 12:715af3660c73 | 102 | { |
manl2003 | 12:715af3660c73 | 103 | //BOOMBOOM |
manl2003 | 12:715af3660c73 | 104 | _decodeError(); |
manl2003 | 12:715af3660c73 | 105 | } |
manl2003 | 10:51ee22e230c7 | 106 | }break; |
manl2003 | 10:51ee22e230c7 | 107 | } |
manl2003 | 10:51ee22e230c7 | 108 | } |
manl2003 | 10:51ee22e230c7 | 109 | |
manl2003 | 10:51ee22e230c7 | 110 | bool MEF::preambleChecker() |
manl2003 | 10:51ee22e230c7 | 111 | { |
manl2003 | 10:51ee22e230c7 | 112 | bool temp = false; |
manl2003 | 10:51ee22e230c7 | 113 | bool resultTest1 = true, resultTest2 = true; |
manl2003 | 10:51ee22e230c7 | 114 | for(int i = 0; i < 8; i++) |
manl2003 | 10:51ee22e230c7 | 115 | { |
manl2003 | 10:51ee22e230c7 | 116 | if(m_InputBuffer[i] != temp) |
manl2003 | 10:51ee22e230c7 | 117 | { |
manl2003 | 10:51ee22e230c7 | 118 | resultTest1 = false; |
manl2003 | 10:51ee22e230c7 | 119 | } |
manl2003 | 10:51ee22e230c7 | 120 | if(m_InputBuffer[i] == temp) |
manl2003 | 10:51ee22e230c7 | 121 | { |
manl2003 | 10:51ee22e230c7 | 122 | resultTest2 = false; |
manl2003 | 10:51ee22e230c7 | 123 | } |
manl2003 | 10:51ee22e230c7 | 124 | temp = !temp; |
manl2003 | 10:51ee22e230c7 | 125 | } |
manl2003 | 10:51ee22e230c7 | 126 | return resultTest1 || resultTest2; |
manl2003 | 10:51ee22e230c7 | 127 | } |
manl2003 | 10:51ee22e230c7 | 128 | |
manl2003 | 10:51ee22e230c7 | 129 | bool MEF::startChecker() |
manl2003 | 10:51ee22e230c7 | 130 | { |
manl2003 | 10:51ee22e230c7 | 131 | if(m_InputBuffer[0] == 0 && m_InputBuffer[1] == 1 && m_InputBuffer[2] == 1 && m_InputBuffer[3] == 1 && m_InputBuffer[4] == 1 && m_InputBuffer[5] == 1 && m_InputBuffer[6] == 1 && m_InputBuffer[7] == 0) |
manl2003 | 10:51ee22e230c7 | 132 | { |
manl2003 | 10:51ee22e230c7 | 133 | return true; |
manl2003 | 10:51ee22e230c7 | 134 | } |
manl2003 | 10:51ee22e230c7 | 135 | return false; |
manl2003 | 10:51ee22e230c7 | 136 | } |
manl2003 | 10:51ee22e230c7 | 137 | |
manl2003 | 10:51ee22e230c7 | 138 | int MEF::calculateSize() |
manl2003 | 10:51ee22e230c7 | 139 | { |
manl2003 | 10:51ee22e230c7 | 140 | return (m_InputBuffer[0] << 7) | (m_InputBuffer[1] << 6) | (m_InputBuffer[2] << 5) | (m_InputBuffer[3] << 4) | (m_InputBuffer[4] << 3) | (m_InputBuffer[5] << 2) | (m_InputBuffer[6] << 1) | (m_InputBuffer[7] << 0); |
manl2003 | 12:715af3660c73 | 141 | } |
manl2003 | 12:715af3660c73 | 142 | |
manl2003 | 12:715af3660c73 | 143 | bool MEF::compareCRC() |
manl2003 | 12:715af3660c73 | 144 | { |
manl2003 | 12:715af3660c73 | 145 | unsigned short incommingCRC = (m_InputBuffer[0] << 0) | |
manl2003 | 12:715af3660c73 | 146 | (m_InputBuffer[1] << 1) | |
manl2003 | 12:715af3660c73 | 147 | (m_InputBuffer[2] << 2) | |
manl2003 | 12:715af3660c73 | 148 | (m_InputBuffer[3] << 3) | |
manl2003 | 12:715af3660c73 | 149 | (m_InputBuffer[4] << 4) | |
manl2003 | 12:715af3660c73 | 150 | (m_InputBuffer[5] << 5) | |
manl2003 | 12:715af3660c73 | 151 | (m_InputBuffer[6] << 6) | |
manl2003 | 12:715af3660c73 | 152 | (m_InputBuffer[7] << 7) | |
manl2003 | 12:715af3660c73 | 153 | (m_InputBuffer[8] << 8) | |
manl2003 | 12:715af3660c73 | 154 | (m_InputBuffer[9] << 9) | |
manl2003 | 12:715af3660c73 | 155 | (m_InputBuffer[10] << 10) | |
manl2003 | 12:715af3660c73 | 156 | (m_InputBuffer[11] << 11) | |
manl2003 | 12:715af3660c73 | 157 | (m_InputBuffer[12] << 12) | |
manl2003 | 12:715af3660c73 | 158 | (m_InputBuffer[13] << 13) | |
manl2003 | 12:715af3660c73 | 159 | (m_InputBuffer[14] << 14) | |
vinbel93 | 14:9505b98c6623 | 160 | (m_InputBuffer[15] << 15); |
manl2003 | 12:715af3660c73 | 161 | |
manl2003 | 12:715af3660c73 | 162 | return m_CRC == incommingCRC; |
manl2003 | 12:715af3660c73 | 163 | } |
manl2003 | 12:715af3660c73 | 164 | |
manl2003 | 12:715af3660c73 | 165 | void MEF::error() |
manl2003 | 12:715af3660c73 | 166 | { |
manl2003 | 12:715af3660c73 | 167 | |
manl2003 | 10:51ee22e230c7 | 168 | } |