CatPot 2015-2016 / Mbed 2 deprecated CatPot_2v10_T_Main

Dependencies:   mbed AQM1602 HMC6352 PID

Revision:
13:b20921316f3c
Parent:
12:bee8f883c33a
Child:
14:b510adcb6065
diff -r bee8f883c33a -r b20921316f3c main_processing/strategy/strategy.cpp
--- a/main_processing/strategy/strategy.cpp	Thu Mar 10 14:08:09 2016 +0000
+++ b/main_processing/strategy/strategy.cpp	Fri Mar 11 00:39:21 2016 +0000
@@ -729,8 +729,6 @@
     return;
 }
 double LineJudgeX(double x){
-    const double static LineDecline[5] = {1, .75, .5, .375, 0};
-    const uint8_t static WhiteToWall = 30;
     uint8_t LineState;
     uint8_t LnRaw;
     uint8_t LnHold;
@@ -776,17 +774,15 @@
     //else if(LnHold==0){...maxpower
     
     if(x>=0){
-        if(data.ping[R_PING]<WhiteToWall) return LineDecline[LineState];
+        if(data.ping[R_PING]<WhiteToWall[X_PING]) return LineDecline[LineState];
         else return 1;
     }
     else{
-        if(data.ping[L_PING]<WhiteToWall) return LineDecline[LineState];
+        if(data.ping[L_PING]<WhiteToWall[X_PING]) return LineDecline[LineState];
         else return 1;
     }
 }
 void LineJudgeSlow(double *x, double *y){
-    const double static LineDecline[5] = {1, .75, .5, .375, 0};
-    const uint8_t static WhiteToWall[2] = {30, 30};
     uint8_t LineState;
     
     //line
@@ -817,6 +813,10 @@
         }
     }
     //else if(data.lnHold==0){...maxpower
+    if(data.FieldState==LINE_OUTSIDE){
+        LineState = 4;
+    }
+    
     
     if(*x>=0){
         if(data.ping[R_PING]<WhiteToWall[X_PING]) (*x)=LineDecline[LineState];
@@ -836,9 +836,8 @@
         else *y=1;
     }
 }
