Sweep a servo according to Proximity sensor measure
Dependencies: Servo X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
Diff: main.cpp
- Revision:
- 9:1d0e839edee8
- Parent:
- 8:4c05f7a5bb60
- Child:
- 10:5319abadb31e
diff -r 4c05f7a5bb60 -r 1d0e839edee8 main.cpp --- a/main.cpp Tue Oct 06 09:09:03 2015 +0200 +++ b/main.cpp Tue Oct 13 14:26:18 2015 +0200 @@ -10,53 +10,144 @@ #define VL6180X_I2C_SDA I2C_SDA #define VL6180X_I2C_SCL I2C_SCL -//devo wrappare le funzioni del api.c -//posso creare un`unica funzione che dal main chiama la misura di distanza o luce -//gestisco all`interno della classe sensore con uno switch case e slezionare quindi la modalita di misura -//nel main posso definire con dei define i valori (dello switch case) che permettono di selezionare le varie modalita - -#define RANGE_SINGLE_SHOT 1 -#define ALS_SINGLE_SHOT 2 -#define RANGE_CONTINUOUS 3 -#define ALS_CONTINUOUS 4 -#define RANGE_CONTINUOUS_ALS_SINGLE_SHOT 5 -#define RANGE_SINGLE_SHOT_ALS_CONTINUOUS 6 -#define INTERLEAVED MODE 7 +/* Polling operating modes (1,2,3 and 4) don`t require callback function that handles IRQ + Callback functions are used only for measure that require interrupt */ void OnErrLog(void){}; void DISP_ExecLoopBody(void){}; DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL); -static X_NUCLEO_6180XA1 *board=X_NUCLEO_6180XA1::Instance(&device_i2c); - +static X_NUCLEO_6180XA1 *board=X_NUCLEO_6180XA1::Instance(&device_i2c); + +MeasureData_t Data; + +/* flags that handle the call to HandleIRQ function */ +bool flag_sensor_top=false, flag_sensor_bottom=false, flag_sensor_left=false, flag_sensor_right=false; + +/* callback functions of the sensors */ +void SensorTopIRQ(void) +{ + flag_sensor_top=true; + board->sensor_top->DisableInterruptMeasureDetectionIRQ(); +} + +//inserire le callback per gli altri sensori + int main() { - /* - uint8_t buf[8]={1,1,1,0,0,0,0,0}; - - uint8_t x=0xFF; - uint8_t y=0xF7; - uint8_t z=0x80; - uint8_t k=0x17; - uint8_t g=0xE7; - - //imposto GPIO di input e output - device_i2c.i2c_write(&x, 0x42*2, 0x14, 1); - device_i2c.i2c_write(&y, 0x42*2, 0x15, 1); - //disabilito i display e abilito il GPIO0 del sensore top - device_i2c.i2c_write(&z, 0x42*2, 0x12, 1); - device_i2c.i2c_write(&g, 0x42*2, 0x13, 1); //spengo gpio0 - device_i2c.i2c_write(&k, 0x42*2, 0x13, 1); //accendo gpio0 - */ - - - - //X_NUCLEO_6180XA1 board(&device_i2c); - - board->InitBoard(); - board->sensor_top->StartMeasurement(RANGE_SINGLE_SHOT); - - //board.~X_NUCLEO_6180XA1(); + int status; + + status=board->InitBoard(); + if(status) + printf("Failed to init the board!\n\r"); + + /* + status=board->sensor_top->StartMeasurement(range_single_shot_polling, NULL, &Data); + if(!status) + printf("Range single shot: %d\n\r",Data.range_mm); + else + printf("Failed to start measurement!\n\r"); + status=board->sensor_top->StartMeasurement(als_single_shot_polling, NULL, &Data); + if(!status) + printf("Light single shot: %d\n\r",Data.lux); + else + printf("Failed to start measurement!\n\r"); + + status=board->sensor_top->StartMeasurement(range_continuous_polling, NULL, &Data); + if(!status) + { + status=board->sensor_top->GetRangeMeasContinuousMode(&Data); + if(!status) + printf("1a Range: %d\n\r",Data.range_mm); + else + printf("Invalid range value!\n\r"); + status=board->sensor_top->GetRangeMeasContinuousMode(&Data); + if(!status) + printf("2a Range: %d\n\r",Data.range_mm); + else + printf("Invalid range value!\n\r"); + status=board->sensor_top->GetRangeMeasContinuousMode(&Data); + if(!status) + printf("3a Range: %d\n\r",Data.range_mm); + else + printf("Invalid range value!\n\r"); + } + else + printf("Failed to start measurement!\n\r"); + + status=board->sensor_top->StartMeasurement(als_continuous_polling, NULL, &Data); + if(!status) + { + status=board->sensor_top->GetAlsMeasContinuousMode(&Data); + if(!status) + printf("1a Light: %d\n\r",Data.lux); + else + printf("Invalid light value!\n\r"); + status=board->sensor_top->GetAlsMeasContinuousMode(&Data); + if(!status) + printf("2a Light: %d\n\r",Data.lux); + else + printf("Invalid light value!\n\r"); + status=board->sensor_top->GetAlsMeasContinuousMode(&Data); + if(!status) + printf("3a Light: %d\n\r",Data.lux); + else + printf("Invalid light value!\n\r"); + } + else + printf("Failed to start measurement!\n\r"); + */ + + /*board->sensor_top->StartMeasurement(range_continuous_interrupt, SensorTopIRQ, &Data); + while(1) + { + if(flag_sensor_top) + { + flag_sensor_top=false; + board->sensor_top->HandleIRQ(range_measure, &Data); + if((Data.range_error==0)&&(Data.int_error==0)) + printf("Range int: %d\n\r",Data.range_mm); + else + printf("Invalid range value!\n\r"); + } + }*/ + + /*board->sensor_top->StartMeasurement(als_continuous_interrupt, SensorTopIRQ, &Data); + while(1) + { + if(flag_sensor_top) + { + flag_sensor_top=false; + board->sensor_top->HandleIRQ(light_measure, &Data); + if((Data.als_error==0)&&(Data.int_error==0)) + printf("Light int: %d\n\r",Data.lux); + else + printf("Invalid light value!\n\r"); + } + }*/ + + + board->sensor_top->StartMeasurement(interleaved_mode, SensorTopIRQ, &Data); + while(1) + { + if(flag_sensor_top) + { + flag_sensor_top=false; + board->sensor_top->HandleIRQ(light_range_measure, &Data); + if((Data.range_error==0)&&(Data.int_error==0)) + printf("Interleaved_mode->Range: %d\n\r",Data.range_mm); + else + printf("Invalid range value!\n\r"); + if((Data.als_error==0)&&(Data.int_error==0)) + printf("Interleaved_mode->Light: %d\n\r",Data.lux); + else + printf("Invalid light value!\n\r"); + } + } + + + + //board->~X_NUCLEO_6180XA1(); }