Problematique

Dependencies:   mbed mbed-rtos

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);
}