APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
vinbel93
Date:
Tue Feb 23 03:52:19 2016 +0000
Revision:
22:b855dbf3a8c1
Parent:
20:f0932bfe09ed
asdf

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