21/02/18 definitivo

Dependencies:   X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Committer:
gallonm
Date:
Wed Oct 28 14:56:58 2015 +0000
Revision:
17:68515d0667af
Parent:
16:fbf61b7c65ba
Child:
18:6312be3b32d9
Updated main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gallonm 0:83c628a58feb 1 #include "mbed.h"
gallonm 8:4c05f7a5bb60 2 #include "x_nucleo_6180xa1.h"
gallonm 14:946e62f44f4f 3 #include "HmiBBGesture.h"
gallonm 4:ccd62fd7e137 4 #include <string.h>
gallonm 4:ccd62fd7e137 5 #include <stdlib.h>
gallonm 4:ccd62fd7e137 6 #include <stdio.h>
gallonm 8:4c05f7a5bb60 7 #include <assert.h>
gallonm 8:4c05f7a5bb60 8
gallonm 14:946e62f44f4f 9 /* Polling operating modes don`t require callback function that handles IRQ
gallonm 14:946e62f44f4f 10 Callback functions are used only for measure that require interrupt */
gallonm 14:946e62f44f4f 11
gallonm 5:fa65d931bd96 12 #define VL6180X_I2C_SDA I2C_SDA
gallonm 5:fa65d931bd96 13 #define VL6180X_I2C_SCL I2C_SCL
gallonm 5:fa65d931bd96 14
gallonm 10:5319abadb31e 15 //#define RANGE_SINGLE_SHOT_POLLING
gallonm 10:5319abadb31e 16 //#define ALS_SINGLE_SHOT_POLLING
gallonm 10:5319abadb31e 17 //#define RANGE_CONTINUOUS_POLLING
gallonm 10:5319abadb31e 18 //#define ALS_CONTINUOUS_POLLING
gallonm 17:68515d0667af 19 #define RANGE_CONTINUOUS_INTERRUPT
gallonm 14:946e62f44f4f 20 //#define ALS_CONTINUOUS_INTERRUPT
gallonm 11:657dbe7bf245 21 //#define INTERLEAVED_MODE_INTERRUPT
gallonm 10:5319abadb31e 22 //#define RANGE_CONTINUOUS_POLLING_LOW_THRESHOLD
gallonm 10:5319abadb31e 23 //#define RANGE_CONTINUOUS_POLLING_HIGH_THRESHOLD
gallonm 10:5319abadb31e 24 //#define RANGE_CONTINUOUS_POLLING_OUT_OF_WINDOW
gallonm 10:5319abadb31e 25 //#define ALS_CONTINUOUS_POLLING_LOW_THRESHOLD
gallonm 10:5319abadb31e 26 //#define ALS_CONTINUOUS_POLLING_HIGH_THRESHOLD
gallonm 10:5319abadb31e 27 //#define ALS_CONTINUOUS_POLLING_OUT_OF_WINDOW
gallonm 10:5319abadb31e 28 //#define RANGE_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
gallonm 10:5319abadb31e 29 //#define RANGE_CONTINUOUS_INTERRUPT_HIGH_THRESHOLD
gallonm 10:5319abadb31e 30 //#define RANGE_CONTINUOUS_INTERRUPT_OUT_OF_WINDOW
gallonm 10:5319abadb31e 31 //#define ALS_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
gallonm 10:5319abadb31e 32 //#define ALS_CONTINUOUS_INTERRUPT_HIGH_THRESHOLD
gallonm 10:5319abadb31e 33 //#define ALS_CONTINUOUS_INTERRUPT_OUT_OF_WINDOW
gallonm 10:5319abadb31e 34
gallonm 14:946e62f44f4f 35 /* timer and digital out pin used for debugging */
gallonm 14:946e62f44f4f 36 //Timer timer;
gallonm 14:946e62f44f4f 37 //int start, end;
gallonm 14:946e62f44f4f 38 //DigitalOut pin(PA_15);
gallonm 5:fa65d931bd96 39
gallonm 8:4c05f7a5bb60 40 DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL);
gallonm 9:1d0e839edee8 41 static X_NUCLEO_6180XA1 *board=X_NUCLEO_6180XA1::Instance(&device_i2c);
gallonm 9:1d0e839edee8 42
gallonm 17:68515d0667af 43 //HmiBBGesture gesture_reco;
gallonm 9:1d0e839edee8 44
gallonm 14:946e62f44f4f 45 MeasureData_t data_sensor_top, data_sensor_bottom, data_sensor_left, data_sensor_right;
gallonm 11:657dbe7bf245 46
gallonm 15:b94bc967fecd 47 /* flags that handle interrupt request */
gallonm 15:b94bc967fecd 48 bool flag_sensor_top=false, flag_sensor_bottom=false, flag_sensor_left=false, flag_sensor_right=false, flag_stop_measure=false;
gallonm 15:b94bc967fecd 49
gallonm 15:b94bc967fecd 50 /* user button used to stop measurements in interrupt mode */
gallonm 15:b94bc967fecd 51 InterruptIn stop_button(USER_BUTTON);
gallonm 9:1d0e839edee8 52
gallonm 9:1d0e839edee8 53 /* callback functions of the sensors */
gallonm 15:b94bc967fecd 54 void SensorTopIRQ(void)
gallonm 9:1d0e839edee8 55 {
gallonm 11:657dbe7bf245 56 flag_sensor_top=true;
gallonm 14:946e62f44f4f 57 board->sensor_top->DisableInterruptMeasureDetectionIRQ();
gallonm 9:1d0e839edee8 58 }
gallonm 9:1d0e839edee8 59
gallonm 15:b94bc967fecd 60 void SensorBottomIRQ(void)
gallonm 11:657dbe7bf245 61 {
gallonm 11:657dbe7bf245 62 flag_sensor_bottom=true;
gallonm 14:946e62f44f4f 63 board->sensor_bottom->DisableInterruptMeasureDetectionIRQ();
gallonm 11:657dbe7bf245 64 }
gallonm 11:657dbe7bf245 65
gallonm 15:b94bc967fecd 66 void SensorLeftIRQ(void)
gallonm 11:657dbe7bf245 67 {
gallonm 11:657dbe7bf245 68 flag_sensor_left=true;
gallonm 14:946e62f44f4f 69 board->sensor_left->DisableInterruptMeasureDetectionIRQ();
gallonm 11:657dbe7bf245 70 }
gallonm 11:657dbe7bf245 71
gallonm 15:b94bc967fecd 72 void SensorRightIRQ(void)
gallonm 11:657dbe7bf245 73 {
gallonm 11:657dbe7bf245 74 flag_sensor_right=true;
gallonm 14:946e62f44f4f 75 board->sensor_right->DisableInterruptMeasureDetectionIRQ();
gallonm 11:657dbe7bf245 76 }
gallonm 9:1d0e839edee8 77
gallonm 15:b94bc967fecd 78 void StopMeasureIRQ(void)
gallonm 15:b94bc967fecd 79 {
gallonm 15:b94bc967fecd 80 flag_stop_measure=true;
gallonm 15:b94bc967fecd 81 }
gallonm 14:946e62f44f4f 82
gallonm 4:ccd62fd7e137 83 int main()
gallonm 5:fa65d931bd96 84 {
gallonm 14:946e62f44f4f 85 int status, status_t, status_b, status_l, status_r;
gallonm 14:946e62f44f4f 86
gallonm 15:b94bc967fecd 87 //device_i2c.frequency(400000); //change i2c frequncy from 100kHz to 400kHz
gallonm 14:946e62f44f4f 88 pc.baud(115200); //change baudrate of the printf
gallonm 14:946e62f44f4f 89
gallonm 10:5319abadb31e 90 status=board->InitBoard();
gallonm 14:946e62f44f4f 91 if(status)
gallonm 15:b94bc967fecd 92 printf("Failed to init the board!\n\r");
gallonm 10:5319abadb31e 93
gallonm 10:5319abadb31e 94 #ifdef RANGE_SINGLE_SHOT_POLLING
gallonm 14:946e62f44f4f 95 status_t=board->sensor_top->StartMeasurement(range_single_shot_polling, NULL, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 96 if(!status_t)
gallonm 14:946e62f44f4f 97 printf("Top Range: %dmm\n\r",data_sensor_top.range_mm);
gallonm 14:946e62f44f4f 98 else if(status==INVALID_PARAMS)
gallonm 14:946e62f44f4f 99 printf("Failed to start measurement!\n\r");
gallonm 14:946e62f44f4f 100 else
gallonm 14:946e62f44f4f 101 printf("Invalid range value!\n\r");
gallonm 14:946e62f44f4f 102 status_t=board->sensor_top->StopMeasurement(range_single_shot_polling);
gallonm 14:946e62f44f4f 103 if(status_t)
gallonm 14:946e62f44f4f 104 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 105 #endif
gallonm 9:1d0e839edee8 106
gallonm 10:5319abadb31e 107 #ifdef ALS_SINGLE_SHOT_POLLING
gallonm 14:946e62f44f4f 108 status_t=board->sensor_top->StartMeasurement(als_single_shot_polling, NULL, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 109 if(!status_t)
gallonm 15:b94bc967fecd 110 printf("Top Light: %d lux\n\r",data_sensor_top.lux);
gallonm 14:946e62f44f4f 111 else if(status==INVALID_PARAMS)
gallonm 14:946e62f44f4f 112 printf("Failed to start measurement!\n\r");
gallonm 14:946e62f44f4f 113 else
gallonm 14:946e62f44f4f 114 printf("Invalid light value!\n\r");
gallonm 14:946e62f44f4f 115 status_t=board->sensor_top->StopMeasurement(als_single_shot_polling);
gallonm 14:946e62f44f4f 116 if(status_t)
gallonm 14:946e62f44f4f 117 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 118 #endif
gallonm 10:5319abadb31e 119
gallonm 10:5319abadb31e 120 #ifdef RANGE_CONTINUOUS_POLLING
gallonm 14:946e62f44f4f 121 status_t=board->sensor_top->StartMeasurement(range_continuous_polling, NULL, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 122 if(!status_t)
gallonm 14:946e62f44f4f 123 {
gallonm 14:946e62f44f4f 124 int i;
gallonm 14:946e62f44f4f 125 for(i=0;i<10;i++)
gallonm 14:946e62f44f4f 126 {
gallonm 14:946e62f44f4f 127 status_t=board->sensor_top->GetMeasurement(range_continuous_polling, &data_sensor_top);
gallonm 11:657dbe7bf245 128 if(!status_t)
gallonm 14:946e62f44f4f 129 printf("Top Range measure %d: %dmm\n\r",i+1,data_sensor_top.range_mm);
gallonm 14:946e62f44f4f 130 else
gallonm 14:946e62f44f4f 131 printf("Invalid range value!\n\r");
gallonm 14:946e62f44f4f 132 }
gallonm 10:5319abadb31e 133 }
gallonm 14:946e62f44f4f 134 else
gallonm 14:946e62f44f4f 135 printf("Failed to start measurement!\n\r");
gallonm 14:946e62f44f4f 136 status_t=board->sensor_top->StopMeasurement(range_continuous_polling);
gallonm 14:946e62f44f4f 137 if(status_t)
gallonm 14:946e62f44f4f 138 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 139 #endif
gallonm 10:5319abadb31e 140
gallonm 10:5319abadb31e 141 #ifdef ALS_CONTINUOUS_POLLING
gallonm 14:946e62f44f4f 142 status_t=board->sensor_top->StartMeasurement(als_continuous_polling, NULL, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 143 if(!status_t)
gallonm 14:946e62f44f4f 144 {
gallonm 14:946e62f44f4f 145 int i;
gallonm 14:946e62f44f4f 146 for(i=0;i<10;i++)
gallonm 14:946e62f44f4f 147 {
gallonm 14:946e62f44f4f 148 status=board->sensor_top->GetMeasurement(als_continuous_polling, &data_sensor_top);
gallonm 11:657dbe7bf245 149 if(!status_t)
gallonm 15:b94bc967fecd 150 printf("Top Light measure %d: %d lux\n\r",i,data_sensor_top.lux);
gallonm 14:946e62f44f4f 151 else
gallonm 14:946e62f44f4f 152 printf("Invalid light value!\n\r");
gallonm 14:946e62f44f4f 153 }
gallonm 9:1d0e839edee8 154 }
gallonm 14:946e62f44f4f 155 else
gallonm 14:946e62f44f4f 156 printf("Failed to start measurement!\n\r");
gallonm 14:946e62f44f4f 157 status_t=board->sensor_top->StopMeasurement(als_continuous_polling);
gallonm 14:946e62f44f4f 158 if(status_t)
gallonm 14:946e62f44f4f 159 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 160 #endif
gallonm 11:657dbe7bf245 161
gallonm 11:657dbe7bf245 162 #ifdef RANGE_CONTINUOUS_INTERRUPT
gallonm 15:b94bc967fecd 163 stop_button.rise(&StopMeasureIRQ);
gallonm 14:946e62f44f4f 164 status=board->sensor_top->StartMeasurement(range_continuous_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 165 if(!status)
gallonm 14:946e62f44f4f 166 {
gallonm 14:946e62f44f4f 167 while(1)
gallonm 14:946e62f44f4f 168 {
gallonm 14:946e62f44f4f 169 if(flag_sensor_top)
gallonm 14:946e62f44f4f 170 {
gallonm 14:946e62f44f4f 171 flag_sensor_top=false;
gallonm 14:946e62f44f4f 172 status=board->sensor_top->HandleIRQ(range_continuous_interrupt, &data_sensor_top);
gallonm 14:946e62f44f4f 173 if(!status)
gallonm 14:946e62f44f4f 174 printf("Range: %dmm\n\r",data_sensor_top.range_mm);
gallonm 14:946e62f44f4f 175 else
gallonm 14:946e62f44f4f 176 printf("Invalid range value!\n\r");
gallonm 14:946e62f44f4f 177 }
gallonm 15:b94bc967fecd 178 if(flag_stop_measure)
gallonm 15:b94bc967fecd 179 break;
gallonm 14:946e62f44f4f 180 }
gallonm 14:946e62f44f4f 181 }
gallonm 14:946e62f44f4f 182 else
gallonm 14:946e62f44f4f 183 printf("Failed to start measurement!\n\r");
gallonm 15:b94bc967fecd 184 status=board->sensor_top->StopMeasurement(range_continuous_interrupt);
gallonm 14:946e62f44f4f 185 if(status)
gallonm 14:946e62f44f4f 186 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 187 #endif
gallonm 10:5319abadb31e 188
gallonm 10:5319abadb31e 189 #ifdef ALS_CONTINUOUS_INTERRUPT
gallonm 15:b94bc967fecd 190 stop_button.rise(&StopMeasureIRQ);
gallonm 14:946e62f44f4f 191 status_t=board->sensor_top->StartMeasurement(als_continuous_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
gallonm 11:657dbe7bf245 192 if(!status_t)
gallonm 14:946e62f44f4f 193 {
gallonm 14:946e62f44f4f 194 while(1)
gallonm 14:946e62f44f4f 195 {
gallonm 14:946e62f44f4f 196 if(flag_sensor_top)
gallonm 14:946e62f44f4f 197 {
gallonm 14:946e62f44f4f 198 flag_sensor_top=false;
gallonm 14:946e62f44f4f 199 status_t=board->sensor_top->HandleIRQ(als_continuous_interrupt, &data_sensor_top);
gallonm 14:946e62f44f4f 200 if(!status_t)
gallonm 15:b94bc967fecd 201 printf("Top Light: %d lux\n\r",data_sensor_top.lux);
gallonm 14:946e62f44f4f 202 else
gallonm 14:946e62f44f4f 203 printf("Invalid light value!\n\r");
gallonm 10:5319abadb31e 204 }
gallonm 15:b94bc967fecd 205 if(flag_stop_measure)
gallonm 15:b94bc967fecd 206 break;
gallonm 14:946e62f44f4f 207 }
gallonm 14:946e62f44f4f 208 }
gallonm 14:946e62f44f4f 209 else
gallonm 14:946e62f44f4f 210 printf("Failed to stop measurement!\n\r");
gallonm 14:946e62f44f4f 211 status_t=board->sensor_top->StopMeasurement(als_continuous_interrupt);
gallonm 14:946e62f44f4f 212 if(status_t)
gallonm 14:946e62f44f4f 213 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 214 #endif
gallonm 9:1d0e839edee8 215
gallonm 15:b94bc967fecd 216 #ifdef INTERLEAVED_MODE_INTERRUPT
gallonm 15:b94bc967fecd 217 stop_button.rise(&StopMeasureIRQ);
gallonm 14:946e62f44f4f 218 status_t=board->sensor_top->StartMeasurement(interleaved_mode_interrupt, SensorTopIRQ, &data_sensor_top, NULL, NULL);
gallonm 14:946e62f44f4f 219 if(!status_t)
gallonm 14:946e62f44f4f 220 {
gallonm 14:946e62f44f4f 221 while(1)
gallonm 14:946e62f44f4f 222 {
gallonm 14:946e62f44f4f 223 if(flag_sensor_top)
gallonm 14:946e62f44f4f 224 {
gallonm 14:946e62f44f4f 225 flag_sensor_top=false;
gallonm 14:946e62f44f4f 226 status_t=board->sensor_top->HandleIRQ(interleaved_mode_interrupt, &data_sensor_top);
gallonm 14:946e62f44f4f 227 if(!status_t)
gallonm 15:b94bc967fecd 228 printf("Top Range: %dmm\tTop Light: %d lux\n\r",data_sensor_top.range_mm, data_sensor_top.lux);
gallonm 14:946e62f44f4f 229 else
gallonm 14:946e62f44f4f 230 printf("Invalid range or light value!\n\r");
gallonm 9:1d0e839edee8 231 }
gallonm 15:b94bc967fecd 232 if(flag_stop_measure)
gallonm 15:b94bc967fecd 233 break;
gallonm 14:946e62f44f4f 234 }
gallonm 14:946e62f44f4f 235 }
gallonm 14:946e62f44f4f 236 else
gallonm 14:946e62f44f4f 237 printf("Failed to stop measurement!\n\r");
gallonm 14:946e62f44f4f 238 status_t=board->sensor_top->StopMeasurement(interleaved_mode_interrupt);
gallonm 14:946e62f44f4f 239 if(status_t)
gallonm 14:946e62f44f4f 240 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 241 #endif
gallonm 10:5319abadb31e 242
gallonm 10:5319abadb31e 243 #ifdef RANGE_CONTINUOUS_INTERRUPT_LOW_THRESHOLD
gallonm 15:b94bc967fecd 244 stop_button.rise(&StopMeasureIRQ);
gallonm 14:946e62f44f4f 245 status_t=board->sensor_top->StartMeasurement(range_continuous_interrupt_low_threshold, SensorTopIRQ, &data_sensor_top, 80, NULL);
gallonm 14:946e62f44f4f 246 if(!status_t)
gallonm 14:946e62f44f4f 247 {
gallonm 14:946e62f44f4f 248 while(1)
gallonm 14:946e62f44f4f 249 {
gallonm 14:946e62f44f4f 250 if(flag_sensor_top)
gallonm 14:946e62f44f4f 251 {
gallonm 14:946e62f44f4f 252 flag_sensor_top=false;
gallonm 14:946e62f44f4f 253 status_t=board->sensor_top->HandleIRQ(range_continuous_interrupt_low_threshold, &data_sensor_top);
gallonm 14:946e62f44f4f 254 if(!status_t)
gallonm 14:946e62f44f4f 255 printf("Range int low threshold: %dmm\n\r",data_sensor_top.range_mm);
gallonm 14:946e62f44f4f 256 else
gallonm 14:946e62f44f4f 257 printf("Invalid range value!\n\r");
gallonm 14:946e62f44f4f 258 }
gallonm 15:b94bc967fecd 259 if(flag_stop_measure)
gallonm 15:b94bc967fecd 260 break;
gallonm 14:946e62f44f4f 261 }
gallonm 14:946e62f44f4f 262 }
gallonm 14:946e62f44f4f 263 else
gallonm 14:946e62f44f4f 264 printf("Failed to start measurement!\n\r");
gallonm 14:946e62f44f4f 265 status_t=board->sensor_top->StopMeasurement(range_continuous_interrupt_low_threshold);
gallonm 14:946e62f44f4f 266 if(status_t)
gallonm 14:946e62f44f4f 267 printf("Failed to stop measurement!\n\r");
gallonm 10:5319abadb31e 268 #endif
gallonm 5:fa65d931bd96 269
gallonm 15:b94bc967fecd 270 delete board;
gallonm 15:b94bc967fecd 271
gallonm 4:ccd62fd7e137 272 }
gallonm 5:fa65d931bd96 273
gallonm 5:fa65d931bd96 274