library for omnidirectional planar positioning system

Dependents:   measuring_wheel 2018NHK_gakugaku_robo 2018NHK_gaku_ver2

OmniPosition.cpp

Committer:
takeuchi
Date:
2018-07-01
Revision:
2:edd33d3ad0fd
Parent:
1:0229fc98a26f
Child:
3:47676abdf529

File content as of revision 2:edd33d3ad0fd:

#include "OmniPosition.h"

OmniPosition::OmniPosition(PinName serialTX, PinName serialRX) :
    RawSerial(serialTX, serialRX, DEFAULT_BAUD),
    readCounter(SERIAL_BUFFER_SIZE, 0),
    takeCounter(SERIAL_BUFFER_SIZE, 0),
    X(0),
    Y(0)
{
    buffer = new char[SERIAL_BUFFER_SIZE];
    data = new char[2];
    attach(callback(this, &OmniPosition::readData));
    assembleTicker.attach(callback(this, &OmniPosition::assemble), RECEIVE_FREQ);
    sendTicker.attach(callback(this, &OmniPosition::send), SEND_FREQ);
}

void OmniPosition::readData()
{
    buffer[(int)readCounter] = getc();
    ++readCounter;
}

void OmniPosition::assemble()
{
    //Find header
    headerCheck = false;
    headerPoint = 0xff;

    for(int i = 0; i < SERIAL_BUFFER_SIZE; i++) {
        if(buffer[i] == HEADER_FIRST_BYTE) {
            takeCounter = i;
            ++takeCounter;
            if(buffer[(int)takeCounter] == HEADER_SECOND_BYTE) {
                headerCheck = true;
                headerPoint = i;
            }
        }
    }
    if(headerPoint == 0xff) {
        return;
    }

    //assemble
    takeCounter = headerPoint;  //firstheader
    ++takeCounter;  //secondheader

    ++takeCounter;
    data[0] = buffer[(int)takeCounter];
    ++takeCounter;
    data[1] = buffer[(int)takeCounter];
    X = ((data[0]<<8)|data[1]) - 32768;

    ++takeCounter;
    data[0] = buffer[(int)takeCounter];
    ++takeCounter;
    data[1] = buffer[(int)takeCounter];
    Y = ((data[0]<<8)|data[1]) - 32768;
}

void OmniPosition::send()
{
    if(resetSend) {
        putc('R');
        resetSend = false;
    } else {
        //putc(0);
    }
}

int OmniPosition::getX()
{
    return X;
}

int OmniPosition::getY()
{
    return Y;
}

void OmniPosition::reset()
{
    resetSend = true;
}