OS5 Sample application using interrupts, and range_continuous_interrupts mode, to receive range data from the on-board and satellite sensors. Results are displayed on the on-board, 4 digit display and on the COM port.

Dependencies:   X_NUCLEO_53L0A1_mbed_sdk

Committer:
JerrySzczurak
Date:
Thu Jun 29 07:41:39 2017 +0000
Revision:
0:fd2a93574dce
OS5 Sample application using interrupts, and range_continuous_interrupts mode, to receive range data from the on-board and satellite sensors. Results are displayed on the on-board, 4 digit display and on the COM port.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JerrySzczurak 0:fd2a93574dce 1 #include "mbed.h"
JerrySzczurak 0:fd2a93574dce 2 #include "x_nucleo_53l0a1.h"
JerrySzczurak 0:fd2a93574dce 3 #include <string.h>
JerrySzczurak 0:fd2a93574dce 4 #include <stdlib.h>
JerrySzczurak 0:fd2a93574dce 5 #include <stdio.h>
JerrySzczurak 0:fd2a93574dce 6 #include <assert.h>
JerrySzczurak 0:fd2a93574dce 7
JerrySzczurak 0:fd2a93574dce 8 #define DEFAULT_STACK_SIZE 768
JerrySzczurak 0:fd2a93574dce 9 /*
JerrySzczurak 0:fd2a93574dce 10 * This VL53L0X Expansion board sample application performs range measurements using
JerrySzczurak 0:fd2a93574dce 11 * range_continuous_interrupt mode to generate a hardware interrupt each time a new
JerrySzczurak 0:fd2a93574dce 12 * measurement is ready to be read.
JerrySzczurak 0:fd2a93574dce 13 * The application supports the centre, on-board, sensor and up two satellite boards.
JerrySzczurak 0:fd2a93574dce 14 *
JerrySzczurak 0:fd2a93574dce 15 * The measured range data is displayed on the on-board 4-digit LED display.
JerrySzczurak 0:fd2a93574dce 16 *
JerrySzczurak 0:fd2a93574dce 17 * The User Blue button switches between the currently selected sensor to display range
JerrySzczurak 0:fd2a93574dce 18 * results from.
JerrySzczurak 0:fd2a93574dce 19 *
JerrySzczurak 0:fd2a93574dce 20 * The Black Reset button is used to restart the program.
JerrySzczurak 0:fd2a93574dce 21 *
JerrySzczurak 0:fd2a93574dce 22 * *** NOTE : By default hardlinks U10, U11, U15 & U18, on the underside of
JerrySzczurak 0:fd2a93574dce 23 * the X-NUCELO-53L0A1 expansion board are not made/OFF.
JerrySzczurak 0:fd2a93574dce 24 * These links must be made to allow interrupts from the Satellite boards
JerrySzczurak 0:fd2a93574dce 25 * to be received.
JerrySzczurak 0:fd2a93574dce 26 * U11 and U18 must be made/ON to allow interrupts to be received from the
JerrySzczurak 0:fd2a93574dce 27 * INT_L & INT_R positions; or
JerrySzczurak 0:fd2a93574dce 28 * U10 and U15 must be made/ON to allow interrupts to be received from the
JerrySzczurak 0:fd2a93574dce 29 * Alternate INT_L & INT_R positions.
JerrySzczurak 0:fd2a93574dce 30 * The X_NUCLEO_53L0A1 firmware library defaults to use the INT_L/INT_R
JerrySzczurak 0:fd2a93574dce 31 * positions.
JerrySzczurak 0:fd2a93574dce 32 * INT_L is available on expansion board Arduino Connector CN5, pin 1 as D8.
JerrySzczurak 0:fd2a93574dce 33 * Alternate INT_L is on CN5 Connector pin 2 as D9.
JerrySzczurak 0:fd2a93574dce 34 * INT_R is available on expansion board Arduino Connector CN9, pin 3 as D2.
JerrySzczurak 0:fd2a93574dce 35 * Alternate INT_R is on CN9 Connector pin 5 as D4.
JerrySzczurak 0:fd2a93574dce 36 * The pinouts are shown here : https://developer.mbed.org/components/X-NUCLEO-53L0A1/
JerrySzczurak 0:fd2a93574dce 37 *
JerrySzczurak 0:fd2a93574dce 38 */
JerrySzczurak 0:fd2a93574dce 39
JerrySzczurak 0:fd2a93574dce 40 #define VL53L0_I2C_SDA D14
JerrySzczurak 0:fd2a93574dce 41 #define VL53L0_I2C_SCL D15
JerrySzczurak 0:fd2a93574dce 42
JerrySzczurak 0:fd2a93574dce 43 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-64s
JerrySzczurak 0:fd2a93574dce 44 InterruptIn stop_button (USER_BUTTON);
JerrySzczurak 0:fd2a93574dce 45 #endif
JerrySzczurak 0:fd2a93574dce 46
JerrySzczurak 0:fd2a93574dce 47 static X_NUCLEO_53L0A1 *board=NULL;
JerrySzczurak 0:fd2a93574dce 48 VL53L0X_RangingMeasurementData_t data_sensor;
JerrySzczurak 0:fd2a93574dce 49 OperatingMode operating_mode;
JerrySzczurak 0:fd2a93574dce 50
JerrySzczurak 0:fd2a93574dce 51 /* current displayed sensor change IRQ */
JerrySzczurak 0:fd2a93574dce 52 volatile bool switchChanged = false;
JerrySzczurak 0:fd2a93574dce 53
JerrySzczurak 0:fd2a93574dce 54 /* interrupt requests */
JerrySzczurak 0:fd2a93574dce 55 volatile bool centerSensor = false;
JerrySzczurak 0:fd2a93574dce 56 volatile bool leftSensor = false;
JerrySzczurak 0:fd2a93574dce 57 volatile bool rightSensor = false;
JerrySzczurak 0:fd2a93574dce 58
JerrySzczurak 0:fd2a93574dce 59 /* Current sensor number*/
JerrySzczurak 0:fd2a93574dce 60 volatile int currentSensor = 0;
JerrySzczurak 0:fd2a93574dce 61 /* Installed sensors count */
JerrySzczurak 0:fd2a93574dce 62 int sensorCnt = 0;
JerrySzczurak 0:fd2a93574dce 63
JerrySzczurak 0:fd2a93574dce 64 /* installed sensors prefixes */
JerrySzczurak 0:fd2a93574dce 65 char installedSensors[3];
JerrySzczurak 0:fd2a93574dce 66
JerrySzczurak 0:fd2a93574dce 67 /* ISR callback function of the sensor_centre */
JerrySzczurak 0:fd2a93574dce 68 void SensorCenterIRQ(void)
JerrySzczurak 0:fd2a93574dce 69 {
JerrySzczurak 0:fd2a93574dce 70 centerSensor = true;
JerrySzczurak 0:fd2a93574dce 71 board->sensor_centre->disable_interrupt_measure_detection_irq();
JerrySzczurak 0:fd2a93574dce 72 }
JerrySzczurak 0:fd2a93574dce 73
JerrySzczurak 0:fd2a93574dce 74 void SensorLeftIRQ(void)
JerrySzczurak 0:fd2a93574dce 75 {
JerrySzczurak 0:fd2a93574dce 76 leftSensor = true;
JerrySzczurak 0:fd2a93574dce 77 board->sensor_left->disable_interrupt_measure_detection_irq();
JerrySzczurak 0:fd2a93574dce 78 }
JerrySzczurak 0:fd2a93574dce 79
JerrySzczurak 0:fd2a93574dce 80 void SensorRightIRQ(void)
JerrySzczurak 0:fd2a93574dce 81 {
JerrySzczurak 0:fd2a93574dce 82 rightSensor = true;
JerrySzczurak 0:fd2a93574dce 83 board->sensor_right->disable_interrupt_measure_detection_irq();
JerrySzczurak 0:fd2a93574dce 84 }
JerrySzczurak 0:fd2a93574dce 85
JerrySzczurak 0:fd2a93574dce 86 /* ISR callback function of the user blue button to switch measuring sensor. */
JerrySzczurak 0:fd2a93574dce 87 void SwitchMeasuringSensorIRQ(void)
JerrySzczurak 0:fd2a93574dce 88 {
JerrySzczurak 0:fd2a93574dce 89 stop_button.disable_irq();
JerrySzczurak 0:fd2a93574dce 90 switchChanged = true;
JerrySzczurak 0:fd2a93574dce 91 }
JerrySzczurak 0:fd2a93574dce 92
JerrySzczurak 0:fd2a93574dce 93
JerrySzczurak 0:fd2a93574dce 94 /* On board 4 digit local display refresh */
JerrySzczurak 0:fd2a93574dce 95 void RefreshDisplay(const VL53L0X_RangingMeasurementData_t &data, char prefix)
JerrySzczurak 0:fd2a93574dce 96 {
JerrySzczurak 0:fd2a93574dce 97 static char str[5];
JerrySzczurak 0:fd2a93574dce 98 if (data_sensor.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:fd2a93574dce 99 {
JerrySzczurak 0:fd2a93574dce 100 sprintf(str, "%c%3d", prefix ,data.RangeMilliMeter);
JerrySzczurak 0:fd2a93574dce 101 board->display->display_string(str);
JerrySzczurak 0:fd2a93574dce 102 }
JerrySzczurak 0:fd2a93574dce 103 else
JerrySzczurak 0:fd2a93574dce 104 {
JerrySzczurak 0:fd2a93574dce 105 sprintf(str, "%c%s", prefix, "---");
JerrySzczurak 0:fd2a93574dce 106 board->display->display_string(str);
JerrySzczurak 0:fd2a93574dce 107 }
JerrySzczurak 0:fd2a93574dce 108 }
JerrySzczurak 0:fd2a93574dce 109
JerrySzczurak 0:fd2a93574dce 110 inline void MeasureSensors(OperatingMode op_mode)
JerrySzczurak 0:fd2a93574dce 111 {
JerrySzczurak 0:fd2a93574dce 112 bool current = false;
JerrySzczurak 0:fd2a93574dce 113 if (centerSensor)
JerrySzczurak 0:fd2a93574dce 114 {
JerrySzczurak 0:fd2a93574dce 115 centerSensor = false;
JerrySzczurak 0:fd2a93574dce 116 board->sensor_centre->handle_irq(op_mode, &data_sensor);
JerrySzczurak 0:fd2a93574dce 117 current = (currentSensor == 0);
JerrySzczurak 0:fd2a93574dce 118 if (current)
JerrySzczurak 0:fd2a93574dce 119 {
JerrySzczurak 0:fd2a93574dce 120 RefreshDisplay(data_sensor, 'C');
JerrySzczurak 0:fd2a93574dce 121 }
JerrySzczurak 0:fd2a93574dce 122 if (data_sensor.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:fd2a93574dce 123 {
JerrySzczurak 0:fd2a93574dce 124 printf("%c %4d; ", 'C', data_sensor.RangeMilliMeter);
JerrySzczurak 0:fd2a93574dce 125 }
JerrySzczurak 0:fd2a93574dce 126 }
JerrySzczurak 0:fd2a93574dce 127 if (leftSensor)
JerrySzczurak 0:fd2a93574dce 128 {
JerrySzczurak 0:fd2a93574dce 129 leftSensor = false;
JerrySzczurak 0:fd2a93574dce 130 board->sensor_left->handle_irq(op_mode, &data_sensor);
JerrySzczurak 0:fd2a93574dce 131 current = (installedSensors[currentSensor] == 'L');
JerrySzczurak 0:fd2a93574dce 132 if (current)
JerrySzczurak 0:fd2a93574dce 133 {
JerrySzczurak 0:fd2a93574dce 134 RefreshDisplay(data_sensor, 'L');
JerrySzczurak 0:fd2a93574dce 135 }
JerrySzczurak 0:fd2a93574dce 136 if (data_sensor.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:fd2a93574dce 137 {
JerrySzczurak 0:fd2a93574dce 138 printf("%c %4d; ", 'L', data_sensor.RangeMilliMeter);
JerrySzczurak 0:fd2a93574dce 139 }
JerrySzczurak 0:fd2a93574dce 140
JerrySzczurak 0:fd2a93574dce 141 }
JerrySzczurak 0:fd2a93574dce 142 if (rightSensor)
JerrySzczurak 0:fd2a93574dce 143 {
JerrySzczurak 0:fd2a93574dce 144 rightSensor = false;
JerrySzczurak 0:fd2a93574dce 145 board->sensor_right->handle_irq(op_mode, &data_sensor);
JerrySzczurak 0:fd2a93574dce 146 current = (installedSensors[currentSensor] == 'R');
JerrySzczurak 0:fd2a93574dce 147 if (current)
JerrySzczurak 0:fd2a93574dce 148 {
JerrySzczurak 0:fd2a93574dce 149 RefreshDisplay(data_sensor, 'R');
JerrySzczurak 0:fd2a93574dce 150 }
JerrySzczurak 0:fd2a93574dce 151 if (data_sensor.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:fd2a93574dce 152 {
JerrySzczurak 0:fd2a93574dce 153 printf("%c %4d; ", 'R', data_sensor.RangeMilliMeter);
JerrySzczurak 0:fd2a93574dce 154 }
JerrySzczurak 0:fd2a93574dce 155
JerrySzczurak 0:fd2a93574dce 156 }
JerrySzczurak 0:fd2a93574dce 157 }
JerrySzczurak 0:fd2a93574dce 158
JerrySzczurak 0:fd2a93574dce 159 int InitSensorsArray()
JerrySzczurak 0:fd2a93574dce 160 {
JerrySzczurak 0:fd2a93574dce 161 int status = 1;
JerrySzczurak 0:fd2a93574dce 162 sensorCnt = 0;
JerrySzczurak 0:fd2a93574dce 163 /* start the measure on the center sensor */
JerrySzczurak 0:fd2a93574dce 164 if (NULL != board->sensor_centre)
JerrySzczurak 0:fd2a93574dce 165 {
JerrySzczurak 0:fd2a93574dce 166 installedSensors[sensorCnt] = 'C';
JerrySzczurak 0:fd2a93574dce 167 status=board->sensor_centre->stop_measurement(operating_mode);
JerrySzczurak 0:fd2a93574dce 168 status=board->sensor_centre->start_measurement(operating_mode, &SensorCenterIRQ);
JerrySzczurak 0:fd2a93574dce 169 ++sensorCnt;
JerrySzczurak 0:fd2a93574dce 170 }
JerrySzczurak 0:fd2a93574dce 171 /* start the measure on the left sensor */
JerrySzczurak 0:fd2a93574dce 172 if (NULL != board->sensor_left)
JerrySzczurak 0:fd2a93574dce 173 {
JerrySzczurak 0:fd2a93574dce 174 installedSensors[sensorCnt] = 'L';
JerrySzczurak 0:fd2a93574dce 175 status=board->sensor_left->stop_measurement(operating_mode);
JerrySzczurak 0:fd2a93574dce 176 status=board->sensor_left->start_measurement(operating_mode, &SensorLeftIRQ);
JerrySzczurak 0:fd2a93574dce 177 ++sensorCnt;
JerrySzczurak 0:fd2a93574dce 178 }
JerrySzczurak 0:fd2a93574dce 179 /* start the measure on the right sensor */
JerrySzczurak 0:fd2a93574dce 180 if (NULL != board->sensor_right)
JerrySzczurak 0:fd2a93574dce 181 {
JerrySzczurak 0:fd2a93574dce 182 installedSensors[sensorCnt] = 'R';
JerrySzczurak 0:fd2a93574dce 183 status=board->sensor_right->stop_measurement(operating_mode);
JerrySzczurak 0:fd2a93574dce 184 status=board->sensor_right->start_measurement(operating_mode, &SensorRightIRQ);
JerrySzczurak 0:fd2a93574dce 185 ++sensorCnt;
JerrySzczurak 0:fd2a93574dce 186 }
JerrySzczurak 0:fd2a93574dce 187 currentSensor = 0;
JerrySzczurak 0:fd2a93574dce 188 return status;
JerrySzczurak 0:fd2a93574dce 189 }
JerrySzczurak 0:fd2a93574dce 190
JerrySzczurak 0:fd2a93574dce 191
JerrySzczurak 0:fd2a93574dce 192 void RangeMeasure(DevI2C *device_i2c) {
JerrySzczurak 0:fd2a93574dce 193 int status;
JerrySzczurak 0:fd2a93574dce 194
JerrySzczurak 0:fd2a93574dce 195 /* creates the 53L0A1 expansion board singleton obj */
JerrySzczurak 0:fd2a93574dce 196 board=X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
JerrySzczurak 0:fd2a93574dce 197 //board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D9, D4); // Alternate INT_L/INT_R settings.
JerrySzczurak 0:fd2a93574dce 198
JerrySzczurak 0:fd2a93574dce 199 board->display->display_string("53L0");
JerrySzczurak 0:fd2a93574dce 200
JerrySzczurak 0:fd2a93574dce 201 operating_mode=range_continuous_interrupt;
JerrySzczurak 0:fd2a93574dce 202
JerrySzczurak 0:fd2a93574dce 203 /* init the 53L0A1 expansion board with default values */
JerrySzczurak 0:fd2a93574dce 204 status=board->init_board();
JerrySzczurak 0:fd2a93574dce 205
JerrySzczurak 0:fd2a93574dce 206 if(status)
JerrySzczurak 0:fd2a93574dce 207 {
JerrySzczurak 0:fd2a93574dce 208 printf("Failed to init board!\n\r");
JerrySzczurak 0:fd2a93574dce 209 }
JerrySzczurak 0:fd2a93574dce 210 else
JerrySzczurak 0:fd2a93574dce 211 {
JerrySzczurak 0:fd2a93574dce 212 status = InitSensorsArray();
JerrySzczurak 0:fd2a93574dce 213 }
JerrySzczurak 0:fd2a93574dce 214
JerrySzczurak 0:fd2a93574dce 215 if(!status)
JerrySzczurak 0:fd2a93574dce 216 {
JerrySzczurak 0:fd2a93574dce 217 printf ("\r\nEntering loop mode\r\n");
JerrySzczurak 0:fd2a93574dce 218 while (true)
JerrySzczurak 0:fd2a93574dce 219 {
JerrySzczurak 0:fd2a93574dce 220 MeasureSensors(operating_mode);
JerrySzczurak 0:fd2a93574dce 221 if (switchChanged)
JerrySzczurak 0:fd2a93574dce 222 {
JerrySzczurak 0:fd2a93574dce 223 ++currentSensor;
JerrySzczurak 0:fd2a93574dce 224 if (currentSensor == sensorCnt)
JerrySzczurak 0:fd2a93574dce 225 currentSensor = 0;
JerrySzczurak 0:fd2a93574dce 226
JerrySzczurak 0:fd2a93574dce 227 printf("Sensor changed to %c\r\n",installedSensors[currentSensor]);
JerrySzczurak 0:fd2a93574dce 228 switchChanged = false;
JerrySzczurak 0:fd2a93574dce 229 stop_button.enable_irq();
JerrySzczurak 0:fd2a93574dce 230 }
JerrySzczurak 0:fd2a93574dce 231 }
JerrySzczurak 0:fd2a93574dce 232 }
JerrySzczurak 0:fd2a93574dce 233 delete board;
JerrySzczurak 0:fd2a93574dce 234 }
JerrySzczurak 0:fd2a93574dce 235
JerrySzczurak 0:fd2a93574dce 236 /*=================================== Main ==================================
JerrySzczurak 0:fd2a93574dce 237 Press the blue user button to switch the displayed sensor.
JerrySzczurak 0:fd2a93574dce 238 =============================================================================*/
JerrySzczurak 0:fd2a93574dce 239 int main()
JerrySzczurak 0:fd2a93574dce 240 {
JerrySzczurak 0:fd2a93574dce 241 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
JerrySzczurak 0:fd2a93574dce 242 stop_button.rise (&SwitchMeasuringSensorIRQ);
JerrySzczurak 0:fd2a93574dce 243 stop_button.enable_irq();
JerrySzczurak 0:fd2a93574dce 244 #endif
JerrySzczurak 0:fd2a93574dce 245 DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
JerrySzczurak 0:fd2a93574dce 246 RangeMeasure(device_i2c); // start continuous measures
JerrySzczurak 0:fd2a93574dce 247 }
JerrySzczurak 0:fd2a93574dce 248
JerrySzczurak 0:fd2a93574dce 249
JerrySzczurak 0:fd2a93574dce 250