k t / Mbed 2 deprecated TCD_BD_JIG

Dependencies:   mbed

Fork of TCD_BD_JIG by masanori abe

main.cpp

Committer:
abem
Date:
2014-10-29
Revision:
0:03dfcdd06518
Child:
1:40527b0f0dfa

File content as of revision 0:03dfcdd06518:

#include "mbed.h"

/* DA設定 */
AnalogOut da1(p18);

/* LED設定 */
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

/* DIO設定 */
DigitalIn inDrvAlm(p21);    // DRV-ALM
DigitalIn inReady(p22);     // READY
DigitalOut outRSTDRV(p23);  // RST-DRV
DigitalOut outPWMON(p24);   // PWM-ON

/* SIO設定 */
Serial pc(USBTX, USBRX);    // USB-SIO
Serial sio1(p9, p10);       // SIO1
Serial sio2(p13, p14);      // SIO2

/* タイマー設定 */
Timeout flipper;
Ticker led4flic;

/* 関数宣言 */
void initSIO(void);     // シリアルイニシャライズ

void cmdSIOpc(void);   // コマンド処理 pc-SIO
void cmdSIOsio2(void);  // コマンド処理 SIO1
void cmdSIOsio1(void);  // コマンド処理 SIO2

int trgADcmp(short ADdata, unsigned short ch);  // ターゲット取得AD値比較処理


/* 定数宣言 */
// DA固定出力(0-2.5-5V)
unsigned short  outDA0v0 =0;
unsigned short  outDA2v5 =19200;
//unsigned short  outDA2v5 =10000;
unsigned short  outDA5v0 =62000;

// ターゲットAD判定閾値(0-2.5-5V)
// 出力範囲:0-5V(ターゲット:-2047~2048)
short  AD0v0l =-2048;
short  AD0v0h =-1800;
short  AD2v5l =-100;
short  AD2v5h =100;
short  AD5v0l =1800;
short  AD5v0h =2047;

// SIOコマンド
// 個別
char cmdCHK[] = "CHK";  // シリアルチェック
char cmdIO1[] = "IO1";  // RST_DRV-DRV_ALMチェック
char cmdIO2[] = "IO2";  // PWM_ON-READYチェック
char cmdIOC[] = "IOC";  // DI/Oシーケンシャルチェック
char cmdDAC[] = "DAC";  // 指令電圧チェック
char cmdDAM[] = "DAM";  // 指令電圧マニュアル出力

/* 変数宣言 */
// DA用
unsigned short  u16OutDA;
short  TrgAD;

unsigned short  cmpADch;

// pc-SIO
char rx_buf_PC[50];
char rx_ch_PC;
short rx_cnt_PC;
short rx_endflg_PC;

// SIO1
char rx_buf_SIO1[50];
char rx_ch_SIO1;
short rx_cnt_SIO1;
short rx_endflg_SIO1;

// SIO2
char rx_buf_SIO2[50];
char rx_ch_SIO2;
short rx_cnt_SIO2;
short rx_endflg_SIO2;

// 汎用
short i;

int len;
int intdaout;
int intbuf;

char cbufstr[50];

// Flag
unsigned short  flgCHKrun;
unsigned short  flgRxAD;

/* 割込ハンドラ */
/* pc-SIO_受信 */
void isr_Rx_PC()
{
    rx_ch_PC = pc.getc();
    rx_buf_PC[rx_cnt_PC] = rx_ch_PC;
    if( rx_ch_PC == '\r'){
        rx_endflg_PC = 1;
        myled3 = 1;
    }else{
        rx_cnt_PC++;
        myled2 = 1;
    }
}

/* SIO1_受信 */
void isr_Rx_SIO1()
{
    rx_ch_SIO1 = sio1.getc();
    rx_buf_SIO1[rx_cnt_SIO1] = rx_ch_SIO1;
    if( rx_ch_SIO1 == '\r'){
        rx_endflg_SIO1 = 1;
    }else{
        rx_cnt_SIO1++;
        myled2 = 1;
    }
}
/* SIO2_受信 */
void isr_Rx_SIO2()
{
    rx_ch_SIO2 = sio2.getc();
    rx_buf_SIO2[rx_cnt_SIO2] = rx_ch_SIO2;
    if( rx_ch_SIO2 == '\r'){
        rx_endflg_SIO2 = 1;
        myled3 = 1;
    }else{
        rx_cnt_SIO2++;
        myled2 = 1;
    }
}

