FEP RX library

Dependents:   2022_FEPRX-PS4 2022A_FEPRX_TokiPS4 2022NHK_A_ashimawari 2022NHK_A_main

FEP_RX22.cpp

Committer:
piroro4560
Date:
2022-10-05
Revision:
0:062f14a26406
Child:
1:8979e85cceb1

File content as of revision 0:062f14a26406:

/**
 *  @file   FEP_RX22.cpp
 *  @author 安澤瑠
 *  @date   22/10/4
 */
#include "FEP_RX22.h"

FEP_RX22::FEP_RX22(PinName tx, PinName rx, uint8_t addr_, int baud) :
    RawSerial(tx, rx, baud)
{
    addr     = addr_;
    timeout  = TIMEOUT_COUNT;
    bufindex = 0;
    retindex = 0;
}

void FEP_RX22::StartReceive()
{
    attach(callback(this, &FEP_RX22::ReceiveBytes));
    timeoutTimer.attach(callback(this, &FEP_RX22::TimeoutLoop), 0.1);
}

void FEP_RX22::TimeoutLoop()
{
    if (timeout >= TIMEOUT_COUNT) {
        status = false;
    } else {
        status = true;
        timeout++;
    }
}

void FEP_RX22::ReceiveBytes()
{
    buffer[bufindex] = getc(); // Receive 1byte
    timeout = 0;

    if ( (!strncmp((char*)(buffer + ((256 + bufindex - 1)%256) ), "\r\n", 2)) ) { // <CR><LF> bufindex = <LF>(='\n')
        CheckData();
    }
    bufindex++;
}

void FEP_RX22::CheckData()
{
    uint8_t temp=0;
    for (uint16_t i=0; i<256; i++) {
        temp = (256 + bufindex - i) % 256;
        if ( !strncmp((char*)(buffer + temp) , "RBN", 3) ) { // check header  temp='R'
        /* コントローラの仕様変更時はここを変える */
            for (int i_button=0; i_button<2; i_button++) {
                button[i_button] = buffer[(temp+9+i_button)%256];
            }
            for (int i_stick=0; i_stick<4; i_stick++) {
                stick[i_stick] = buffer[(temp+11+i_stick)%256];
            }
            for (int i_trigger=0; i_trigger<2; i_trigger++) {
                trigger[i_trigger] = buffer[(temp+15+i_trigger)%256];
            }
            count_timeout = buffer[(temp+17)%256];
            
            return;
        }
    }
}


void FEP_RX22::GetData(uint8_t *data)
{
    for (int i=0; i<DATANUM; i++) data[i] = retdata[i];
}

bool FEP_RX22::getButton(uint8_t n)
{
    if (n<8) {
        return (button[0]>>n) & 1;
    } else {
        return (button[1]>>(n-8)) & 1;
    }
}

int16_t FEP_RX22::getStick(uint8_t n)
{
    if (n%2) return 128-stick[n];
    else return stick[n]-128;
}

int16_t FEP_RX22::getTrigger(uint8_t n)
{
    return trigger[n];
}

uint8_t FEP_RX22::getTimeout()
{
    return count_timeout;
}