Test application performs a range measurement in interrupt mode on the center embedded sensor.

Dependencies:   X_NUCLEO_53L0A1 mbed

Committer:
JerrySzczurak
Date:
Wed Jun 14 14:21:24 2017 +0000
Revision:
0:218f6c31fda4
Test application performs a range measurement in interrupt mode;    on the center embedded sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JerrySzczurak 0:218f6c31fda4 1 #include "mbed.h"
JerrySzczurak 0:218f6c31fda4 2 #include "x_nucleo_53l0a1.h"
JerrySzczurak 0:218f6c31fda4 3 #include <string.h>
JerrySzczurak 0:218f6c31fda4 4 #include <stdlib.h>
JerrySzczurak 0:218f6c31fda4 5 #include <stdio.h>
JerrySzczurak 0:218f6c31fda4 6 #include <assert.h>
JerrySzczurak 0:218f6c31fda4 7
JerrySzczurak 0:218f6c31fda4 8 /* This VL53L0X Expansion board test application performs a range measurement in interrupt mode
JerrySzczurak 0:218f6c31fda4 9 on the center embedded sensor.
JerrySzczurak 0:218f6c31fda4 10 The measured data is displayed on the on-board 4-digit display, and sent to com port
JerrySzczurak 0:218f6c31fda4 11
JerrySzczurak 0:218f6c31fda4 12 User Blue button stops the current measurement and the entire program, releasing all resources.
JerrySzczurak 0:218f6c31fda4 13 Reset button is used to restart the program.
JerrySzczurak 0:218f6c31fda4 14
JerrySzczurak 0:218f6c31fda4 15 Interrupt mode requires callback function which handles IRQ from given sensor.
JerrySzczurak 0:218f6c31fda4 16 */
JerrySzczurak 0:218f6c31fda4 17
JerrySzczurak 0:218f6c31fda4 18 #define VL53L0_I2C_SDA D14
JerrySzczurak 0:218f6c31fda4 19 #define VL53L0_I2C_SCL D15
JerrySzczurak 0:218f6c31fda4 20
JerrySzczurak 0:218f6c31fda4 21 static X_NUCLEO_53L0A1 *board=NULL;
JerrySzczurak 0:218f6c31fda4 22 VL53L0X_RangingMeasurementData_t data_sensor;
JerrySzczurak 0:218f6c31fda4 23 OperatingMode operating_mode;
JerrySzczurak 0:218f6c31fda4 24
JerrySzczurak 0:218f6c31fda4 25 /* flags that handle interrupt request for sensor and user blue button*/
JerrySzczurak 0:218f6c31fda4 26 volatile bool int_sensor_centre=false;
JerrySzczurak 0:218f6c31fda4 27 volatile bool int_measuring_stop = false;
JerrySzczurak 0:218f6c31fda4 28
JerrySzczurak 0:218f6c31fda4 29
JerrySzczurak 0:218f6c31fda4 30 /* ISR callback function of the center sensor */
JerrySzczurak 0:218f6c31fda4 31 void SensorCenterIRQ(void)
JerrySzczurak 0:218f6c31fda4 32 {
JerrySzczurak 0:218f6c31fda4 33 int_sensor_centre=true;
JerrySzczurak 0:218f6c31fda4 34 board->sensor_centre->DisableInterruptMeasureDetectionIRQ();
JerrySzczurak 0:218f6c31fda4 35 }
JerrySzczurak 0:218f6c31fda4 36
JerrySzczurak 0:218f6c31fda4 37 /* ISR callback function of the user blue button to switch measuring sensor. */
JerrySzczurak 0:218f6c31fda4 38 void MeasuringStopIRQ(void)
JerrySzczurak 0:218f6c31fda4 39 {
JerrySzczurak 0:218f6c31fda4 40 int_measuring_stop = true;
JerrySzczurak 0:218f6c31fda4 41 }
JerrySzczurak 0:218f6c31fda4 42
JerrySzczurak 0:218f6c31fda4 43 /* On board 4 digit local display refresh */
JerrySzczurak 0:218f6c31fda4 44 void DisplayRefresh(const VL53L0X_RangingMeasurementData_t &data)
JerrySzczurak 0:218f6c31fda4 45 {
JerrySzczurak 0:218f6c31fda4 46 char str[4];
JerrySzczurak 0:218f6c31fda4 47 if (data.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:218f6c31fda4 48 {
JerrySzczurak 0:218f6c31fda4 49 printf("%4d; ", data.RangeMilliMeter);
JerrySzczurak 0:218f6c31fda4 50 sprintf(str,"%4d", data.RangeMilliMeter);
JerrySzczurak 0:218f6c31fda4 51 }
JerrySzczurak 0:218f6c31fda4 52 else
JerrySzczurak 0:218f6c31fda4 53 {
JerrySzczurak 0:218f6c31fda4 54 sprintf(str,"%s", "----");
JerrySzczurak 0:218f6c31fda4 55 }
JerrySzczurak 0:218f6c31fda4 56 board->display->DisplayString(str);
JerrySzczurak 0:218f6c31fda4 57 }
JerrySzczurak 0:218f6c31fda4 58
JerrySzczurak 0:218f6c31fda4 59 void RangeMeasure(DevI2C *device_i2c) {
JerrySzczurak 0:218f6c31fda4 60 int status;
JerrySzczurak 0:218f6c31fda4 61
JerrySzczurak 0:218f6c31fda4 62 /* creates the 53L0A1 expansion board singleton obj */
JerrySzczurak 0:218f6c31fda4 63 board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);
JerrySzczurak 0:218f6c31fda4 64
JerrySzczurak 0:218f6c31fda4 65 board->display->DisplayString("53L0");
JerrySzczurak 0:218f6c31fda4 66
JerrySzczurak 0:218f6c31fda4 67 /* setting operating mode to continuous interrupt */
JerrySzczurak 0:218f6c31fda4 68 operating_mode=range_continuous_interrupt;
JerrySzczurak 0:218f6c31fda4 69
JerrySzczurak 0:218f6c31fda4 70 /* init the 53L0A1 expansion board with default values */
JerrySzczurak 0:218f6c31fda4 71 status=board->InitBoard();
JerrySzczurak 0:218f6c31fda4 72 if(status)
JerrySzczurak 0:218f6c31fda4 73 {
JerrySzczurak 0:218f6c31fda4 74 printf("Failed to init board!\n\r");
JerrySzczurak 0:218f6c31fda4 75 return;
JerrySzczurak 0:218f6c31fda4 76 }
JerrySzczurak 0:218f6c31fda4 77 //Stop any measurement before setting sensor
JerrySzczurak 0:218f6c31fda4 78 status=board->sensor_centre->StopMeasurement(operating_mode);
JerrySzczurak 0:218f6c31fda4 79 status=board->sensor_centre->StartMeasurement(operating_mode, &SensorCenterIRQ);
JerrySzczurak 0:218f6c31fda4 80
JerrySzczurak 0:218f6c31fda4 81 if(!status)
JerrySzczurak 0:218f6c31fda4 82 {
JerrySzczurak 0:218f6c31fda4 83 printf ("Entering loop mode\r\n");
JerrySzczurak 0:218f6c31fda4 84 while (true)
JerrySzczurak 0:218f6c31fda4 85 {
JerrySzczurak 0:218f6c31fda4 86 if (int_sensor_centre)
JerrySzczurak 0:218f6c31fda4 87 {
JerrySzczurak 0:218f6c31fda4 88 int_sensor_centre = false;
JerrySzczurak 0:218f6c31fda4 89 status = board->sensor_centre->HandleIRQ(operating_mode, &data_sensor);
JerrySzczurak 0:218f6c31fda4 90 DisplayRefresh(data_sensor);
JerrySzczurak 0:218f6c31fda4 91 }
JerrySzczurak 0:218f6c31fda4 92
JerrySzczurak 0:218f6c31fda4 93 if (int_measuring_stop)
JerrySzczurak 0:218f6c31fda4 94 {
JerrySzczurak 0:218f6c31fda4 95 printf("\r\nEnding loop mode \r\n");
JerrySzczurak 0:218f6c31fda4 96 break;
JerrySzczurak 0:218f6c31fda4 97 }
JerrySzczurak 0:218f6c31fda4 98 }
JerrySzczurak 0:218f6c31fda4 99 }
JerrySzczurak 0:218f6c31fda4 100 board->display->DisplayString("BYE");
JerrySzczurak 0:218f6c31fda4 101 delete board;
JerrySzczurak 0:218f6c31fda4 102 }
JerrySzczurak 0:218f6c31fda4 103
JerrySzczurak 0:218f6c31fda4 104 /*=================================== Main ==================================
JerrySzczurak 0:218f6c31fda4 105 Press the blue user button to stop the measurements in progress
JerrySzczurak 0:218f6c31fda4 106 =============================================================================*/
JerrySzczurak 0:218f6c31fda4 107 int main()
JerrySzczurak 0:218f6c31fda4 108 {
JerrySzczurak 0:218f6c31fda4 109 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
JerrySzczurak 0:218f6c31fda4 110 InterruptIn stop_button (USER_BUTTON);
JerrySzczurak 0:218f6c31fda4 111 stop_button.rise (&MeasuringStopIRQ);
JerrySzczurak 0:218f6c31fda4 112 #endif
JerrySzczurak 0:218f6c31fda4 113 DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
JerrySzczurak 0:218f6c31fda4 114 RangeMeasure(device_i2c); // start continuous measures
JerrySzczurak 0:218f6c31fda4 115 }
JerrySzczurak 0:218f6c31fda4 116
JerrySzczurak 0:218f6c31fda4 117