APP 4

Dependencies:   mbed CRC16 mbed-rtos

Committer:
vinbel93
Date:
Tue Feb 23 03:52:19 2016 +0000
Revision:
22:b855dbf3a8c1
Parent:
20:f0932bfe09ed
asdf

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