APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
vinbel93
Date:
Tue Feb 23 00:22:49 2016 +0000
Revision:
20:f0932bfe09ed
Parent:
19:41e914ab0d19
Child:
21:137d010e7469
Child:
22:b855dbf3a8c1
Child:
23:d41a23d8f2d7
final v1

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