APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
manl2003
Date:
Tue Feb 23 14:50:48 2016 +0000
Revision:
23:d41a23d8f2d7
Parent:
20:f0932bfe09ed
Child:
24:e307f6aad106
Child:
25:a3e06778c54b
Child:
26:f2b37f9dfca9
Mef fix et wrappage du code de debug

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;
vinbel93 0:ac5e42371639 31
vinbel93 1:f212b6676849 32 int benchmark(void (*function) (void))
vinbel93 0:ac5e42371639 33 {
vinbel93 3:3ffa14e75b8a 34 int count = LPC_TIM2->TC;
vinbel93 0:ac5e42371639 35 function();
vinbel93 3:3ffa14e75b8a 36 return LPC_TIM2->TC - count;
vinbel93 0:ac5e42371639 37 }
vinbel93 0:ac5e42371639 38
vinbel93 13:195826b8c61b 39 extern "C" void TIMER1_IRQHandler()
vinbel93 0:ac5e42371639 40 {
vinbel93 13:195826b8c61b 41 if ((LPC_TIM1->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
vinbel93 0:ac5e42371639 42 {
vinbel93 6:3181f546e812 43 clockTick = !clockTick;
vinbel93 20:f0932bfe09ed 44 out = encode(message[counter], clockTick);
vinbel93 6:3181f546e812 45
vinbel93 6:3181f546e812 46 if (clockTick)
vinbel93 0:ac5e42371639 47 {
vinbel93 6:3181f546e812 48 counter++;
vinbel93 0:ac5e42371639 49 }
vinbel93 6:3181f546e812 50
manl2003 23:d41a23d8f2d7 51 if (counter >= 56+messageLength*8)
vinbel93 0:ac5e42371639 52 {
manl2003 23:d41a23d8f2d7 53 counter = 0;
vinbel93 0:ac5e42371639 54 }
manl2003 23:d41a23d8f2d7 55
manl2003 23:d41a23d8f2d7 56 LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag
vinbel93 0:ac5e42371639 57 }
vinbel93 0:ac5e42371639 58 }
vinbel93 13:195826b8c61b 59
vinbel93 13:195826b8c61b 60 extern "C" void TIMER2_IRQHandler()
manl2003 10:51ee22e230c7 61 {
vinbel93 13:195826b8c61b 62 unsigned int clocks = LPC_TIM2->CR0;
vinbel93 20:f0932bfe09ed 63 bool inputValue = in.read();
manl2003 10:51ee22e230c7 64
vinbel93 20:f0932bfe09ed 65 // Discard first bit
vinbel93 20:f0932bfe09ed 66 if (!periodCalculated && !firstBit)
vinbel93 13:195826b8c61b 67 {
vinbel93 20:f0932bfe09ed 68 period = clocks / 2;
vinbel93 20:f0932bfe09ed 69 periodCalculated = true;
vinbel93 13:195826b8c61b 70 }
vinbel93 20:f0932bfe09ed 71
vinbel93 20:f0932bfe09ed 72 if (firstBit)
vinbel93 13:195826b8c61b 73 {
manl2003 23:d41a23d8f2d7 74 swag = true;
manl2003 23:d41a23d8f2d7 75 asdf = !inputValue;
vinbel93 20:f0932bfe09ed 76 mef.ReceiveBit(!inputValue);
vinbel93 20:f0932bfe09ed 77 firstBit = false;
vinbel93 13:195826b8c61b 78 }
manl2003 10:51ee22e230c7 79
vinbel93 20:f0932bfe09ed 80 if (periodCalculated)
vinbel93 20:f0932bfe09ed 81 {
vinbel93 20:f0932bfe09ed 82 if (clocks >= period*1.5 || (currentClocks + clocks) >= period*1.5)
vinbel93 20:f0932bfe09ed 83 {
vinbel93 20:f0932bfe09ed 84 currentClocks = 0;
manl2003 23:d41a23d8f2d7 85 swag = true;
manl2003 23:d41a23d8f2d7 86 asdf = !inputValue;
vinbel93 20:f0932bfe09ed 87 mef.ReceiveBit(!inputValue);
vinbel93 20:f0932bfe09ed 88 }
vinbel93 20:f0932bfe09ed 89 else
vinbel93 20:f0932bfe09ed 90 {
vinbel93 20:f0932bfe09ed 91 currentClocks += clocks;
vinbel93 20:f0932bfe09ed 92 }
vinbel93 20:f0932bfe09ed 93 }
vinbel93 20:f0932bfe09ed 94
vinbel93 13:195826b8c61b 95 LPC_TIM2->TC = 0;
manl2003 10:51ee22e230c7 96
vinbel93 13:195826b8c61b 97 LPC_TIM2->IR |= 0xFFFFFFFF; // clear Timer interrupt register
vinbel93 13:195826b8c61b 98 }
vinbel93 13:195826b8c61b 99
manl2003 7:733d500dbe5c 100 void initTimers()
vinbel93 0:ac5e42371639 101 {
vinbel93 13:195826b8c61b 102 //Timer 1 (match)
vinbel93 13:195826b8c61b 103 LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1
manl2003 10:51ee22e230c7 104 LPC_SC->PCONP |= (1 << 2); // timer1 power on
manl2003 23:d41a23d8f2d7 105 LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 100 ms
manl2003 10:51ee22e230c7 106 LPC_TIM1->MCR = 3; // interrupt and reset control
vinbel93 13:195826b8c61b 107 // Interrupt & reset timer on match
vinbel93 13:195826b8c61b 108 LPC_TIM1->EMR = (3 << 4);
vinbel93 13:195826b8c61b 109 NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt
vinbel93 13:195826b8c61b 110 LPC_TIM1->TCR = 1; // enable Timer
vinbel93 13:195826b8c61b 111
vinbel93 13:195826b8c61b 112 //Timer 2 (cap)
vinbel93 13:195826b8c61b 113 LPC_SC->PCLKSEL1 |= (1 << 12); // pclk = cclk timer2
vinbel93 13:195826b8c61b 114 LPC_SC->PCONP |= (1 << 22); // timer2 power on
vinbel93 13:195826b8c61b 115 LPC_TIM2->TC = 0; // clear timer counter
vinbel93 13:195826b8c61b 116 LPC_TIM2->PC = 0; // clear prescale counter
vinbel93 13:195826b8c61b 117 LPC_TIM2->PR = 0; // clear prescale register
vinbel93 13:195826b8c61b 118 LPC_TIM2->TCR |= (1 << 1); // reset timer
vinbel93 13:195826b8c61b 119 LPC_TIM2->TCR &= ~(1 << 1); // release reset
vinbel93 13:195826b8c61b 120 LPC_TIM2->IR = 0xFFFFFFFF; // clear interrupt register
vinbel93 13:195826b8c61b 121 LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture on 2.0
vinbel93 13:195826b8c61b 122 NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt
vinbel93 13:195826b8c61b 123 LPC_TIM2->TCR = 1; // start Timer
vinbel93 0:ac5e42371639 124 }
vinbel93 0:ac5e42371639 125
vinbel93 1:f212b6676849 126 int main()
vinbel93 0:ac5e42371639 127 {
manl2003 23:d41a23d8f2d7 128 message = buildFrame(convertToBits("BLUB", messageLength), messageLength);
vinbel93 9:b937f9c6d682 129
vinbel93 13:195826b8c61b 130 LPC_PINCON->PINSEL0 |= (3 << 8); // P0.4 = CAP2.0
manl2003 8:60499583959f 131 initTimers();
manl2003 23:d41a23d8f2d7 132
vinbel93 3:3ffa14e75b8a 133 while (true)
vinbel93 0:ac5e42371639 134 {
vinbel93 15:ed9511c3aac6 135 if (dataReady)
vinbel93 15:ed9511c3aac6 136 {
vinbel93 20:f0932bfe09ed 137 for (int i = 0; i < payloadSize * 8; i++)
vinbel93 20:f0932bfe09ed 138 {
vinbel93 20:f0932bfe09ed 139
vinbel93 20:f0932bfe09ed 140 if((i + 1) % 8 == 0)
vinbel93 20:f0932bfe09ed 141 {
vinbel93 20:f0932bfe09ed 142 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 143 pc.printf("%c", tempChar);
vinbel93 20:f0932bfe09ed 144 }
vinbel93 20:f0932bfe09ed 145 }
vinbel93 20:f0932bfe09ed 146 dataReady = false;
vinbel93 15:ed9511c3aac6 147 }
manl2003 23:d41a23d8f2d7 148
manl2003 23:d41a23d8f2d7 149
manl2003 23:d41a23d8f2d7 150
manl2003 23:d41a23d8f2d7 151 #if DEBUG
manl2003 23:d41a23d8f2d7 152 debugPrint();
manl2003 23:d41a23d8f2d7 153 #endif
vinbel93 0:ac5e42371639 154 }
vinbel93 0:ac5e42371639 155 }
manl2003 12:715af3660c73 156
vinbel93 20:f0932bfe09ed 157 void bSToChar(bitset<8> bs)
vinbel93 20:f0932bfe09ed 158 {
vinbel93 20:f0932bfe09ed 159
vinbel93 20:f0932bfe09ed 160 }
vinbel93 20:f0932bfe09ed 161
vinbel93 20:f0932bfe09ed 162 void _decodeCallback(bitset<MAX_DATA> decMessage, int size)
manl2003 12:715af3660c73 163 {
vinbel93 17:8d8c33bdcaf5 164 decodedMessage = decMessage;
vinbel93 20:f0932bfe09ed 165 payloadSize = size;
vinbel93 17:8d8c33bdcaf5 166 dataReady = true;
manl2003 12:715af3660c73 167 }
manl2003 12:715af3660c73 168
vinbel93 14:9505b98c6623 169 void _decodeError()
manl2003 12:715af3660c73 170 {
manl2003 12:715af3660c73 171 frameDropped = true;
manl2003 23:d41a23d8f2d7 172 periodCalculated = false;
manl2003 23:d41a23d8f2d7 173 period = 0;
vinbel93 17:8d8c33bdcaf5 174 }
vinbel93 17:8d8c33bdcaf5 175
manl2003 16:cf433716f8d6 176 void _updateState(STATES state)
manl2003 16:cf433716f8d6 177 {
vinbel93 18:493a5aa7e4ec 178 mefSTATE = state;
vinbel93 18:493a5aa7e4ec 179 }
vinbel93 18:493a5aa7e4ec 180
vinbel93 20:f0932bfe09ed 181 void _mefDebug(int blu)
vinbel93 17:8d8c33bdcaf5 182 {
vinbel93 20:f0932bfe09ed 183 debugMessage = blu;
vinbel93 20:f0932bfe09ed 184 debugMessageReady = true;
vinbel93 20:f0932bfe09ed 185 }
manl2003 23:d41a23d8f2d7 186
manl2003 23:d41a23d8f2d7 187 void debugPrint()
manl2003 23:d41a23d8f2d7 188 {
manl2003 23:d41a23d8f2d7 189 if (tempState != mefSTATE)
manl2003 23:d41a23d8f2d7 190 {
manl2003 23:d41a23d8f2d7 191 pc.printf("\r\nNew state: %i \r\n", mefSTATE);
manl2003 23:d41a23d8f2d7 192 tempState = mefSTATE;
manl2003 23:d41a23d8f2d7 193 }
manl2003 23:d41a23d8f2d7 194 if(frameDropped)
manl2003 23:d41a23d8f2d7 195 {
manl2003 23:d41a23d8f2d7 196 pc.printf("Frame dropped\r\n");
manl2003 23:d41a23d8f2d7 197 frameDropped = false;
manl2003 23:d41a23d8f2d7 198 }
manl2003 23:d41a23d8f2d7 199 if(debugMessageReady)
manl2003 23:d41a23d8f2d7 200 {
manl2003 23:d41a23d8f2d7 201 pc.printf("%i\r\n", debugMessage);
manl2003 23:d41a23d8f2d7 202 debugMessageReady = false;
manl2003 23:d41a23d8f2d7 203 }
manl2003 23:d41a23d8f2d7 204
manl2003 23:d41a23d8f2d7 205 if (swag)
manl2003 23:d41a23d8f2d7 206 {
manl2003 23:d41a23d8f2d7 207 pc.printf("%i ", asdf);
manl2003 23:d41a23d8f2d7 208 swag = false;
manl2003 23:d41a23d8f2d7 209 }
manl2003 23:d41a23d8f2d7 210 }