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