/* flip_設定時間後ワンショット動作 */
void flip()
{
    led4flic.detach();
    // タイムアウトにてLED点灯
    myled4 = 1;       
    flgCHKrun = 0;
    pc.puts("TimeOut CHK\r");
    sio1.puts("NG\r");
}

/* flic_設定時間繰り返し動作 */
void flic()
{
    myled4 = !myled4;
}


/* main */
int main() {
    /* シリアル初期化 */
    initSIO();

    /* mbed上LED初期化 */
    myled2 = 0;
    myled3 = 0;
    /* 出力ポート初期化 */
    outRSTDRV = 1;  // '1'=Hi(mbed),出力=Open
    outPWMON = 1;   // '1'=Hi(mbed),出力=Open

    /* DA出力初期化 */
    da1.write_u16(0);
    flgRxAD = 0;        // ターゲットAD受信フラグ

    /* 起動出力 */
    pc.printf("SIOpc test start \r");
    sio1.printf("PW ON\r");
    myled1 = 1;

    while(1){
        /* SIO処理 */
        if( rx_endflg_PC == 1 ){
            cmdSIOpc();   // コマンド処理 pc-SIO
        }else if( rx_endflg_SIO1 == 1 ){
            cmdSIOsio1();  // コマンド処理 SIO1
        }else if( rx_endflg_SIO2 == 1 ){
            cmdSIOsio2();  // コマンド処理 SIO2
        }
        
        /* AD値判定処理 */
        if( flgRxAD == 1){
            trgADcmp(TrgAD, cmpADch);
        }
    }
}


/* 関数 */
/* シリアルイニシャライズ */
void initSIO(void)
{
    /* シリアル-割込ハンドラ登録 */
    /* pc-SIO */
    pc.attach(isr_Rx_PC,Serial::RxIrq); // 受信割込ハンドラ
    /* SIO1 */
    sio1.attach(isr_Rx_SIO1,Serial::RxIrq); // 受信割込ハンドラ
    /* SIO2 */
    sio2.attach(isr_Rx_SIO2,Serial::RxIrq); // 受信割込ハンドラ
 
    /* シリアル初期化 */
    /* pc-SIO */
    pc.baud(38400);
    pc.format(8, SerialBase::None ,1);
    /* pc-SIO */
    sio1.baud(38400);
    sio1.format(8, SerialBase::None ,1);
    /* pc-SIO */
    sio2.baud(38400);
    sio2.format(8, SerialBase::None ,1);

    /* pc-SIO チェック用初期化 */
    rx_cnt_PC = 0;
    rx_endflg_PC = 0;
    /* SIO1 チェック用初期化 */
    rx_cnt_SIO1 = 0;
    rx_endflg_SIO1 = 0;
    /* SIO2 チェック用初期化 */
    rx_cnt_SIO2 = 0;
    rx_endflg_SIO2 = 0;

    /* 受信領域初期化 */
    memset(cbufstr,'\0',sizeof(cbufstr));
    memset(rx_buf_PC,'\0',sizeof(rx_buf_PC));
    memset(rx_buf_SIO1,'\0',sizeof(rx_buf_SIO1));
    memset(rx_buf_SIO2,'\0',sizeof(rx_buf_SIO2));
}


