APP 4
Dependencies: mbed CRC16 mbed-rtos
APP.cpp@24:e307f6aad106, 2016-02-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |