APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
manl2003
Date:
Tue Feb 23 15:57:09 2016 +0000
Revision:
24:e307f6aad106
Parent:
23:d41a23d8f2d7
Chat pas fonctionnel

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manl2003 2:1250280a511b 1 #include "APP.h"
vinbel93 3:3ffa14e75b8a 2 #include "Manchester.h"
vinbel93 9:b937f9c6d682 3 #include "Frame.h"
vinbel93 14:9505b98c6623 4 #include "MEF.h"
vinbel93 0:ac5e42371639 5
vinbel93 0:ac5e42371639 6 Serial pc(USBTX, USBRX);
vinbel93 13:195826b8c61b 7 DigitalOut out(p8);
vinbel93 13:195826b8c61b 8 DigitalIn in(p30);
vinbel93 0:ac5e42371639 9
vinbel93 6:3181f546e812 10 bool clockTick = false;
vinbel93 20:f0932bfe09ed 11 bitset<FRAMESIZE> message;
manl2003 12:715af3660c73 12 bitset<MAX_DATA> decodedMessage;
vinbel93 20:f0932bfe09ed 13 int debugMessage;
vinbel93 20:f0932bfe09ed 14 bool debugMessageReady = false;
manl2003 12:715af3660c73 15 bool dataReady;
manl2003 12:715af3660c73 16 bool frameDropped;
vinbel93 3:3ffa14e75b8a 17 int counter = 0;
vinbel93 13:195826b8c61b 18 unsigned int period = 0;
vinbel93 20:f0932bfe09ed 19 unsigned int currentClocks = 0;
vinbel93 20:f0932bfe09ed 20 bool periodCalculated = false;
vinbel93 14:9505b98c6623 21 MEF mef;
manl2003 16:cf433716f8d6 22 STATES mefSTATE;
vinbel93 20:f0932bfe09ed 23 int payloadSize = 0;
manl2003 23:d41a23d8f2d7 24 bool swag = false;
manl2003 23:d41a23d8f2d7 25 bool asdf = false;
manl2003 23:d41a23d8f2d7 26 int messageLength = 4;
manl2003 23:d41a23d8f2d7 27 bool buffer[16];
manl2003 23:d41a23d8f2d7 28 int bufferCounter = 0;
manl2003 23:d41a23d8f2d7 29 bool firstBit = true;
manl2003 23:d41a23d8f2d7 30 STATES tempState = NOSTATE;
manl2003 24:e307f6aad106 31 Mail<Message, 16> mailBox;
manl2003 24:e307f6aad106 32 Mutex mute;
manl2003 24:e307f6aad106 33 bool sendMessageReady;
vinbel93 0:ac5e42371639 34
vinbel93 1:f212b6676849 35 int benchmark(void (*function) (void))
vinbel93 0:ac5e42371639 36 {
vinbel93 3:3ffa14e75b8a 37 int count = LPC_TIM2->TC;
vinbel93 0:ac5e42371639 38 function();
vinbel93 3:3ffa14e75b8a 39 return LPC_TIM2->TC - count;
vinbel93 0:ac5e42371639 40 }
vinbel93 0:ac5e42371639 41
vinbel93 13:195826b8c61b 42 extern "C" void TIMER1_IRQHandler()
vinbel93 0:ac5e42371639 43 {
vinbel93 13:195826b8c61b 44 if ((LPC_TIM1->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
vinbel93 0:ac5e42371639 45 {
vinbel93 6:3181f546e812 46
manl2003 24:e307f6aad106 47 if(sendMessageReady)
vinbel93 0:ac5e42371639 48 {
manl2003 24:e307f6aad106 49 clockTick = !clockTick;
manl2003 24:e307f6aad106 50 out = encode(message[counter], clockTick);
manl2003 24:e307f6aad106 51
manl2003 24:e307f6aad106 52 if (clockTick)
manl2003 24:e307f6aad106 53 {
manl2003 24:e307f6aad106 54 counter++;
manl2003 24:e307f6aad106 55 }
manl2003 24:e307f6aad106 56
manl2003 24:e307f6aad106 57 if (counter >= 56+messageLength*8)
manl2003 24:e307f6aad106 58 {
manl2003 24:e307f6aad106 59 counter = 0;
manl2003 24:e307f6aad106 60 sendMessageReady = false;
manl2003 24:e307f6aad106 61 }
vinbel93 0:ac5e42371639 62 }
manl2003 23:d41a23d8f2d7 63 LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag
vinbel93 0:ac5e42371639 64 }
vinbel93 0:ac5e42371639 65 }
vinbel93 13:195826b8c61b 66
vinbel93 13:195826b8c61b 67 extern "C" void TIMER2_IRQHandler()
manl2003 10:51ee22e230c7 68 {
vinbel93 13:195826b8c61b 69 unsigned int clocks = LPC_TIM2->CR0;
vinbel93 20:f0932bfe09ed 70 bool inputValue = in.read();
manl2003 10:51ee22e230c7 71
vinbel93 20:f0932bfe09ed 72 // Discard first bit
vinbel93 20:f0932bfe09ed 73 if (!periodCalculated && !firstBit)
vinbel93 13:195826b8c61b 74 {
vinbel93 20:f0932bfe09ed 75 period = clocks / 2;
vinbel93 20:f0932bfe09ed 76 periodCalculated = true;
vinbel93 13:195826b8c61b 77 }
vinbel93 20:f0932bfe09ed 78
vinbel93 20:f0932bfe09ed 79 if (firstBit)
vinbel93 13:195826b8c61b 80 {
manl2003 23:d41a23d8f2d7 81 swag = true;
manl2003 23:d41a23d8f2d7 82 asdf = !inputValue;
vinbel93 20:f0932bfe09ed 83 mef.ReceiveBit(!inputValue);
vinbel93 20:f0932bfe09ed 84 firstBit = false;
vinbel93 13:195826b8c61b 85 }
manl2003 10:51ee22e230c7 86
vinbel93 20:f0932bfe09ed 87 if (periodCalculated)
vinbel93 20:f0932bfe09ed 88 {
vinbel93 20:f0932bfe09ed 89 if (clocks >= period*1.5 || (currentClocks + clocks) >= period*1.5)
vinbel93 20:f0932bfe09ed 90 {
vinbel93 20:f0932bfe09ed 91 currentClocks = 0;
manl2003 23:d41a23d8f2d7 92 swag = true;
manl2003 23:d41a23d8f2d7 93 asdf = !inputValue;
vinbel93 20:f0932bfe09ed 94 mef.ReceiveBit(!inputValue);
vinbel93 20:f0932bfe09ed 95 }
vinbel93 20:f0932bfe09ed 96 else
vinbel93 20:f0932bfe09ed 97 {
vinbel93 20:f0932bfe09ed 98 currentClocks += clocks;
vinbel93 20:f0932bfe09ed 99 }
vinbel93 20:f0932bfe09ed 100 }
vinbel93 20:f0932bfe09ed 101
vinbel93 13:195826b8c61b 102 LPC_TIM2->TC = 0;
manl2003 10:51ee22e230c7 103
vinbel93 13:195826b8c61b 104 LPC_TIM2->IR |= 0xFFFFFFFF; // clear Timer interrupt register
vinbel93 13:195826b8c61b 105 }
vinbel93 13:195826b8c61b 106
manl2003 7:733d500dbe5c 107 void initTimers()
vinbel93 0:ac5e42371639 108 {
vinbel93 13:195826b8c61b 109 //Timer 1 (match)
vinbel93 13:195826b8c61b 110 LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1
manl2003 10:51ee22e230c7 111 LPC_SC->PCONP |= (1 << 2); // timer1 power on
manl2003 23:d41a23d8f2d7 112 LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 100 ms
manl2003 10:51ee22e230c7 113 LPC_TIM1->MCR = 3; // interrupt and reset control
vinbel93 13:195826b8c61b 114 // Interrupt & reset timer on match
vinbel93 13:195826b8c61b 115 LPC_TIM1->EMR = (3 << 4);
vinbel93 13:195826b8c61b 116 NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt
vinbel93 13:195826b8c61b 117 LPC_TIM1->TCR = 1; // enable Timer
vinbel93 13:195826b8c61b 118
vinbel93 13:195826b8c61b 119 //Timer 2 (cap)
vinbel93 13:195826b8c61b 120 LPC_SC->PCLKSEL1 |= (1 << 12); // pclk = cclk timer2
vinbel93 13:195826b8c61b 121 LPC_SC->PCONP |= (1 << 22); // timer2 power on
vinbel93 13:195826b8c61b 122 LPC_TIM2->TC = 0; // clear timer counter
vinbel93 13:195826b8c61b 123 LPC_TIM2->PC = 0; // clear prescale counter
vinbel93 13:195826b8c61b 124 LPC_TIM2->PR = 0; // clear prescale register
vinbel93 13:195826b8c61b 125 LPC_TIM2->TCR |= (1 << 1); // reset timer
vinbel93 13:195826b8c61b 126 LPC_TIM2->TCR &= ~(1 << 1); // release reset
vinbel93 13:195826b8c61b 127 LPC_TIM2->IR = 0xFFFFFFFF; // clear interrupt register
vinbel93 13:195826b8c61b 128 LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture on 2.0
vinbel93 13:195826b8c61b 129 NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt
vinbel93 13:195826b8c61b 130 LPC_TIM2->TCR = 1; // start Timer
vinbel93 0:ac5e42371639 131 }
vinbel93 0:ac5e42371639 132
manl2003 24:e307f6aad106 133
manl2003 24:e307f6aad106 134
vinbel93 1:f212b6676849 135 int main()
vinbel93 0:ac5e42371639 136 {
manl2003 24:e307f6aad106 137 //message = buildFrame(convertToBits("BLUB", messageLength), messageLength);
vinbel93 9:b937f9c6d682 138
vinbel93 13:195826b8c61b 139 LPC_PINCON->PINSEL0 |= (3 << 8); // P0.4 = CAP2.0
manl2003 8:60499583959f 140 initTimers();
manl2003 24:e307f6aad106 141 Thread term(terminal);
manl2003 23:d41a23d8f2d7 142
vinbel93 3:3ffa14e75b8a 143 while (true)
vinbel93 0:ac5e42371639 144 {
vinbel93 15:ed9511c3aac6 145 if (dataReady)
vinbel93 15:ed9511c3aac6 146 {
vinbel93 20:f0932bfe09ed 147 for (int i = 0; i < payloadSize * 8; i++)
vinbel93 20:f0932bfe09ed 148 {
vinbel93 20:f0932bfe09ed 149
vinbel93 20:f0932bfe09ed 150 if((i + 1) % 8 == 0)
vinbel93 20:f0932bfe09ed 151 {
vinbel93 20:f0932bfe09ed 152 char tempChar = (decodedMessage[i] << 0) | (decodedMessage[i - 1] << 1) | (decodedMessage[i - 2] << 2) | (decodedMessage[i - 3] << 3) | (decodedMessage[i - 4] << 4) | (decodedMessage[i - 5] << 5) | (decodedMessage[i - 6] << 6) | (decodedMessage[i - 7] << 7);
vinbel93 20:f0932bfe09ed 153 pc.printf("%c", tempChar);
vinbel93 20:f0932bfe09ed 154 }
vinbel93 20:f0932bfe09ed 155 }
vinbel93 20:f0932bfe09ed 156 dataReady = false;
vinbel93 15:ed9511c3aac6 157 }
manl2003 23:d41a23d8f2d7 158
manl2003 24:e307f6aad106 159 osEvent evt = mailBox.get();
manl2003 24:e307f6aad106 160 if (evt.status == osEventMail)
manl2003 24:e307f6aad106 161 {
manl2003 24:e307f6aad106 162 mute.lock();
manl2003 24:e307f6aad106 163 // écriture de l'événement en sortie (port série)
manl2003 24:e307f6aad106 164 Message *mail = (Message*)evt.value.p;
manl2003 24:e307f6aad106 165 messageLength = mail->size;
manl2003 24:e307f6aad106 166 pc.printf("Envoie de %i bytes, %c \r\n", messageLength, mail->buffer[0]);
manl2003 24:e307f6aad106 167 message = buildFrame(convertToBits(mail->buffer, messageLength), messageLength);
manl2003 24:e307f6aad106 168 mailBox.free(mail);
manl2003 24:e307f6aad106 169 sendMessageReady = true;
manl2003 24:e307f6aad106 170 mute.unlock();
manl2003 24:e307f6aad106 171 }
manl2003 23:d41a23d8f2d7 172
manl2003 23:d41a23d8f2d7 173
manl2003 23:d41a23d8f2d7 174 #if DEBUG
manl2003 23:d41a23d8f2d7 175 debugPrint();
manl2003 23:d41a23d8f2d7 176 #endif
vinbel93 0:ac5e42371639 177 }
vinbel93 0:ac5e42371639 178 }
manl2003 12:715af3660c73 179
vinbel93 20:f0932bfe09ed 180 void _decodeCallback(bitset<MAX_DATA> decMessage, int size)
manl2003 12:715af3660c73 181 {
vinbel93 17:8d8c33bdcaf5 182 decodedMessage = decMessage;
vinbel93 20:f0932bfe09ed 183 payloadSize = size;
vinbel93 17:8d8c33bdcaf5 184 dataReady = true;
manl2003 12:715af3660c73 185 }
manl2003 12:715af3660c73 186
vinbel93 14:9505b98c6623 187 void _decodeError()
manl2003 12:715af3660c73 188 {
manl2003 12:715af3660c73 189 frameDropped = true;
manl2003 23:d41a23d8f2d7 190 periodCalculated = false;
manl2003 23:d41a23d8f2d7 191 period = 0;
vinbel93 17:8d8c33bdcaf5 192 }
vinbel93 17:8d8c33bdcaf5 193
manl2003 16:cf433716f8d6 194 void _updateState(STATES state)
manl2003 16:cf433716f8d6 195 {
vinbel93 18:493a5aa7e4ec 196 mefSTATE = state;
vinbel93 18:493a5aa7e4ec 197 }
vinbel93 18:493a5aa7e4ec 198
vinbel93 20:f0932bfe09ed 199 void _mefDebug(int blu)
vinbel93 17:8d8c33bdcaf5 200 {
vinbel93 20:f0932bfe09ed 201 debugMessage = blu;
vinbel93 20:f0932bfe09ed 202 debugMessageReady = true;
vinbel93 20:f0932bfe09ed 203 }
manl2003 23:d41a23d8f2d7 204
manl2003 23:d41a23d8f2d7 205 void debugPrint()
manl2003 23:d41a23d8f2d7 206 {
manl2003 23:d41a23d8f2d7 207 if (tempState != mefSTATE)
manl2003 23:d41a23d8f2d7 208 {
manl2003 23:d41a23d8f2d7 209 pc.printf("\r\nNew state: %i \r\n", mefSTATE);
manl2003 23:d41a23d8f2d7 210 tempState = mefSTATE;
manl2003 23:d41a23d8f2d7 211 }
manl2003 23:d41a23d8f2d7 212 if(frameDropped)
manl2003 23:d41a23d8f2d7 213 {
manl2003 23:d41a23d8f2d7 214 pc.printf("Frame dropped\r\n");
manl2003 23:d41a23d8f2d7 215 frameDropped = false;
manl2003 23:d41a23d8f2d7 216 }
manl2003 23:d41a23d8f2d7 217 if(debugMessageReady)
manl2003 23:d41a23d8f2d7 218 {
manl2003 23:d41a23d8f2d7 219 pc.printf("%i\r\n", debugMessage);
manl2003 23:d41a23d8f2d7 220 debugMessageReady = false;
manl2003 23:d41a23d8f2d7 221 }
manl2003 23:d41a23d8f2d7 222
manl2003 23:d41a23d8f2d7 223 if (swag)
manl2003 23:d41a23d8f2d7 224 {
manl2003 23:d41a23d8f2d7 225 pc.printf("%i ", asdf);
manl2003 23:d41a23d8f2d7 226 swag = false;
manl2003 23:d41a23d8f2d7 227 }
manl2003 23:d41a23d8f2d7 228 }
manl2003 24:e307f6aad106 229
manl2003 24:e307f6aad106 230 void terminal(void const *args)
manl2003 24:e307f6aad106 231 {
manl2003 24:e307f6aad106 232 char messageBuffer[80];
manl2003 24:e307f6aad106 233 int bufferCounter = 0;
manl2003 24:e307f6aad106 234 char temp;
manl2003 24:e307f6aad106 235 while(true)
manl2003 24:e307f6aad106 236 {
manl2003 24:e307f6aad106 237 if(pc.readable())
manl2003 24:e307f6aad106 238 {
manl2003 24:e307f6aad106 239 temp = pc.getc();
manl2003 24:e307f6aad106 240 if(temp == 0x0D)
manl2003 24:e307f6aad106 241 {
manl2003 24:e307f6aad106 242 pc.printf("Debug send %c , %i\r\n", messageBuffer[0], bufferCounter);
manl2003 24:e307f6aad106 243 mute.lock();
manl2003 24:e307f6aad106 244
manl2003 24:e307f6aad106 245 Message * mes = mailBox.alloc();
manl2003 24:e307f6aad106 246 memcpy(mes->buffer, messageBuffer, bufferCounter);
manl2003 24:e307f6aad106 247 mes->size = bufferCounter;
manl2003 24:e307f6aad106 248 mailBox.put(mes);
manl2003 24:e307f6aad106 249
manl2003 24:e307f6aad106 250 mute.unlock();
manl2003 24:e307f6aad106 251
manl2003 24:e307f6aad106 252 bufferCounter = 0;
manl2003 24:e307f6aad106 253 }
manl2003 24:e307f6aad106 254 else
manl2003 24:e307f6aad106 255 {
manl2003 24:e307f6aad106 256 pc.printf("%c", temp);
manl2003 24:e307f6aad106 257 messageBuffer[bufferCounter] = temp;
manl2003 24:e307f6aad106 258 bufferCounter++;
manl2003 24:e307f6aad106 259 }
manl2003 24:e307f6aad106 260 }
manl2003 24:e307f6aad106 261 }
manl2003 24:e307f6aad106 262 }