/* コマンド処理 */
/* 20141008 現状ではターミネート受信後返信処理 */
/* SIO-pc */
void cmdSIOpc(void)
{
    memset(cbufstr,'\0',sizeof(cbufstr));

    /* 文字長チェック */
    len = strlen(rx_buf_PC);
    strncpy(cbufstr,rx_buf_PC,3);
    
    /* コマンド判定 */
    if( strlen(rx_buf_PC) <= 4){
        if(strcmp(cbufstr,cmdCHK) == 0){
            //  コマンド可
            pc.puts("Res CHK\r");
            flipper.detach();
            led4flic.detach();
            if( flgCHKrun == 1){
                flgCHKrun = 0;
                myled4 = 0;
                sio1.puts("OK\r");
            }
        }else{
            //  コマンド不可
            pc.puts("No CHK\r");
        }
    }else if( strlen(rx_buf_PC) <= 10){
        if(strcmp(cbufstr,cmdDAC) == 0){
            // コマンド可 DAC
            strncpy(cbufstr,&rx_buf_PC[4],5);
            intbuf = atoi( cbufstr );
            TrgAD = (short)intbuf;
            flgRxAD = 1;
        }else{
            //  コマンド不可
            pc.puts("No DAC\r");
        }

    }else{
        pc.puts("Lengs error\r");
        pc.puts(cbufstr);
    }

    memset(rx_buf_PC,'\0',sizeof(rx_buf_PC));
    rx_cnt_PC = 0;
    myled2 = 0;
    myled3 = 0;
    rx_endflg_PC = 0;
}

/* SIO1 */
void cmdSIOsio1(void)
{
    memset(cbufstr,'\0',sizeof(cbufstr));
    /* 文字長チェック */
    len = strlen(rx_buf_SIO1);
    /* コマンド判定 */
    strncpy(cbufstr,rx_buf_SIO1,3);
    if( len == 4){
        if(strcmp(cbufstr,cmdCHK) == 0){
            // コマンド可:CHK
            if( flgCHKrun == 1){
                flipper.detach();
                led4flic.detach();
            }
            flipper.attach(&flip,5.0);
            led4flic.attach(&flic,0.3);
            flgCHKrun = 1;
            sio2.puts("CHK\r");
        }else{
            // コマンド不可
            sio1.puts("CMD Error 3\r");
        }
    }else if( len == 6){
        if(strcmp(cbufstr,cmdIO1) == 0){
            // コマンド可:IO1
            sio1.puts("res IO1\r");
            if( rx_buf_SIO1[4] == '0' ){
                outRSTDRV = 1;
                wait(0.5);
                if( inDrvAlm == 1 ){
                    sio1.puts("OK\r");
                }else{
                    sio1.puts("NG\r");
                }
            }else if(rx_buf_SIO1[4] == '1'){
                outRSTDRV = 0;
                wait(0.5);
                if( inDrvAlm == 0 ){
                    sio1.puts("OK\r");
                }else{
                    sio1.puts("NG\r");
                }
            }else{
                sio1.puts("Data Error cmdIO1\r");
            }
        }else if(strcmp(cbufstr,cmdIO2) == 0){
            // コマンド可:IO2
            sio1.puts("res IO2\r");
            if( rx_buf_SIO1[4] == '0' ){
                outPWMON = 1;
                wait(0.5);
                if( inReady == 1 ){
                    sio1.puts("OK\r");
                }else{
                    sio1.puts("NG\r");
                }
            }else if(rx_buf_SIO1[4] == '1'){
                outPWMON = 0;
                wait(0.5);
                if( inReady == 0 ){
                    sio1.puts("OK\r");
                }else{
                    sio1.puts("NG\r");
                }
            }else{
                sio1.puts("Data Error cmdIO2\r");
            }
        }else if(strcmp(cbufstr,cmdDAC) == 0){
            // コマンド可:DAC
            sio1.puts("res DAC\r");
            if(rx_buf_SIO1[4] == '1'){
                sprintf(cbufstr,"DAC,%05d\r",outDA0v0);
                sio1.puts(cbufstr);
                da1.write_u16(outDA0v0);

                wait(0.2);
                sio2.puts("DAC\r");                
//                pc.puts("DAC\r");                
                cmpADch = 1;    // 比較用chセット
            }else if(rx_buf_SIO1[4] == '2'){
                sprintf(cbufstr,"DAC,%05d\r",outDA2v5);
                sio1.puts(cbufstr);
                da1.write_u16(outDA2v5);

                wait(0.2);
                sio2.puts("DAC\r");                
//                pc.puts("DAC\r");                
                cmpADch = 2;    // 比較用chセット
            }else if(rx_buf_SIO1[4] == '3'){
                sprintf(cbufstr,"DAC,%05d\r",outDA5v0);
                sio1.puts(cbufstr);
                da1.write_u16(outDA5v0);

                wait(0.2);
                sio2.puts("DAC\r");                
//                pc.puts("DAC\r");                
                cmpADch = 3;    // 比較用chセット
            }else{
                sio1.puts("Data Error cmdDAC\r");
            }
        }else{
            // コマンド不可
            sio1.puts("CMD Error 5\r");
            sio1.printf("SIO1Rx= %s ",rx_buf_SIO1);
        }
    }else if( len == 10){
        if(strcmp(cbufstr,cmdDAM) == 0){
            // コマンド可:DAM
            sio1.puts("res DAM\r");
            strncpy(cbufstr,&rx_buf_SIO1[4],5);
            intdaout = atoi( cbufstr );
            // DA出力設定
            da1.write_u16((unsigned short)intdaout);
            
        }else{
            // コマンド不可
            sio1.puts("CMD Error 9\r");
        }
    }else{
        sio1.puts("CMD Lengs Error\r");
    }

    memset(rx_buf_SIO1,'\0',sizeof(rx_buf_SIO1));
    rx_cnt_SIO1 = 0;
    myled2 = 0;
    myled3 = 0;
    rx_endflg_SIO1 = 0;
}