-void LineJudgeReturn(double pow_x, double pow_y, int8_t *x, int8_t *y){
+void LineJudgeReturn(double pow_x, double pow_y, double *x, double *y){
     const int8_t static LineReturn[5] = {0, 0, 0, 0, 10};
-    const uint8_t static WhiteToWall[2] = {30, 30};
     uint8_t LinePingState[4];
     //◎ボールを追う力とラインから離れる力の向きが違うならばラインから離れる力が優先される.
     //◎ボールを追う力とラインから離れる力の向きが同じならばボールを追う力が優先される.
@@ -846,8 +845,6 @@
     //×ラインのほぼ場外では常時ラインから離れる力が優先される.
     //※場外判定を行うには再び場内に戻る必要がある.
     
-    
-    
     if(data.FieldState==LINE_OUTSIDE){
         
         LinePingState[L_PING]=(data.ping[L_PING]<WhiteToWall[X_PING]);
@@ -860,39 +857,75 @@
         data.lnStop[Y_LINE]=1;
         //x
         if((LinePingState[L_PING]==0)&&(LinePingState[R_PING]==0)){
-            if(data.ping[L_PING]>data.ping[R_PING]) *x = -LineReturn[4];
-            if(data.ping[L_PING]==data.ping[R_PING]) *x = 0;
-            if(data.ping[L_PING]<data.ping[R_PING]) *x = LineReturn[4];
+            if(pow_x>0){
+              *x = -pow_x*(1-0.75);
+            }
+            else{
+              *x = pow_x*(1-0.75);
+            }
+            data.lnStop[X_LINE]=1;
         }
         if((LinePingState[L_PING]==0)&&(LinePingState[R_PING]==1)){
-            if(pow_x<0){*x = 0;}
-            else{*x = -LineReturn[4];data.lnStop[X_LINE]=0;}
+            if(pow_x<0){
+              *x = 0;
+              data.lnStop[X_LINE]=1;
+            }
+            else{
+              *x = -LineReturn[4];
+              data.lnStop[X_LINE]=0;
+            }
         }
         if((LinePingState[L_PING]==1)&&(LinePingState[R_PING]==0)){
-            if(pow_x>0){*x = 0;}
-            else{*x = -LineReturn[4];data.lnStop[X_LINE]=0;}
+            if(pow_x>0){
+              *x = 0;
+              data.lnStop[X_LINE]=1;
+            }
+            else{
+              *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((LinePingState[L_PING]==0)&&(LinePingState[R_PING]==0)){
-            if(data.ping[L_PING]>data.ping[R_PING]) *x = -LineReturn[4];
-            if(data.ping[L_PING]==data.ping[R_PING]) *x = 0;
-            if(data.ping[L_PING]<data.ping[R_PING]) *x = LineReturn[4];
+        if((LinePingState[B_PING]==0)&&(LinePingState[F_PING]==0)){
+            if(pow_y>0){
+              *y = -pow_y*(1-0.75);
+            }
+            else{
+              *y = pow_y*(1-0.75);
+            }
+            data.lnStop[Y_LINE]=1;
         }
-        if((LinePingState[L_PING]==0)&&(LinePingState[R_PING]==1)){
-            if(pow_x<0){*x = 0;}
-            else{*x = -LineReturn[4];data.lnStop[X_LINE]=0;}
+        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[L_PING]==1)&&(LinePingState[R_PING]==0)){
-            if(pow_x>0){*x = 0;}
-            else{*x = -LineReturn[4];data.lnStop[X_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[L_PING]==1)&&(LinePingState[R_PING]==1)){
-            *x = 0;
+        if((LinePingState[B_PING]==1)&&(LinePingState[F_PING]==1)){
+            *y = 0;
+            data.lnStop[Y_LINE]=0;
         }
+        
+        
     }
     else{//data.FieldState==LINE_INSIDE
         *x = 0;
@@ -904,12 +937,55 @@
     }
 }
 void LineJudgeReset(void){
-    return;
+    uint8_t LineState;
+    
+    //line
+    if(data.lnHold==7){
+        if(data.lnRaw>0){
+            //場外間際...減衰
+        }
+        else{//data.lnRaw==0
+            //場外...出力完全無効+反発
+            if(
+                (data.ping[L_PING]<OutToWall[X_PING])||
+                (data.ping[R_PING]<OutToWall[X_PING])||
+                (data.ping[F_PING]<OutToWall[Y_PING])||
+                (data.ping[B_PING]<OutToWall[Y_PING])
+            ){
+                LineLiberate();
+                data.FieldState=LINE_OUTSIDE;
+            }
+            if(
+                (data.ping[L_PING]>=WhiteToWall[X_PING])&&
+                (data.ping[R_PING]>=WhiteToWall[X_PING])
+            ){
+                LineLiberate();
+                data.FieldState=LINE_INSIDE;
+            }
+        }
+    }
+    else if(data.lnHold>0){
+        if(data.lnRaw>0){
+            //踏んでるけどまだ出てない...減衰
+            //timeout&reset...detach
+        }
+        else{//data.lnRaw==0
+            //線をまたいでいるか,中途半端に線を踏んだあと復帰したか...減衰
+            //if((data.ping[L_PING]>40)&&(data.ping[R_PING]>40)) LineLiberate();
+            //ping&reset
+            //timeout&reset
+        }
+    }
+    //else if(data.lnHold==0){...maxpower
+    
+    if((data.ping[R_PING]>WhiteToWall[X_PING])&&(data.ping[L_PING]>WhiteToWall[X_PING])) LineLiberate();
 }
 void modeAttack4(void){
     double ir_x_dir, ir_y_dir;
     double ir_x_turn, ir_y_turn;
     double ir_x, ir_y;
+    
+    double pow_x, pow_y;
     uint8_t ir_pow;
     int vx,vy,vs;
     
@@ -920,6 +996,8 @@
         sys.LineBlind=0;
         sys.PingBlind=0;
         
+        data.FieldState=LINE_INSIDE;
+        
         sys.KickOffFlag=0;
     }
     //data