Leon Wehmeier / Mbed OS fiasco_max32630

Dependencies:   SoftSerial MAX14690 Buffer

Fork of rtos_threading_with_callback by mbed_example

linkLayerEncoder/linkLayer.cpp

Committer:
lwehmeier
Date:
2018-03-30
Revision:
3:d7ec6dc025b0
Parent:
2:bf699e054b34

File content as of revision 3:d7ec6dc025b0:

#include "linkLayer.h"
#include "global.h"

void LinkLayerEncoder::setPacket(linkPacket* p)
{
    encoderIndex = 0;
    lp = p;
    oneCntr = 0;
    hasPacket = 1;
    preambleBits=8;
    frameTypeBits=8;
}
bool LinkLayerEncoder::getNext()
{
    if(!hasPacket)//no active packet to send, get next
        setPacket(txQueue.getNext());//rtos semaphore; wait until new data available
    if(preambleBits-->0)//send preamble
    {
        return preambleBits<7;//send 1111 1110
    }
    if(frameTypeBits-->0)//send frametype
    {
        unsigned bitIndex = 7-frameTypeBits;
        
        bool real = (bool)(lp->frameType&(1<<bitIndex));
        bool returnVal;
        if(real)
        {
            if((oneCntr ++)<6)
                        returnVal=1;
            else
            {   
                returnVal=0; // insert stuffing zero
                frameTypeBits++;//need to transmit one bit next 
                oneCntr=0;
            }
        }
        else
        {
            if(oneCntr==6)
            {
                returnVal=0; // insert stuffing zero
                frameTypeBits++;//need to transmit one bit next 
                oneCntr=0;
            }
            else
            {
                oneCntr=0;
                returnVal=0;
            }
        }
        return returnVal;
    }
    unsigned byteIndex = encoderIndex / 8;
    unsigned bitIndex = encoderIndex % 8;
    encoderIndex++;
    
    bool real = (bool)(lp->payload[byteIndex]&(1<<bitIndex));
    bool returnVal;
    if(real)
    {
        if((oneCntr ++)<6)
                    returnVal=1;
        else
        {   
            returnVal=0; // insert stuffing zero
            encoderIndex--;//need to transmit one bit next 
            oneCntr=0;
        }
    }
    else
    {
        if(oneCntr==6)
        {
            returnVal=0; // insert stuffing zero
            encoderIndex--;//need to transmit one bit next 
            oneCntr=0;
        }
        else
        {
            oneCntr=0;
            returnVal=0;
        }
    }
    
    
    byteIndex = encoderIndex / 8;
    if(byteIndex >= lp->payloadSz)
    {
        hasPacket=0;
        delete lp->payload;
        delete lp;
    }

    return returnVal;
}