APP 4

Dependencies:   mbed CRC16 mbed-rtos

APP.cpp

Committer:
manl2003
Date:
2016-02-23
Revision:
24:e307f6aad106
Parent:
23:d41a23d8f2d7

File content as of revision 24:e307f6aad106:

#include "APP.h"
#include "Manchester.h"
#include "Frame.h"
#include "MEF.h"

Serial pc(USBTX, USBRX);
DigitalOut out(p8);
DigitalIn in(p30);

bool clockTick = false;
bitset<FRAMESIZE> message;
bitset<MAX_DATA> decodedMessage;
int debugMessage;
bool debugMessageReady = false;
bool dataReady;
bool frameDropped; 
int counter = 0;
unsigned int period = 0;
unsigned int currentClocks = 0;
bool periodCalculated = false;
MEF mef;
STATES mefSTATE;
int payloadSize = 0;
bool swag = false;
bool asdf = false;
int messageLength = 4;
bool buffer[16];
int bufferCounter = 0;
bool firstBit = true;
STATES tempState = NOSTATE;
Mail<Message, 16> mailBox;
Mutex mute;
bool sendMessageReady;

int benchmark(void (*function) (void))
{
    int count = LPC_TIM2->TC;
    function();
    return LPC_TIM2->TC - count;
}

extern "C" void TIMER1_IRQHandler()
{
    if ((LPC_TIM1->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
    {

        if(sendMessageReady)
        {
            clockTick = !clockTick;
            out = encode(message[counter], clockTick);
    
            if (clockTick)
            {
                counter++;
            }
    
            if (counter >= 56+messageLength*8)
            {
                counter = 0;
                sendMessageReady = false;
            }
        }
        LPC_TIM1->IR |= 1 << 0;        // Clear MR0 interrupt flag
    }
}

extern "C" void TIMER2_IRQHandler()
{
    unsigned int clocks = LPC_TIM2->CR0;
    bool inputValue = in.read();

    // Discard first bit
    if (!periodCalculated && !firstBit)
    {
        period = clocks / 2;
        periodCalculated = true;
    }
    
    if (firstBit)
    {
        swag = true;
        asdf = !inputValue;
        mef.ReceiveBit(!inputValue);
        firstBit = false;
    }

    if (periodCalculated)
    {
        if (clocks >= period*1.5 || (currentClocks + clocks) >= period*1.5)
        {
            currentClocks = 0;
            swag = true;
            asdf = !inputValue;
            mef.ReceiveBit(!inputValue);
        }
        else
        {
            currentClocks += clocks;
        }
    }

    LPC_TIM2->TC = 0;

    LPC_TIM2->IR |= 0xFFFFFFFF;     // clear Timer interrupt register
}

void initTimers()
{
    //Timer 1 (match)
    LPC_SC->PCLKSEL0 |= (1 << 4);           // pclk = cclk timer1
    LPC_SC->PCONP |= (1 << 2);              // timer1 power on
    LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100;  // 100 ms
    LPC_TIM1->MCR = 3;                      // interrupt and reset control
                                            // Interrupt & reset timer on match
    LPC_TIM1->EMR = (3 << 4);
    NVIC_EnableIRQ(TIMER1_IRQn);            // enable timer interrupt
    LPC_TIM1->TCR = 1;                      // enable Timer

    //Timer 2 (cap)
    LPC_SC->PCLKSEL1 |= (1 << 12);          // pclk = cclk timer2
    LPC_SC->PCONP |= (1 << 22);             // timer2 power on
    LPC_TIM2->TC = 0;                       // clear timer counter
    LPC_TIM2->PC = 0;                       // clear prescale counter
    LPC_TIM2->PR = 0;                       // clear prescale register
    LPC_TIM2->TCR |= (1 << 1);              // reset timer
    LPC_TIM2->TCR &= ~(1 << 1);             // release reset
    LPC_TIM2->IR = 0xFFFFFFFF;              // clear interrupt register
    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture on 2.0
    NVIC_EnableIRQ(TIMER2_IRQn);            // enable timer interrupt
    LPC_TIM2->TCR = 1;                      // start Timer
}



int main()
{
    //message = buildFrame(convertToBits("BLUB", messageLength), messageLength);    

    LPC_PINCON->PINSEL0 |= (3 << 8);   // P0.4 = CAP2.0
    initTimers();
    Thread term(terminal);

    while (true)
    {
        if (dataReady)
        {
            for (int i = 0; i < payloadSize * 8; i++)
            {
                
                if((i + 1) % 8 == 0)
                {
                    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);
                    pc.printf("%c", tempChar);        
                }
            }
            dataReady = false;
        }
        
        osEvent evt = mailBox.get();
        if (evt.status == osEventMail) 
        {
            mute.lock();
            // écriture de l'événement en sortie (port série)
            Message *mail = (Message*)evt.value.p;
            messageLength = mail->size;
            pc.printf("Envoie de %i bytes, %c \r\n", messageLength, mail->buffer[0]);
            message = buildFrame(convertToBits(mail->buffer, messageLength), messageLength);
            mailBox.free(mail);
            sendMessageReady = true;
            mute.unlock();
        }    
        
        
        #if DEBUG
        debugPrint();
        #endif
    }
}

void _decodeCallback(bitset<MAX_DATA> decMessage, int size)
{
    decodedMessage = decMessage;
    payloadSize = size;
    dataReady = true;
}

void _decodeError()
{
    frameDropped = true;
    periodCalculated = false;
    period = 0;
}

void _updateState(STATES state)
{
    mefSTATE = state;
}

void _mefDebug(int blu)
{
    debugMessage = blu;
    debugMessageReady = true;
}

void debugPrint()
{
    if (tempState != mefSTATE)
    {
        pc.printf("\r\nNew state: %i \r\n", mefSTATE);
        tempState = mefSTATE;
    }
    if(frameDropped)
    {
        pc.printf("Frame dropped\r\n");
        frameDropped = false;    
    }
    if(debugMessageReady)
    {
        pc.printf("%i\r\n", debugMessage);
        debugMessageReady = false;
    }
    
    if (swag)
    {
        pc.printf("%i ", asdf);
        swag = false;
    }
}

void terminal(void const *args)
{
    char messageBuffer[80];
    int bufferCounter = 0;
    char temp;
    while(true)
    {
        if(pc.readable())
        {
            temp = pc.getc();
            if(temp == 0x0D)
            {      
                pc.printf("Debug send %c , %i\r\n", messageBuffer[0], bufferCounter);          
                mute.lock();
                
                Message * mes = mailBox.alloc();                
                memcpy(mes->buffer, messageBuffer, bufferCounter);
                mes->size = bufferCounter;                
                mailBox.put(mes);
                
                mute.unlock();
                
                bufferCounter = 0;
            }
            else
            {
                pc.printf("%c", temp);
                messageBuffer[bufferCounter] = temp;
                bufferCounter++;
            }
        }
    }    
}