gyo

SBDBT.cpp

Committer:
kurobikari
Date:
2019-10-16
Revision:
16:976121fe5c9d
Parent:
15:8c49a263e344

File content as of revision 16:976121fe5c9d:


#include "SBDBT.h"
//#include "YKNCT.h"
SBDBT::SBDBT(PinName p1, PinName p2)
{
    i = 0;
    readable = 0;
    length = 8;
    value = 128;
    position = 0;
    tmp = new char [length];
    data = new char [length];
    sr = new Serial(p1,p2);
    sr -> baud(2400);
    sr -> attach(this,&SBDBT::getf,Serial::RxIrq);
}

SBDBT::SBDBT(PinName p1, PinName p2, int baud)
{
    i = 0;
    readable = 0;
    length = 8;
    value = 128;
    position = 0;
    tmp = new char [length];
    data = new char [length];
    sr = new Serial(p1,p2);
    sr -> baud(baud);
    sr -> attach(this,&SBDBT::getf,Serial::RxIrq);
}

void SBDBT::getf()
{
    tmp[i] = sr -> getc();
    if(tmp[i] == value) {  //受信したデータが訂正用定数であり
        if(i != position) {     //訂正用定数を受信すべき位置でないとき
            tmp[position] = value;     //正しい位置に訂正用定数を代入
            i = position + 1;           //受信先も正しい位置へもどす
        } else                  //訂正用定数を受信すべき位置であるとき
            i++;                    //次の位置で受信する
    } else {                //受信したデータが訂正用定数でなく
        if(i == position) {}    //訂正用定数を受信すべき位置であるとき
        //再度同じ位置で受信する
        else                    //訂正用定数を受信すべき場所でないとき
            i++;                    //次の位置で受信する
    }
    if(i>=length) {         //位置がデータの長さを超えたら
        data[0] = tmp[0];
        data[1] = tmp[1];
        data[2] = tmp[2];
        data[3] = tmp[3];
        data[4] = tmp[4];
        data[5] = tmp[5];
        data[6] = tmp[6];
        data[7] = tmp[7];
        readable = 1;               //全データ受信完了
        check();
        i=0;                    //位置を初期化
    }
}

void SBDBT::print()
{
    printf("%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d\n\r",TRIANGLE,CIRCLE,CROSS,SQUARE,UPkey,RIGHTkey,DOWNkey,LEFTkey,SELECT,START);
}

int8_t SBDBT::State_check()
{
    if(readable == 1)return 1;
    else return 0;
}

void SBDBT::check()
{
    SQUARE=(data[1] & 1)==1;
    L1 =   (data[1] & 2)==2;
    L2 =   (data[1] & 4)==4;
    L3 =   (data[1] & 8);
    R1 =   (data[1] & 16);
    R2 =   (data[1] & 32);
    R3 =   (data[1] & 64);

    UPkey =    (data[2] & 1)==1&&(data[2] & 2)!=2;
    DOWNkey =  (data[2] & 2)==2&&(data[2] & 1)!=1;
    START   =  (data[2] & 3)==3;
    RIGHTkey = (data[2] & 4)==4&&(data[2] & 8)!=8;
    LEFTkey =  (data[2] & 8)==8&&(data[2] & 4)!=4;
    SELECT  =  (data[2] & 12)==12;
    TRIANGLE = (data[2] & 16)==16;
    CROSS =    (data[2] & 32)==32;
    CIRCLE =   (data[2] & 64)==64;

    LX = data[3];
    LY = data[4];
    RX = data[5];
    RY = data[6];
}


char SBDBT::rs_x_check()
{
    return data[5]==data[5] ? 0 : 1;
}

char SBDBT::rs_y_check()
{
    return data[6]==data[6] ? 0 : 1;
}

char SBDBT::ls_x_check()
{
    return data[3]==data[3] ? 0 : 1;
}

char SBDBT::ls_y_check()
{
    return data[4]==data[4] ? 0 : 1;
}

SBDBT::~SBDBT()
{
    delete sr;
    delete tmp;
    delete data;
}