S5info_H14
/
APP3
Problematique
main.cpp
- Committer:
- RufflesAllD
- Date:
- 2014-02-11
- Revision:
- 2:db7c8378b324
- Parent:
- 1:261bb31628e8
- Child:
- 3:65845faafbb1
File content as of revision 2:db7c8378b324:
#include "mbed.h" #include "rtos.h" #include "trame.hpp" Serial pc(USBTX, USBRX); int tickPerPeriod = 9600; Queue<string, 16> textToSend; Mail<trame, 16> trameToSend; Mail<trame, 16> trameToDecode; Queue<string, 16> textToPrint; void getText(void const *args) { int compteur = 0; char c; string message = ""; while (true) { c = pc.getc(); if (c == 0xD) { if (!message.empty()) { pc.putc(0xA); pc.putc(0xD); textToSend.put(new string(message)); message = ""; compteur = 0; } } else if (c == 0x8) { pc.putc(c); pc.putc(0x20); pc.putc(c); message = message.substr(0, message.length() - 1); compteur--; } else { if (compteur < 80) { pc.putc(c); message += c; compteur++; } } } } void leTrameur(void const *args) { while (true) { osEvent evt = textToSend.get(); if (evt.status == osEventMessage) { string *msg = (string*)evt.value.p; //pc.printf("message envoye :\n\r%s\n\r", msg->c_str()); trameToSend.put(new trame(*msg)); delete msg; } } } void setPwmMatch(bitset<8> bitst) { for (int a = 0; a < 8; a++) { if (bitst.test(a)) { LPC_PWM1->MR1 = tickPerPeriod/2; LPC_PWM1->MR2 = 1; } else { LPC_PWM1->MR1 = 1; LPC_PWM1->MR2 = tickPerPeriod/2; } while(LPC_PWM1->IR != 0x01); LPC_PWM1->IR = 0xFF; } } void sendTrame(trame *trm) { LPC_PWM1->TCR |= (1 << 0); // Enable counter setPwmMatch(trm->preambule); setPwmMatch(trm->start_end); setPwmMatch(trm->type_flag); setPwmMatch(trm->charge_utile); for (int a = 0; a < trm->length; a++) { if (trm->message.test(a)) { LPC_PWM1->MR1 = tickPerPeriod/2; LPC_PWM1->MR2 = 1; } else { LPC_PWM1->MR1 = 1; LPC_PWM1->MR2 = tickPerPeriod/2; } while(LPC_PWM1->IR != 0x01); LPC_PWM1->IR = 0xFF; } for (int a = 0; a < 16; a++) { if (trm->crc16.test(a)) { LPC_PWM1->MR1 = tickPerPeriod/2; LPC_PWM1->MR2 = 1; } else { LPC_PWM1->MR1 = 1; LPC_PWM1->MR2 = tickPerPeriod/2; } while(LPC_PWM1->IR != 0x01); LPC_PWM1->IR = 0xFF; } setPwmMatch(trm->start_end); LPC_PWM1->TCR = 0x0; // Disable counter } void sender(void const *args) { while (true) { osEvent evt = trameToSend.get(); if (evt.status == osEventMail) { trame *trm = (trame*)evt.value.p; pc.printf("trame shooter :\n\r%s", trm->trameToString().c_str()); sendTrame(trm); trameToSend.free(trm); } } } void readTrame() { //LPC_TIM2->IR = 0xFF; } void bla() { string temp = "01010101011111100000000000000011011000110110011000100000011001101101101001111110"; bitset<696> bit(temp); trame *trm = new trame(bit); if (trm->checkCRC16()) { //pc.printf("trame recu :\n\r%s\n\r", trm->trameToString().c_str()); trameToDecode.put(trm); } else { pc.printf("Mauvais CRC16"); } } void receiver(void const *args) { bla(); } void decoder(void const *args) { while(true) { osEvent evt = trameToDecode.get(); if (evt.status == osEventMail) { trame *trm = (trame*)evt.value.p; textToPrint.put(new string(trm->text)); trameToSend.free(trm); } } } void printer(void const *args) { while (true) { osEvent evt = textToPrint.get(); if (evt.status == osEventMessage) { string *msg = (string*)evt.value.p; pc.printf("Sender says :\n\r%s\n\r", msg->c_str()); delete msg; } } } void initialize() { // Set system control LPC_SC->PCONP |= (1 << 22) | (1 << 6); // Enable Timer2 et PWM LPC_SC->PCLKSEL0 |= (1 << 12); // PClk PWM = CCLK LPC_SC->PCLKSEL1 |= (1 << 12); // PClk Timer2 = CCLK // Set pin connection LPC_PINCON->PINSEL0 |= (3 << 10); // Pin 29 Capture LPC_PINCON->PINSEL4 |= (1 << 2); // Pin 25 PWM //Initialize Timer2 for capture NVIC_SetVector(TIMER2_IRQn, (uint32_t)&readTrame); NVIC_EnableIRQ(TIMER2_IRQn); LPC_TIM2->TC = 0; // Initialize Time Counter LPC_TIM2->PC = 0; // Initialize Prescale Counter LPC_TIM2->PR = 0; // Initialize Prescale Register LPC_TIM2->TCR |= (1 << 1); // Reset Timer Control Register LPC_TIM2->IR = 0xFF; // Reset Interrupt Register LPC_TIM2->CCR |= (1 << 5) | (1 << 4) | (1 << 3); // Initialize Capture Control Register LPC_TIM2->CTCR |= (1 << 0); // TC is incremented on rising edge LPC_TIM2->TCR = 0x01; // Start Timer Control Register //Initialize PWM LPC_PWM1->MCR |= (1 << 1) | (1 << 0); // Initialize Match Control Register Interrupt/Reset LPC_PWM1->PCR |= (1 << 10) | (1 << 2); // Initialize PWM Control Register Output/Double-edge LPC_PWM1->MR0 = tickPerPeriod; // Period LPC_PWM1->LER |= (1 << 2) | (1 << 1); // Initialize Latch Enable Register LPC_PWM1->IR = 0xFF; // Reset Interrupt Registe } int main() { initialize(); Thread thread1(getText); //thread1.set_priority(osPriorityAboveNormal); Thread thread2(leTrameur); thread2.set_priority(osPriorityAboveNormal); Thread thread3(sender); thread3.set_priority(osPriorityHigh); Thread thread4(receiver); thread4.set_priority(osPriorityRealtime); Thread thread5(decoder); thread5.set_priority(osPriorityHigh); Thread thread6(printer); thread6.set_priority(osPriorityAboveNormal); while(true); }