Sample application to show ranging with interrupts support. Uses centre sensor on X-Nucleo-53L0A1 and ranging_continuous_interrupt mode.

Dependencies:   mbed X_NUCLEO_53L0A1

Fork of Display_53L0A1 by ST

main.cpp

Committer:
johnAlexander
Date:
2019-06-06
Revision:
4:79d9b33ebed6
Parent:
3:bd38edab685e

File content as of revision 4:79d9b33ebed6:

#include "mbed.h"
#include "XNucleo53L0A1.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 XNucleo53L0A1 *board = NULL;
VL53L0X_RangingMeasurementData_t data_sensor;
OperatingMode operating_mode;

/* 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 centre sensor */
void sensor_centre_irq(void)
{
    int_sensor_centre = true;
    board->sensor_centre->disable_interrupt_measure_detection_irq();
}

/* ISR callback function of the user blue button to switch measuring sensor. */
void measuring_stop_irq(void)
{
    int_measuring_stop = true;
}

/* On board 4 digit local display refresh */
void display_refresh(const VL53L0X_RangingMeasurementData_t &data)
{
    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->display_string(str);
}

void range_measure(DevI2C *device_i2c)
{
    int status;

    /* creates the 53L0A1 expansion board singleton obj */
    board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);

    board->display->display_string("53L0");

    /* setting operating mode to continuous interrupt */
    operating_mode = range_continuous_interrupt;

    /* init the 53L0A1 expansion board with default values */
    status = board->init_board();
    if (status) {
        printf("Failed to init board!\n\r");
        return;
    }
    //Stop any measurement before setting sensor
    status = board->sensor_centre->stop_measurement(operating_mode);
    status = board->sensor_centre->start_measurement(operating_mode, &sensor_centre_irq);

    if (!status) {
        printf("Entering loop mode\r\n");
        while (true) {
            if (int_sensor_centre) {
                int_sensor_centre = false;
                status = board->sensor_centre->handle_irq(operating_mode, &data_sensor);
                display_refresh(data_sensor);
            }

            if (int_measuring_stop) {
                printf("\r\nEnding loop mode \r\n");
                break;
            }
        }
    }
    board->display->display_string("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(&measuring_stop_irq);
#endif
    DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
    range_measure(device_i2c);  // start continuous measures
}