APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
manl2003
Date:
Tue Feb 23 21:15:05 2016 +0000
Revision:
27:011ad1667040
Parent:
26:f2b37f9dfca9
Tout beau, mef inclue.

Who changed what in which revision?

UserRevisionLine numberNew 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 27:011ad1667040 24 //On vérifie si dans les 8 derniers bits se trouve le préambule
manl2003 23:d41a23d8f2d7 25 m_InputBuffer[0] = m_InputBuffer[1];
manl2003 23:d41a23d8f2d7 26 m_InputBuffer[1] = m_InputBuffer[2];
manl2003 23:d41a23d8f2d7 27 m_InputBuffer[2] = m_InputBuffer[3];
manl2003 23:d41a23d8f2d7 28 m_InputBuffer[3] = m_InputBuffer[4];
manl2003 23:d41a23d8f2d7 29 m_InputBuffer[4] = m_InputBuffer[5];
manl2003 23:d41a23d8f2d7 30 m_InputBuffer[5] = m_InputBuffer[6];
manl2003 23:d41a23d8f2d7 31 m_InputBuffer[6] = m_InputBuffer[7];
manl2003 23:d41a23d8f2d7 32 m_InputBuffer[7] = bit;
manl2003 23:d41a23d8f2d7 33
manl2003 23:d41a23d8f2d7 34 if(preambleChecker())
manl2003 10:51ee22e230c7 35 {
manl2003 23:d41a23d8f2d7 36 state = START;
manl2003 10:51ee22e230c7 37 }
manl2003 10:51ee22e230c7 38
manl2003 10:51ee22e230c7 39 }break;
manl2003 10:51ee22e230c7 40 case START :
manl2003 10:51ee22e230c7 41 {
manl2003 27:011ad1667040 42 //Verification du start byte
manl2003 10:51ee22e230c7 43 m_InputBuffer[m_Counter] = bit;
manl2003 10:51ee22e230c7 44 m_Counter++;
manl2003 23:d41a23d8f2d7 45 if(m_Counter >= 8)
manl2003 10:51ee22e230c7 46 {
vinbel93 20:f0932bfe09ed 47 if(startChecker())
vinbel93 20:f0932bfe09ed 48 {
vinbel93 20:f0932bfe09ed 49 state = TYPE;
vinbel93 20:f0932bfe09ed 50 m_Counter = 0;
vinbel93 20:f0932bfe09ed 51 }
vinbel93 20:f0932bfe09ed 52 else
vinbel93 20:f0932bfe09ed 53 {
manl2003 27:011ad1667040 54 //Frame drop
vinbel93 20:f0932bfe09ed 55 _decodeError();
vinbel93 20:f0932bfe09ed 56 state = PREAMBLE;
vinbel93 20:f0932bfe09ed 57 init();
vinbel93 20:f0932bfe09ed 58 }
vinbel93 20:f0932bfe09ed 59 }
manl2003 10:51ee22e230c7 60 }break;
manl2003 10:51ee22e230c7 61 case TYPE :
manl2003 10:51ee22e230c7 62 {
manl2003 27:011ad1667040 63 //8 bits de type
manl2003 10:51ee22e230c7 64 m_Counter ++;
manl2003 23:d41a23d8f2d7 65 if(m_Counter >= 8)
manl2003 10:51ee22e230c7 66 {
manl2003 10:51ee22e230c7 67 state = LENGTH;
manl2003 10:51ee22e230c7 68 m_Counter = 0;
manl2003 10:51ee22e230c7 69 }
manl2003 10:51ee22e230c7 70
manl2003 10:51ee22e230c7 71 }break;
manl2003 10:51ee22e230c7 72 case LENGTH :
manl2003 10:51ee22e230c7 73 {
manl2003 27:011ad1667040 74 //Longueur du data
manl2003 10:51ee22e230c7 75 m_InputBuffer[m_Counter] = bit;
manl2003 10:51ee22e230c7 76 m_Counter++;
manl2003 23:d41a23d8f2d7 77 if(m_Counter >= 8)
manl2003 10:51ee22e230c7 78 {
manl2003 10:51ee22e230c7 79 state = DATA;
manl2003 10:51ee22e230c7 80 m_DataSize = calculateSize();
manl2003 10:51ee22e230c7 81 m_Counter = 0;
manl2003 10:51ee22e230c7 82 }
manl2003 10:51ee22e230c7 83
manl2003 10:51ee22e230c7 84 }break;
manl2003 10:51ee22e230c7 85 case DATA :
manl2003 10:51ee22e230c7 86 {
manl2003 27:011ad1667040 87 //Interprétation du data
manl2003 12:715af3660c73 88 m_BSPayload[m_Counter] = bit;
vinbel93 20:f0932bfe09ed 89 if (((m_Counter + 1) % 8) == 0 && m_Counter != 0)
manl2003 12:715af3660c73 90 {
vinbel93 20:f0932bfe09ed 91 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 92 }
manl2003 12:715af3660c73 93 m_Counter++;
manl2003 23:d41a23d8f2d7 94 if(m_Counter >= m_DataSize*8)
manl2003 12:715af3660c73 95 {
manl2003 12:715af3660c73 96 state = CRC16STATE;
vinbel93 20:f0932bfe09ed 97 m_CRC = CRC16::calculateCRC16(m_CPayload, m_DataSize);
vinbel93 20:f0932bfe09ed 98 m_Counter = 0;
manl2003 12:715af3660c73 99 }
manl2003 10:51ee22e230c7 100 }break;
manl2003 12:715af3660c73 101 case CRC16STATE :
manl2003 10:51ee22e230c7 102 {
manl2003 27:011ad1667040 103 //Réception du checksum et calcul
manl2003 12:715af3660c73 104 m_InputBuffer[m_Counter] = bit;
manl2003 12:715af3660c73 105 m_Counter++;
manl2003 23:d41a23d8f2d7 106 if(m_Counter >= 16)
manl2003 12:715af3660c73 107 {
manl2003 12:715af3660c73 108 if(!compareCRC())
manl2003 12:715af3660c73 109 {
manl2003 27:011ad1667040 110 //Frame drop
vinbel93 20:f0932bfe09ed 111 _decodeError();
vinbel93 20:f0932bfe09ed 112 state = PREAMBLE;
vinbel93 20:f0932bfe09ed 113 init();
manl2003 12:715af3660c73 114 }
manl2003 16:cf433716f8d6 115 else
manl2003 16:cf433716f8d6 116 {
vinbel93 20:f0932bfe09ed 117 state = END;
manl2003 16:cf433716f8d6 118 }
manl2003 12:715af3660c73 119 m_Counter = 0;
manl2003 12:715af3660c73 120 }
manl2003 10:51ee22e230c7 121
manl2003 10:51ee22e230c7 122 }break;
manl2003 10:51ee22e230c7 123 case END :
manl2003 10:51ee22e230c7 124 {
manl2003 27:011ad1667040 125 //Calcul du byte de fin
manl2003 12:715af3660c73 126 m_InputBuffer[m_Counter] = bit;
manl2003 12:715af3660c73 127 m_Counter++;
manl2003 23:d41a23d8f2d7 128 if(m_Counter >= 8)
manl2003 12:715af3660c73 129 {
vinbel93 20:f0932bfe09ed 130 if(startChecker())
vinbel93 20:f0932bfe09ed 131 {
vinbel93 20:f0932bfe09ed 132 state = PREAMBLE;
vinbel93 20:f0932bfe09ed 133 m_Counter = 0;
manl2003 27:011ad1667040 134 //Message complet, appel du callback
vinbel93 20:f0932bfe09ed 135 _decodeCallback(m_BSPayload, m_DataSize);
vinbel93 20:f0932bfe09ed 136 }
vinbel93 20:f0932bfe09ed 137 else
vinbel93 20:f0932bfe09ed 138 {
vinbel93 20:f0932bfe09ed 139 _decodeError();
vinbel93 20:f0932bfe09ed 140 state = PREAMBLE;
vinbel93 20:f0932bfe09ed 141 init();
vinbel93 20:f0932bfe09ed 142 }
manl2003 12:715af3660c73 143 }
vinbel93 20:f0932bfe09ed 144
manl2003 10:51ee22e230c7 145 }break;
manl2003 10:51ee22e230c7 146 }
manl2003 27:011ad1667040 147 //Callback pour avertir le main d'un changement d'état
manl2003 16:cf433716f8d6 148 _updateState(state);
manl2003 10:51ee22e230c7 149 }
manl2003 10:51ee22e230c7 150
manl2003 10:51ee22e230c7 151 bool MEF::preambleChecker()
manl2003 10:51ee22e230c7 152 {
manl2003 10:51ee22e230c7 153 bool temp = false;
manl2003 10:51ee22e230c7 154 bool resultTest1 = true, resultTest2 = true;
manl2003 10:51ee22e230c7 155 for(int i = 0; i < 8; i++)
manl2003 10:51ee22e230c7 156 {
manl2003 10:51ee22e230c7 157 if(m_InputBuffer[i] != temp)
manl2003 10:51ee22e230c7 158 {
manl2003 10:51ee22e230c7 159 resultTest1 = false;
manl2003 10:51ee22e230c7 160 }
manl2003 10:51ee22e230c7 161 if(m_InputBuffer[i] == temp)
manl2003 10:51ee22e230c7 162 {
manl2003 10:51ee22e230c7 163 resultTest2 = false;
manl2003 10:51ee22e230c7 164 }
manl2003 10:51ee22e230c7 165 temp = !temp;
manl2003 10:51ee22e230c7 166 }
manl2003 10:51ee22e230c7 167 return resultTest1 || resultTest2;
manl2003 10:51ee22e230c7 168 }
manl2003 10:51ee22e230c7 169
manl2003 10:51ee22e230c7 170 bool MEF::startChecker()
manl2003 10:51ee22e230c7 171 {
manl2003 10:51ee22e230c7 172 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 173 {
manl2003 10:51ee22e230c7 174 return true;
manl2003 10:51ee22e230c7 175 }
manl2003 10:51ee22e230c7 176 return false;
manl2003 10:51ee22e230c7 177 }
manl2003 10:51ee22e230c7 178
manl2003 10:51ee22e230c7 179 int MEF::calculateSize()
manl2003 10:51ee22e230c7 180 {
manl2003 10:51ee22e230c7 181 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 182 }
manl2003 12:715af3660c73 183
manl2003 12:715af3660c73 184 bool MEF::compareCRC()
manl2003 12:715af3660c73 185 {
vinbel93 20:f0932bfe09ed 186 unsigned short incommingCRC = (m_InputBuffer[0] << 15) |
vinbel93 20:f0932bfe09ed 187 (m_InputBuffer[1] << 14) |
vinbel93 20:f0932bfe09ed 188 (m_InputBuffer[2] << 13) |
vinbel93 20:f0932bfe09ed 189 (m_InputBuffer[3] << 12) |
vinbel93 20:f0932bfe09ed 190 (m_InputBuffer[4] << 11) |
vinbel93 20:f0932bfe09ed 191 (m_InputBuffer[5] << 10) |
vinbel93 20:f0932bfe09ed 192 (m_InputBuffer[6] << 9) |
vinbel93 20:f0932bfe09ed 193 (m_InputBuffer[7] << 8) |
vinbel93 20:f0932bfe09ed 194 (m_InputBuffer[8] << 7) |
vinbel93 20:f0932bfe09ed 195 (m_InputBuffer[9] << 6) |
vinbel93 20:f0932bfe09ed 196 (m_InputBuffer[10] << 5) |
vinbel93 20:f0932bfe09ed 197 (m_InputBuffer[11] << 4) |
vinbel93 20:f0932bfe09ed 198 (m_InputBuffer[12] << 3) |
vinbel93 20:f0932bfe09ed 199 (m_InputBuffer[13] << 2) |
vinbel93 20:f0932bfe09ed 200 (m_InputBuffer[14] << 1) |
vinbel93 20:f0932bfe09ed 201 (m_InputBuffer[15] << 0);
vinbel93 20:f0932bfe09ed 202
manl2003 12:715af3660c73 203 return m_CRC == incommingCRC;
manl2003 12:715af3660c73 204 }
manl2003 12:715af3660c73 205