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