CatPot 2015-2016 / Mbed 2 deprecated CatPot_2v10_T_Main

Dependencies:   mbed AQM1602 HMC6352 PID

Revision:
27:825c6835e3db
Parent:
25:a7460e23e02e
Child:
28:f246a5fbf6a5
--- a/main_processing/strategy/LineProcess.cpp	Mon Mar 21 05:49:18 2016 +0000
+++ b/main_processing/strategy/LineProcess.cpp	Mon Mar 21 17:05:08 2016 +0000
@@ -41,6 +41,54 @@
         else *y=1;
     }
 }
+void LineJudgeSlow2(double pow_x, double pow_y, double *x, double *y, uint8_t *px, uint8_t *py){
+    uint8_t LineState;
+    uint8_t LineSum;
+    
+    //line
+    LineState = 0;
+    
+    LineSum = (data.lnRawOrder[0]!=LINE_EMPTY)+(data.lnRawOrder[1]!=LINE_EMPTY)+(data.lnRawOrder[2]!=LINE_EMPTY);
+    if(LineSum==3){
+        LineState = 3;
+    }
+    else if(LineSum==2){
+        LineState = 2;
+    }
+    else if(LineSum==1){
+        LineState = 1;
+    }
+    else if(LineSum==0){
+        LineState = 0;
+    }
+    
+    if(LineSum>0){
+        if(pow_x>=0){
+            if((data.ping[R_PING]<WhiteToWall[X_PING])&&((*px)>LineDecrease[LineState])) (*px)=LineDecrease[LineState];
+        }
+        else{
+            if((data.ping[L_PING]<WhiteToWall[X_PING])&&((*px)>LineDecrease[LineState])) (*px)=LineDecrease[LineState];
+        }
+        
+        if(pow_y>=0){
+            if((data.ping[F_PING]<WhiteToWall[Y_PING])&&((*py)>LineDecrease[LineState])) (*py)=LineDecrease[LineState];
+        }
+        else{
+            if((data.ping[B_PING]<WhiteToWall[Y_PING])&&((*py)>LineDecrease[LineState])) (*py)=LineDecrease[LineState];
+        }
+    }
+    else if(LineSum==0){
+        if(pow_x>=0){
+            if((data.ping[R_PING]<GoalEdgeToWall[X_PING])&&((*px)>LineDecrease[LineState])) (*px)=LineDecrease[LineState];
+        }
+        else{
+            if((data.ping[L_PING]<GoalEdgeToWall[X_PING])&&((*px)>LineDecrease[LineState])) (*px)=LineDecrease[LineState];
+        }
+    }
+    
+    *x=1;
+    *y=1;
+}
 void LineJudgeReturn(double pow_x, double pow_y, double *x, double *y){
     const int8_t static LineReturn[5] = {0, 0, 0, 0, 20};
     uint8_t LinePingState[4];
@@ -240,6 +288,134 @@
         //line間際の復帰力以外の力を作用させるか否か
         data.lnStop[X_LINE]=1;
         data.lnStop[Y_LINE]=1;
+       /* 
+        if(
+            (data.lnRawMemory[A_SPOT]==1)&&
+            (data.lnRawMemory[B_SPOT]==1)&&
+            (data.lnRawMemory[C_SPOT]==0)
+        ){
+            data.lnStop[Y_LINE]=0;
+            *y = -LineReturn[4];
+        }
+        else if(
+            (data.lnRawMemory[A_SPOT]==0)&&
+            (data.lnRawMemory[B_SPOT]==0)&&
+            (data.lnRawMemory[C_SPOT]==1)
+        ){
+            data.lnStop[Y_LINE]=0;
+            *y = LineReturn[4];
+        }*/
+    }
+}
+void LineJudgeReturn2(double pow_x, double pow_y, double *x, double *y){
+    const int8_t static LineReturn[5] = {0, 0, 0, 0, 20};
+    uint8_t LinePingState[4];
+    //◎ボールを追う力とラインから離れる力の向きが違うならばラインから離れる力が優先される.
+    //◎ボールを追う力とラインから離れる力の向きが同じならばボールを追う力が優先される.
+    //◎ラインセンサ全てが場外になるまではボールを追う力は作用しない.ボールを追う力は場内に出るまで作用する.
+    //×ラインのほぼ場外では常時ラインから離れる力が優先される.
+    //※場外判定を行うには再び場内に戻る必要がある.
+    
+    data.FieldSpot=LINE_INSIDE;
+    
+    if(data.FieldSpot==LINE_OUTSIDE){
+    }
+    else{//data.FieldSpot==LINE_INSIDE
+    
+        data.ReturnDir[X_LINE]=LINE_EMPTY;
+        data.ReturnDir[Y_LINE]=LINE_EMPTY;
+        
+        *x = 0;
+        *y = 0;
+        
+        //line間際の復帰力以外の力を作用させるか否か
+        data.lnStop[X_LINE]=1;
+        data.lnStop[Y_LINE]=1;
+        
+        if(//y
+            ((data.lnRawOrder[0]==A_SPOT)&&(data.lnRawOrder[1]==B_SPOT)&&(1))||
+            ((data.lnRawOrder[0]==B_SPOT)&&(data.lnRawOrder[1]==A_SPOT)&&(1))
+        ){
+            data.lnStop[Y_LINE]=0;
+            *y = -LineReturn[4];
+        }
+        else if(
+            ((data.lnRawOrder[0]==C_SPOT)&&(1)&&(1))
+        ){
+            data.lnStop[Y_LINE]=0;
+            *y = LineReturn[4];
+        }
+        else if(//x
+            ((data.lnRawOrder[0]==A_SPOT)&&(data.lnRawOrder[1]==C_SPOT)&&(1))
+        ){
+            *x = -LineReturn[4];
+            data.lnStop[X_LINE]=0;
+        }
+        else if(
+            ((data.lnRawOrder[0]==B_SPOT)&&(data.lnRawOrder[1]==C_SPOT)&&(1))
+        ){
+            *x = LineReturn[4];
+            data.lnStop[X_LINE]=0;
+        }
+        
+        if(
+            ((*x)!=0)||
+            ((*y)!=0)
+        ){
+            
+            data.lnRawReturn=1;
+            
+            LinePingState[L_PING]=(data.ping[L_PING]<WhiteToWallPlus[X_PING]);
+            LinePingState[R_PING]=(data.ping[R_PING]<WhiteToWallPlus[X_PING]);
+            LinePingState[F_PING]=(data.ping[F_PING]<WhiteToWallPlus[Y_PING]);
+            LinePingState[B_PING]=(data.ping[B_PING]<WhiteToWallPlus[Y_PING]);
+            //x
+            if(data.lnStop[X_LINE]==1){
+                if((LinePingState[L_PING]==0)&&(LinePingState[R_PING]==1)){
+                    *x = -LineReturn[4];
+                    data.lnStop[X_LINE]=0;
+                }
+                if((LinePingState[L_PING]==1)&&(LinePingState[R_PING]==0)){
+                    *x = LineReturn[4];
+                    data.lnStop[X_LINE]=0;
+                }
+                if((LinePingState[L_PING]==1)&&(LinePingState[R_PING]==1)){
+                    *x = 0;
+                    data.lnStop[X_LINE]=0;
+                }
+            }
+            //y
+            if(data.lnStop[Y_LINE]==1){
+                if((LinePingState[B_PING]==0)&&(LinePingState[F_PING]==1)){
+                    if(pow_y<0){
+                      *y = 0;
+                      data.lnStop[Y_LINE]=1;
+                    }
+                    else{
+                      *y = -LineReturn[4];
+                      data.lnStop[Y_LINE]=0;
+                    }
+                }
+                if((LinePingState[B_PING]==1)&&(LinePingState[F_PING]==0)){
+                    if(pow_y>0){
+                      *y = 0;
+                      data.lnStop[Y_LINE]=1;
+                    }
+                    else{
+                      *y = LineReturn[4];
+                      data.lnStop[Y_LINE]=0;
+                    }
+                }
+                if((LinePingState[B_PING]==1)&&(LinePingState[F_PING]==1)){
+                    *y = 0;
+                    data.lnStop[Y_LINE]=0;
+                }
+            }
+        }
+        else{
+            data.lnRawReturn=0;
+        }
+        
     }
 }
 void LineJudgeReset(double pow_x, double pow_y, double *x, double *y){
@@ -422,3 +598,259 @@
     //*/
     
 }
