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

Dependencies:   mbed AQM1602 HMC6352 PID

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers input.cpp Source File

input.cpp

00001 #include "mbed.h"
00002 #include "extern.h"
00003 
00004 //line
00005 void ReadLine(void){
00006     static uint8_t line_buf[3]={0,0,0};
00007     wait_us(100);
00008     if(Line[0].read()==1) line_buf[0] = 100;
00009     if(line_buf[0]==0)  data.lnFlag[0]=0;
00010     else                data.lnFlag[0]=1;
00011     if(line_buf[0]>0) line_buf[0]--;
00012     
00013     if(Line[1].read()==1) line_buf[1] = 100;
00014     if(line_buf[1]==0)  data.lnFlag[1]=0;
00015     else                data.lnFlag[1]=1;
00016     if(line_buf[1]>0) line_buf[1]--;
00017     
00018     if(Line[2].read()==1) line_buf[2] = 100;
00019     if(line_buf[2]==0)  data.lnFlag[2]=0;
00020     else                data.lnFlag[2]=1;
00021     if(line_buf[2]>0) line_buf[2]--;
00022 }
00023 //line_hold
00024 void LineRanking_A(void){
00025     if(data.lnOrder[0]==LINE_EMPTY){
00026         data.lnOrder[0]=A_SPOT;
00027     }
00028     else if(data.lnOrder[1]==LINE_EMPTY){
00029         data.lnOrder[1]=A_SPOT;
00030     }
00031     else if(data.lnOrder[2]==LINE_EMPTY){
00032         data.lnOrder[2]=A_SPOT;
00033     }
00034 }
00035 void LineRanking_B(void){
00036     if(data.lnOrder[0]==LINE_EMPTY){
00037         data.lnOrder[0]=B_SPOT;
00038     }
00039     else if(data.lnOrder[1]==LINE_EMPTY){
00040         data.lnOrder[1]=B_SPOT;
00041     }
00042     else if(data.lnOrder[2]==LINE_EMPTY){
00043         data.lnOrder[2]=B_SPOT;
00044     }
00045 }
00046 void LineRanking_C(void){
00047     if(data.lnOrder[0]==LINE_EMPTY){
00048         data.lnOrder[0]=C_SPOT;
00049     }
00050     else if(data.lnOrder[1]==LINE_EMPTY){
00051         data.lnOrder[1]=C_SPOT;
00052     }
00053     else if(data.lnOrder[2]==LINE_EMPTY){
00054         data.lnOrder[2]=C_SPOT;
00055     }
00056 }
00057 void LineRankClear(void){
00058     data.lnOrder[0]=LINE_EMPTY;
00059     data.lnOrder[1]=LINE_EMPTY;
00060     data.lnOrder[2]=LINE_EMPTY;
00061     
00062     if((0<LineHold)&&(LineHold<7)){
00063         if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==1)){
00064             data.lnOrder[0] = C_SPOT;
00065             data.lnOrder[1] = LINE_EMPTY;
00066         }
00067         else if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==0)){
00068             data.lnOrder[0] = B_SPOT;
00069             data.lnOrder[1] = LINE_EMPTY;
00070         }
00071         else if((LineHolding[A_SPOT].read()==0)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==1)){
00072             data.lnOrder[0] = C_SPOT;
00073             data.lnOrder[1] = B_SPOT;
00074         }
00075         else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==0)){
00076             data.lnOrder[0] = A_SPOT;
00077             data.lnOrder[1] = LINE_EMPTY;
00078         }
00079         else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==0)&&(LineHolding[C_SPOT].read()==1)){
00080             data.lnOrder[0] = C_SPOT;
00081             data.lnOrder[1] = A_SPOT;
00082         }
00083         else if((LineHolding[A_SPOT].read()==1)&&(LineHolding[B_SPOT].read()==1)&&(LineHolding[C_SPOT].read()==0)){
00084             data.lnOrder[0] = A_SPOT;
00085             data.lnOrder[1] = B_SPOT;
00086         }
00087     }
00088 }
00089 //line raw
00090 /*
00091 void LineRawCall_A(void){data.lnRawMemory[A_SPOT]=1;Line_timeout[A_SPOT].attach(&LineRawClear_A, LINE_DELAY);}
00092 void LineRawCall_B(void){data.lnRawMemory[B_SPOT]=1;Line_timeout[B_SPOT].attach(&LineRawClear_B, LINE_DELAY);}
00093 void LineRawCall_C(void){data.lnRawMemory[C_SPOT]=1;Line_timeout[C_SPOT].attach(&LineRawClear_C, LINE_DELAY);}
00094 void LineRawClear_A(void){if(Line[A_SPOT].read()==1){LineRawCall_A();}else{data.lnRawMemory[A_SPOT]=0;}}
00095 void LineRawClear_B(void){if(Line[B_SPOT].read()==1){LineRawCall_B();}else{data.lnRawMemory[B_SPOT]=0;}}
00096 void LineRawClear_C(void){if(Line[C_SPOT].read()==1){LineRawCall_C();}else{data.lnRawMemory[C_SPOT]=0;}}
00097 */
00098 void LineRawCall_ALL(void){
00099     if(data.lnRawReturn==1){
00100         if(
00101             (data.lnRawOrder[0]==A_SPOT)||
00102             (data.lnRawOrder[0]==B_SPOT)||
00103             (data.lnRawOrder[0]==C_SPOT)
00104         ){
00105             if(
00106                 (
00107                     (data.lnRawOrder[0]!=LINE_EMPTY)&&
00108                     (data.lnRawOrder[1]!=LINE_EMPTY)&&
00109                     ((Line[data.lnRawOrder[0]].read()==1)||(data.lnRawOrder[0]==data.lnRawLastRise))
00110                 )||
00111                 (data.lnRawOrder[0]==C_SPOT)
00112             ){
00113                 Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_3);
00114             }
00115             else{
00116                 Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_2);
00117             }
00118         }
00119         else{
00120             Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_2);
00121         }
00122     }
00123     else{
00124         Line_reset.attach(&LineRawClear_ALL, LINE_DELAY_1);
00125     }
00126 }
00127 void LineRawClear_ALL(void){
00128     if(LineRaw>0){
00129         LineRawCall_ALL();
00130     }
00131     else if(LineRaw==0){
00132         LineRawRankClear();
00133     }
00134 }
00135 void LineRawRankClear(void){
00136     
00137     //JSO2
00138     LineLiberate();
00139     
00140     data.lnRawOrderLog2[0]=data.lnRawOrderLog1[0];
00141     data.lnRawOrderLog2[1]=data.lnRawOrderLog1[1];
00142     data.lnRawOrderLog2[2]=data.lnRawOrderLog1[2];
00143     
00144     data.lnRawOrderLog1[0]=data.lnRawOrder[0];
00145     data.lnRawOrderLog1[1]=data.lnRawOrder[1];
00146     data.lnRawOrderLog1[2]=data.lnRawOrder[2];
00147     
00148     data.lnRawOrder[0]=LINE_EMPTY;
00149     data.lnRawOrder[1]=LINE_EMPTY;
00150     data.lnRawOrder[2]=LINE_EMPTY;
00151     
00152     if(
00153         (data.lnRawOrderLog2[0]==data.lnRawOrderLog1[0])&&
00154         //(data.lnRawOrderLog2[1]==data.lnRawOrderLog1[1])&&
00155         //(data.lnRawOrderLog2[2]==data.lnRawOrderLog1[2])
00156         (data.lnRawOrderLog2[0]!=LINE_EMPTY)
00157         //(data.lnRawOrderLog2[1]!=LINE_EMPTY)
00158     ){
00159         if(data.lnRepeat>100) data.lnRepeat=100;
00160         data.lnRepeat++;
00161         
00162         data.irLastNotice = data.irNotice;
00163         data.irLastPosition = data.irPosition;
00164     }
00165     else{
00166         data.lnRepeat=0;
00167     }
00168     
00169     
00170     data.lnRawRise[A_SPOT]=0;
00171     data.lnRawRise[B_SPOT]=0;
00172     data.lnRawRise[C_SPOT]=0;
00173 }
00174 void LineRawLogReset(void){
00175     /*
00176     if(
00177         (!(
00178             (data.irPosition==data.irLastPosition)||
00179             (data.irPosition==(data.irLastPosition+1))||
00180             (data.irPosition==(data.irLastPosition-1))||
00181             (data.irPosition==(data.irLastPosition+11))||
00182             (data.irPosition==(data.irLastPosition-11))
00183         ))&&
00184         (
00185             (data.irNotice==IR_CLOSE)||
00186             (data.irNotice==IR_CLOSER)
00187         )&&
00188         (
00189             (data.irLastPosition>7)
00190         )
00191     ){
00192         data.lnRawOrderLog2[0]=LINE_EMPTY;
00193         data.lnRawOrderLog2[1]=LINE_EMPTY;
00194         data.lnRawOrderLog2[2]=LINE_EMPTY;
00195     }
00196     else{
00197         data.lnRawOrderLog2[0]=LINE_EMPTY;
00198         data.lnRawOrderLog2[1]=LINE_EMPTY;
00199         data.lnRawOrderLog2[2]=LINE_EMPTY;
00200         
00201         data.lnRawOrderLog1[0]=LINE_EMPTY;
00202         data.lnRawOrderLog1[1]=LINE_EMPTY;
00203         data.lnRawOrderLog1[2]=LINE_EMPTY;
00204     }*/
00205     if(data.irNotice==IR_NONE){
00206         data.lnRawOrderLog2[0]=LINE_EMPTY;
00207         data.lnRawOrderLog2[1]=LINE_EMPTY;
00208         data.lnRawOrderLog2[2]=LINE_EMPTY;
00209         
00210         data.lnRawOrderLog1[0]=LINE_EMPTY;
00211         data.lnRawOrderLog1[1]=LINE_EMPTY;
00212         data.lnRawOrderLog1[2]=LINE_EMPTY;
00213     }
00214     else{
00215         data.lnRawOrderLog2[0]=LINE_EMPTY;
00216         data.lnRawOrderLog2[1]=LINE_EMPTY;
00217         data.lnRawOrderLog2[2]=LINE_EMPTY;
00218     }
00219     
00220 }
00221 void LineRawRanking_A(void){
00222     data.lnRawLastRise=A_SPOT;
00223     LineRawCall_ALL();
00224     if(data.lnRawRise[A_SPOT]==1) return;
00225     
00226     if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==A_SPOT)){
00227         data.lnRawOrder[0]=A_SPOT;
00228         if((sys.DefenceFlag==1)&&(data.lnRawOrder[1]==LINE_EMPTY)){
00229             data.lnRawOrder[1]=C_SPOT;
00230         }
00231     }
00232     else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==A_SPOT)){
00233         data.lnRawOrder[1]=A_SPOT;
00234     }
00235     else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==A_SPOT)){
00236         data.lnRawOrder[2]=A_SPOT;
00237     }
00238     data.lnRawRise[A_SPOT]=1;
00239 }
00240 void LineRawRanking_B(void){
00241     data.lnRawLastRise=B_SPOT;
00242     LineRawCall_ALL();
00243     if(data.lnRawRise[B_SPOT]==1) return;
00244     
00245     if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==B_SPOT)){
00246         data.lnRawOrder[0]=B_SPOT;
00247         if((sys.DefenceFlag==1)&&(data.lnRawOrder[1]==LINE_EMPTY)){
00248             data.lnRawOrder[1]=C_SPOT;
00249         }
00250     }
00251     else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==B_SPOT)){
00252         data.lnRawOrder[1]=B_SPOT;
00253     }
00254     else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==B_SPOT)){
00255         data.lnRawOrder[2]=B_SPOT;
00256     }
00257     data.lnRawRise[B_SPOT]=1;
00258 }
00259 void LineRawRanking_C(void){
00260     data.lnRawLastRise=C_SPOT;
00261     LineRawCall_ALL();
00262     if(data.lnRawRise[C_SPOT]==1) return;
00263     
00264     if((data.lnRawOrder[0]==LINE_EMPTY)||(data.lnRawOrder[0]==C_SPOT)){
00265         data.lnRawOrder[0]=C_SPOT;
00266     }
00267     else if((data.lnRawOrder[1]==LINE_EMPTY)||(data.lnRawOrder[1]==C_SPOT)){
00268         data.lnRawOrder[1]=C_SPOT;
00269     }
00270     else if((data.lnRawOrder[2]==LINE_EMPTY)||(data.lnRawOrder[2]==C_SPOT)){
00271         data.lnRawOrder[2]=C_SPOT;
00272     }
00273     data.lnRawRise[C_SPOT]=1;
00274 }
00275 //ball
00276 uint8_t ReadBall(void){//1or0
00277     return (BallChecker.read()==0);
00278     //return (BallCheckerA.read_u16()<40000); 
00279 }
00280 void JudgeBallHolding(void){
00281     //ホールド判定
00282     if(sys.DriBlind==0){
00283         if(
00284             ((data.ball==0)&&(sys.BallHoldFlag==0))||
00285             ((data.ball==1)&&(sys.BallHoldFlag==1))
00286         ){
00287             sys.BallHoldJudgeFlag=0;
00288             Ball_judge.detach();
00289         }
00290         if(
00291             ((data.ball==0)&&(sys.BallHoldFlag==1))||
00292             ((data.ball==1)&&(sys.BallHoldFlag==0))
00293         ){
00294             if(sys.BallHoldJudgeFlag==0){
00295                 sys.BallHoldJudgeFlag=1;
00296                 Ball_judge.attach(&JudgeBallHold, .25);
00297             }
00298         }
00299         /*
00300         if(
00301             !(
00302                 (data.irNotice==IR_CLOSER)&&
00303                 ((data.irPosition==10)||(data.irPosition==11)||(data.irPosition==12))
00304             )
00305         ){
00306             sys.BallHoldJudgeFlag=0;
00307             sys.BallHoldFlag=0;
00308             Ball_judge.detach();
00309         }
00310         */
00311     }
00312     else{
00313         sys.BallHoldFlag=0;
00314     }
00315 }
00316 //readsensor
00317 void ReadCmps(void){
00318     cmps_set.cmps = hmc.sample()/10.0;
00319 }
00320 void ReadPing(void){
00321     uint16_t spi_data;
00322     //Ultra Sonic Wave
00323     spi_ss[1]=0;
00324     wait_us(200);
00325     
00326     spi_data = spi.write(0xABCD);
00327     
00328     wait_us(200);
00329     spi_ss[1]=1;
00330     
00331     data.ping[0] = (spi_data&0x00FF)>>0;
00332     data.ping[1] = (spi_data&0xFF00)>>8;
00333 }
00334 void ReadPing2(void){
00335     uint16_t spi_data;
00336     //Ultra Sonic Wave
00337     spi_ss[0]=0;
00338     wait_us(200);
00339     
00340     spi_data = spi.write(0xABCD);
00341     
00342     wait_us(200);
00343     spi_ss[0]=1;
00344     
00345     data.ping[2] = (spi_data&0x00FF)>>0;
00346     data.ping[3] = (spi_data&0xFF00)>>8;
00347 }
00348 void ReadIr(void){
00349     uint16_t spi_data;
00350     
00351     //Ir
00352     spi_ss[3]=0;
00353     wait_us(200);
00354     
00355     spi_data = spi.write(0xABCD);
00356     
00357     wait_us(200);
00358     spi_ss[3]=1;
00359     /*
00360     //key/phaseL/phaseS/long/short/
00361     // 2/     3/     3/   4/    4/
00362     data.irKey                  = (spi_data&0xC000)>>14;//1100000000000000
00363     data.irValPhase[IR_LONG]    = (spi_data&0x3800)>>11;//0011100000000000
00364     data.irValPhase[IR_SHORT]   = (spi_data&0x0700)>>8;///0000011100000000
00365     data.irSpot[IR_LONG]        = (spi_data&0x00F0)>>4;///0000000011110000
00366     data.irSpot[IR_SHORT]       = (spi_data&0x000F)>>0;///0000000000001111
00367     */
00368     
00369     //key/phaseL/phaseS/diffL/position/
00370     // 2/     3/     3/    3/       5/
00371     data.irKey                  = (spi_data&0xC000)>>14;//1100000000000000
00372     data.irValPhase[IR_LONG]    = (spi_data&0x3800)>>11;//0011100000000000
00373     data.irValPhase[IR_SHORT]   = (spi_data&0x0700)>>8;///0000011100000000
00374     data.irDif[IR_LONG]         = (spi_data&0x00E0)>>5;///0000000011100000
00375     data.irPosition             = (spi_data&0x001F)>>0;///0000000000011111
00376     
00377     if(data.irKey!=0x2) data.irNotice=IR_NONE;
00378     
00379     
00380     if(data.irValPhase[IR_SHORT]>=DIS_7){
00381         if(data.irValPhase[IR_LONG]>=DIS_7){
00382             data.irNotice=IR_NONE;
00383         }
00384         else{
00385             if(data.irDif[IR_LONG]<=DIS_0){
00386                 data.irNotice=IR_NONE;
00387             }
00388             else{
00389                 data.irNotice=IR_FAR;
00390             }
00391         }
00392     }
00393     else{
00394         if(data.irValPhase[IR_SHORT]>=DIS_3){
00395             data.irNotice = IR_CLOSE;
00396         }
00397         else{
00398             data.irNotice = IR_CLOSER;
00399         }
00400     }
00401     
00402     /*if(data.irValPhase[IR_LONG]>=DIS_7){
00403         data.irNotice=IR_NONE;
00404     }
00405     else{
00406         if(data.irValPhase[IR_SHORT]>=DIS_7){
00407             data.irNotice=IR_FAR;
00408         }
00409         else{
00410             if(data.irValPhase[IR_LONG]>=DIS_4){
00411                 data.irNotice = IR_CLOSE;
00412             }
00413             else{
00414                 data.irNotice = IR_CLOSER;
00415             }
00416         }
00417     }*/
00418     /*
00419     if(data.irNotice == IR_NONE) data.irPosition=11;
00420     if(data.irNotice == IR_FAR) data.irPosition=data.irSpot[IR_LONG]-1;
00421     if(data.irNotice == IR_CLOSE) data.irPosition=data.irSpot[IR_SHORT]+7;
00422     if(data.irNotice == IR_CLOSER) data.irPosition=data.irSpot[IR_SHORT]+7;
00423     */
00424     //LED[1] = LED[0];
00425     //LED[0] = !LED[0];
00426 }
00427 //info
00428 void ValidInfo(void){
00429     //LED=0xA;
00430     if(sys.InfoFlag==0){
00431         sys.InfoFlag=1;
00432     }
00433 }
00434 void ReadInfo(void){
00435     ReadIr();
00436     PidUpdate();
00437     ReadPing();
00438     ReadPing2();
00439 }