ジャパンオープン用のメインプログラム

Dependencies:   mbed AQM1602 HMC6352 PID

main_processing/strategy_parts/input.cpp

Committer:
lilac0112_1
Date:
2016-03-27
Revision:
38:67bc78f3c0ab
Parent:
33:aa115c30892e

File content as of revision 38:67bc78f3c0ab:

#include "mbed.h"
#include "extern.h"

//line
void ReadLine(void){
    static uint8_t line_buf[3]={0,0,0};
    wait_us(100);
    if(Line[0].read()==1) line_buf[0] = 100;
    if(line_buf[0]==0)  data.lnFlag[0]=0;
    else                data.lnFlag[0]=1;
    if(line_buf[0]>0) line_buf[0]--;
    
    if(Line[1].read()==1) line_buf[1] = 100;
    if(line_buf[1]==0)  data.lnFlag[1]=0;
    else                data.lnFlag[1]=1;
    if(line_buf[1]>0) line_buf[1]--;
    
    if(Line[2].read()==1) line_buf[2] = 100;
    if(line_buf[2]==0)  data.lnFlag[2]=0;
    else                data.lnFlag[2]=1;
    if(line_buf[2]>0) line_buf[2]--;
}
//line_hold
void LineRanking_A(void){
    if(data.lnOrder[0]==LINE_EMPTY){
        data.lnOrder[0]=A_SPOT;
    }
    else if(data.lnOrder[1]==LINE_EMPTY){
        data.lnOrder[1]=A_SPOT;
    }
    else if(data.lnOrder[2]==LINE_EMPTY){
        data.lnOrder[2]=A_SPOT;
    }
}
void LineRanking_B(void){
    if(data.lnOrder[0]==LINE_EMPTY){
        data.lnOrder[0]=B_SPOT;
    }
    else if(data.lnOrder[1]==LINE_EMPTY){
        data.lnOrder[1]=B_SPOT;
    }
    else if(data.lnOrder[2]==LINE_EMPTY){
        data.lnOrder[2]=B_SPOT;
    }
}
void LineRanking_C(void){
    if(data.lnOrder[0]==LINE_EMPTY){
        data.lnOrder[0]=C_SPOT;
    }
    else if(data.lnOrder[1]==LINE_EMPTY){
        data.lnOrder[1]=C_SPOT;
    }
    else if(data.lnOrder[2]==LINE_EMPTY){
        data.lnOrder[2]=C_SPOT;
    }
}
void LineRankClear(void){
    data.lnOrder[0]=LINE_EMPTY;
    data.lnOrder[1]=LINE_EMPTY;
    data.lnOrder[2]=LINE_EMPTY;
    
    if((0<LineHold)&&(LineHold<7)){
        if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==1)){
            data.lnOrder[0] = C_SPOT;
            data.lnOrder[1] = LINE_EMPTY;
        }
        else if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==0)){
            data.lnOrder[0] = B_SPOT;
            data.lnOrder[1] = LINE_EMPTY;
        }
        else if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==1)){
            data.lnOrder[0] = C_SPOT;
            data.lnOrder[1] = B_SPOT;
        }
        else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==0)){
            data.lnOrder[0] = A_SPOT;
            data.lnOrder[1] = LINE_EMPTY;
        }
        else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==1)){
            data.lnOrder[0] = C_SPOT;
            data.lnOrder[1] = A_SPOT;
        }
        else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==0)){
            data.lnOrder[0] = A_SPOT;
            data.lnOrder[1] = B_SPOT;
        }
    }
}
//line raw
/*
void LineRawCall_A(void){data.lnRawMemory[A_SPOT]=1;Line_timeout[A_SPOT].attach(&LineRawClear_A, LINE_DELAY);}
void LineRawCall_B(void){data.lnRawMemory[B_SPOT]=1;Line_timeout[B_SPOT].attach(&LineRawClear_B, LINE_DELAY);}
void LineRawCall_C(void){data.lnRawMemory[C_SPOT]=1;Line_timeout[C_SPOT].attach(&LineRawClear_C, LINE_DELAY);}
void LineRawClear_A(void){if(Line[A_SPOT].read()==1){LineRawCall_A();}else{data.lnRawMemory[A_SPOT]=0;}}
void LineRawClear_B(void){if(Line[B_SPOT].read()==1){LineRawCall_B();}else{data.lnRawMemory[B_SPOT]=0;}}
void LineRawClear_C(void){if(Line[C_SPOT].read()==1){LineRawCall_C();}else{data.lnRawMemory[C_SPOT]=0;}}
*/
void LineRawCall_ALL(void){
    if(data.lnRawReturn==1){
        if(
            (data.lnRawOrder[0]==A_SPOT)||
            (data.lnRawOrder[0]==B_SPOT)||
            (data.lnRawOrder[0]==C_SPOT)
        ){
            if(
                (
                    (data.lnRawOrder[0]!=LINE_EMPTY)&&
                    (data.lnRawOrder[1]!=LINE_EMPTY)&&
                    ((Line[data.lnRawOrder[0]].read()==1)||(data.lnRawOrder[0]==data.lnRawLastRise))
                )||
                (data.lnRawOrder[0]==C_SPOT)
            ){
                Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_3);
            }
            else{
                Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_2);
            }
        }
        else{
            Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_2);
        }
    }
    else{
        Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_1);
    }
}
void LineRawClear_ALL(void){
    if(LineRaw>0){
        LineRawCall_ALL();
    }
    else if(LineRaw==0){
        LineRawRankClear();
    }
}
void LineRawRankClear(void){
    
    //JSO2
    LineLiberate();
    
    data.lnRawOrderLog2[0]=data.lnRawOrderLog1[0];
    data.lnRawOrderLog2[1]=data.lnRawOrderLog1[1];
    data.lnRawOrderLog2[2]=data.lnRawOrderLog1[2];
    
    data.lnRawOrderLog1[0]=data.lnRawOrder[0];
    data.lnRawOrderLog1[1]=data.lnRawOrder[1];
    data.lnRawOrderLog1[2]=data.lnRawOrder[2];
    
    data.lnRawOrder[0]=LINE_EMPTY;
    data.lnRawOrder[1]=LINE_EMPTY;
    data.lnRawOrder[2]=LINE_EMPTY;
    
    if(
        (data.lnRawOrderLog2[0]==data.lnRawOrderLog1[0])&&
        //(data.lnRawOrderLog2[1]==data.lnRawOrderLog1[1])&&
        //(data.lnRawOrderLog2[2]==data.lnRawOrderLog1[2])
        (data.lnRawOrderLog2[0]!=LINE_EMPTY)
        //(data.lnRawOrderLog2[1]!=LINE_EMPTY)
    ){
        if(data.lnRepeat>100) data.lnRepeat=100;
        data.lnRepeat++;
        
        data.irLastNotice = data.irNotice;
        data.irLastPosition = data.irPosition;
    }
    else{
        data.lnRepeat=0;
    }
    
    
    data.lnRawRise[A_SPOT]=0;
    data.lnRawRise[B_SPOT]=0;
    data.lnRawRise[C_SPOT]=0;
}
void LineRawLogReset(void){
    /*
    if(
        (!(
            (data.irPosition==data.irLastPosition)||
            (data.irPosition==(data.irLastPosition+1))||
            (data.irPosition==(data.irLastPosition-1))||
            (data.irPosition==(data.irLastPosition+11))||
            (data.irPosition==(data.irLastPosition-11))
        ))&&
        (
            (data.irNotice==IR_CLOSE)||
            (data.irNotice==IR_CLOSER)
        )&&
        (
            (data.irLastPosition>7)
        )
    ){
        data.lnRawOrderLog2[0]=LINE_EMPTY;
        data.lnRawOrderLog2[1]=LINE_EMPTY;
        data.lnRawOrderLog2[2]=LINE_EMPTY;
    }
    else{
        data.lnRawOrderLog2[0]=LINE_EMPTY;
        data.lnRawOrderLog2[1]=LINE_EMPTY;
        data.lnRawOrderLog2[2]=LINE_EMPTY;
        
        data.lnRawOrderLog1[0]=LINE_EMPTY;
        data.lnRawOrderLog1[1]=LINE_EMPTY;
        data.lnRawOrderLog1[2]=LINE_EMPTY;
    }*/
    if(data.irNotice==IR_NONE){
        data.lnRawOrderLog2[0]=LINE_EMPTY;
        data.lnRawOrderLog2[1]=LINE_EMPTY;
        data.lnRawOrderLog2[2]=LINE_EMPTY;
        
        data.lnRawOrderLog1[0]=LINE_EMPTY;
        data.lnRawOrderLog1[1]=LINE_EMPTY;
        data.lnRawOrderLog1[2]=LINE_EMPTY;
    }
    else{
        data.lnRawOrderLog2[0]=LINE_EMPTY;
        data.lnRawOrderLog2[1]=LINE_EMPTY;
        data.lnRawOrderLog2[2]=LINE_EMPTY;
    }
    
}
void LineRawRanking_A(void){
    data.lnRawLastRise=A_SPOT;
    LineRawCall_ALL();
    if(data.lnRawRise[A_SPOT]==1) return;
    
    if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==A_SPOT)){
        data.lnRawOrder[0]=A_SPOT;
        if((sys.DefenceFlag==1)&&(data.lnRawOrder[1]==LINE_EMPTY)){
            data.lnRawOrder[1]=C_SPOT;
        }
    }
    else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==A_SPOT)){
        data.lnRawOrder[1]=A_SPOT;
    }
    else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==A_SPOT)){
        data.lnRawOrder[2]=A_SPOT;
    }
    data.lnRawRise[A_SPOT]=1;
}
void LineRawRanking_B(void){
    data.lnRawLastRise=B_SPOT;
    LineRawCall_ALL();
    if(data.lnRawRise[B_SPOT]==1) return;
    
    if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==B_SPOT)){
        data.lnRawOrder[0]=B_SPOT;
        if((sys.DefenceFlag==1)&&(data.lnRawOrder[1]==LINE_EMPTY)){
            data.lnRawOrder[1]=C_SPOT;
        }
    }
    else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==B_SPOT)){
        data.lnRawOrder[1]=B_SPOT;
    }
    else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==B_SPOT)){
        data.lnRawOrder[2]=B_SPOT;
    }
    data.lnRawRise[B_SPOT]=1;
}
void LineRawRanking_C(void){
    data.lnRawLastRise=C_SPOT;
    LineRawCall_ALL();
    if(data.lnRawRise[C_SPOT]==1) return;
    
    if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==C_SPOT)){
        data.lnRawOrder[0]=C_SPOT;
    }
    else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==C_SPOT)){
        data.lnRawOrder[1]=C_SPOT;
    }
    else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==C_SPOT)){
        data.lnRawOrder[2]=C_SPOT;
    }
    data.lnRawRise[C_SPOT]=1;
}
//ball
uint8_t ReadBall(void){//1or0
    return (BallChecker.read()==0);
    //return (BallCheckerA.read_u16()<40000); 
}
void JudgeBallHolding(void){
    //ホールド判定
    if(sys.DriBlind==0){
        if(
            ((data.ball==0)&&(sys.BallHoldFlag==0))||
            ((data.ball==1)&&(sys.BallHoldFlag==1))
        ){
            sys.BallHoldJudgeFlag=0;
            Ball_judge.detach();
        }
        if(
            ((data.ball==0)&&(sys.BallHoldFlag==1))||
            ((data.ball==1)&&(sys.BallHoldFlag==0))
        ){
            if(sys.BallHoldJudgeFlag==0){
                sys.BallHoldJudgeFlag=1;
                Ball_judge.attach(&JudgeBallHold, .25);
            }
        }
        /*
        if(
            !(
                (data.irNotice==IR_CLOSER)&&
                ((data.irPosition==10)||(data.irPosition==11)||(data.irPosition==12))
            )
        ){
            sys.BallHoldJudgeFlag=0;
            sys.BallHoldFlag=0;
            Ball_judge.detach();
        }
        */
    }
    else{
        sys.BallHoldFlag=0;
    }
}
//readsensor
void ReadCmps(void){
    cmps_set.cmps = hmc.sample()/10.0;
}
void ReadPing(void){
    uint16_t spi_data;
    //Ultra Sonic Wave
    spi_ss[1]=0;
    wait_us(200);
    
    spi_data = spi.write(0xABCD);
    
    wait_us(200);
    spi_ss[1]=1;
    
    data.ping[0] = (spi_data&0x00FF)>>0;
    data.ping[1] = (spi_data&0xFF00)>>8;
}
void ReadPing2(void){
    uint16_t spi_data;
    //Ultra Sonic Wave
    spi_ss[0]=0;
    wait_us(200);
    
    spi_data = spi.write(0xABCD);
    
    wait_us(200);
    spi_ss[0]=1;
    
    data.ping[2] = (spi_data&0x00FF)>>0;
    data.ping[3] = (spi_data&0xFF00)>>8;
}
void ReadIr(void){
    uint16_t spi_data;
    
    //Ir
    spi_ss[3]=0;
    wait_us(200);
    
    spi_data = spi.write(0xABCD);
    
    wait_us(200);
    spi_ss[3]=1;
    /*
    //key/phaseL/phaseS/long/short/
    // 2/     3/     3/   4/    4/
    data.irKey                  = (spi_data&0xC000)>>14;//1100000000000000
    data.irValPhase[IR_LONG]    = (spi_data&0x3800)>>11;//0011100000000000
    data.irValPhase[IR_SHORT]   = (spi_data&0x0700)>>8;///0000011100000000
    data.irSpot[IR_LONG]        = (spi_data&0x00F0)>>4;///0000000011110000
    data.irSpot[IR_SHORT]       = (spi_data&0x000F)>>0;///0000000000001111
    */
    
    //key/phaseL/phaseS/diffL/position/
    // 2/     3/     3/    3/       5/
    data.irKey                  = (spi_data&0xC000)>>14;//1100000000000000
    data.irValPhase[IR_LONG]    = (spi_data&0x3800)>>11;//0011100000000000
    data.irValPhase[IR_SHORT]   = (spi_data&0x0700)>>8;///0000011100000000
    data.irDif[IR_LONG]         = (spi_data&0x00E0)>>5;///0000000011100000
    data.irPosition             = (spi_data&0x001F)>>0;///0000000000011111
    
    if(data.irKey!=0x2) data.irNotice=IR_NONE;
    
    
    if(data.irValPhase[IR_SHORT]>=DIS_7){
        if(data.irValPhase[IR_LONG]>=DIS_7){
            data.irNotice=IR_NONE;
        }
        else{
            if(data.irDif[IR_LONG]<=DIS_0){
                data.irNotice=IR_NONE;
            }
            else{
                data.irNotice=IR_FAR;
            }
        }
    }
    else{
        if(data.irValPhase[IR_SHORT]>=DIS_3){
            data.irNotice = IR_CLOSE;
        }
        else{
            data.irNotice = IR_CLOSER;
        }
    }
    
    /*if(data.irValPhase[IR_LONG]>=DIS_7){
        data.irNotice=IR_NONE;
    }
    else{
        if(data.irValPhase[IR_SHORT]>=DIS_7){
            data.irNotice=IR_FAR;
        }
        else{
            if(data.irValPhase[IR_LONG]>=DIS_4){
                data.irNotice = IR_CLOSE;
            }
            else{
                data.irNotice = IR_CLOSER;
            }
        }
    }*/
    /*
    if(data.irNotice == IR_NONE) data.irPosition=11;
    if(data.irNotice == IR_FAR) data.irPosition=data.irSpot[IR_LONG]-1;
    if(data.irNotice == IR_CLOSE) data.irPosition=data.irSpot[IR_SHORT]+7;
    if(data.irNotice == IR_CLOSER) data.irPosition=data.irSpot[IR_SHORT]+7;
    */
    //LED[1] = LED[0];
    //LED[0] = !LED[0];
}
//info
void ValidInfo(void){
    //LED=0xA;
    if(sys.InfoFlag==0){
        sys.InfoFlag=1;
    }
}
void ReadInfo(void){
    ReadIr();
    PidUpdate();
    ReadPing();
    ReadPing2();
}