APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
vinbel93
Date:
Tue Feb 23 00:28:40 2016 +0000
Revision:
21:137d010e7469
Parent:
20:f0932bfe09ed
final v2

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
vinbel93 20:f0932bfe09ed 4 void MEF::init()
vinbel93 20:f0932bfe09ed 5 {
vinbel93 20:f0932bfe09ed 6 m_InputBuffer.reset();
vinbel93 20:f0932bfe09ed 7 m_BSPayload.reset();
vinbel93 20:f0932bfe09ed 8 memset(m_CPayload, 0, 80);
vinbel93 20:f0932bfe09ed 9 m_Counter = 0;
vinbel93 20:f0932bfe09ed 10 m_DataSize = 0;
vinbel93 20:f0932bfe09ed 11 m_CRC = 0;
vinbel93 20:f0932bfe09ed 12 }
vinbel93 20:f0932bfe09ed 13
manl2003 10:51ee22e230c7 14 void MEF::ReceiveBit(bool bit)
manl2003 10:51ee22e230c7 15 {
manl2003 10:51ee22e230c7 16 switch (state)
manl2003 10:51ee22e230c7 17 {
manl2003 10:51ee22e230c7 18 case PREAMBLE :
vinbel93 21:137d010e7469 19 {
vinbel93 21:137d010e7469 20 m_InputBuffer[m_Counter] = bit;
vinbel93 21:137d010e7469 21 m_Counter++;
vinbel93 21:137d010e7469 22 if(m_Counter == 8 )
manl2003 10:51ee22e230c7 23 {
vinbel93 21:137d010e7469 24 if(preambleChecker())
manl2003 10:51ee22e230c7 25 {
vinbel93 21:137d010e7469 26 state = START;
vinbel93 21:137d010e7469 27 }
vinbel93 21:137d010e7469 28 m_Counter = 0;
vinbel93 21:137d010e7469 29 }
vinbel93 21:137d010e7469 30
vinbel93 21:137d010e7469 31 } break;
vinbel93 21:137d010e7469 32 case START :
vinbel93 21:137d010e7469 33 {
vinbel93 21:137d010e7469 34 m_InputBuffer[m_Counter] = bit;
vinbel93 21:137d010e7469 35 m_Counter++;
vinbel93 21:137d010e7469 36 if(m_Counter == 8)
manl2003 10:51ee22e230c7 37 {
vinbel93 21:137d010e7469 38 if(startChecker())
manl2003 10:51ee22e230c7 39 {
vinbel93 21:137d010e7469 40 state = TYPE;
manl2003 10:51ee22e230c7 41 m_Counter = 0;
manl2003 10:51ee22e230c7 42 }
vinbel93 21:137d010e7469 43 else
manl2003 12:715af3660c73 44 {
vinbel93 21:137d010e7469 45 //Bluboom
vinbel93 21:137d010e7469 46 _decodeError();
vinbel93 21:137d010e7469 47 state = PREAMBLE;
vinbel93 21:137d010e7469 48 init();
manl2003 12:715af3660c73 49 }
vinbel93 21:137d010e7469 50 }
vinbel93 21:137d010e7469 51 } break;
vinbel93 21:137d010e7469 52 case TYPE :
vinbel93 21:137d010e7469 53 {
vinbel93 21:137d010e7469 54 m_Counter ++;
vinbel93 21:137d010e7469 55 if(m_Counter == 8)
vinbel93 21:137d010e7469 56 {
vinbel93 21:137d010e7469 57 state = LENGTH;
vinbel93 21:137d010e7469 58 m_Counter = 0;
vinbel93 21:137d010e7469 59 }
vinbel93 21:137d010e7469 60
vinbel93 21:137d010e7469 61 } break;
vinbel93 21:137d010e7469 62 case LENGTH :
vinbel93 21:137d010e7469 63 {
vinbel93 21:137d010e7469 64 m_InputBuffer[m_Counter] = bit;
vinbel93 21:137d010e7469 65 m_Counter++;
vinbel93 21:137d010e7469 66 if(m_Counter == 8)
vinbel93 21:137d010e7469 67 {
vinbel93 21:137d010e7469 68 state = DATA;
vinbel93 21:137d010e7469 69 m_DataSize = calculateSize();
vinbel93 21:137d010e7469 70 m_Counter = 0;
vinbel93 21:137d010e7469 71 }
vinbel93 21:137d010e7469 72
vinbel93 21:137d010e7469 73 } break;
vinbel93 21:137d010e7469 74 case DATA :
vinbel93 21:137d010e7469 75 {
vinbel93 21:137d010e7469 76 m_BSPayload[m_Counter] = bit;
vinbel93 21:137d010e7469 77 if (((m_Counter + 1) % 8) == 0 && m_Counter != 0)
vinbel93 21:137d010e7469 78 {
vinbel93 21:137d010e7469 79 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);
vinbel93 21:137d010e7469 80 }
vinbel93 21:137d010e7469 81 m_Counter++;
vinbel93 21:137d010e7469 82 if(m_Counter == m_DataSize*8)
manl2003 10:51ee22e230c7 83 {
vinbel93 21:137d010e7469 84 state = CRC16STATE;
vinbel93 21:137d010e7469 85 m_CRC = CRC16::calculateCRC16(m_CPayload, m_DataSize);
vinbel93 21:137d010e7469 86 m_Counter = 0;
vinbel93 21:137d010e7469 87 }
vinbel93 21:137d010e7469 88 } break;
vinbel93 21:137d010e7469 89 case CRC16STATE :
vinbel93 21:137d010e7469 90 {
vinbel93 21:137d010e7469 91 m_InputBuffer[m_Counter] = bit;
vinbel93 21:137d010e7469 92 m_Counter++;
vinbel93 21:137d010e7469 93 if(m_Counter == 16)
vinbel93 21:137d010e7469 94 {
vinbel93 21:137d010e7469 95 if(!compareCRC())
vinbel93 21:137d010e7469 96 {
vinbel93 21:137d010e7469 97 //BOOMBOOM
vinbel93 21:137d010e7469 98 _decodeError();
vinbel93 21:137d010e7469 99 state = PREAMBLE;
vinbel93 21:137d010e7469 100 init();
vinbel93 21:137d010e7469 101 }
vinbel93 21:137d010e7469 102 else
manl2003 12:715af3660c73 103 {
vinbel93 21:137d010e7469 104 state = END;
manl2003 12:715af3660c73 105 }
vinbel93 21:137d010e7469 106 m_Counter = 0;
vinbel93 21:137d010e7469 107 }
vinbel93 21:137d010e7469 108
vinbel93 21:137d010e7469 109 } break;
vinbel93 21:137d010e7469 110 case END :
vinbel93 21:137d010e7469 111 {
vinbel93 21:137d010e7469 112 m_InputBuffer[m_Counter] = bit;
vinbel93 21:137d010e7469 113 m_Counter++;
vinbel93 21:137d010e7469 114 if(m_Counter == 8)
vinbel93 21:137d010e7469 115 {
vinbel93 21:137d010e7469 116 if(startChecker())
vinbel93 21:137d010e7469 117 {
vinbel93 21:137d010e7469 118 state = PREAMBLE;
vinbel93 21:137d010e7469 119 m_Counter = 0;
vinbel93 21:137d010e7469 120 //CALLBACK
vinbel93 21:137d010e7469 121 _decodeCallback(m_BSPayload, m_DataSize);
vinbel93 21:137d010e7469 122 }
vinbel93 21:137d010e7469 123 else
vinbel93 21:137d010e7469 124 {
vinbel93 21:137d010e7469 125 //BOOMBOOM
vinbel93 21:137d010e7469 126 _decodeError();
vinbel93 21:137d010e7469 127 state = PREAMBLE;
vinbel93 21:137d010e7469 128 init();
vinbel93 21:137d010e7469 129 }
vinbel93 21:137d010e7469 130 }
vinbel93 20:f0932bfe09ed 131
vinbel93 21:137d010e7469 132 } break;
manl2003 10:51ee22e230c7 133 }
manl2003 10:51ee22e230c7 134 }
manl2003 10:51ee22e230c7 135
manl2003 10:51ee22e230c7 136 bool MEF::preambleChecker()
manl2003 10:51ee22e230c7 137 {
manl2003 10:51ee22e230c7 138 bool temp = false;
manl2003 10:51ee22e230c7 139 bool resultTest1 = true, resultTest2 = true;
manl2003 10:51ee22e230c7 140 for(int i = 0; i < 8; i++)
manl2003 10:51ee22e230c7 141 {
manl2003 10:51ee22e230c7 142 if(m_InputBuffer[i] != temp)
manl2003 10:51ee22e230c7 143 {
manl2003 10:51ee22e230c7 144 resultTest1 = false;
manl2003 10:51ee22e230c7 145 }
manl2003 10:51ee22e230c7 146 if(m_InputBuffer[i] == temp)
manl2003 10:51ee22e230c7 147 {
manl2003 10:51ee22e230c7 148 resultTest2 = false;
manl2003 10:51ee22e230c7 149 }
manl2003 10:51ee22e230c7 150 temp = !temp;
manl2003 10:51ee22e230c7 151 }
manl2003 10:51ee22e230c7 152 return resultTest1 || resultTest2;
manl2003 10:51ee22e230c7 153 }
manl2003 10:51ee22e230c7 154
manl2003 10:51ee22e230c7 155 bool MEF::startChecker()
manl2003 10:51ee22e230c7 156 {
manl2003 10:51ee22e230c7 157 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 158 {
manl2003 10:51ee22e230c7 159 return true;
manl2003 10:51ee22e230c7 160 }
manl2003 10:51ee22e230c7 161 return false;
manl2003 10:51ee22e230c7 162 }
manl2003 10:51ee22e230c7 163
manl2003 10:51ee22e230c7 164 int MEF::calculateSize()
manl2003 10:51ee22e230c7 165 {
manl2003 10:51ee22e230c7 166 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 167 }
manl2003 12:715af3660c73 168
manl2003 12:715af3660c73 169 bool MEF::compareCRC()
manl2003 12:715af3660c73 170 {
vinbel93 20:f0932bfe09ed 171 unsigned short incommingCRC = (m_InputBuffer[0] << 15) |
vinbel93 20:f0932bfe09ed 172 (m_InputBuffer[1] << 14) |
vinbel93 20:f0932bfe09ed 173 (m_InputBuffer[2] << 13) |
vinbel93 20:f0932bfe09ed 174 (m_InputBuffer[3] << 12) |
vinbel93 20:f0932bfe09ed 175 (m_InputBuffer[4] << 11) |
vinbel93 20:f0932bfe09ed 176 (m_InputBuffer[5] << 10) |
vinbel93 20:f0932bfe09ed 177 (m_InputBuffer[6] << 9) |
vinbel93 20:f0932bfe09ed 178 (m_InputBuffer[7] << 8) |
vinbel93 20:f0932bfe09ed 179 (m_InputBuffer[8] << 7) |
vinbel93 20:f0932bfe09ed 180 (m_InputBuffer[9] << 6) |
vinbel93 20:f0932bfe09ed 181 (m_InputBuffer[10] << 5) |
vinbel93 20:f0932bfe09ed 182 (m_InputBuffer[11] << 4) |
vinbel93 20:f0932bfe09ed 183 (m_InputBuffer[12] << 3) |
vinbel93 20:f0932bfe09ed 184 (m_InputBuffer[13] << 2) |
vinbel93 20:f0932bfe09ed 185 (m_InputBuffer[14] << 1) |
vinbel93 20:f0932bfe09ed 186 (m_InputBuffer[15] << 0);
vinbel93 20:f0932bfe09ed 187
manl2003 12:715af3660c73 188 return m_CRC == incommingCRC;
manl2003 12:715af3660c73 189 }