Problematique

Dependencies:   mbed mbed-rtos

Committer:
RufflesAllD
Date:
Tue Feb 11 15:15:23 2014 +0000
Revision:
2:db7c8378b324
Parent:
1:261bb31628e8
Child:
3:65845faafbb1
almost done, remain signal acquirement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joGenie 0:dc7095ab4963 1 #include "mbed.h"
RufflesAllD 1:261bb31628e8 2 #include "rtos.h"
RufflesAllD 2:db7c8378b324 3 #include "trame.hpp"
joGenie 0:dc7095ab4963 4
joGenie 0:dc7095ab4963 5 Serial pc(USBTX, USBRX);
joGenie 0:dc7095ab4963 6
RufflesAllD 2:db7c8378b324 7 int tickPerPeriod = 9600;
RufflesAllD 2:db7c8378b324 8
RufflesAllD 2:db7c8378b324 9 Queue<string, 16> textToSend;
RufflesAllD 2:db7c8378b324 10 Mail<trame, 16> trameToSend;
RufflesAllD 2:db7c8378b324 11
RufflesAllD 2:db7c8378b324 12 Mail<trame, 16> trameToDecode;
RufflesAllD 2:db7c8378b324 13 Queue<string, 16> textToPrint;
RufflesAllD 2:db7c8378b324 14
RufflesAllD 2:db7c8378b324 15 void getText(void const *args)
RufflesAllD 2:db7c8378b324 16 {
RufflesAllD 2:db7c8378b324 17 int compteur = 0;
RufflesAllD 2:db7c8378b324 18 char c;
RufflesAllD 2:db7c8378b324 19 string message = "";
RufflesAllD 2:db7c8378b324 20
RufflesAllD 2:db7c8378b324 21 while (true)
RufflesAllD 2:db7c8378b324 22 {
RufflesAllD 2:db7c8378b324 23 c = pc.getc();
RufflesAllD 2:db7c8378b324 24
RufflesAllD 2:db7c8378b324 25 if (c == 0xD)
RufflesAllD 2:db7c8378b324 26 {
RufflesAllD 2:db7c8378b324 27 if (!message.empty())
RufflesAllD 2:db7c8378b324 28 {
RufflesAllD 2:db7c8378b324 29 pc.putc(0xA);
RufflesAllD 2:db7c8378b324 30 pc.putc(0xD);
RufflesAllD 2:db7c8378b324 31 textToSend.put(new string(message));
RufflesAllD 2:db7c8378b324 32 message = "";
RufflesAllD 2:db7c8378b324 33 compteur = 0;
RufflesAllD 2:db7c8378b324 34 }
RufflesAllD 2:db7c8378b324 35 }
RufflesAllD 2:db7c8378b324 36 else if (c == 0x8)
RufflesAllD 2:db7c8378b324 37 {
RufflesAllD 2:db7c8378b324 38 pc.putc(c);
RufflesAllD 2:db7c8378b324 39 pc.putc(0x20);
RufflesAllD 2:db7c8378b324 40 pc.putc(c);
RufflesAllD 2:db7c8378b324 41 message = message.substr(0, message.length() - 1);
RufflesAllD 2:db7c8378b324 42 compteur--;
RufflesAllD 2:db7c8378b324 43 }
RufflesAllD 2:db7c8378b324 44 else
RufflesAllD 2:db7c8378b324 45 {
RufflesAllD 2:db7c8378b324 46 if (compteur < 80)
RufflesAllD 2:db7c8378b324 47 {
RufflesAllD 2:db7c8378b324 48 pc.putc(c);
RufflesAllD 2:db7c8378b324 49 message += c;
RufflesAllD 2:db7c8378b324 50 compteur++;
RufflesAllD 2:db7c8378b324 51 }
RufflesAllD 2:db7c8378b324 52 }
RufflesAllD 2:db7c8378b324 53 }
RufflesAllD 2:db7c8378b324 54 }
RufflesAllD 2:db7c8378b324 55
RufflesAllD 2:db7c8378b324 56 void leTrameur(void const *args)
RufflesAllD 2:db7c8378b324 57 {
RufflesAllD 2:db7c8378b324 58 while (true)
RufflesAllD 2:db7c8378b324 59 {
RufflesAllD 2:db7c8378b324 60 osEvent evt = textToSend.get();
RufflesAllD 2:db7c8378b324 61
RufflesAllD 2:db7c8378b324 62 if (evt.status == osEventMessage) {
RufflesAllD 2:db7c8378b324 63 string *msg = (string*)evt.value.p;
RufflesAllD 2:db7c8378b324 64
RufflesAllD 2:db7c8378b324 65 //pc.printf("message envoye :\n\r%s\n\r", msg->c_str());
RufflesAllD 2:db7c8378b324 66 trameToSend.put(new trame(*msg));
RufflesAllD 2:db7c8378b324 67
RufflesAllD 2:db7c8378b324 68 delete msg;
RufflesAllD 2:db7c8378b324 69 }
RufflesAllD 2:db7c8378b324 70 }
RufflesAllD 2:db7c8378b324 71 }
joGenie 0:dc7095ab4963 72
RufflesAllD 2:db7c8378b324 73 void setPwmMatch(bitset<8> bitst)
RufflesAllD 2:db7c8378b324 74 {
RufflesAllD 2:db7c8378b324 75 for (int a = 0; a < 8; a++)
RufflesAllD 2:db7c8378b324 76 {
RufflesAllD 2:db7c8378b324 77 if (bitst.test(a))
RufflesAllD 2:db7c8378b324 78 {
RufflesAllD 2:db7c8378b324 79 LPC_PWM1->MR1 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 80 LPC_PWM1->MR2 = 1;
RufflesAllD 2:db7c8378b324 81 }
RufflesAllD 2:db7c8378b324 82 else
RufflesAllD 2:db7c8378b324 83 {
RufflesAllD 2:db7c8378b324 84 LPC_PWM1->MR1 = 1;
RufflesAllD 2:db7c8378b324 85 LPC_PWM1->MR2 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 86 }
RufflesAllD 2:db7c8378b324 87
RufflesAllD 2:db7c8378b324 88 while(LPC_PWM1->IR != 0x01);
RufflesAllD 2:db7c8378b324 89 LPC_PWM1->IR = 0xFF;
RufflesAllD 2:db7c8378b324 90 }
RufflesAllD 2:db7c8378b324 91 }
RufflesAllD 2:db7c8378b324 92
RufflesAllD 2:db7c8378b324 93 void sendTrame(trame *trm)
RufflesAllD 2:db7c8378b324 94 {
RufflesAllD 2:db7c8378b324 95 LPC_PWM1->TCR |= (1 << 0); // Enable counter
RufflesAllD 2:db7c8378b324 96
RufflesAllD 2:db7c8378b324 97 setPwmMatch(trm->preambule);
RufflesAllD 2:db7c8378b324 98 setPwmMatch(trm->start_end);
RufflesAllD 2:db7c8378b324 99 setPwmMatch(trm->type_flag);
RufflesAllD 2:db7c8378b324 100 setPwmMatch(trm->charge_utile);
RufflesAllD 2:db7c8378b324 101
RufflesAllD 2:db7c8378b324 102 for (int a = 0; a < trm->length; a++)
RufflesAllD 2:db7c8378b324 103 {
RufflesAllD 2:db7c8378b324 104 if (trm->message.test(a))
RufflesAllD 2:db7c8378b324 105 {
RufflesAllD 2:db7c8378b324 106 LPC_PWM1->MR1 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 107 LPC_PWM1->MR2 = 1;
RufflesAllD 2:db7c8378b324 108 }
RufflesAllD 2:db7c8378b324 109 else
RufflesAllD 2:db7c8378b324 110 {
RufflesAllD 2:db7c8378b324 111 LPC_PWM1->MR1 = 1;
RufflesAllD 2:db7c8378b324 112 LPC_PWM1->MR2 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 113 }
RufflesAllD 2:db7c8378b324 114
RufflesAllD 2:db7c8378b324 115 while(LPC_PWM1->IR != 0x01);
RufflesAllD 2:db7c8378b324 116 LPC_PWM1->IR = 0xFF;
RufflesAllD 2:db7c8378b324 117 }
RufflesAllD 2:db7c8378b324 118
RufflesAllD 2:db7c8378b324 119 for (int a = 0; a < 16; a++)
RufflesAllD 2:db7c8378b324 120 {
RufflesAllD 2:db7c8378b324 121 if (trm->crc16.test(a))
RufflesAllD 2:db7c8378b324 122 {
RufflesAllD 2:db7c8378b324 123 LPC_PWM1->MR1 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 124 LPC_PWM1->MR2 = 1;
RufflesAllD 2:db7c8378b324 125 }
RufflesAllD 2:db7c8378b324 126 else
RufflesAllD 2:db7c8378b324 127 {
RufflesAllD 2:db7c8378b324 128 LPC_PWM1->MR1 = 1;
RufflesAllD 2:db7c8378b324 129 LPC_PWM1->MR2 = tickPerPeriod/2;
RufflesAllD 2:db7c8378b324 130 }
RufflesAllD 2:db7c8378b324 131
RufflesAllD 2:db7c8378b324 132 while(LPC_PWM1->IR != 0x01);
RufflesAllD 2:db7c8378b324 133 LPC_PWM1->IR = 0xFF;
RufflesAllD 2:db7c8378b324 134 }
RufflesAllD 2:db7c8378b324 135
RufflesAllD 2:db7c8378b324 136 setPwmMatch(trm->start_end);
RufflesAllD 2:db7c8378b324 137
RufflesAllD 2:db7c8378b324 138 LPC_PWM1->TCR = 0x0; // Disable counter
RufflesAllD 2:db7c8378b324 139 }
RufflesAllD 2:db7c8378b324 140
RufflesAllD 2:db7c8378b324 141 void sender(void const *args)
RufflesAllD 2:db7c8378b324 142 {
RufflesAllD 2:db7c8378b324 143 while (true)
RufflesAllD 2:db7c8378b324 144 {
RufflesAllD 2:db7c8378b324 145 osEvent evt = trameToSend.get();
RufflesAllD 2:db7c8378b324 146
RufflesAllD 2:db7c8378b324 147 if (evt.status == osEventMail) {
RufflesAllD 2:db7c8378b324 148 trame *trm = (trame*)evt.value.p;
RufflesAllD 2:db7c8378b324 149
RufflesAllD 2:db7c8378b324 150 pc.printf("trame shooter :\n\r%s", trm->trameToString().c_str());
RufflesAllD 2:db7c8378b324 151 sendTrame(trm);
RufflesAllD 2:db7c8378b324 152
RufflesAllD 2:db7c8378b324 153 trameToSend.free(trm);
RufflesAllD 2:db7c8378b324 154 }
RufflesAllD 2:db7c8378b324 155 }
RufflesAllD 2:db7c8378b324 156 }
joGenie 0:dc7095ab4963 157
joGenie 0:dc7095ab4963 158 void readTrame()
joGenie 0:dc7095ab4963 159 {
RufflesAllD 2:db7c8378b324 160 //LPC_TIM2->IR = 0xFF;
RufflesAllD 2:db7c8378b324 161 }
joGenie 0:dc7095ab4963 162
RufflesAllD 2:db7c8378b324 163 void bla()
RufflesAllD 2:db7c8378b324 164 {
RufflesAllD 2:db7c8378b324 165 string temp = "01010101011111100000000000000011011000110110011000100000011001101101101001111110";
RufflesAllD 2:db7c8378b324 166 bitset<696> bit(temp);
RufflesAllD 2:db7c8378b324 167
RufflesAllD 2:db7c8378b324 168 trame *trm = new trame(bit);
RufflesAllD 2:db7c8378b324 169 if (trm->checkCRC16())
RufflesAllD 2:db7c8378b324 170 {
RufflesAllD 2:db7c8378b324 171 //pc.printf("trame recu :\n\r%s\n\r", trm->trameToString().c_str());
RufflesAllD 2:db7c8378b324 172 trameToDecode.put(trm);
RufflesAllD 2:db7c8378b324 173 }
RufflesAllD 2:db7c8378b324 174 else
RufflesAllD 2:db7c8378b324 175 {
RufflesAllD 2:db7c8378b324 176 pc.printf("Mauvais CRC16");
RufflesAllD 2:db7c8378b324 177 }
RufflesAllD 2:db7c8378b324 178 }
RufflesAllD 2:db7c8378b324 179
RufflesAllD 2:db7c8378b324 180 void receiver(void const *args)
RufflesAllD 2:db7c8378b324 181 {
RufflesAllD 2:db7c8378b324 182 bla();
joGenie 0:dc7095ab4963 183 }
joGenie 0:dc7095ab4963 184
RufflesAllD 2:db7c8378b324 185 void decoder(void const *args)
joGenie 0:dc7095ab4963 186 {
RufflesAllD 2:db7c8378b324 187 while(true)
joGenie 0:dc7095ab4963 188 {
RufflesAllD 2:db7c8378b324 189 osEvent evt = trameToDecode.get();
RufflesAllD 2:db7c8378b324 190
RufflesAllD 2:db7c8378b324 191 if (evt.status == osEventMail) {
RufflesAllD 2:db7c8378b324 192 trame *trm = (trame*)evt.value.p;
RufflesAllD 2:db7c8378b324 193
RufflesAllD 2:db7c8378b324 194 textToPrint.put(new string(trm->text));
RufflesAllD 2:db7c8378b324 195
RufflesAllD 2:db7c8378b324 196 trameToSend.free(trm);
joGenie 0:dc7095ab4963 197 }
joGenie 0:dc7095ab4963 198 }
RufflesAllD 1:261bb31628e8 199 }
RufflesAllD 1:261bb31628e8 200
RufflesAllD 2:db7c8378b324 201 void printer(void const *args)
RufflesAllD 2:db7c8378b324 202 {
RufflesAllD 2:db7c8378b324 203 while (true)
RufflesAllD 2:db7c8378b324 204 {
RufflesAllD 2:db7c8378b324 205 osEvent evt = textToPrint.get();
RufflesAllD 2:db7c8378b324 206
RufflesAllD 2:db7c8378b324 207 if (evt.status == osEventMessage) {
RufflesAllD 2:db7c8378b324 208 string *msg = (string*)evt.value.p;
RufflesAllD 2:db7c8378b324 209
RufflesAllD 2:db7c8378b324 210 pc.printf("Sender says :\n\r%s\n\r", msg->c_str());
RufflesAllD 2:db7c8378b324 211
RufflesAllD 2:db7c8378b324 212 delete msg;
RufflesAllD 2:db7c8378b324 213 }
RufflesAllD 2:db7c8378b324 214 }
joGenie 0:dc7095ab4963 215 }
joGenie 0:dc7095ab4963 216
joGenie 0:dc7095ab4963 217 void initialize()
joGenie 0:dc7095ab4963 218 {
joGenie 0:dc7095ab4963 219 // Set system control
joGenie 0:dc7095ab4963 220 LPC_SC->PCONP |= (1 << 22) | (1 << 6); // Enable Timer2 et PWM
joGenie 0:dc7095ab4963 221 LPC_SC->PCLKSEL0 |= (1 << 12); // PClk PWM = CCLK
joGenie 0:dc7095ab4963 222 LPC_SC->PCLKSEL1 |= (1 << 12); // PClk Timer2 = CCLK
joGenie 0:dc7095ab4963 223
joGenie 0:dc7095ab4963 224 // Set pin connection
joGenie 0:dc7095ab4963 225 LPC_PINCON->PINSEL0 |= (3 << 10); // Pin 29 Capture
joGenie 0:dc7095ab4963 226 LPC_PINCON->PINSEL4 |= (1 << 2); // Pin 25 PWM
joGenie 0:dc7095ab4963 227
joGenie 0:dc7095ab4963 228 //Initialize Timer2 for capture
RufflesAllD 1:261bb31628e8 229 NVIC_SetVector(TIMER2_IRQn, (uint32_t)&readTrame);
RufflesAllD 1:261bb31628e8 230 NVIC_EnableIRQ(TIMER2_IRQn);
joGenie 0:dc7095ab4963 231
joGenie 0:dc7095ab4963 232 LPC_TIM2->TC = 0; // Initialize Time Counter
joGenie 0:dc7095ab4963 233 LPC_TIM2->PC = 0; // Initialize Prescale Counter
joGenie 0:dc7095ab4963 234 LPC_TIM2->PR = 0; // Initialize Prescale Register
joGenie 0:dc7095ab4963 235 LPC_TIM2->TCR |= (1 << 1); // Reset Timer Control Register
joGenie 0:dc7095ab4963 236 LPC_TIM2->IR = 0xFF; // Reset Interrupt Register
RufflesAllD 1:261bb31628e8 237 LPC_TIM2->CCR |= (1 << 5) | (1 << 4) | (1 << 3); // Initialize Capture Control Register
RufflesAllD 1:261bb31628e8 238 LPC_TIM2->CTCR |= (1 << 0); // TC is incremented on rising edge
joGenie 0:dc7095ab4963 239
joGenie 0:dc7095ab4963 240 LPC_TIM2->TCR = 0x01; // Start Timer Control Register
joGenie 0:dc7095ab4963 241
joGenie 0:dc7095ab4963 242 //Initialize PWM
joGenie 0:dc7095ab4963 243 LPC_PWM1->MCR |= (1 << 1) | (1 << 0); // Initialize Match Control Register Interrupt/Reset
joGenie 0:dc7095ab4963 244 LPC_PWM1->PCR |= (1 << 10) | (1 << 2); // Initialize PWM Control Register Output/Double-edge
joGenie 0:dc7095ab4963 245
RufflesAllD 2:db7c8378b324 246 LPC_PWM1->MR0 = tickPerPeriod; // Period
joGenie 0:dc7095ab4963 247 LPC_PWM1->LER |= (1 << 2) | (1 << 1); // Initialize Latch Enable Register
joGenie 0:dc7095ab4963 248
RufflesAllD 1:261bb31628e8 249 LPC_PWM1->IR = 0xFF; // Reset Interrupt Registe
joGenie 0:dc7095ab4963 250 }
joGenie 0:dc7095ab4963 251
joGenie 0:dc7095ab4963 252 int main()
joGenie 0:dc7095ab4963 253 {
joGenie 0:dc7095ab4963 254 initialize();
joGenie 0:dc7095ab4963 255
RufflesAllD 2:db7c8378b324 256 Thread thread1(getText);
RufflesAllD 2:db7c8378b324 257 //thread1.set_priority(osPriorityAboveNormal);
RufflesAllD 2:db7c8378b324 258 Thread thread2(leTrameur);
RufflesAllD 2:db7c8378b324 259 thread2.set_priority(osPriorityAboveNormal);
RufflesAllD 2:db7c8378b324 260 Thread thread3(sender);
RufflesAllD 2:db7c8378b324 261 thread3.set_priority(osPriorityHigh);
RufflesAllD 2:db7c8378b324 262 Thread thread4(receiver);
RufflesAllD 2:db7c8378b324 263 thread4.set_priority(osPriorityRealtime);
RufflesAllD 2:db7c8378b324 264 Thread thread5(decoder);
RufflesAllD 2:db7c8378b324 265 thread5.set_priority(osPriorityHigh);
RufflesAllD 2:db7c8378b324 266 Thread thread6(printer);
RufflesAllD 2:db7c8378b324 267 thread6.set_priority(osPriorityAboveNormal);
joGenie 0:dc7095ab4963 268
RufflesAllD 2:db7c8378b324 269 while(true);
joGenie 0:dc7095ab4963 270 }