/* SIO2 */
void cmdSIOsio2(void)
{
    memset(cbufstr,'\0',sizeof(cbufstr));

    /* 文字長チェック */
    len = strlen(rx_buf_SIO2);
    strncpy(cbufstr,rx_buf_SIO2,3);
    
    /* コマンド判定 */
    if( strlen(rx_buf_SIO2) <= 4){
        if(strcmp(cbufstr,cmdCHK) == 0){
            //  コマンド可
            pc.puts("Res CHK\r");
            flipper.detach();
            led4flic.detach();
            if( flgCHKrun == 1){
                flgCHKrun = 0;
                myled4 = 0;
                sio1.puts("OK\r");
            }
        }else{
            //  コマンド不可
            pc.puts("No CHK\r");
        }
    }else if( strlen(rx_buf_SIO2) <= 10){
        if(strcmp(cbufstr,cmdDAC) == 0){
            // コマンド可 DAC
            strncpy(cbufstr,&rx_buf_SIO2[4],5);
            intbuf = atoi( cbufstr );
            TrgAD = (short)intbuf;
            flgRxAD = 1;
        }else{
            //  コマンド不可
            pc.puts("No DAC\r");
        }

    }else{
        pc.puts("Lengs error\r");
        pc.puts(cbufstr);
    }

    memset(rx_buf_SIO2,'\0',sizeof(rx_buf_SIO2));
    rx_cnt_SIO2 = 0;
    myled2 = 0;
    myled3 = 0;
    rx_endflg_SIO2 = 0;
}


/* ターゲットAD値判定処理 */
/* 引数:                                                          */
/*      unsigned short ADdata   :判定値(受信ADデータ)               */
/*      unsigned short ch       :判定レンジ指定[1:0V0,2:2v5,3,5v0]  */
/* 戻値:int 1:OK, 0:NG                                            */
/*  */
int trgADcmp(short ADdata, unsigned short ch)
{
    // フラグリセット
    flgRxAD = 0;

    memset(cbufstr,'\0',sizeof(cbufstr));

    // 比較範囲チェック
    if( ch == 1 ){
        // 0V比較
        if( ADdata >= AD0v0l && ADdata <= AD0v0h){
            // OK
            sprintf(cbufstr,"OK,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 1;
        }else{
            // NG
            sprintf(cbufstr,"NG,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 0;
        }
    }else if( ch == 2 ){
        // 2V5比較
        if( ADdata >= AD2v5l && ADdata <= AD2v5h){
            // OK
            sprintf(cbufstr,"OK,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 1;
        }else{
            // NG
            sprintf(cbufstr,"NG,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 0;
        }
    }else if( ch == 3 ){
        // 5V0比較
        if( ADdata >= AD5v0l && ADdata <= AD5v0h){
            // OK
            sprintf(cbufstr,"OK,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 1;
        }else{
            // NG
            sprintf(cbufstr,"NG,%05d\r",(int)ADdata);
            sio1.puts(cbufstr);
            return 0;
        }
    }else{
        // ch error
        sio1.puts("error ADch\r");
        return 0;
    }
}