APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
vinbel93
Date:
Tue Feb 23 15:58:49 2016 +0000
Revision:
25:a3e06778c54b
Parent:
23:d41a23d8f2d7
profiling-ish

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