YKNCT / Mbed 2 deprecated R21_ConsteSlave2

Dependencies:   mbed CtrlStationRX

main.cpp

Committer:
TakushimaYukimasa
Date:
2021-10-02
Revision:
1:56c272cb4522
Parent:
0:70fee422a0e0
Child:
2:0806f6996e8c

File content as of revision 1:56c272cb4522:

#include "mbed.h"
#include "SO1602A.h"
#define SW_ONE(__NUM__) (SWData[__NUM__][0]-SWData[__NUM__][1]==1)

DigitalIn SW[7]= {PA_3,PA_12,PB_5,PA_11,PA_8,PF_1,PF_0};

DigitalOut POWER[2]= {PA_1,PB_1};

Serial UART(PA_9,PA_10, 9600);

DigitalOut led(LED1);
Serial telemetry(USBTX, USBRX, 115200);

SO1602A oled(PB_7,PB_6);

Timer emoTimer;
Timer restTimer;
Timer newsTimer[3];
Timer mainTimer;
int msTimer=0;

int newsStatus[3] = {0};

void uartRX()
{
    char data = UART.getc();
    newsStatus[(data>>2)&0b11]=(data&0b11);
    newsTimer[(data>>2)&0b11].reset();
}

int main()
{

    POWER[0]=POWER[1]=1;
    for(int i=0; i<7; i++) SW[i].mode(PullDown);

    mainTimer.reset();
    mainTimer.start();
    restTimer.start();
    emoTimer.start();
    for(int i=0; i<3; i++) newsTimer[i].start();

    oled.init();
    oled.setDispFlag(1,0,0);
//    oled.locate(2,0);
//    oled.printf("Stop display");

    UART.attach(uartRX, Serial::RxIrq);

    while(1) {

//        telemetry.printf("%d\n\r", (SW[6]==0?0:1));

        /* SW入力のワンタイム化 */
        static bool SWData[7][2] = {0};
        for(int i=0; i<7; i++) {
            SWData[i][1]=SWData[i][0];
            SWData[i][0]=SW[i];
        }

        /* 入力制限モード */
        static bool restFlag = 0;
        if(SW_ONE(0)) restFlag=!restFlag;

        /* メインタイマー制御 0-pause 1-start */
        static bool timerMode=0;
        if(!SW[1]) timerMode=0;
        if(!restFlag) {
            if(SW_ONE(2)) msTimer+=1000*60;
            if(SW_ONE(3)) msTimer+=1000*10;
            if(SW_ONE(4)) msTimer+=1000*1;

            if(SW[1]&&SW_ONE(5)) {
                timerMode=0;
                msTimer=0;
            }
            if(SW[1]&&SW_ONE(6)) timerMode=!timerMode;
        }

        /* 時間の更新 */
        static int temp=mainTimer.read_ms();
        if(timerMode) msTimer+=mainTimer.read_ms()-temp;
        temp=mainTimer.read_ms();
        if(msTimer>120e3) {
            timerMode=0;
            msTimer=120e3;
        }

        /* UART送受信関連 */
        uint8_t sendData[4] = {0};
        uint8_t checkSum = 0;

        //チェックサム計算
        for (int i = 0; i < 7; i++)
            checkSum += msTimer / (int)pow(10.0, (double)i) % 10;

        sendData[3] = 0x80;
        sendData[3] |= timerMode << 6;
        sendData[3] |= checkSum & 0x3F;

        //1バイト区切る
        for(int i = 0; i < 3; i++)
            sendData[i] = 0x7F & msTimer >> 7 * (2-i);

        for(int i = 0; i < 4; i++){
            UART.putc(sendData[i]);
        telemetry.putc(sendData[i]);
            }
//        telemetry.printf("%d \n\r",msTimer);

        for(int i=0; i<3; i++)
            if(newsTimer[i].read_ms()>500)
                newsStatus[i]=0;



        /* LCD描画 */

//        oled.locate(5,0);
//        oled.printf("%1d:%02d.%d ", msTimer/60000,msTimer/1000%60,msTimer/100%10);
//
//        oled.locate(0,0);
//        int statious=!SW[1];
//        if(restFlag&&(SW[2]+SW[3]+SW[4]+SW[5]+SW[6])) restTimer.reset();
//        if(emoTimer.read()<1&&emoTimer.read_ms()%200<100) statious=0;
//        if(statious) oled.printf("EMO  ");
//        else oled.printf("     ");
//
//        oled.locate(12,0);
//        statious=restFlag;
//        if(!SW[1]&&(SW[5]+SW[6])) emoTimer.reset();
//        if(restTimer.read()<1&&restTimer.read_ms()%200<100) statious=0;
//        if(statious) oled.printf("REST");
//        else oled.printf("    ");


//        for(int i=0; i<3; i++) {
//            oled.locate(i*6,1);
//            if(newsStatus[i]==0) oled.printf("Lost");
//            if(newsStatus[i]==1) oled.printf("None");
//            if(newsStatus[i]==2) oled.printf("Yoki");
//        }
//        for(int i=0; i<2; i++) {
//            oled.locate(i*6+4,1);
//            oled.printf("  ");
//        }

        char printLCD[32] = {0};

        int statious=!SW[1];
        if(restFlag&&(SW[2]+SW[3]+SW[4]+SW[5]+SW[6])) restTimer.reset();
        if(emoTimer.read()<1&&emoTimer.read_ms()%200<100) statious=0;
        if(statious) strcat(printLCD,"EMO  ");
        else strcat(printLCD,"     ");
        
        char tmp[17] = {0};
        sprintf(tmp,"%1d:%02d.%d ", msTimer/60000,msTimer/1000%60,msTimer/100%10);
        strcat(printLCD,tmp);
        
        statious=restFlag;
        if(!SW[1]&&(SW[5]+SW[6])) emoTimer.reset();
        if(restTimer.read()<1&&restTimer.read_ms()%200<100) statious=0;
        if(statious) strcat(printLCD,"REST");
        else strcat(printLCD,"    ");
        
        const char stat[3][5] = {"Lost","None","Yoki"};
        oled.locate(0,1);
        sprintf(tmp,"%s  %s  %s",stat[newsStatus[0]],stat[newsStatus[1]],stat[newsStatus[2]]);
        strcat(printLCD,tmp);
        
        oled.locate(0,0);
        oled.printf(printLCD);
            
//        for(int i=0; i<3; i++) {
//            oled.locate(i*6,1);
//            if(newsStatus[i]==0) oled.printf("Lost");
//            if(newsStatus[i]==1) oled.printf("None");
//            if(newsStatus[i]==2) oled.printf("Yoki");
//        }
//        for(int i=0; i<2; i++) {
//            oled.locate(i*6+4,1);
//            oled.printf("  ");
//        }
//static Timer tim;
//tim.start();
//telemetry.printf("%d \n\r",tim.read_ms());
//tim.reset();


    }
}