APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
manl2003
Date:
Mon Feb 22 18:24:53 2016 +0000
Revision:
16:cf433716f8d6
Parent:
15:ed9511c3aac6
Child:
20:f0932bfe09ed
'ti fix de Meuf

Who changed what in which revision?

UserRevisionLine numberNew 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 16:cf433716f8d6 86 else
manl2003 16:cf433716f8d6 87 {
manl2003 16:cf433716f8d6 88 state = END;
manl2003 16:cf433716f8d6 89 }
manl2003 12:715af3660c73 90 m_Counter = 0;
manl2003 12:715af3660c73 91 }
manl2003 10:51ee22e230c7 92
manl2003 10:51ee22e230c7 93 }break;
manl2003 10:51ee22e230c7 94 case END :
manl2003 10:51ee22e230c7 95 {
manl2003 12:715af3660c73 96 m_InputBuffer[m_Counter] = bit;
manl2003 12:715af3660c73 97 m_Counter++;
manl2003 12:715af3660c73 98 if(m_Counter == 8 && startChecker())
manl2003 12:715af3660c73 99 {
manl2003 12:715af3660c73 100 state = PREAMBLE;
manl2003 12:715af3660c73 101 m_Counter = 0;
manl2003 12:715af3660c73 102 //CALLBACK
vinbel93 15:ed9511c3aac6 103 _decodeCallback(m_BSPayload);
manl2003 12:715af3660c73 104 }
manl2003 12:715af3660c73 105 else
manl2003 12:715af3660c73 106 {
manl2003 12:715af3660c73 107 //BOOMBOOM
manl2003 12:715af3660c73 108 _decodeError();
manl2003 12:715af3660c73 109 }
manl2003 10:51ee22e230c7 110 }break;
manl2003 10:51ee22e230c7 111 }
manl2003 16:cf433716f8d6 112 _updateState(state);
manl2003 10:51ee22e230c7 113 }
manl2003 10:51ee22e230c7 114
manl2003 10:51ee22e230c7 115 bool MEF::preambleChecker()
manl2003 10:51ee22e230c7 116 {
manl2003 10:51ee22e230c7 117 bool temp = false;
manl2003 10:51ee22e230c7 118 bool resultTest1 = true, resultTest2 = true;
manl2003 10:51ee22e230c7 119 for(int i = 0; i < 8; i++)
manl2003 10:51ee22e230c7 120 {
manl2003 10:51ee22e230c7 121 if(m_InputBuffer[i] != temp)
manl2003 10:51ee22e230c7 122 {
manl2003 10:51ee22e230c7 123 resultTest1 = false;
manl2003 10:51ee22e230c7 124 }
manl2003 10:51ee22e230c7 125 if(m_InputBuffer[i] == temp)
manl2003 10:51ee22e230c7 126 {
manl2003 10:51ee22e230c7 127 resultTest2 = false;
manl2003 10:51ee22e230c7 128 }
manl2003 10:51ee22e230c7 129 temp = !temp;
manl2003 10:51ee22e230c7 130 }
manl2003 10:51ee22e230c7 131 return resultTest1 || resultTest2;
manl2003 10:51ee22e230c7 132 }
manl2003 10:51ee22e230c7 133
manl2003 10:51ee22e230c7 134 bool MEF::startChecker()
manl2003 10:51ee22e230c7 135 {
manl2003 10:51ee22e230c7 136 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 137 {
manl2003 10:51ee22e230c7 138 return true;
manl2003 10:51ee22e230c7 139 }
manl2003 10:51ee22e230c7 140 return false;
manl2003 10:51ee22e230c7 141 }
manl2003 10:51ee22e230c7 142
manl2003 10:51ee22e230c7 143 int MEF::calculateSize()
manl2003 10:51ee22e230c7 144 {
manl2003 10:51ee22e230c7 145 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 146 }
manl2003 12:715af3660c73 147
manl2003 12:715af3660c73 148 bool MEF::compareCRC()
manl2003 12:715af3660c73 149 {
manl2003 12:715af3660c73 150 unsigned short incommingCRC = (m_InputBuffer[0] << 0) |
manl2003 12:715af3660c73 151 (m_InputBuffer[1] << 1) |
manl2003 12:715af3660c73 152 (m_InputBuffer[2] << 2) |
manl2003 12:715af3660c73 153 (m_InputBuffer[3] << 3) |
manl2003 12:715af3660c73 154 (m_InputBuffer[4] << 4) |
manl2003 12:715af3660c73 155 (m_InputBuffer[5] << 5) |
manl2003 12:715af3660c73 156 (m_InputBuffer[6] << 6) |
manl2003 12:715af3660c73 157 (m_InputBuffer[7] << 7) |
manl2003 12:715af3660c73 158 (m_InputBuffer[8] << 8) |
manl2003 12:715af3660c73 159 (m_InputBuffer[9] << 9) |
manl2003 12:715af3660c73 160 (m_InputBuffer[10] << 10) |
manl2003 12:715af3660c73 161 (m_InputBuffer[11] << 11) |
manl2003 12:715af3660c73 162 (m_InputBuffer[12] << 12) |
manl2003 12:715af3660c73 163 (m_InputBuffer[13] << 13) |
manl2003 12:715af3660c73 164 (m_InputBuffer[14] << 14) |
vinbel93 14:9505b98c6623 165 (m_InputBuffer[15] << 15);
manl2003 12:715af3660c73 166
manl2003 12:715af3660c73 167 return m_CRC == incommingCRC;
manl2003 12:715af3660c73 168 }
manl2003 12:715af3660c73 169
manl2003 12:715af3660c73 170 void MEF::error()
manl2003 12:715af3660c73 171 {
manl2003 12:715af3660c73 172
manl2003 10:51ee22e230c7 173 }