program_BlockPIL //{Ping,Ir,Lines} Sensor

Dependencies:   mbed HMC6352

main.cpp

Committer:
ryuna
Date:
2014-02-22
Revision:
0:010fe1eae7d2
Child:
1:3ecb80796a7f

File content as of revision 0:010fe1eae7d2:

#include "mbed.h"
/*PING DEFINE */
#define ERROR_PING 0xFFF
#define ALL_PING 4
/*IR DEFINE*/
#define BREAKPT_IR 833
#define ERROR_IR 0xFFF
#define ALL_IR 10
//#define OVERLINE_IR 46
/*LINE DEFINE*/
#define JUDGEVOL_LINE 0.8
#define ALL_LINE 4
//OTHERS
#define ALL_KIND 3 //kind of sensors
#define MAX_NUM 10 //sensors most number
/*
Ping , IrSensor , LineSensor
*/

//LINE sensor is float value 
Serial pc(USBTX,USBRX);
Timer time_ping;
Timer time_ir; 

PinName num_ping[ALL_PING] = {p5,p6,p7,p8};
PinName num_ir[ALL_IR] = {p21,p22,p23,p24,p25,p26,p27,p28,p29,p30};
PinName num_line[ALL_LINE] = {p17,p18,p19,p20};

enum sensors{Ping,Ir,Line};
volatile unsigned int value_ping[ALL_PING] = {0};
volatile unsigned int value_ir[ALL_IR] = {0};
volatile float value_line[ALL_LINE] = {0};
DigitalOut myled(LED1);

unsigned int moving_ave(enum sensors kind,int num, unsigned int data){
    static unsigned int sum[ALL_KIND][MAX_NUM] = {0};
    static unsigned int temp[ALL_KIND][MAX_NUM][10] = {0};
    //static unsigned int ave[MAX_NUM] = {0};
    sum[kind][num] -= temp[kind][num][9];
    sum[kind][num] += data;
    temp[kind][num][9] = temp[kind][num][8];
    temp[kind][num][8] = temp[kind][num][7];
    temp[kind][num][7] = temp[kind][num][6];
    temp[kind][num][6] = temp[kind][num][5];
    temp[kind][num][5] = temp[kind][num][4];
    temp[kind][num][4] = temp[kind][num][3];
    temp[kind][num][3] = temp[kind][num][2];
    temp[kind][num][2] = temp[kind][num][1];
    temp[kind][num][1] = temp[kind][num][0];
    temp[kind][num][0] = data;
    //ave[kind][num] = sum[kind][num]/100;
    
    switch (kind) {
        case Ping: 
            value_ping[num] = sum[kind][num]/10;
            break;
        case Ir:
            value_ir[num] = sum[kind][num]/100;
            break;
        case Line:
            value_line[num] = sum[kind][num]/10000.0;
            break;
        default :
            break;
    }

    return sum[kind][num];//return no config sum
       
}
unsigned int ping_function (int num){
    DigitalInOut sensor_ping(num_ping[num]);
    unsigned int memory = 0;//return value
    time_ping.reset();
    /*make a pulse */
    sensor_ping.output();
    sensor_ping = 1;
    wait_us(5);
    sensor_ping = 0;
    sensor_ping.input();
    /*finish,and start timer*/
    time_ping.start();
    while(!sensor_ping){
        if(time_ping.read_ms() > 1){
            time_ping.stop();
            return ERROR_PING;
        }
    }
    time_ping.reset();
    while(sensor_ping){
        if(time_ping.read_ms() >18.5){
            time_ping.stop();
            return ERROR_PING;
        }
    }
    memory = time_ping.read_us();
    time_ping.stop();
    
    return memory;
}
unsigned int ir_function (int num){
    DigitalIn sensor_ir(num_ir[num]);
    int flag = 0;
    unsigned int memory = 0;
    unsigned int temp = 0;   
    flag = 1;
    time_ir.start();
    if((sensor_ir)){
        while((sensor_ir)){
            if(time_ir.read_us() >= BREAKPT_IR){
                flag = 0;
                break;
            }
        }
    }
    time_ir.stop();
    time_ir.reset();
    if(flag){
        time_ir.start();
        while(!sensor_ir){//!
            if(time_ir.read_us() >= BREAKPT_IR){
                break;
            }
        }
        memory = time_ir.read_us();
        while(1){
            if(!sensor_ir){
                temp = (time_ir.read_us() - memory);
                time_ir.stop();
                time_ir.reset();
                wait(0.01);
                return temp;
            }
        }
    }else{//not found
    }
    time_ir.stop();
    time_ir.reset();
    return ERROR_IR;
}
int line_function(int num){
    float memory = 0;
    AnalogIn sensor_line(num_line[num]);
    memory = sensor_line;
    return (int)(memory*1000);

}
int main() {
    //enum sensors kinds;
    int num[ALL_KIND] = {0};
    unsigned int value1[ALL_PING] = {0};
    unsigned int value2[ALL_IR] = {0};
    float value3[ALL_LINE] = {0};
    while(1) {
        //value1[num[Ping]] = moving_ave(Ping,num[Ping],ping_function(num[Ping]))/10;
        value2[num[Ir]]   = moving_ave(Ir,num[Ir],ir_function(num[Ir]))/100;
        //value3[num[Line]]= moving_ave(Line,num[Line],line_function(num[Line]))/10000.0;
        //pc.printf("value1[%d]=%d ",num[Ping], value1[num[Ping]]);
        pc.printf("value2[%d]=%d ",num[Ir], value2[num[Ir]]);
        //pc.printf("value3[%d]=%lf ",num[Line], value3[num[Line]]);
        num[Ping]++;
        num[Ir]++;
        num[Line]++;        
        if(num[Ping]>= ALL_PING){
            num[Ping] = 0; 
            //putchar('\n');
        }
        if(num[Ir]>= ALL_IR){
            num[Ir] = 0;
            putchar('\n');
        }
        if(num[Line]>= ALL_LINE){
            num[Line] = 0;
            //putchar('\n');
        }
        
    }
}