Sweep a servo according to Proximity sensor measure

Dependencies:   Servo X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Revision:
9:1d0e839edee8
Parent:
8:4c05f7a5bb60
Child:
10:5319abadb31e
--- 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();
 
 }