share

Dependencies:   mbed-rtos mbed

Fork of BX-car_2 by Tony Lin

Revision:
20:4ed21397e775
Parent:
19:eb0552a0ddae
--- a/camera_api.cpp	Sun Jun 29 14:02:37 2014 +0000
+++ b/camera_api.cpp	Sun Jun 29 16:20:22 2014 +0000
@@ -1,367 +1,167 @@
 #include "mbed.h"
 #include "camera_api.h"
+ 
 #define clk 2  //ms
-
-BX_camera::BX_camera(void)
+ 
+BX_camera::BX_camera(int p)
 {
-
+ 
     line_CamR = new FastAnalogIn(PTD5);
     line_CamL=   new FastAnalogIn(PTD6,0);
     cam_clk=new DigitalOut(PTE1);
     si=new DigitalOut(PTD7);
-
+    padding = p;
 }
-
+ 
 int BX_camera::black_centerR(void)
 {
-
-    int r_care=10;
-    int l_care=118;
-
-
-    // find center
-    // case 1      //  |  //
-    // case 2       /  |  /
-
-    char find_type=0x00;
-
-    int b_end=64;
-    int b_start=64;
-    int b_w=0;
-    int b_center=64;    
-    int b2_end=64;
-    int b2_start=64;
-    int b2_center=64;
-    int b2_w=0;
-    int center=30;
-    int j=64,i;
-    int offset=64;
-    bool f1=false;
-    bool f2=false;
-    bool f3=false;
-    bool f4=false;
-    bool count=false;
-    int same_chars=0;
-    int w_thr_up=32;
-    int w_thr_dn=2;
-
-    b_start=b_center=b_end=b2_start=b2_center=b2_end=offset;
-    
-    for(i=l_care-1; i>r_care; i--){
-        if(sign_line_imageR[i]==' ' && count==false){
-            b_start=i;
-            count=true;
-            if(last_sign_line_imageR[i]==' ')
-                same_chars++;
-        }
-        else if(sign_line_imageR[i]==' ' && count==true){
-            if(last_sign_line_imageR[i]==' ')
-                same_chars++;
-        }
-        else if(sign_line_imageR[i]!=' ' && count==true){
-            count=false;
-            if(same_chars>5 && same_chars<32){
-                b_end=i+1;
-                break;    
-            }
-        }
-    }
-    
-    center=(b_end+b_start)/2;
-    
-    for(i=l_care-1; i>r_care; i--){
-        last_sign_line_imageR[i]=sign_line_imageR[i];
-        }
-        
-    return center;
-/*
+ 
     int l_care=10;
     int r_care=118;
-
-
-    // find center
-    // case 1      //  |  //
-    // case 2       /  |  /
-
-    char find_type=0x00;
-
-    int b_end=64;
-    int b_start=64;
+    int b_start=0;
+    int b_end=0;
+    bool l_f1=false;
+    bool l_f2=false;
+    bool find=false;
+    int b_thr_up=32;
+    int b_thr_dn=5;
     int b_w=0;
-    int b_center=64;    
-    int b2_end=64;
-    int b2_start=64;
-    int b2_center=64;
-    int b2_w=0;
-    int center=30;
-    int j=64;
-    int offset=64;
-    bool f1=false;
-    bool f2=false;
-    bool f3=false;
-    bool f4=false;
-    int w_thr_up=32;
-    int w_thr_dn=2;
-
-    b_start=b_center=b_end=b2_start=b2_center=b2_end=offset;
-    
-    if(sign_line_imageR[64]==' ')
-        find_type=0x02;
-    else
-        find_type=0x01;
-
-
-    for(int i=64; i<r_care; i++,j--) {
-        
-        switch(find_type) {
-            case 0x01:
-                if(f1==false && sign_line_imageR[i]==' ') {
-                        b_start=i;
-                        f1=true;
-                }
-                if(f1== true && f2==false && sign_line_imageR[i]=='O') {
-                        b_end=i-1;
-                        f2=true;
-                }
-                if(f3==false && sign_line_imageR[j]==' ') {
-                        b2_start=j;
-                        f3=true;
-                }
-                if(f3==true && f4==false && sign_line_imageR[j]=='O') {
-                        b2_end=j+1;
-                        f4=true;
-                }
-                break;
-
-            case 0x02:
-                if(sign_line_imageR[i]=='O') {
-                    if(f1==false) {
-                        b_end=i-1;
-                        f1=true;
-                    }
-                }
-                if(sign_line_imageR[j]=='O') {
-                    if(f2==false) {
-                        b_start=j+1;
-                        f2=true;
-                    }
-                }
-                break;
-        }
-    }
-
-    b_w=b_end-b_start+1;
-    b2_w=b2_start-b2_end+1;
-
-    de_v=b_start;
-    de_v2=b_end;
-
-    switch(find_type) {
-        case 0x01:
-            b_center=(b_end+b_start)/2;
-            b2_center=(b2_end+b2_start)/2;
-
-            if(w_thr_up>b_w && w_thr_dn<b_w && (b_center!=offset) && (b_center-offset)<(offset-b2_center))
-                center=b_center;
-            else if(w_thr_up>b2_w && w_thr_dn<b2_w && (b2_center!=offset)) 
-                center=b2_center;
-            else
-                center=offset;
-            break;
-
-        case 0x02:
-            center=(b_end+b_start)/2;
-            break;
-    }
     
-    return center;
-    */
-}
-
-
-
-int BX_camera::black_centerL(void)
-{
-
-    int l_care=10;
-    int r_care=118;
-    // find center
-    // case 1      //  |  //
-    // case 2       /  |  /
-    char find_type=0x00;
-    int b_end=118;
-    int b_start=118;
-    int b_w=0;
-    int b_center=0;
-    int b2_end=0;
-    int b2_start=0;
-    int b2_center=0;
-    int b2_w=0;
-    int center=30;
-    int j=64;
-    bool f1=false;
-    bool f2=false;
-    bool f3=false;
-    bool f4=false;
-    int w_thr_up=32;
-    int w_thr_dn=0;
-
-    if(sign_line_imageR[64]==' ')
-        find_type=0x02;
-    else
-        find_type=0x01;
-
-
-    for(int i=64; i<r_care; i++,j--) {
-        
-        switch(find_type) {
-            case 0x01:
-                if(f1==false&&sign_line_imageR[i]==' ') {
-                    if(f1==false) {
-                        b_start=i;
-                        f1=true;
-                    }
-
-                }
-                if(f1== true&& f2==false&&sign_line_imageR[i]=='O') {
-                    if(f2==false) {
-                        b_end=i-1;
-                        f2=true;
-                    }
-
-                }
-                if(f3==false&&sign_line_imageR[j]==' ') {
-                    if(f3==false) {
-                        b2_end=j;
-                        f3=true;
-                    }
-
+     for(int i=r_care;i>l_care;i--){
+         
+         
+          if(l_f1==false&&sign_line_imageR[i]==' '){
+               
+              b_start=i;
+              l_f1=true;
+          }
+          if(l_f1==true && sign_line_imageR[i]=='O'){
+              b_end=i-1;
+              l_f2=true;   
+           }
+         
+           if(l_f1==true && l_f2== true){
+               b_w=b_start-b_end;
+               if( b_thr_up>b_w&&b_w> b_thr_dn){
+                   
+                   find=true;     
+                   break;
                 }
-                if(f3==true&&f4==false&&sign_line_imageR[j]=='O') {
-                    if(f4==false) {
-                        b2_start=j-1;
-                        f4=true;
-                    }
-
-                }
-                break;
+                else{
+                   l_f1=false;
+                   l_f2=false;
+                   
+                } 
                 
-            case 0x02:
-                if(sign_line_imageR[i]=='O') {
-                    if(f1==false) {
-                        b_end=i;
-                        f1=true;
-                    }
-                }
-                if(sign_line_imageR[j]=='O') {
-                    if(f2==false) {
-                        b_start=j;
-                        f2=true;
-                    }
-                }
-                break;
-        }
+                   
+            }
+               
+               
     }
-
-    b_w=b_start-b_end;
-    b2_w=b2_start-b2_end;
-
-    de_v=b_start;
-    de_v2=b_end;
-
-    switch(find_type) {
-        case 0x01:
-            b_center=(b_end+b_start)/2;
-            b2_center=(b2_end+b2_start)/2;
-            if(w_thr_up>b_w&&(b_center!=0)&&(b_center-64)<(64-b2_center))
-                center=b_center;
-            else
-                center=b2_center;
-            /*            if( ( w_thr_up- (b_w))>0  &&( ( w_thr_up- (b_w)) < (w_thr_up-(b2_w)) )           ) {
-                            center=(b_end+b_start)/2;
-
-
-
-              //          } else if( ( w_thr_up- (b2_w) )>0 ) {
-                            center=(b2_end+b2_start)/2;
-            //            } else {
-
-                            center=65;
-
-                            //????????????????
-
-                        }
-
-            */
-            break;
-
-        case 0x02:
-            center=(b_end+b_start)/2;
-            break;
-    }
-    return center;
-}
-
+         
+         
+         
+     
+ 
+  if(find)
+     return (b_start+b_end)/2;
+  else
+     return -1;  
+}   
+ 
+ 
+ 
+ 
+ 
 void BX_camera::read(void)
 {
-
+ 
     w_f_vL=0x0000;
     b_f_vL=0xffff;
+ 
     w_f_vR=0x0000;
     b_f_vR=0xffff;
-
+ 
+ 
+ 
+ 
     *si=1;
     *cam_clk=1;
-
+ 
     wait_us(30);   // tune here
     *si=0;
     *cam_clk=0;
-
+ 
+ 
+ 
     line_CamR->enable();
     line_CamL->enable();
-    
+ 
+ 
     //input 128 //both
+ 
     for(int i=0; i<128; i++) {
         *cam_clk=1;
         wait_us(5);
-
+ 
+ 
         line_imageR[i]=line_CamR->read_u16();
         line_imageL[i]=line_CamL->read_u16();
-
+ 
         //  big small
         if(line_imageR[i] > w_f_vR)
             w_f_vR=line_imageR[i];
         else if(line_imageR[i] < b_f_vR )
             b_f_vR = line_imageR[i];
-
-
+ 
+ 
         if(line_imageL[i] > w_f_vL)
             w_f_vL=line_imageL[i];
         else if(line_imageL[i] < b_f_vL )
             b_f_vL = line_imageL[i];
-
+ 
+ 
+ 
+ 
         *cam_clk=0;
         wait_us(5);
+ 
+ 
     }
-
+ 
+ 
     line_CamR->enable();
     line_CamL->enable();
-
+ 
+ 
     //filter L R   //may change
+ 
     for(int i=0; i<128; i++) {
+ 
+ 
         if( (line_imageR[i]-b_f_vR) < (w_f_vR - line_imageR[i] )    )
             sign_line_imageR[i]=' ';
         else
             sign_line_imageR[i]='O';
-
+ 
+ 
         if( (line_imageL[i]-b_f_vL) < (w_f_vL - line_imageL[i] )    )
             sign_line_imageL[i]=' ';
         else
             sign_line_imageL[i]='O';
-
+ 
+ 
+ 
+ 
+ 
         if(i==0) {
             sign_line_imageR[i]='X';
             sign_line_imageL[i]='X';
         }
+ 
+ 
     }
+ 
+ 
+ 
 }
\ No newline at end of file