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

Dependencies:   mbed AQM1602 HMC6352 PID

Revision:
18:3a42a931c95a
Parent:
17:cc862ecf9812
Child:
19:967207de919d
--- a/main_processing/strategy/strategy.cpp	Mon Mar 14 08:56:04 2016 +0000
+++ b/main_processing/strategy/strategy.cpp	Tue Mar 15 12:03:51 2016 +0000
@@ -2,732 +2,7 @@
 #include "extern.h"
 
 //Atk
-void modeAttack0(void){
-    double ir_x, ir_y;
-    int vx,vy,vs;
-    uint8_t LineDir[4];
-    uint8_t LineStop[2];
-    //uint8_t IrRange[4];
-    //uint8_t LineBind[4];
-    if(sys.IrFlag==1){
-        ReadIr();
-        sys.IrFlag=0;
-    }
-    if(sys.PidFlag==1){
-        Line_ticker.detach();
-        PidUpdate();
-        Line_ticker.attach(&ReadLine, 0.005);
-        sys.PidFlag=0;
-    }
-    ir_x = ir_move_val_old[data.irNotice][data.irPosition][IR_X];
-    ir_y = ir_move_val_old[data.irNotice][data.irPosition][IR_Y];
-    if(data.irPosition<8){
-        ir_x *= (double)(sys.l_pow);
-        ir_y *= (double)(sys.l_pow);
-    }
-    else{
-        ir_x *= (double)(sys.s_pow);
-        ir_y *= (double)(sys.s_pow);
-    }
-    //Lineを考慮していないIrのみの値
-    vx = ir_x;
-    vy = ir_y;
-    //Line検出方向を調べる
-    LineDir[A_SPOT] = (!((vx>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==0))));
-    LineDir[B_SPOT] = (!((vx<0)&&((data.lnFlag[A_SPOT]==0)&&(data.lnFlag[B_SPOT]==1))));
-    LineDir[C_SPOT] = (!((vy<0)&&((data.lnFlag[C_SPOT]==1)&&(1))));
-    LineDir[AB_SPOT] = (!((vy>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==1))));
-    
-    LineStop[X_AXIS] = LineDir[A_SPOT]*LineDir[B_SPOT];
-    LineStop[Y_AXIS] = LineDir[C_SPOT]*LineDir[AB_SPOT];
-    
-    //Ir
-    move(
-        vx*LineStop[X_AXIS] + (LINE_RF)*(vy!=0)*((-1)*(LineDir[A_SPOT]==0) + (LineDir[B_SPOT]==0)),
-        vy*LineStop[Y_AXIS] + (LINE_RF)*(vx!=0)*((LineDir[C_SPOT]==0) + (-1)*(LineDir[AB_SPOT]==0)),
-        vs
-    );
-    if(sys.MotorFlag==1){
-        tx_motor();
-        sys.MotorFlag=0;
-    }
-    return;
-}
-uint8_t HmcResetFlag;
-void HmcReset(void){
-    hmc_reset=HMC_RST;
-    wait_us(100);
-    hmc_reset=HMC_RUN;
-}
-uint8_t LineReverseFlag;
-void LineReverse(void){
-    LineReverseFlag=0;
-}
-uint8_t LineSign[3];
-uint8_t LineFirst[2];
-uint8_t LinePriority[2];//0を後に,1を優先
-void LineClear_A(void){LineSign[A_SPOT]=0;data.lnFlag[A_SPOT]=0;}
-void LineClear_B(void){LineSign[B_SPOT]=0;data.lnFlag[B_SPOT]=0;}
-void LineClear_C(void){LineSign[C_SPOT]=0;data.lnFlag[C_SPOT]=0;}
-void LineCall_A(void){
-    //
-    LineSign[A_SPOT] = 1;
-    if(LineSign[B_SPOT]==0){
-        LineFirst[X_AXIS] = A_SPOT;
-    }
-    if((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1)){
-        if(LineSign[C_SPOT]==0){
-            LineFirst[Y_AXIS] = AB_SPOT;
-        }
-    }
-    //
-    if((Line[A_SPOT].read()==1)||(1)) data.lnFlag[A_SPOT]=1;
-    //
-    Line_timeout[A_SPOT].attach(&LineClear_A, LINE_DELAY);
-}
-void LineCall_B(void){
-    //
-    LineSign[B_SPOT] = 1;
-    if(LineSign[A_SPOT]==0){
-        LineFirst[X_AXIS] = B_SPOT;
-    }
-    if((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1)){
-        if(LineSign[C_SPOT]==0){
-            LineFirst[Y_AXIS] = AB_SPOT;
-        }
-    }
-    //
-    if((Line[B_SPOT].read()==1)||(1)) data.lnFlag[B_SPOT]=1;
-    //
-    Line_timeout[B_SPOT].attach(&LineClear_B, LINE_DELAY);
-}
-void LineCall_C(void){
-    //
-    LineSign[C_SPOT] = 1;
-    if(!((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1))){
-        LineFirst[Y_AXIS] = C_SPOT;
-    }
-    //
-    if((Line[C_SPOT].read()==1)||(1)) data.lnFlag[C_SPOT]=1;
-    //
-    Line_timeout[C_SPOT].attach(&LineClear_C, LINE_DELAY);
-}
-void modeAttack1(void){
-    double ir_x, ir_y;
-    int vx,vy,vs;
-    uint8_t LineDir[4];
-    uint8_t LineStop[2];
-    uint8_t IrRange[4];
-    uint8_t LinePulse[4];
-    uint8_t static LineBind[4];
-    if(sys.KickOffFlag==1){
-        LineBind[0]=0;
-        LineBind[1]=0;
-        LineBind[2]=0;
-        LineBind[3]=0;
-        LineReverseFlag=0;
-        
-        LineSign[A_SPOT]=0;
-        LineSign[B_SPOT]=0;
-        LineSign[C_SPOT]=0;
-        
-        data.lnFlag[A_SPOT]=0;
-        data.lnFlag[B_SPOT]=0;
-        data.lnFlag[C_SPOT]=0;
-        
-        sys.KickOffFlag=0;
-    }
-    if(sys.IrFlag==1){
-        ReadIr();
-        sys.IrFlag=0;
-    }
-    if(sys.PidFlag==1){
-        //Line_ticker.detach();
-        PidUpdate();
-        //Line_ticker.attach(&ReadLine, 0.005);
-        sys.PidFlag=0;
-    }
-    ir_x = ir_move_val_old[data.irNotice][data.irPosition][IR_X];
-    ir_y = ir_move_val_old[data.irNotice][data.irPosition][IR_Y];
-    if(data.irPosition<8){
-        ir_x *= sys.l_pow;
-        ir_y *= sys.l_pow;
-    }
-    else{
-        ir_x *= sys.s_pow;
-        ir_y *= sys.s_pow;
-    }
-    
-    //Lineを考慮していないIrのみの値
-    vx = ir_x;
-    vy = ir_y;
-    //Line検出方向を調べる
-    LineDir[A_SPOT] = (!((vx>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==0))&&(1)));
-    LineDir[B_SPOT] = (!((vx<0)&&((data.lnFlag[A_SPOT]==0)&&(data.lnFlag[B_SPOT]==1))&&(1)));
-    LineDir[C_SPOT] = (!((vy<0)&&((data.lnFlag[C_SPOT]==1)&&(1                      ))&&(1)));
-    LineDir[AB_SPOT] = (!((vy>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==1))&&(1)));
-    
-    LineStop[X_AXIS] = LineDir[A_SPOT]*LineDir[B_SPOT];
-    LineStop[Y_AXIS] = LineDir[C_SPOT]*LineDir[AB_SPOT];
-    
-    //Ir
-    //strict
-    /*
-    IrRange[A_SPOT] = ((18<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=10))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((12<=data.irPosition)&&(data.irPosition<=16))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((15<=data.irPosition)&&(data.irPosition<=19))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((9<=data.irPosition)&&(data.irPosition<=13))||((                 1)&&(data.irPosition<=3));
-    */
-    //sweet
-    IrRange[A_SPOT] = ((19<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=9))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((13<=data.irPosition)&&(data.irPosition<=15))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((16<=data.irPosition)&&(data.irPosition<=18))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((10<=data.irPosition)&&(data.irPosition<=12))||((                 1)&&(data.irPosition<=3));
-    
-    
-    LinePulse[A_SPOT] = ((IrRange[A_SPOT]==1)&&(LineDir[A_SPOT]==0));
-    LinePulse[B_SPOT] = ((IrRange[B_SPOT]==1)&&(LineDir[B_SPOT]==0));
-    LinePulse[C_SPOT] = ((IrRange[C_SPOT]==1)&&(LineDir[C_SPOT]==0));
-    LinePulse[AB_SPOT] = ((IrRange[AB_SPOT]==1)&&(LineDir[AB_SPOT]==0));
-    
-    LineBind[A_SPOT] = ((LinePulse[A_SPOT])||((IrRange[A_SPOT]==1)&&(LineBind[A_SPOT]==1)))&&(LineBind[B_SPOT]==0);
-    LineBind[B_SPOT] = ((LinePulse[B_SPOT])||((IrRange[B_SPOT]==1)&&(LineBind[B_SPOT]==1)))&&(LineBind[A_SPOT]==0);
-    LineBind[C_SPOT] = ((LinePulse[C_SPOT])||((IrRange[C_SPOT]==1)&&(LineBind[C_SPOT]==1)))&&(LineBind[AB_SPOT]==0);
-    LineBind[AB_SPOT] = ((LinePulse[AB_SPOT])||((IrRange[AB_SPOT]==1)&&(LineBind[AB_SPOT]==1)))&&(LineBind[C_SPOT]==0);
-    /*
-    LineBind[A_SPOT] = ((IrRange[A_SPOT]==1)&&((LineDir[A_SPOT]==0)||(LineBind[A_SPOT]==1)));
-    LineBind[B_SPOT] = ((IrRange[B_SPOT]==1)&&((LineDir[B_SPOT]==0)||(LineBind[B_SPOT]==1)));
-    LineBind[C_SPOT] = ((IrRange[C_SPOT]==1)&&((LineDir[C_SPOT]==0)||(LineBind[C_SPOT]==1)));
-    LineBind[AB_SPOT] = ((IrRange[AB_SPOT]==1)&&((LineDir[AB_SPOT]==0)||(LineBind[AB_SPOT]==1)));
-    */
-    vx = vx*LineStop[X_AXIS] + (LINE_RF)*(vy!=0)*((-1)*(LineDir[A_SPOT]==0) + (LineDir[B_SPOT]==0));
-    vy = vy*LineStop[Y_AXIS] + (LINE_RF)*(vx!=0)*((LineDir[C_SPOT]==0) + (-1)*(LineDir[AB_SPOT]==0));
-    vs = cmps_set.OutputPID;
-    if((LineBind[A_SPOT]==1)||(LineBind[B_SPOT]==1)||(LineBind[C_SPOT]==1)||(LineBind[AB_SPOT]==1)){
-        if(LineRaw>0){
-            vx=(LINE_RF*2)*((-1)*IrRange[A_SPOT] +      IrRange[B_SPOT]);
-            vy=(LINE_RF*2)*(     IrRange[C_SPOT] + (-1)*IrRange[AB_SPOT]);
-            /*vx=(LINE_RF*2)*((-1)*(LineFirst[X_AXIS] == A_SPOT) +      (LineFirst[X_AXIS] == B_SPOT));
-            vy=(LINE_RF*2)*(     (LineFirst[Y_AXIS] == C_SPOT) + (-1)*(LineFirst[Y_AXIS] == AB_SPOT));
-            Line_timeout[A_SPOT].attach(&LineClear_A, LINE_DELAY);
-            Line_timeout[B_SPOT].attach(&LineClear_B, LINE_DELAY);
-            Line_timeout[C_SPOT].attach(&LineClear_C, LINE_DELAY);*/
-        }
-        else{
-            vx=0;
-            vy=0;
-        }
-    }
-    if(LineRaw>0){
-        Line_timeout[A_SPOT].attach(&LineClear_A, LINE_DELAY);
-        Line_timeout[B_SPOT].attach(&LineClear_B, LINE_DELAY);
-        Line_timeout[C_SPOT].attach(&LineClear_C, LINE_DELAY);
-    }
-    move(
-        vx,
-        vy,
-        vs
-    );
-    if(sys.MotorFlag==1){
-        tx_motor();
-        sys.MotorFlag=0;
-    }
-    return;
-}
-void modeAttack2(void){
-    double ir_x, ir_y;
-    int vx,vy,vs;
-    /*int LineForce[2];
-    uint8_t LineDir[4];
-    uint8_t LineOn[4];
-    uint8_t LineReturn[4];
-    uint8_t LineStop[2];
-    uint8_t IrRange[4];
-    uint8_t static LineBind[4];*/
-    //buint8_t static spi_count;
-    if(sys.KickOffFlag==1){
-        
-        sys.MotorFlag=0;
-        sys.IrFlag=0;
-        /*LineBind[0]=0;
-        LineBind[1]=0;
-        LineBind[2]=0;
-        LineBind[3]=0;
-        LineReverseFlag=0;
-        
-        LineSign[A_SPOT]=0;
-        LineSign[B_SPOT]=0;
-        LineSign[C_SPOT]=0;
-        
-        data.lnFlag[A_SPOT]=0;
-        data.lnFlag[B_SPOT]=0;
-        data.lnFlag[C_SPOT]=0;
-        
-        HmcResetFlag = 0;
-        sys.UswFlag = 0;
-        //spi_count=0;
-        */
-        hmc_reset=HMC_RUN;
-        sys.KickFlag = 0;
-        
-        sys.KickOffFlag=0;
-        //while((Sw[2].read()==1)&&(Sw[3].read()==1));//押して離すとスタート
-    }
-    if(sys.IrFlag==1){
-        //LED[0] = 0;
-        //LED[1] = 1;
-        /*spi_count++;
-        if(spi_count%10 == 0){
-            ReadPing();
-        }
-        else{
-            ReadIr();
-        }
-        if(spi_count==20) spi_count=0;
-        */
-        ReadIr();
-        sys.IrFlag=0;
-    }
-    if(sys.PidFlag==1){
-        PidUpdate();
-        sys.PidFlag=0;
-    }
-    /*if(sys.UswFlag==1){
-        ReadPing();
-        sys.UswFlag=0;
-    }*/
-    /*
-    if(HmcResetFlag==1){
-        HmcReset();
-        HmcResetFlag=0;
-    }
-    */
-    //ir_x = ir_move_val_old[data.irNotice][data.irPosition][IR_X];
-    //ir_y = ir_move_val_old[data.irNotice][data.irPosition][IR_Y];
-    ir_x = ir_move_val[0][data.irNotice][data.irPosition][IR_X_DIR]+ir_move_val[0][data.irNotice][data.irPosition][IR_X_TURN];
-    ir_y = ir_move_val[0][data.irNotice][data.irPosition][IR_Y_DIR]+ir_move_val[0][data.irNotice][data.irPosition][IR_Y_TURN];
-    
-    if(data.irPosition<8){
-        ir_x *= sys.l_pow;
-        ir_y *= sys.l_pow;
-    }
-    else{
-        ir_x *= sys.s_pow;
-        ir_y *= sys.s_pow;
-    }
-    
-    //Lineを考慮していないIrのみの値
-    vx = ir_x;
-    vy = ir_y;
-    /*
-    if((data.irPosition==10)&&(vy>0)){
-        vy += 0;//前進加速
-    }
-    if((data.irPosition==11)&&(vy>0)){
-        vy += 0;//前進加速
-        if(sys.KickFlag==1){
-            DriveSolenoid();
-        }
-    }
-    if((data.irPosition==12)&&(vy>0)){
-        vy += 0;//前進加速
-    }
-    if((data.irPosition==1)&&(vy>0)){
-        vy += 0;//前進加速
-    }
-    if((data.irPosition==2)&&(vy>0)){
-        vy += 0;//前進加速
-    }
-    
-    if((data.irPosition==17)&&(data.ping[L_PING]>data.ping[R_PING])){
-        vx *= -1.0;//背後回り込みの左右判断
-    }*/
-    /*
-    if((cmps_set.InputPID<(REFERENCE-30))||(cmps_set.InputPID>(REFERENCE+30))){
-        vx = vx*(0.75);
-        vy = vy*(0.75);
-    }
-    */
-    //Lineを踏み始めた方向を調べる
-    /*LineDir[A_SPOT] = (vx>0)&&((data.lnFlag[A_SPOT]==1)&&(1                     ))&&(LineFirst[X_AXIS] == A_SPOT);
-    LineDir[B_SPOT] = (vx<0)&&((data.lnFlag[B_SPOT]==1)&&(1                     ))&&(LineFirst[X_AXIS] == B_SPOT);
-    LineDir[C_SPOT] = (vy<0)&&((data.lnFlag[C_SPOT]==1)&&(1                     ))&&(LineFirst[Y_AXIS] == C_SPOT);
-    LineDir[AB_SPOT]= (vy>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==1))&&(LineFirst[Y_AXIS] == AB_SPOT);*/
-    /*
-    LineDir[A_SPOT] = (vx>0)&&((LineSign[A_SPOT]==1)&&(1                  ))&&(LineFirst[X_AXIS] == A_SPOT);
-    LineDir[B_SPOT] = (vx<0)&&((LineSign[B_SPOT]==1)&&(1                  ))&&(LineFirst[X_AXIS] == B_SPOT);
-    LineDir[C_SPOT] = (vy<0)&&((LineSign[C_SPOT]==1)&&(1                  ))&&(LineFirst[Y_AXIS] == C_SPOT);
-    LineDir[AB_SPOT]= (vy>0)&&((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1))&&(LineFirst[Y_AXIS] == AB_SPOT);
-    
-    //Irボールの方向
-    //strict
-    
-    IrRange[A_SPOT] = ((18<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=10))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((12<=data.irPosition)&&(data.irPosition<=16))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((15<=data.irPosition)&&(data.irPosition<=19))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((9<=data.irPosition)&&(data.irPosition<=13))||((                 1)&&(data.irPosition<=3));
-    */
-    //sweet
-    /*IrRange[A_SPOT] = ((19<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=9))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((13<=data.irPosition)&&(data.irPosition<=15))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((16<=data.irPosition)&&(data.irPosition<=18))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((10<=data.irPosition)&&(data.irPosition<=12))||((                 1)&&(data.irPosition<=3));*/
-    /*
-    //none
-    if(data.irNotice==IR_NONE){
-        IrRange[A_SPOT]  = 0;
-        IrRange[B_SPOT]  = 0;
-        IrRange[C_SPOT]  = 0;
-        IrRange[AB_SPOT] = 0;
-    }
-    //白線を踏み始めた方向とボールの方向が一致.(SelfHold)
-    LineBind[A_SPOT] = (IrRange[A_SPOT]==1)&&((LineDir[A_SPOT]==1)||(LineBind[A_SPOT]==1));
-    LineBind[B_SPOT] = (IrRange[B_SPOT]==1)&&((LineDir[B_SPOT]==1)||(LineBind[B_SPOT]==1));
-    LineBind[C_SPOT] = (IrRange[C_SPOT]==1)&&((LineDir[C_SPOT]==1)||(LineBind[C_SPOT]==1));
-    LineBind[AB_SPOT] = (IrRange[AB_SPOT]==1)&&((LineDir[AB_SPOT]==1)||(LineBind[AB_SPOT]==1));
-    
-    LineStop[X_AXIS] = (LineBind[A_SPOT]==0)*(LineBind[B_SPOT]==0);
-    LineStop[Y_AXIS] = (LineBind[C_SPOT]==0)*(LineBind[AB_SPOT]==0);
-    
-    //白線踏んでる
-    if(LineRaw>0){
-        LineOn[A_SPOT]  = (LineSign[A_SPOT]==1)                         &&(LineFirst[X_AXIS]==A_SPOT);
-        LineOn[B_SPOT]  = (LineSign[B_SPOT]==1)                         &&(LineFirst[X_AXIS]==B_SPOT);
-        LineOn[C_SPOT]  = (LineSign[C_SPOT]==1)                         &&(LineFirst[Y_AXIS]==C_SPOT);
-        LineOn[AB_SPOT] = ((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1))&&(LineFirst[Y_AXIS]==AB_SPOT);
-        //外側に向かう力を消す.
-        //x
-        if(((LineOn[A_SPOT]==1)&&(vx>0))||((LineOn[B_SPOT]==1)&&(vx<0))){
-            vx=0;
-            //yの力を加える.
-            if(vy>0){vy += 10;}
-            if(vy<0){vy -= 10;}
-        }
-        //y
-        if(((LineOn[C_SPOT]==1)&&(vy<0))||((LineOn[AB_SPOT]==1)&&(vy>0))){
-            vy=0;
-        }
-        //内側に向かう力を加える.
-        LineReturn[A_SPOT] = (LineOn[A_SPOT]==1);
-        if((LineReturn[A_SPOT]==1)&&(LineOn[AB_SPOT]==1)){
-            if(LineOn[C_SPOT]==0){
-                LineReturn[A_SPOT]=0;
-            }
-            else{
-                LineReturn[A_SPOT]=1;
-            }
-        }
-        
-        LineReturn[B_SPOT] = (LineOn[B_SPOT]==1);
-        if((LineReturn[B_SPOT]==1)&&(LineOn[AB_SPOT]==1)){
-            if(LineOn[C_SPOT]==0){
-                LineReturn[B_SPOT]=0;
-            }
-            else{
-                LineReturn[B_SPOT]=1;
-            }
-        }
-        LineReturn[C_SPOT] = (LineOn[C_SPOT]==1);
-        if(LineReturn[C_SPOT]==1){
-            LineReturn[A_SPOT]=0;
-            LineReturn[B_SPOT]=0;
-        }
-        LineReturn[AB_SPOT] = (LineOn[AB_SPOT]==1);
-        
-        LineForce[X_AXIS] = (LINE_RF*2)*((-1)*(LineReturn[A_SPOT]==1) + ( 1)*(LineReturn[B_SPOT]==1)) + 
-                            (LINE_RF*2)*(LineReturn[AB_SPOT]==1)*(LineReturn[A_SPOT]==0)*(LineReturn[B_SPOT]==0)
-                            *(( 1)*(data.ping[L_PING]<40) + (-1)*(data.ping[R_PING]<40)) +
-                            (LINE_RF*2)*(LineReturn[C_SPOT]==1)*(LineReturn[A_SPOT]==0)*(LineReturn[B_SPOT]==0)
-                            *(( 1)*(data.ping[L_PING]<40) + (-1)*(data.ping[R_PING]<40));
-        LineForce[Y_AXIS] = (LINE_RF*2)*(( 1)*(LineReturn[C_SPOT]==1) + (-1)*(LineReturn[AB_SPOT]==1));
-        
-        Line_timeout[A_SPOT].attach(&LineClear_A, LINE_DELAY);
-        Line_timeout[B_SPOT].attach(&LineClear_B, LINE_DELAY);
-        Line_timeout[C_SPOT].attach(&LineClear_C, LINE_DELAY);
-    }
-    else{
-        LineForce[X_AXIS] = 0;
-        LineForce[Y_AXIS] = 0;
-    }
-    */
-    //vx = vx*LineStop[X_AXIS] + LineForce[X_AXIS];
-    //vy = vy*LineStop[Y_AXIS] + LineForce[Y_AXIS];
-    vs = cmps_set.OutputPID;
-    move(
-        vx,
-        vy,
-        vs
-    );
-    /*move(
-        0,
-        0,
-        10
-    );*/
-    if(sys.MotorFlag==1){
-        tx_motor();
-        sys.MotorFlag=0;
-    }
-    return;
-}
-void modeAttack3(void){
-    double ir_x, ir_y;
-    int vx,vy,vs, LineForce[2];
-    uint8_t LineDir[4];
-    uint8_t LineOn[4];
-    uint8_t LineReturn[4];
-    uint8_t LineStop[2];
-    uint8_t IrRange[4];
-    uint8_t static LineBind[4];
-    //buint8_t static spi_count;
-    if(sys.KickOffFlag==1){
-        LineBind[0]=0;
-        LineBind[1]=0;
-        LineBind[2]=0;
-        LineBind[3]=0;
-        LineReverseFlag=0;
-        
-        LineSign[A_SPOT]=0;
-        LineSign[B_SPOT]=0;
-        LineSign[C_SPOT]=0;
-        
-        data.lnFlag[A_SPOT]=0;
-        data.lnFlag[B_SPOT]=0;
-        data.lnFlag[C_SPOT]=0;
-        
-        LinePriority[X_AXIS]=0;
-        LinePriority[Y_AXIS]=0;
-        
-        HmcResetFlag = 0;
-        sys.UswFlag = 0;
-        //spi_count=0;
-        
-        hmc_reset=HMC_RUN;
-        sys.KickFlag = 0;
-        
-        sys.KickOffFlag=0;
-        //while((Sw[2].read()==1)&&(Sw[3].read()==1));//押して離すとスタート
-    }
-    if(sys.IrFlag==1){
-        /*spi_count++;
-        if(spi_count%10 == 0){
-            ReadPing();
-        }
-        else{
-            ReadIr();
-        }
-        if(spi_count==20) spi_count=0;
-        */
-        ReadIr();
-        sys.IrFlag=0;
-    }
-    if(sys.PidFlag==1){
-        PidUpdate();
-        sys.PidFlag=0;
-    }
-    if(sys.UswFlag==1){
-        ReadPing();
-        sys.UswFlag=0;
-    }
-    /*
-    if(HmcResetFlag==1){
-        HmcReset();
-        HmcResetFlag=0;
-    }
-    */
-    ir_x = ir_move_val_old[data.irNotice][data.irPosition][IR_X];
-    ir_y = ir_move_val_old[data.irNotice][data.irPosition][IR_Y];
-    if(data.irPosition<8){
-        ir_x *= sys.l_pow;
-        ir_y *= sys.l_pow;
-    }
-    else{
-        ir_x *= sys.s_pow;
-        ir_y *= sys.s_pow;
-    }
-    
-    //Lineを考慮していないIrのみの値
-    vx = ir_x;
-    vy = ir_y;
-    
-    if((data.irPosition==10)&&(vy>0)){
-        vy += 15;//前進加速
-    }
-    if((data.irPosition==11)&&(vy>0)){
-        vy += 15;//前進加速
-        if(sys.KickFlag==1){
-            DriveSolenoid();
-        }
-    }
-    if((data.irPosition==12)&&(vy>0)){
-        vy += 15;//前進加速
-    }
-    if((data.irPosition==1)&&(vy>0)){
-        vy += 25;//前進加速
-    }
-    if((data.irPosition==2)&&(vy>0)){
-        vy += 25;//前進加速
-    }
-    
-    
-    if((data.irPosition==17)&&(data.ping[L_PING]>data.ping[R_PING])){
-        vx *= -1.0;//背後回り込みの左右判断
-    }
-    /*
-    if((cmps_set.InputPID<(REFERENCE-30))||(cmps_set.InputPID>(REFERENCE+30))){
-        vx = vx*(0.75);
-        vy = vy*(0.75);
-    }
-    */
-    //Lineを踏み始めた方向を調べる
-    /*LineDir[A_SPOT] = (vx>0)&&((data.lnFlag[A_SPOT]==1)&&(1                     ))&&(LineFirst[X_AXIS] == A_SPOT);
-    LineDir[B_SPOT] = (vx<0)&&((data.lnFlag[B_SPOT]==1)&&(1                     ))&&(LineFirst[X_AXIS] == B_SPOT);
-    LineDir[C_SPOT] = (vy<0)&&((data.lnFlag[C_SPOT]==1)&&(1                     ))&&(LineFirst[Y_AXIS] == C_SPOT);
-    LineDir[AB_SPOT]= (vy>0)&&((data.lnFlag[A_SPOT]==1)&&(data.lnFlag[B_SPOT]==1))&&(LineFirst[Y_AXIS] == AB_SPOT);*/
-    
-    LineDir[A_SPOT] = (vx>0)&&((LineSign[A_SPOT]==1)&&(1                  ))&&(LineFirst[X_AXIS] == A_SPOT);
-    LineDir[B_SPOT] = (vx<0)&&((LineSign[B_SPOT]==1)&&(1                  ))&&(LineFirst[X_AXIS] == B_SPOT);
-    LineDir[C_SPOT] = (vy<0)&&((LineSign[C_SPOT]==1)&&(1                  ))&&(LineFirst[Y_AXIS] == C_SPOT);
-    LineDir[AB_SPOT]= (vy>0)&&((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1))&&(LineFirst[Y_AXIS] == AB_SPOT);
-    
-    //Irボールの方向
-    //strict
-    
-    IrRange[A_SPOT] = ((18<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=10))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((12<=data.irPosition)&&(data.irPosition<=16))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((15<=data.irPosition)&&(data.irPosition<=19))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((9<=data.irPosition)&&(data.irPosition<=13))||((                 1)&&(data.irPosition<=3));
-    
-    //sweet
-    /*IrRange[A_SPOT] = ((19<=data.irPosition)&&(data.irPosition<=19))||((8<=data.irPosition)&&(data.irPosition<=9))
-                    ||((6<=data.irPosition)&&(data.irPosition<=7))||((                   1)&&(data.irPosition<=1));
-    IrRange[B_SPOT] = ((13<=data.irPosition)&&(data.irPosition<=15))||((2<=data.irPosition)&&(data.irPosition<=5));
-    IrRange[C_SPOT] = ((16<=data.irPosition)&&(data.irPosition<=18))||((4<=data.irPosition)&&(data.irPosition<=7));
-    IrRange[AB_SPOT] = ((10<=data.irPosition)&&(data.irPosition<=12))||((                 1)&&(data.irPosition<=3));*/
-    //none
-    if(data.irNotice==IR_NONE){
-        IrRange[A_SPOT]  = 0;
-        IrRange[B_SPOT]  = 0;
-        IrRange[C_SPOT]  = 0;
-        IrRange[AB_SPOT] = 0;
-    }
-    //白線を踏み始めた方向とボールの方向が一致.(SelfHold)
-    LineBind[A_SPOT] = (IrRange[A_SPOT]==1)&&((LineDir[A_SPOT]==1)||(LineBind[A_SPOT]==1));
-    LineBind[B_SPOT] = (IrRange[B_SPOT]==1)&&((LineDir[B_SPOT]==1)||(LineBind[B_SPOT]==1));
-    LineBind[C_SPOT] = (IrRange[C_SPOT]==1)&&((LineDir[C_SPOT]==1)||(LineBind[C_SPOT]==1));
-    LineBind[AB_SPOT] = (IrRange[AB_SPOT]==1)&&((LineDir[AB_SPOT]==1)||(LineBind[AB_SPOT]==1));
-    
-    LineStop[X_AXIS] = 1;//(LineBind[A_SPOT]==0)*(LineBind[B_SPOT]==0);
-    LineStop[Y_AXIS] = 1;//(LineBind[C_SPOT]==0)*(LineBind[AB_SPOT]==0);
-    
-    //白線踏んでる
-    if(LineRaw>0){
-        LineOn[A_SPOT]  = (LineSign[A_SPOT]==1)                         &&(LineFirst[X_AXIS]==A_SPOT);
-        LineOn[B_SPOT]  = (LineSign[B_SPOT]==1)                         &&(LineFirst[X_AXIS]==B_SPOT);
-        LineOn[C_SPOT]  = (LineSign[C_SPOT]==1)                         &&(LineFirst[Y_AXIS]==C_SPOT);
-        LineOn[AB_SPOT] = ((LineSign[A_SPOT]==1)&&(LineSign[B_SPOT]==1))&&(LineFirst[Y_AXIS]==AB_SPOT);
-        //外側に向かう力を消す.
-        //x
-        if(((LineOn[A_SPOT]==1)&&(vx>0))||((LineOn[B_SPOT]==1)&&(vx<0))){
-            
-            if(LinePriority[Y_AXIS]==0){
-                LinePriority[X_AXIS]=1;
-                LinePriority[Y_AXIS]=0;
-            }
-            vx=0;
-            //yの力を加える.
-            if(vy>0){vy += 10;}
-            if(vy<0){vy -= 10;}
-        }
-        //y
-        if(((LineOn[C_SPOT]==1)&&(vy<0))||((LineOn[AB_SPOT]==1)&&(vy>0))){
-            if(LinePriority[X_AXIS]==0){
-                LinePriority[X_AXIS]=0;
-                LinePriority[Y_AXIS]=1;
-            }
-            if((LinePriority[X_AXIS]==1)&&(LineOn[AB_SPOT]==1)){
-                LinePriority[X_AXIS]=0;
-                LinePriority[Y_AXIS]=1;
-            }
-            vy=0;
-        }
-        //内側に向かう力を加える.
-        LineReturn[A_SPOT] = (LineOn[A_SPOT]==1);
-        /*if((LineReturn[A_SPOT]==1)&&(LineOn[AB_SPOT]==1)){
-            if(LineOn[C_SPOT]==0){
-                LineReturn[A_SPOT]=0;
-            }
-            else{
-                LineReturn[A_SPOT]=1;
-            }
-        }*/
-        
-        LineReturn[B_SPOT] = (LineOn[B_SPOT]==1);
-        /*if((LineReturn[B_SPOT]==1)&&(LineOn[AB_SPOT]==1)){
-            if(LineOn[C_SPOT]==0){
-                LineReturn[B_SPOT]=0;
-            }
-            else{
-                LineReturn[B_SPOT]=1;
-            }
-        }*/
-        LineReturn[C_SPOT] = (LineOn[C_SPOT]==1);
-        /*if(LineReturn[C_SPOT]==1){
-            LineReturn[A_SPOT]=0;
-            LineReturn[B_SPOT]=0;
-        }*/
-        LineReturn[AB_SPOT] = (LineOn[AB_SPOT]==1);
-        
-        LineForce[X_AXIS] = (LINE_RF*2)*(LinePriority[X_AXIS])*((-1)*(LineReturn[A_SPOT]==1) + ( 1)*(LineReturn[B_SPOT]==1)) +
-                            (LINE_RF*2)*(LineReturn[AB_SPOT]==1)*(( 1)*(data.ping[L_PING]<40) + (-1)*(data.ping[R_PING]<40)) +
-                            (LINE_RF*2)*(LineReturn[C_SPOT]==1)*(( 1)*(data.ping[L_PING]<40) + (-1)*(data.ping[R_PING]<40));
-        LineForce[Y_AXIS] = (LINE_RF*2)*(LinePriority[Y_AXIS])*(( 1)*(LineReturn[C_SPOT]==1) + (-1)*(LineReturn[AB_SPOT]==1));
-        /*
-        LineForce[X_AXIS] = (LINE_RF*2)*((-1)*(LineReturn[A_SPOT]==1) + ( 1)*(LineReturn[B_SPOT]==1)) + 
-                            (LINE_RF*2)*(LineReturn[AB_SPOT]==1)*(LineReturn[A_SPOT]==0)*(LineReturn[B_SPOT]==0)
-                            *(( 1)*(data.ping[L_PING]<30) + (-1)*(data.ping[R_PING]<30)) +
-                            (LINE_RF*2)*(LineReturn[C_SPOT]==1)*(LineReturn[A_SPOT]==0)*(LineReturn[B_SPOT]==0)
-                            *(( 1)*(data.ping[L_PING]<30) + (-1)*(data.ping[R_PING]<30));
-        LineForce[Y_AXIS] = (LINE_RF*2)*(( 1)*(LineReturn[C_SPOT]==1) + (-1)*(LineReturn[AB_SPOT]==1));
-        */
-        Line_timeout[A_SPOT].attach(&LineClear_A, LINE_DELAY);
-        Line_timeout[B_SPOT].attach(&LineClear_B, LINE_DELAY);
-        Line_timeout[C_SPOT].attach(&LineClear_C, LINE_DELAY);
-    }
-    else{
-        LineForce[X_AXIS] = 0;
-        LineForce[Y_AXIS] = 0;
-        
-        LinePriority[X_AXIS]=0;
-        LinePriority[Y_AXIS]=0;
-    }
-    
-    vx = vx*LineStop[X_AXIS] + LineForce[X_AXIS];
-    vy = vy*LineStop[Y_AXIS] + LineForce[Y_AXIS];
-    vs = cmps_set.OutputPID;
-    move(
-        vx,
-        vy,
-        vs
-    );
-    /*move(
-        10,
-        0,
-        0
-    );*/
-    if(sys.MotorFlag==1){
-        tx_motor();
-        sys.MotorFlag=0;
-    }
-    if(sys.stopflag==1){
-        //停止処理
-    }
-    return;
-}
+
 void LineJudgeSlow(double pow_x, double pow_y, double *x, double *y){
     uint8_t LineState;
     uint8_t LineSum;
@@ -826,27 +101,31 @@
                 
                 data.ReturnDir[X_LINE]=L_LINE;
                 
-                if(pow_x<0){
+                /*if(pow_x<0){
                   *x = 0;
                   data.lnStop[X_LINE]=1;
                 }
                 else{
                   *x = -LineReturn[4];
                   data.lnStop[X_LINE]=0;
-                }
+                }*/
+                *x = -LineReturn[4];
+                data.lnStop[X_LINE]=0;
             }
             if((LinePingState[L_PING]==1)&&(LinePingState[R_PING]==0)){
                 
                 data.ReturnDir[X_LINE]=R_LINE;
                 
-                if(pow_x>0){
+                /*if(pow_x>0){
                   *x = 0;
                   data.lnStop[X_LINE]=1;
                 }
                 else{
                   *x = LineReturn[4];
                   data.lnStop[X_LINE]=0;
-                }
+                }*/
+                *x = LineReturn[4];
+                data.lnStop[X_LINE]=0;
             }
             if((LinePingState[L_PING]==1)&&(LinePingState[R_PING]==1)){
                 *x = 0;
@@ -934,9 +213,13 @@
         data.lnStop[Y_LINE]=1;
     }
 }
-void LineJudgeReset(void){
-    if((data.lnRaw==0)&&(data.lnHold==7)){
+void LineJudgeReset(double pow_x, double pow_y, double *x, double *y){
+    //static uint8_t NewLineCorner[4]={LINE_EMPTY, LINE_EMPTY, LINE_EMPTY, LINE_EMPTY};
+    //static uint8_t LastLineCorner[4]={LINE_EMPTY, LINE_EMPTY, LINE_EMPTY, LINE_EMPTY};
+    
+    if((/*data.lnRaw==0*/1)&&(data.lnHold==7)){
         if(data.FieldSpot==LINE_INSIDE){
+            
             data.lnCorner[L_LINE] = (data.ping[L_PING]<OutToWall[X_PING]);
             data.lnCorner[R_LINE] = (data.ping[R_PING]<OutToWall[X_PING]);
             data.lnCorner[F_LINE] = (data.ping[F_PING]<OutToWall[Y_PING]);
@@ -947,19 +230,47 @@
                 (data.lnCorner[F_LINE])||
                 (data.lnCorner[B_LINE])
             ){
+                
                 data.NonWall[L_LINE] = (data.ping[L_PING]>WhiteToWall[X_PING]);
                 data.NonWall[R_LINE] = (data.ping[R_PING]>WhiteToWall[X_PING]);
                 data.NonWall[F_LINE] = (data.ping[F_PING]>WhiteToWall[Y_PING]);
                 data.NonWall[B_LINE] = (data.ping[B_PING]>WhiteToWall[Y_PING]);
+                
+                
+                
+                /*LastLineCorner[L_LINE]=NewLineCorner[L_LINE];
+                LastLineCorner[R_LINE]=NewLineCorner[R_LINE];
+                LastLineCorner[F_LINE]=NewLineCorner[F_LINE];
+                LastLineCorner[B_LINE]=NewLineCorner[B_LINE];
+                
+                NewLineCorner[L_LINE]=data.lnCorner[L_LINE];
+                NewLineCorner[R_LINE]=data.lnCorner[R_LINE];
+                NewLineCorner[F_LINE]=data.lnCorner[F_LINE];
+                NewLineCorner[B_LINE]=data.lnCorner[B_LINE];
+                
+                if(
+                    (LastLineCorner[L_LINE]==NewLineCorner[L_LINE])&&
+                    (LastLineCorner[R_LINE]==NewLineCorner[R_LINE])&&
+                    (LastLineCorner[F_LINE]==NewLineCorner[F_LINE])&&
+                    (LastLineCorner[B_LINE]==NewLineCorner[B_LINE])
+                ){
+                    data.lnRepeat++;
+                }
+                else{
+                    data.lnRepeat=0;
+                }*/
+                
                 data.FieldSpot = LINE_OUTSIDE;
                 LineLiberate();
             }
         }
         else if(data.FieldSpot==LINE_OUTSIDE){
-            data.FieldSpot = LINE_INSIDE;
-            data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
-            LineLiberate();
-            LineRankClear();
+            if(data.lnRaw==0){
+                data.FieldSpot = LINE_INSIDE;
+                data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
+                LineLiberate();
+                LineRankClear();
+            }
         }
     }
     if(data.FieldSpot == LINE_OUTSIDE){
@@ -993,16 +304,6 @@
             LineLiberate();
             LineRankClear();
         }
-        /*if(
-            (data.ping[L_PING]>=WhiteToWall[X_PING])&&
-            (data.ping[R_PING]>=WhiteToWall[X_PING])&&
-            (data.ping[F_PING]>=WhiteToWall[Y_PING])&&
-            (data.ping[B_PING]>=WhiteToWall[Y_PING])
-        ){
-            data.FieldSpot = LINE_INSIDE;
-            LineLiberate();
-            LineRankClear();
-        }*/
     }
     if((data.FieldSpot == LINE_INSIDE)&&(0<data.lnHold)&&(data.lnHold<7)&&(data.lnRaw==0)){
         if(
@@ -1025,11 +326,57 @@
                 ((data.lnOrder[0]==A_SPOT)&&(data.lnOrder[1]==B_SPOT))||
                 ((data.lnOrder[0]==B_SPOT)&&(data.lnOrder[1]==A_SPOT))
             )
+            /*||
+            (
+                (data.ping[L_PING]>=GoalEdgeToWall[X_PING])&&
+                (data.ping[R_PING]>=GoalEdgeToWall[X_PING])
+            )*/
         ){
             data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
             LineLiberate();
         }
     }
+    /*
+    if(
+        (data.irNotice==IR_NONE)||
+        (data.irNotice==IR_FAR)||
+        (
+            (data.ping[L_PING]>=GoalEdgeToWall[X_PING])&&
+            (data.ping[R_PING]>=GoalEdgeToWall[X_PING])
+        )
+    ){
+        data.lnRepeat = 0;
+        
+        data.lnCorner[L_LINE]=LINE_EMPTY;
+        data.lnCorner[R_LINE]=LINE_EMPTY;
+        data.lnCorner[F_LINE]=LINE_EMPTY;
+        data.lnCorner[B_LINE]=LINE_EMPTY;
+    }
+    data.lnRepeat=0;
+    if(data.lnRepeat>0){
+        if(
+            ((pow_x>=0)&&(data.lnCorner[R_LINE]))||
+            ((pow_x<0)&&(data.lnCorner[L_LINE]))
+        ){
+            data.lnStay[X_LINE]=0;
+        }
+        else{
+            data.lnStay[X_LINE]=1;
+        }
+        if(
+            ((pow_y>=0)&&(data.lnCorner[F_LINE]))||
+            ((pow_y<0)&&(data.lnCorner[B_LINE]))
+        ){
+            data.lnStay[Y_LINE]=0;
+        }
+        else{
+            data.lnStay[Y_LINE]=1;
+        }
+    }
+    else{
+        data.lnStay[X_LINE]=data.lnStay[Y_LINE]=1;
+    }*/
+    
 }
 void modeAttack4(void){
     double ir_x_dir, ir_y_dir;
@@ -1047,10 +394,18 @@
     
     if(sys.KickOffFlag==1){
         
-        sys.IrBlind=1;
+        sys.IrBlind=0;
         sys.LineBlind=0;
         sys.PingBlind=0;
         
+        sys.ir_pow_table = 0;
+        
+        data.lnCorner[L_LINE]=data.lnCorner[R_LINE]=data.lnCorner[F_LINE]=data.lnCorner[B_LINE]=LINE_EMPTY;
+        data.lnRepeat = 0;
+        
+        //data.lnStay[X_LINE]=data.lnStay[Y_LINE]=1;
+        data.lnStop[X_LINE]=data.lnStop[Y_LINE]=1;
+        
         data.FieldSpot = LINE_INSIDE;
         LineLiberate();
         LineRankClear();
@@ -1066,10 +421,34 @@
     data.lnRaw = LineRaw;
     data.lnHold = LineHold;
     
+    if(data.ping[B_PING]<=30){
+        sys.ir_pow_table=1;
+        ir_x_dir = ir_move_val[1][data.irNotice][data.irPosition][IR_X_DIR];
+        ir_y_dir = ir_move_val[1][data.irNotice][data.irPosition][IR_Y_DIR];
+        ir_x_turn = ir_move_val[1][data.irNotice][data.irPosition][IR_X_TURN];
+        ir_y_turn = ir_move_val[1][data.irNotice][data.irPosition][IR_Y_TURN];
+    }
+    else{
+        sys.ir_pow_table=0;
+        ir_x_dir = ir_move_val[0][data.irNotice][data.irPosition][IR_X_DIR];
+        ir_y_dir = ir_move_val[0][data.irNotice][data.irPosition][IR_Y_DIR];
+        ir_x_turn = ir_move_val[0][data.irNotice][data.irPosition][IR_X_TURN];
+        ir_y_turn = ir_move_val[0][data.irNotice][data.irPosition][IR_Y_TURN];
+    }
+    /*
+    ir_x_dir = ir_move_val[sys.ir_pow_table][data.irNotice][data.irPosition][IR_X_DIR];
+    ir_y_dir = ir_move_val[sys.ir_pow_table][data.irNotice][data.irPosition][IR_Y_DIR];
+    ir_x_turn = ir_move_val[sys.ir_pow_table][data.irNotice][data.irPosition][IR_X_TURN];
+    ir_y_turn = ir_move_val[sys.ir_pow_table][data.irNotice][data.irPosition][IR_Y_TURN];
+    */
+    /*
     ir_x_dir = ir_move_val[0][data.irNotice][data.irPosition][IR_X_DIR];
     ir_y_dir = ir_move_val[0][data.irNotice][data.irPosition][IR_Y_DIR];
     ir_x_turn = ir_move_val[0][data.irNotice][data.irPosition][IR_X_TURN];
     ir_y_turn = ir_move_val[0][data.irNotice][data.irPosition][IR_Y_TURN];
+    */
+    
+    if(sys.IrBlind==1) data.irNotice=IR_NONE;
     if(data.irNotice==IR_CLOSER){
         ir_pow = sys.s_pow;
     }
@@ -1082,7 +461,12 @@
     else{//data.irNotice==IR_NONE
         ir_pow = 0;
     }
-    if(sys.IrBlind==1) data.irNotice=IR_NONE;
+    
+    
+    if((data.ping[R_PING]<data.ping[L_PING])&&(data.irPosition==17)){
+        ir_x_turn = -ir_x_turn;
+        ir_y_turn = -ir_y_turn;
+    }
     
     ir_x = (ir_x_dir + ir_x_turn);
     ir_y = (ir_y_dir + ir_y_turn);
@@ -1101,14 +485,14 @@
         data.FieldSpot = LINE_INSIDE;
     }
     else{
-        LineJudgeReset();
+        LineJudgeReset(ir_x, ir_y, &LineSlowPower[X_LINE], &LineSlowPower[Y_LINE]);
         
-        //LineJudgeSlow(ir_x, ir_y, &LineSlowPower[X_LINE], &LineSlowPower[Y_LINE]);
-        LineJudgeReturn(ir_x, ir_y, &LineReturnPower[X_LINE], &LineReturnPower[Y_LINE]);
-        
+        LineJudgeSlow(ir_x, ir_y, &LineSlowPower[X_LINE], &LineSlowPower[Y_LINE]);
+        LineJudgeReturn(ir_x*LineSlowPower[X_LINE], ir_y*LineSlowPower[Y_LINE], &LineReturnPower[X_LINE], &LineReturnPower[Y_LINE]);
+        /*
         LineSlowPower[X_LINE] = 1.0;
         LineSlowPower[Y_LINE] = 1.0;
-        /*
+        
         LineReturnPower[X_LINE] = 0.0;
         LineReturnPower[Y_LINE] = 0.0;
         
@@ -1125,8 +509,8 @@
     //else LED = 0xA;
     //LED = LineHold;
     
-    vx = (ir_pow*ir_x)*data.lnStop[X_LINE]*LineSlowPower[X_LINE] + LineReturnPower[X_LINE];
-    vy = (ir_pow*ir_y)*data.lnStop[Y_LINE]*LineSlowPower[Y_LINE] + LineReturnPower[Y_LINE];
+    vx = (ir_pow*ir_x)*data.lnStop[X_LINE]*(/*data.lnStay[X_LINE]*/1)*LineSlowPower[X_LINE] + LineReturnPower[X_LINE];
+    vy = (ir_pow*ir_y)*data.lnStop[Y_LINE]*(/*data.lnStay[X_LINE]*/1)*LineSlowPower[Y_LINE] + LineReturnPower[Y_LINE];
     vs = cmps_set.OutputPID;
     move(
         vx,