A sample program getting measurements from a VL53L1CB ToF sensors which are directly connected to the STM32F401. Copes with three sensors. Interrupt mode. VL53L1 is operated in ranging mode. MBed V5

Dependencies:   X_NUCLEO_53L1CB

Committer:
charlesmn
Date:
Mon Nov 09 09:37:03 2020 +0000
Revision:
0:39e3ada258b6
Sample MBed program running ST XNucleo VL53L1CB ToF sensors directly connected to the the F401.  Uses interrupts to cope with up to 3 sensors in multizone mode. Includes MBed V5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesmn 0:39e3ada258b6 1 /*
charlesmn 0:39e3ada258b6 2 * This VL53L1 test application performs range measurements
charlesmn 0:39e3ada258b6 3 * using the onboard embedded centre sensor and two satelites, in ranging, interrupt mode.
charlesmn 0:39e3ada258b6 4 * This program does not use the expansion board and the sensors a directly connected to the F401.
charlesmn 0:39e3ada258b6 5 * Measured ranges are ouput on the Serial Port, running at 115200 baud.
charlesmn 0:39e3ada258b6 6 *
charlesmn 0:39e3ada258b6 7 * This is designed to work with MBed V2 , MBed V5 and MBed V6.
charlesmn 0:39e3ada258b6 8 *
charlesmn 0:39e3ada258b6 9 *
charlesmn 0:39e3ada258b6 10 * The Reset button can be used to restart the program.
charlesmn 0:39e3ada258b6 11 */
charlesmn 0:39e3ada258b6 12
charlesmn 0:39e3ada258b6 13 #include <stdio.h>
charlesmn 0:39e3ada258b6 14
charlesmn 0:39e3ada258b6 15 #include "mbed.h"
charlesmn 0:39e3ada258b6 16 #include "XNucleo53L1A1.h"
charlesmn 0:39e3ada258b6 17 #include "ToF_I2C.h"
charlesmn 0:39e3ada258b6 18 #include <time.h>
charlesmn 0:39e3ada258b6 19
charlesmn 0:39e3ada258b6 20 // i2c comms pins
charlesmn 0:39e3ada258b6 21 #define I2C_SDA D14
charlesmn 0:39e3ada258b6 22 #define I2C_SCL D15
charlesmn 0:39e3ada258b6 23
charlesmn 0:39e3ada258b6 24 // i2c addresses the sensors are configured to be
charlesmn 0:39e3ada258b6 25 #define NEW_SENSOR_CENTRE_ADDRESS 0x56
charlesmn 0:39e3ada258b6 26 #define NEW_SENSOR_LEFT_ADDRESS 0x58
charlesmn 0:39e3ada258b6 27 #define NEW_SENSOR_RIGHT_ADDRESS 0x5a
charlesmn 0:39e3ada258b6 28
charlesmn 0:39e3ada258b6 29
charlesmn 0:39e3ada258b6 30 #define NUM_SENSORS 3
charlesmn 0:39e3ada258b6 31
charlesmn 0:39e3ada258b6 32 // define the sensor interrupt pins. This much match the wiring!
charlesmn 0:39e3ada258b6 33 PinName CentreIntPin = A2;
charlesmn 0:39e3ada258b6 34 PinName LeftIntPin = D9;
charlesmn 0:39e3ada258b6 35 PinName RightIntPin = D4;
charlesmn 0:39e3ada258b6 36
charlesmn 0:39e3ada258b6 37
charlesmn 0:39e3ada258b6 38 // MBed V6.4 has renamed wait_ms and UnbufferedSerial replaces Serial
charlesmn 0:39e3ada258b6 39 #if (MBED_VERSION > 60300)
charlesmn 0:39e3ada258b6 40 UnbufferedSerial pc(SERIAL_TX, SERIAL_RX);
charlesmn 0:39e3ada258b6 41 extern "C" void wait_ms(int ms);
charlesmn 0:39e3ada258b6 42 #else
charlesmn 0:39e3ada258b6 43 Serial pc(SERIAL_TX, SERIAL_RX);
charlesmn 0:39e3ada258b6 44 #endif
charlesmn 0:39e3ada258b6 45
charlesmn 0:39e3ada258b6 46 static int int_centre_result = 0;
charlesmn 0:39e3ada258b6 47 static int int_left_result = 0;
charlesmn 0:39e3ada258b6 48 static int int_right_result = 0;
charlesmn 0:39e3ada258b6 49
charlesmn 0:39e3ada258b6 50
charlesmn 0:39e3ada258b6 51 class WaitForMeasurement {
charlesmn 0:39e3ada258b6 52 public:
charlesmn 0:39e3ada258b6 53
charlesmn 0:39e3ada258b6 54
charlesmn 0:39e3ada258b6 55 // this class services the interrupts from the ToF sensors.
charlesmn 0:39e3ada258b6 56 // There is a limited amount you can do in an interrupt routine; printfs,mutexes break them among other things.
charlesmn 0:39e3ada258b6 57 // We keep things simple by only raising a flag so all the real work is done outside the interrupt.
charlesmn 0:39e3ada258b6 58 // This is designed around MBED V2 which doesn't have the RTOS features that would make this work nicely e.g. semaphores/queues.
charlesmn 0:39e3ada258b6 59 WaitForMeasurement(): _interrupt(A1)
charlesmn 0:39e3ada258b6 60 {
charlesmn 0:39e3ada258b6 61 }
charlesmn 0:39e3ada258b6 62
charlesmn 0:39e3ada258b6 63
charlesmn 0:39e3ada258b6 64 // constructor
charlesmn 0:39e3ada258b6 65 WaitForMeasurement(PinName pin, uint8_t slave_address) : _interrupt(pin) // create the InterruptIn on the pin specified
charlesmn 0:39e3ada258b6 66 {
charlesmn 0:39e3ada258b6 67 i2c_slave_address = slave_address;
charlesmn 0:39e3ada258b6 68 _interrupt.rise(callback(this, &WaitForMeasurement::got_interrupt)); // attach routine to deal with interrupt
charlesmn 0:39e3ada258b6 69
charlesmn 0:39e3ada258b6 70 }
charlesmn 0:39e3ada258b6 71
charlesmn 0:39e3ada258b6 72
charlesmn 0:39e3ada258b6 73 // function is called every time an interupt is seen. A flag is raised which allows the main routine to service the interupt.
charlesmn 0:39e3ada258b6 74 void got_interrupt()
charlesmn 0:39e3ada258b6 75 {
charlesmn 0:39e3ada258b6 76
charlesmn 0:39e3ada258b6 77 // identify which sensor this instance relates to and flag an interrupt has occured
charlesmn 0:39e3ada258b6 78 if (i2c_slave_address == NEW_SENSOR_CENTRE_ADDRESS)
charlesmn 0:39e3ada258b6 79 int_centre_result = 1; //flag to main that interrupt happened
charlesmn 0:39e3ada258b6 80 if (i2c_slave_address == NEW_SENSOR_LEFT_ADDRESS)
charlesmn 0:39e3ada258b6 81 int_left_result = 1; //flag to main that interrupt happened
charlesmn 0:39e3ada258b6 82 if (i2c_slave_address == NEW_SENSOR_RIGHT_ADDRESS)
charlesmn 0:39e3ada258b6 83 int_right_result = 1; //flag to main that interrupt happened
charlesmn 0:39e3ada258b6 84 }
charlesmn 0:39e3ada258b6 85
charlesmn 0:39e3ada258b6 86
charlesmn 0:39e3ada258b6 87 //destructor
charlesmn 0:39e3ada258b6 88 ~WaitForMeasurement()
charlesmn 0:39e3ada258b6 89 {
charlesmn 0:39e3ada258b6 90 printf("destruction \n");
charlesmn 0:39e3ada258b6 91 }
charlesmn 0:39e3ada258b6 92
charlesmn 0:39e3ada258b6 93 private:
charlesmn 0:39e3ada258b6 94 InterruptIn _interrupt;
charlesmn 0:39e3ada258b6 95 int status;
charlesmn 0:39e3ada258b6 96 uint8_t i2c_slave_address;
charlesmn 0:39e3ada258b6 97
charlesmn 0:39e3ada258b6 98 };
charlesmn 0:39e3ada258b6 99
charlesmn 0:39e3ada258b6 100
charlesmn 0:39e3ada258b6 101 /*=================================== Main ==================================
charlesmn 0:39e3ada258b6 102 =============================================================================*/
charlesmn 0:39e3ada258b6 103 int main()
charlesmn 0:39e3ada258b6 104 {
charlesmn 0:39e3ada258b6 105 int status;
charlesmn 0:39e3ada258b6 106 VL53L1X * Sensor;
charlesmn 0:39e3ada258b6 107 VL53L1X * SensorCentre;
charlesmn 0:39e3ada258b6 108 VL53L1X * SensorLeft;
charlesmn 0:39e3ada258b6 109 VL53L1X * SensorRight;
charlesmn 0:39e3ada258b6 110 DigitalOut xshutdownCentre(D9);
charlesmn 0:39e3ada258b6 111 DigitalOut xshutdownLeft(D4);
charlesmn 0:39e3ada258b6 112 DigitalOut xshutdownRight(D3);
charlesmn 0:39e3ada258b6 113
charlesmn 0:39e3ada258b6 114 uint8_t ToFSensor = 1;
charlesmn 0:39e3ada258b6 115
charlesmn 0:39e3ada258b6 116
charlesmn 0:39e3ada258b6 117 WaitForMeasurement* int2;
charlesmn 0:39e3ada258b6 118 WaitForMeasurement* int1;
charlesmn 0:39e3ada258b6 119 WaitForMeasurement* int3;
charlesmn 0:39e3ada258b6 120
charlesmn 0:39e3ada258b6 121 pc.baud(115200); // baud rate is important as printf statements take a lot of time
charlesmn 0:39e3ada258b6 122
charlesmn 0:39e3ada258b6 123 printf("VL53L1CB_NoShield_3sensors_interrupt_ranging mbed = %d \r\n",MBED_VERSION);
charlesmn 0:39e3ada258b6 124
charlesmn 0:39e3ada258b6 125 // create the i2c instance
charlesmn 0:39e3ada258b6 126 ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL);
charlesmn 0:39e3ada258b6 127 // create the sensor instances
charlesmn 0:39e3ada258b6 128 SensorCentre = new VL53L1X(dev_I2C, &xshutdownCentre, CentreIntPin);
charlesmn 0:39e3ada258b6 129 SensorLeft = new VL53L1X(dev_I2C, &xshutdownLeft, LeftIntPin);
charlesmn 0:39e3ada258b6 130 SensorRight = new VL53L1X(dev_I2C, &xshutdownRight, RightIntPin);
charlesmn 0:39e3ada258b6 131
charlesmn 0:39e3ada258b6 132 printf("board created!\r\n");
charlesmn 0:39e3ada258b6 133 // initialise sensors
charlesmn 0:39e3ada258b6 134 for (ToFSensor=0;ToFSensor< NUM_SENSORS ;ToFSensor++){
charlesmn 0:39e3ada258b6 135 switch(ToFSensor){
charlesmn 0:39e3ada258b6 136 case 0:
charlesmn 0:39e3ada258b6 137
charlesmn 0:39e3ada258b6 138 if (SensorCentre == NULL ) continue;
charlesmn 0:39e3ada258b6 139 // try to initialise the sensor. returns -1 if sensor is not there.
charlesmn 0:39e3ada258b6 140 if (SensorCentre->InitSensor(NEW_SENSOR_CENTRE_ADDRESS) ==-1)
charlesmn 0:39e3ada258b6 141 {
charlesmn 0:39e3ada258b6 142 printf("centre not found \n");
charlesmn 0:39e3ada258b6 143 SensorCentre = NULL;
charlesmn 0:39e3ada258b6 144 continue;
charlesmn 0:39e3ada258b6 145 }
charlesmn 0:39e3ada258b6 146 Sensor=SensorCentre;
charlesmn 0:39e3ada258b6 147 printf("configuring centre channel \n");
charlesmn 0:39e3ada258b6 148 break;
charlesmn 0:39e3ada258b6 149 case 1:
charlesmn 0:39e3ada258b6 150 if (SensorLeft== NULL ) continue;
charlesmn 0:39e3ada258b6 151 if (SensorLeft->InitSensor(NEW_SENSOR_LEFT_ADDRESS)==-1)
charlesmn 0:39e3ada258b6 152 {
charlesmn 0:39e3ada258b6 153 printf("left not found \n");
charlesmn 0:39e3ada258b6 154 SensorLeft = NULL;
charlesmn 0:39e3ada258b6 155 continue;
charlesmn 0:39e3ada258b6 156 }
charlesmn 0:39e3ada258b6 157 Sensor=SensorLeft;
charlesmn 0:39e3ada258b6 158 printf("configuring left channel \n");
charlesmn 0:39e3ada258b6 159 break;
charlesmn 0:39e3ada258b6 160 case 2:
charlesmn 0:39e3ada258b6 161 if (SensorRight == NULL ) continue;
charlesmn 0:39e3ada258b6 162 if(SensorRight->InitSensor(NEW_SENSOR_RIGHT_ADDRESS)==-1)
charlesmn 0:39e3ada258b6 163 {
charlesmn 0:39e3ada258b6 164 printf("right not found \n");
charlesmn 0:39e3ada258b6 165 SensorRight = NULL;
charlesmn 0:39e3ada258b6 166 continue;
charlesmn 0:39e3ada258b6 167 }
charlesmn 0:39e3ada258b6 168 Sensor=SensorRight;
charlesmn 0:39e3ada258b6 169 printf("configuring right channel \n");
charlesmn 0:39e3ada258b6 170 break;
charlesmn 0:39e3ada258b6 171 default:
charlesmn 0:39e3ada258b6 172 printf(" error in switch, invalid ToF sensor \n");
charlesmn 0:39e3ada258b6 173 }
charlesmn 0:39e3ada258b6 174 wait_ms(250); // wait for the sensor to come alive
charlesmn 0:39e3ada258b6 175
charlesmn 0:39e3ada258b6 176 // configure the sensors
charlesmn 0:39e3ada258b6 177
charlesmn 0:39e3ada258b6 178 /* Device Initialization and setting */
charlesmn 0:39e3ada258b6 179 status = Sensor->vl53L1_DataInit();
charlesmn 0:39e3ada258b6 180 status = Sensor->vl53L1_StaticInit();
charlesmn 0:39e3ada258b6 181 status = Sensor->vl53L1_SetPresetMode( VL53L1_PRESETMODE_RANGING);
charlesmn 0:39e3ada258b6 182 status = Sensor->vl53L1_SetDistanceMode( VL53L1_DISTANCEMODE_LONG);
charlesmn 0:39e3ada258b6 183 status = Sensor->vl53L1_SetMeasurementTimingBudgetMicroSeconds( 50000);
charlesmn 0:39e3ada258b6 184 status = Sensor->vl53L1_SetInterMeasurementPeriodMilliSeconds( 100);
charlesmn 0:39e3ada258b6 185 }
charlesmn 0:39e3ada258b6 186
charlesmn 0:39e3ada258b6 187 if (SensorCentre != NULL )
charlesmn 0:39e3ada258b6 188 {
charlesmn 0:39e3ada258b6 189 printf("starting interrupt centre\n");
charlesmn 0:39e3ada258b6 190 // create interrupt process for the centre sensor
charlesmn 0:39e3ada258b6 191 int1 = new WaitForMeasurement(CentreIntPin,NEW_SENSOR_CENTRE_ADDRESS);
charlesmn 0:39e3ada258b6 192 // start the snesor measuring
charlesmn 0:39e3ada258b6 193 status = SensorCentre->vl53L1_StartMeasurement();
charlesmn 0:39e3ada258b6 194 printf("end interrupt centre\n");
charlesmn 0:39e3ada258b6 195 }
charlesmn 0:39e3ada258b6 196
charlesmn 0:39e3ada258b6 197
charlesmn 0:39e3ada258b6 198 if (SensorLeft!= NULL )
charlesmn 0:39e3ada258b6 199 {
charlesmn 0:39e3ada258b6 200 printf("starting interrupt left\n");
charlesmn 0:39e3ada258b6 201 int2 = new WaitForMeasurement(LeftIntPin,NEW_SENSOR_LEFT_ADDRESS);
charlesmn 0:39e3ada258b6 202 status = SensorLeft->vl53L1_StartMeasurement();
charlesmn 0:39e3ada258b6 203 }
charlesmn 0:39e3ada258b6 204
charlesmn 0:39e3ada258b6 205 if (SensorRight!= NULL )
charlesmn 0:39e3ada258b6 206 {
charlesmn 0:39e3ada258b6 207 printf("starting interrupt right\n");
charlesmn 0:39e3ada258b6 208 int3 = new WaitForMeasurement(RightIntPin,NEW_SENSOR_RIGHT_ADDRESS);
charlesmn 0:39e3ada258b6 209 status = SensorRight->vl53L1_StartMeasurement();
charlesmn 0:39e3ada258b6 210 }
charlesmn 0:39e3ada258b6 211
charlesmn 0:39e3ada258b6 212 printf("loop forever \n");
charlesmn 0:39e3ada258b6 213 // loop waiting for interrupts to happen. This is signaled by int_centre_result,int_left_result or int_right_result
charlesmn 0:39e3ada258b6 214 // being non zero. The are set back to zero when processing is completed
charlesmn 0:39e3ada258b6 215 while (1)
charlesmn 0:39e3ada258b6 216 {
charlesmn 0:39e3ada258b6 217 static VL53L1_RangingMeasurementData_t RangingData;
charlesmn 0:39e3ada258b6 218 VL53L1_MultiRangingData_t MultiRangingData;
charlesmn 0:39e3ada258b6 219 VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
charlesmn 0:39e3ada258b6 220
charlesmn 0:39e3ada258b6 221 wait_ms( 1 * 50);
charlesmn 0:39e3ada258b6 222 if (int_centre_result != 0)
charlesmn 0:39e3ada258b6 223 {
charlesmn 0:39e3ada258b6 224 // as there has been an interrupt there is data waiting so get it
charlesmn 0:39e3ada258b6 225 status = SensorCentre->vl53L1_GetMultiRangingData( pMultiRangingData);
charlesmn 0:39e3ada258b6 226 if ( status == VL53L1_ERROR_NONE)
charlesmn 0:39e3ada258b6 227 {
charlesmn 0:39e3ada258b6 228 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:39e3ada258b6 229 if ( no_of_object_found < 10 )
charlesmn 0:39e3ada258b6 230 {
charlesmn 0:39e3ada258b6 231 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:39e3ada258b6 232 if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) ||
charlesmn 0:39e3ada258b6 233 (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL))
charlesmn 0:39e3ada258b6 234 {
charlesmn 0:39e3ada258b6 235 printf("centre\t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
charlesmn 0:39e3ada258b6 236 pMultiRangingData->RangeData[j].RangeStatus,
charlesmn 0:39e3ada258b6 237 pMultiRangingData->RangeData[j].RangeMilliMeter,
charlesmn 0:39e3ada258b6 238 pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0,
charlesmn 0:39e3ada258b6 239 pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
charlesmn 0:39e3ada258b6 240 }
charlesmn 0:39e3ada258b6 241 }
charlesmn 0:39e3ada258b6 242 }
charlesmn 0:39e3ada258b6 243 }
charlesmn 0:39e3ada258b6 244 int_centre_result = 0;
charlesmn 0:39e3ada258b6 245 status = SensorCentre->vl53L1_ClearInterruptAndStartMeasurement();
charlesmn 0:39e3ada258b6 246 }
charlesmn 0:39e3ada258b6 247
charlesmn 0:39e3ada258b6 248
charlesmn 0:39e3ada258b6 249 if (int_left_result != 0)
charlesmn 0:39e3ada258b6 250 {
charlesmn 0:39e3ada258b6 251 status = SensorLeft->vl53L1_GetMultiRangingData( pMultiRangingData);
charlesmn 0:39e3ada258b6 252 if ( status == VL53L1_ERROR_NONE)
charlesmn 0:39e3ada258b6 253 {
charlesmn 0:39e3ada258b6 254 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:39e3ada258b6 255 if ( no_of_object_found < 10 )
charlesmn 0:39e3ada258b6 256 {
charlesmn 0:39e3ada258b6 257 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:39e3ada258b6 258 if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) ||
charlesmn 0:39e3ada258b6 259 (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL))
charlesmn 0:39e3ada258b6 260 {
charlesmn 0:39e3ada258b6 261
charlesmn 0:39e3ada258b6 262 printf("left \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
charlesmn 0:39e3ada258b6 263 pMultiRangingData->RangeData[j].RangeStatus,
charlesmn 0:39e3ada258b6 264 pMultiRangingData->RangeData[j].RangeMilliMeter,
charlesmn 0:39e3ada258b6 265 pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0,
charlesmn 0:39e3ada258b6 266 pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
charlesmn 0:39e3ada258b6 267 }
charlesmn 0:39e3ada258b6 268 }
charlesmn 0:39e3ada258b6 269 }
charlesmn 0:39e3ada258b6 270 }
charlesmn 0:39e3ada258b6 271
charlesmn 0:39e3ada258b6 272 int_left_result = 0;
charlesmn 0:39e3ada258b6 273 status = SensorLeft->vl53L1_ClearInterruptAndStartMeasurement();
charlesmn 0:39e3ada258b6 274
charlesmn 0:39e3ada258b6 275 }
charlesmn 0:39e3ada258b6 276
charlesmn 0:39e3ada258b6 277
charlesmn 0:39e3ada258b6 278 if (int_right_result != 0)
charlesmn 0:39e3ada258b6 279 {
charlesmn 0:39e3ada258b6 280 status = SensorRight->vl53L1_GetMultiRangingData( pMultiRangingData);
charlesmn 0:39e3ada258b6 281 if ( status == VL53L1_ERROR_NONE)
charlesmn 0:39e3ada258b6 282 {
charlesmn 0:39e3ada258b6 283 // if valid result print it
charlesmn 0:39e3ada258b6 284 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:39e3ada258b6 285 if ( no_of_object_found < 10 )
charlesmn 0:39e3ada258b6 286 {
charlesmn 0:39e3ada258b6 287 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:39e3ada258b6 288 if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) ||
charlesmn 0:39e3ada258b6 289 (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL))
charlesmn 0:39e3ada258b6 290 {
charlesmn 0:39e3ada258b6 291 printf("right \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
charlesmn 0:39e3ada258b6 292 pMultiRangingData->RangeData[j].RangeStatus,
charlesmn 0:39e3ada258b6 293 pMultiRangingData->RangeData[j].RangeMilliMeter,
charlesmn 0:39e3ada258b6 294 pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0,
charlesmn 0:39e3ada258b6 295 pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
charlesmn 0:39e3ada258b6 296 }
charlesmn 0:39e3ada258b6 297 }
charlesmn 0:39e3ada258b6 298 }
charlesmn 0:39e3ada258b6 299 }
charlesmn 0:39e3ada258b6 300 // clear interrupt flag
charlesmn 0:39e3ada258b6 301 int_right_result = 0;
charlesmn 0:39e3ada258b6 302 // clear theinterrupt and wait for another result
charlesmn 0:39e3ada258b6 303 status = SensorRight->vl53L1_ClearInterruptAndStartMeasurement();
charlesmn 0:39e3ada258b6 304
charlesmn 0:39e3ada258b6 305 }
charlesmn 0:39e3ada258b6 306 }
charlesmn 0:39e3ada258b6 307 printf("terminated");
charlesmn 0:39e3ada258b6 308 }
charlesmn 0:39e3ada258b6 309
charlesmn 0:39e3ada258b6 310
charlesmn 0:39e3ada258b6 311 // this function doesn't exist in MBed6.4 onwards. It is required for the F401 drivers.
charlesmn 0:39e3ada258b6 312 // addded here as it allows the file to be compatible with all mbed versions
charlesmn 0:39e3ada258b6 313 #if (MBED_VERSION > 60300)
charlesmn 0:39e3ada258b6 314 void wait_ms(int ms)
charlesmn 0:39e3ada258b6 315 {
charlesmn 0:39e3ada258b6 316 thread_sleep_for(ms);
charlesmn 0:39e3ada258b6 317 }
charlesmn 0:39e3ada258b6 318 #endif
charlesmn 0:39e3ada258b6 319