QQQ

Dependencies:   mbed-rtos mbed

Fork of BX-car_s by Tony Lin

camera_api.cpp

Committer:
TonyLin
Date:
2014-06-28
Revision:
17:af867c7512bb
Parent:
12:418e39749f48
Child:
18:88b083db7491

File content as of revision 17:af867c7512bb:

#include "mbed.h"
#include "camera_api.h"

#define clk 2  //ms


BX_camera::BX_camera(void)
{

    line_CamR = new FastAnalogIn(PTD5);
    line_CamL=   new FastAnalogIn(PTD6,0);
    cam_clk=new DigitalOut(PTE1);
    si=new DigitalOut(PTD7);

}

int BX_camera::black_centerR(void)
{

    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_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=0;

    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]==' ') {
                    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;
                    }
                }
                if(f3==true&&f4==false&&sign_line_imageR[j]=='O') {
                    if(f4==false) {
                        b2_start=j+1;
                        f4=true;
                    }
                }
                break;

            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!=offset) && (b_center-offset)<(offset-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;
}



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;
                    }

                }
                if(f3==true&&f4==false&&sign_line_imageR[j]=='O') {
                    if(f4==false) {
                        b2_start=j-1;
                        f4=true;
                    }

                }
                break;
                
            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;
}

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';
        }
    }
}