sda

Dependencies:   mbed

Revision:
12:654ad1fe2951
Parent:
11:ce9832af1c3b
--- a/main.cpp	Tue Apr 09 14:27:00 2019 +0000
+++ b/main.cpp	Wed Apr 10 16:58:05 2019 +0000
@@ -204,6 +204,13 @@
     }
     activeReg[5][5].amplitude=0;
     activeReg[5][5].amplitude=0;
+    
+    for (int j = 10; j >= 0; j--) {
+        for (int i = 0; i < 11; i++) {
+            cout << "[" << activeReg[i][j].cellVal << "]";
+        }
+        cout << endl;
+    }
 
     calcSectors(theta);
 }
@@ -218,8 +225,8 @@
         }
     }
 
-    smooth[0]=(secVal[28]+2*secVal[29]+2*secVal[0]+2*secVal[1]+secVal[2])/5;
-    smooth[1]=(secVal[29]+2*secVal[0]+2*secVal[1]+2*secVal[2]+secVal[3])/5;
+    smooth[0]=(secVal[34]+2*secVal[35]+2*secVal[0]+2*secVal[1]+secVal[2])/5;
+    smooth[1]=(secVal[35]+2*secVal[0]+2*secVal[1]+2*secVal[2]+secVal[3])/5;
     smooth[34]=(secVal[32]+2*secVal[33]+2*secVal[34]+2*secVal[35]+secVal[0])/5;
     smooth[35]=(secVal[33]+2*secVal[34]+2*secVal[35]+2*secVal[0]+secVal[1])/5;
     for (int i = 2; i < 34; ++i) {
@@ -250,17 +257,188 @@
     float theta_deg;
     theta_deg =(theta*180.0f)/M_PI;
     pc.printf("theta (degrees): = %lf\n\n", theta_deg);
-    float sectorA, sectorB;
-    for (int i = 0; i < 36; ++i) {
-        sectorA = 10*i;
-        sectorB = 10*best;
-        if(sectorA > 180) sectorA=-(360-sectorA);
-        if(sectorB > 180) sectorB=-(360-sectorB);
-        //pc.printf("sectorA = %lf sectorB = %lf temp[%d] = %d smooth[%d] = %lf secVal[%d] = %lf \n", sectorA, sectorB, i, temp[i], i, smooth[i], i, secVal[i]);
-        if(temp[i]!=0 && (fabs(sectorA-theta_deg)<fabs(sectorB-theta_deg))) best=i;
+   int destSec = theta_deg / 10;
+   if(destSec<0) destSec=36+destSec;
+   cout<<"destination sector: "<<destSec<<endl;
+   
+   int L=destSec;
+    int R=destSec;
+    while(temp[L]==0){
+        L--;
+        if(L<0) L=35;
+    }
+    while(temp[R]==0){
+        R++;
+        if(R>35) R=0;
     }
-    pc.printf("best = %lf\n\n", best);
-    fX=cos(best*10.0f*M_PI/180.0f);
-    fY=sin(best*10.0f*M_PI/180.0f);
+   
+    float dirSet, dirC,dirL,dirR;
+    if(temp[destSec]==1){
+        int k=destSec-1;
+        if(k<0) k=35;
+        int size=1;
+        while(temp[k]==1){
+            size++;
+            k--;
+            if(k<0) k=35;
+            if(k==destSec) break;
+            if(size>=5) break;
+        }
+        int right=k+1;
+        if(right<0) right=35;
+        k=destSec+1;
+        if(k>35) k=0;
+        while(temp[k]==1){
+            size++;
+            k++;
+            if(k>35) k=0;
+            if(k==destSec) break;
+            if(size>=5) break;
+        }
+        int left=k-1;
+        if(left>35) left=0;
+        if(size>=5) {
+        //wide
+            dirC=destSec*10;
+            cout << "wide"<<endl;
+            }
+    
+        else if(size>4 && size<5) //narrow
+        {
+            dirC=0.5*(left*10+right*10);
+            cout<<"narrow"<<endl;
+        } else {
+            int secL = L;
+        while (temp[secL] != 1) {
+            secL++;
+            if (secL > 35) secL = 0;
+        }
+        int rightL = secL;
+        int size = 1;
+
+        int i = secL + 1;
+        if (i > 35) i = 0;
+        while (temp[i] == 1) {
+            size++;
+            i++;
+            if (i > 35) i = 0;
+            if (i == secL) break;
+            // Smax here
+            if (size >= 5) break;
+        }
+        int leftL = i - 1;
+        if (leftL < 0) leftL = 35;
+        if (size >= 5) //wide
+            dirL = rightL * 10 + 0.5 * 10 * 5;
+        else if(size>4 && size<5)  //narrow
+            dirL = 0.5 * (leftL * 10 + rightL * 10);
+        else
+            dirL=9999;
+        ///////////////////////////////////////////////////////////////////
+        int secR = R;
+        while (temp[secR] != 1) {
+            secR--;
+            if (secR < 0) secR = 35;
+        }
+
+        int leftR = secR;
+        int sizeR = 1;
+
+        int j = secR - 1;
+        if (j < 0) j = 35;
+        while (temp[j] == 1) {
+            sizeR++;
+            j--;
+            if (j < 0) j = 35;
+            if (j == secR) break;
+            if (sizeR >= 5) break;
+        }
+        int rightR = j + 1;
+        if (rightR > 35) rightR = 0;
+        if (sizeR >= 5) //wide
+            dirR = leftR * 10 + 0.5 * 10 * 5;
+        else if(sizeR>4 && sizeR<5)//narrow
+            dirR = 0.5 * (rightR * 10 + leftR * 10);
+        else
+            dirR=9999;
+
+        if(dirL>360) dirL=fabs(dirL-360);
+        if(dirR>360) dirR=fabs(dirR-360);
+        if(fabs(theta_deg-dirL)>fabs(theta_deg-dirR))
+            dirC=dirR;
+        else
+            dirC=dirL;
+        }
+        dirSet=dirC;
+        cout<<"dirSet: 1"<<endl;
+
+        ///////////////////////////////////////////////////////////
+    } else {
+        int secL = destSec;
+        while (temp[secL] != 1) {
+            secL++;
+            if (secL > 35) secL = 0;
+        }
+        int rightL = secL;
+        int size = 1;
+
+        int i = secL + 1;
+        if (i > 35) i = 0;
+        while (temp[i] == 1) {
+            size++;
+            i++;
+            if (i > 35) i = 0;
+            if (i == secL) break;
+            // Smax here
+            if (size >= 5) break;
+        }
+        int leftL = i - 1;
+        if (leftL < 0) leftL = 35;
+        if (size >= 5) //wide
+            dirL = rightL * 10 + 0.5 * 10 * 5;
+        else if(size>4 && size<5)  //narrow
+            dirL = 0.5 * (leftL * 10 + rightL * 10);
+        else
+            dirL=9999;
+        ///////////////////////////////////////////////////////////////////
+        int secR = destSec;
+        while (temp[secR] != 1) {
+            secR--;
+            if (secR < 0) secR = 35;
+        }
+
+        int leftR = secR;
+        int sizeR = 1;
+
+        int j = secR - 1;
+        if (j < 0) j = 35;
+        while (temp[j] == 1) {
+            sizeR++;
+            j--;
+            if (j < 0) j = 35;
+            if (j == secR) break;
+            if (sizeR >= 5) break;
+        }
+        int rightR = j + 1;
+        if (rightR > 35) rightR = 0;
+        if (sizeR >= 5) //wide
+            dirR = leftR * 10 + 0.5 * 10 * 5;
+        else if(sizeR>4 && sizeR<5)//narrow
+            dirR = 0.5 * (rightR * 10 + leftR * 10);
+        else
+            dirR=9999;
+
+        if(dirL>360) dirL=fabs(dirL-360);
+        if(dirR>360) dirR=fabs(dirR-360);
+        if(fabs(theta_deg-dirL)>fabs(theta_deg-dirR))
+            dirSet=dirR;
+        else
+            dirSet=dirL;
+        cout<<"dirSet:2 dirR: "<<dirR<<" dirL: "<<dirL<<endl;
+    }
+    cout<<"dirSet: "<<dirSet<<endl;
+    
+    fX=cos(dirSet*M_PI/180.0f);
+    fY=sin(dirSet*M_PI/180.0f);
     
 }
\ No newline at end of file