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: mbed X_NUCLEO_53L0A1
Fork of Display_53L0A1_Interrupts by
* NOTE : Hard-links U11 and U18, on the underside of the X-NUCELO-53L0A1 expansion board, must be made/ON to allow interrupts to be received from the satellite boards, on INT_L and INT_R, or U10 and U15 to receive interrupts from the alternate locations. *
Diff: main.cpp
- Revision:
- 2:bdf097d93eca
- Parent:
- 1:c1c10e0c32b2
- Child:
- 3:12cb106044f9
diff -r c1c10e0c32b2 -r bdf097d93eca main.cpp
--- a/main.cpp Tue Jun 13 15:31:26 2017 +0000
+++ b/main.cpp Wed Jun 14 14:42:41 2017 +0000
@@ -1,91 +1,117 @@
-/*
- * This VL53L0X Expansion board test application performs range measurements
- * using the onboard embedded centre sensor, in singleshot, polling mode.
- * Measured ranges are displayed on the on-board 4-digit display.
- *
- * The User Blue button stops the current measurement and entire program,
- * releasing all resources.
- *
- * The Reset button can be used to restart the program.
- */
-
-#include <string.h>
-#include <stdio.h>
-
#include "mbed.h"
#include "x_nucleo_53l0a1.h"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+/* This VL53L0X Expansion board test application performs a range measurement in interrupt mode
+ on the center embedded sensor.
+ The measured data is displayed on the on-board 4-digit display, and sent to com port
+
+ User Blue button stops the current measurement and the entire program, releasing all resources.
+ Reset button is used to restart the program.
+
+ Interrupt mode requires callback function which handles IRQ from given sensor.
+*/
#define VL53L0_I2C_SDA D14
#define VL53L0_I2C_SCL D15
-static X_NUCLEO_53L0A1 *board = NULL;
-VL53L0X_RangingMeasurementData_t data_sensor_centre;
+static X_NUCLEO_53L0A1 *board=NULL;
+VL53L0X_RangingMeasurementData_t data_sensor;
OperatingMode operating_mode;
-/* flags that handle interrupt request */
-bool int_stop_measure = false;
+/* flags that handle interrupt request for sensor and user blue button*/
+volatile bool int_sensor_centre=false;
+volatile bool int_measuring_stop = false;
+
-/* ISR callback function of the user blue button to stop program */
-void StopMeasureIRQ(void)
+/* ISR callback function of the center sensor */
+void SensorCenterIRQ(void)
{
- int_stop_measure = true;
+ int_sensor_centre=true;
+ board->sensor_centre->DisableInterruptMeasureDetectionIRQ();
+}
+
+/* ISR callback function of the user blue button to switch measuring sensor. */
+void MeasuringStopIRQ(void)
+{
+ int_measuring_stop = true;
}
/* On board 4 digit local display refresh */
-void DisplayRefresh(VL53L0X_RangingMeasurementData_t sensor_range_data)
+void DisplayRefresh(const VL53L0X_RangingMeasurementData_t &data)
{
- char str[5];
-
- if (sensor_range_data.RangeStatus == 0) // we have a valid range.
- {
- sprintf(str,"%d", sensor_range_data.RangeMilliMeter);
- }
- else
- {
- sprintf(str,"%s","----");
- }
-
- board->display->DisplayString(str);
+ char str[4];
+ if (data.RangeStatus == 0) // we have a valid range.
+ {
+ printf("%4d; ", data.RangeMilliMeter);
+ sprintf(str,"%4d", data.RangeMilliMeter);
+ }
+ else
+ {
+ sprintf(str,"%s", "----");
+ }
+ board->display->DisplayString(str);
}
-/*=================================== Main ==================================
- Press the blue user button to stop measurements in progress
-=============================================================================*/
-int main()
-{
-#if USER_BUTTON == PC_13 // we are cross compiling for Nucleo-f401
- InterruptIn stop_button(USER_BUTTON);
- stop_button.rise(&StopMeasureIRQ);
-#endif
+void RangeMeasure(DevI2C *device_i2c) {
+ int status;
- DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
- int status;
-
/* creates the 53L0A1 expansion board singleton obj */
board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);
board->display->DisplayString("53L0");
+
+ /* setting operating mode to continuous interrupt */
+ operating_mode=range_continuous_interrupt;
+
/* init the 53L0A1 expansion board with default values */
- status = board->InitBoard();
- if (status) printf("Failed to init board!\n\r");
- operating_mode = range_single_shot_polling;
- /* start the measure on sensor centre */
- status = board->sensor_centre->StartMeasurement(operating_mode, NULL);
- if (!status)
+ status=board->InitBoard();
+ if(status)
+ {
+ printf("Failed to init board!\n\r");
+ return;
+ }
+ //Stop any measurement before setting sensor
+ status=board->sensor_centre->StopMeasurement(operating_mode);
+ status=board->sensor_centre->StartMeasurement(operating_mode, &SensorCenterIRQ);
+
+ if(!status)
{
- while (1) // infinite loop. can be broken by pressing Blue (User) button.
- {
- status = board->sensor_centre->GetMeasurement(operating_mode, &data_sensor_centre);
- DisplayRefresh(data_sensor_centre);
- if (int_stop_measure) // Blue Button isr was triggered
- {
- status = board->sensor_centre->StopMeasurement(operating_mode); // stop the measure and exit
- int_stop_measure = false;
- printf("\nProgram stopped!\n\n\r");
+ printf ("Entering loop mode\r\n");
+ while (true)
+ {
+ if (int_sensor_centre)
+ {
+ int_sensor_centre = false;
+ status = board->sensor_centre->HandleIRQ(operating_mode, &data_sensor);
+ DisplayRefresh(data_sensor);
+ }
+
+ if (int_measuring_stop)
+ {
+ printf("\r\nEnding loop mode \r\n");
break;
- }
- }
+ }
+ }
}
board->display->DisplayString("BYE");
delete board;
+}
+
+/*=================================== Main ==================================
+ Press the blue user button to stop the measurements in progress
+=============================================================================*/
+int main()
+{
+#if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
+ InterruptIn stop_button (USER_BUTTON);
+ stop_button.rise (&MeasuringStopIRQ);
+#endif
+ DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
+ RangeMeasure(device_i2c); // start continuous measures
}
+
+
