NagaokaRoboticsClub_mbedTeam / SerialMultiByte

Dependents:   Nucleo_NHK_2018_syudo_wheel a_team_R1370 Nucleo_NHK_2018_syudo_wheel 2018NHK_gaku_ver2 ... more

SerialMultiByte.cpp

Committer:
tanabe2000
Date:
2018-09-12
Revision:
3:dd947d95765a
Parent:
1:a28d64ee7a79

File content as of revision 3:dd947d95765a:

#include "SerialMultiByte.h"

SerialMultiByte::SerialMultiByte(PinName tx, PinName rx) :
    RawSerial(tx, rx),
    myled(LED1)
{
    header[0] = DEFAULT_FIRST_HEADER;
    header[1] = DEFAULT_SECOND_HEADER;
}

void SerialMultiByte::setHeaders(uint8_t firstHeader, uint8_t secondHeader)
{
    header[0] = firstHeader;
    header[1] = secondHeader;
}

void SerialMultiByte::setHeaders(uint8_t headers[])
{
    header[0] = headers[0];
    header[1] = headers[1];
}

void SerialMultiByte::startReceive(uint16_t dataSize)
{
    bufferSize = dataSize + 3;
    data = new uint8_t[bufferSize];
    thread.start(callback(this, &SerialMultiByte::receiveLoop));

//    ticker.attach(callback(this, &SerialMultiByte::receiveLoop),1.0/200.0);
    attach(callback(this, &SerialMultiByte::receiveByte));
}

void SerialMultiByte::receiveLoop()
{
    while(true) {
        if(buffer.size() > bufferSize) {
            if(buffer[0] == header[0] && buffer[1] == header[1]) {
                checkData();
                buffer.erase(buffer.begin(), buffer.begin() + (bufferSize - 1));
            } else {
                buffer.erase(buffer.begin());
            }
        }
    }
}

void SerialMultiByte::receiveByte()
{
    buffer.push_back(getc());
}

void SerialMultiByte::checkData()
{
    uint8_t checksum = 0x00;
    for(int i = 2; i < bufferSize - 1; i++) {
        checksum += buffer[i];
    }
    if(checksum == buffer[bufferSize - 1]) {
        myled = !myled;
        for(int i = 2; i < bufferSize - 1; i++) {
            data[i-2] = buffer[i];
        }   
    }
}

void SerialMultiByte::getData(uint8_t data_[])
{
    for(int i = 0; i < bufferSize - 3; i++) {
        data_[i] = data[i];
    }
}

void SerialMultiByte::sendData(uint8_t data_[], uint16_t length)
{
    uint8_t checksum = 0x00;
    for(int i = 0; i < length; i++) {
        checksum += data_[i];
    }
    putc(header[0]);
    putc(header[1]);
    for(int i = 0; i < length; i++) {
        putc(data_[i]);
    }
    putc(checksum);
}