+void LineJudgeReset2(double pow_x, double pow_y, double *x, double *y){
+    if(
+        (data.lnRawOrderLog2[0]==data.lnRawOrderLog1[0])&&
+        (data.lnRawOrderLog2[1]==data.lnRawOrderLog1[1])&&
+        (data.lnRawOrderLog2[2]==data.lnRawOrderLog1[2])
+    ){
+        data.lnRepeat=1;
+    }
+    else{
+        data.lnRepeat=0;
+    }
+    
+    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;
+        
+        LineRawLogReset();
+    }
+    //data.lnRepeat=0;
+    if((data.lnRepeat==1)&&((data.lnRawOrder[0]==LINE_EMPTY)&&(data.lnRawOrder[1]==LINE_EMPTY)&&(data.lnRawOrder[2]==LINE_EMPTY))){
+        //y
+        if(
+            ((pow_y>0)&&((data.lnRawOrderLog1[0]==A_SPOT)&&(data.lnRawOrderLog1[1]==B_SPOT)&&(1)))||
+            ((pow_y>0)&&((data.lnRawOrderLog1[0]==B_SPOT)&&(data.lnRawOrderLog1[1]==A_SPOT)&&(1)))||
+            ((pow_y<0)&&((data.lnRawOrderLog1[0]==C_SPOT)&&(1)&&(1)))
+        ){
+            data.lnStay[Y_LINE]=0;
+        }
+        else{
+            data.lnStay[Y_LINE]=1;
+        }
+        //x
+        if(
+            ((pow_x>0)&&((data.lnRawOrderLog1[0]==A_SPOT)&&(data.lnRawOrderLog1[1]==C_SPOT)&&(1)))||
+            ((pow_x<0)&&((data.lnRawOrderLog1[0]==B_SPOT)&&(data.lnRawOrderLog1[1]==C_SPOT)&&(1)))
+        ){
+            data.lnStay[X_LINE]=0;
+        }
+        else{
+            data.lnStay[X_LINE]=1;
+        }
+    }
+    else{
+        data.lnStay[X_LINE]=data.lnStay[Y_LINE]=1;
+    }
+    
+}
+void LineJudgeReset3(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};
+    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>0)){
+        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]);
+            data.lnCorner[B_LINE] = (data.ping[B_PING]<OutToWall[Y_PING]);
+            if(
+                (data.lnCorner[L_LINE])||
+                (data.lnCorner[R_LINE])||
+                (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;
+                //Line_home.detach();
+                LineLiberate();
+            }
+            else{
+                data.FieldSpot = LINE_INSIDE;
+                data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
+                //Line_home.detach();
+                LineLiberate();
+                LineRankClear();
+            }
+        }
+        /*else if(data.FieldSpot==LINE_OUTSIDE){
+            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){
+        //Line_home.attach(&JudgeInSide, 2.0);
+        if(
+            (
+                data.lnRaw==0
+            )&&
+            (
+                (data.ping[L_PING]>=WhiteToWall[X_PING])||
+                (data.NonWall[L_LINE]==1)||
+                ((data.lnOrder[0]==A_SPOT)&&(data.lnOrder[1]==C_SPOT))||
+                ((data.lnOrder[0]==A_SPOT)&&(data.NonWall[F_LINE]==1)&&(data.NonWall[B_LINE]==1))||
+                ((data.lnOrder[0]==A_SPOT)&&(data.ping[F_PING]>WhiteToWall[Y_PING])&&(data.ping[B_PING]>WhiteToWall[Y_PING]))
+            )&&
+            (
+                (data.ping[R_PING]>=WhiteToWall[X_PING])||
+                (data.NonWall[R_LINE]==1)||
+                ((data.lnOrder[0]==B_SPOT)&&(data.lnOrder[1]==C_SPOT))||
+                ((data.lnOrder[0]==B_SPOT)&&(data.NonWall[F_LINE]==1)&&(data.NonWall[B_LINE]==1))||
+                ((data.lnOrder[0]==B_SPOT)&&(data.ping[F_PING]>WhiteToWall[Y_PING])&&(data.ping[B_PING]>WhiteToWall[Y_PING]))
+            )&&
+            (
+                (data.ping[F_PING]>=WhiteToWall[Y_PING])||
+                (data.NonWall[F_LINE]==1)||
+                ((data.lnOrder[0]==C_SPOT)&&(data.lnOrder[1]==A_SPOT))||
+                ((data.lnOrder[0]==C_SPOT)&&(data.lnOrder[1]==B_SPOT))||
+                ((data.lnOrder[0]==C_SPOT)&&(data.lnOrder[1]==LINE_EMPTY))
+            )&&
+                ((data.ping[B_PING]>=WhiteToWall[Y_PING])||
+                (data.NonWall[B_LINE]==1)||
+                ((data.lnOrder[0]==A_SPOT)&&(data.lnOrder[1]==B_SPOT))||
+                ((data.lnOrder[0]==B_SPOT)&&(data.lnOrder[1]==A_SPOT))
+            )
+        ){
+            data.FieldSpot = LINE_INSIDE;
+            data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
+            //Line_home.detach();
+            LineLiberate();
+            LineRankClear();
+        }
+    }
+    /*if((data.FieldSpot == LINE_INSIDE)&&(0<data.lnHold)&&(data.lnHold<7)&&(data.lnRaw==0)){
+        if(
+            (
+                (
+                    (data.ping[L_PING]>=WhiteToWall[X_PING])||
+                    ((data.lnOrder[0]==A_SPOT)&&(data.lnOrder[1]==C_SPOT))
+                    //(data.lnOrder[0]==A_SPOT)
+                )&&
+                (
+                    (data.ping[R_PING]>=WhiteToWall[X_PING])||
+                    ((data.lnOrder[0]==B_SPOT)&&(data.lnOrder[1]==C_SPOT))
+                    //(data.lnOrder[0]==B_SPOT)
+                )&&
+                (
+                    (data.ping[F_PING]>=WhiteToWall[Y_PING])||
+                    ((data.lnOrder[0]==C_SPOT)&&(data.lnOrder[1]==A_SPOT))||
+                    ((data.lnOrder[0]==C_SPOT)&&(data.lnOrder[1]==B_SPOT))
+                )&&
+                (
+                    (data.ping[B_PING]>=WhiteToWall[Y_PING])||
+                    ((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;
+        
+        NewLineCorner[L_LINE]=LINE_EMPTY;
+        NewLineCorner[R_LINE]=LINE_EMPTY;
+        NewLineCorner[F_LINE]=LINE_EMPTY;
+        NewLineCorner[B_LINE]=LINE_EMPTY;
+        
+        LastLineCorner[L_LINE]=LINE_EMPTY;
+        LastLineCorner[R_LINE]=LINE_EMPTY;
+        LastLineCorner[F_LINE]=LINE_EMPTY;
+        LastLineCorner[B_LINE]=LINE_EMPTY;
+    }
+    //data.lnRepeat=0;
+    if((data.lnRepeat>0)&&(data.FieldSpot == LINE_INSIDE)){
+        //x
+        if(
+            ((pow_x>=0)&&(NewLineCorner[R_LINE]))||
+            ((pow_x<0)&&(NewLineCorner[L_LINE]))
+        ){
+            data.lnStay[X_LINE]=0;
+        }
+        else{
+            data.lnStay[X_LINE]=1;
+        }
+        //y
+        if(
+            ((pow_y>=0)&&(NewLineCorner[F_LINE]))||
+            ((pow_y<0)&&(NewLineCorner[B_LINE]))
+        ){
+            data.lnStay[Y_LINE]=0;
+        }
+        else{
+            data.lnStay[Y_LINE]=1;
+        }
+    }
+    else{
+        data.lnStay[X_LINE]=data.lnStay[Y_LINE]=1;
+    }
+    //*/
+    
+}
+void JudgeInSide(void){
+    data.FieldSpot = LINE_INSIDE;
+    data.NonWall[L_LINE] = data.NonWall[R_LINE] = data.NonWall[F_LINE] = data.NonWall[B_LINE] = 0;
+    LineLiberate();
+    LineRankClear();
+    //Line_home.detach();
+}