Simple Ranging Example, using Expansion Board Sensor, driven via Interrupts, on Mbed OS 5.x.

Dependencies:   X_NUCLEO_53L1A1_mbed

Files at this revision

API Documentation at this revision

Comitter:
johnAlexander
Date:
Fri May 17 12:29:28 2019 +0000
Parent:
1:e5cce6b28b6f
Commit message:
Simple Ranging Example, using Expansion Board Sensor, driven via Interrupts, on Mbed OS 5.x.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri May 17 12:24:17 2019 +0000
+++ b/main.cpp	Fri May 17 12:29:28 2019 +0000
@@ -3,16 +3,14 @@
  * with interrupts enabled to generate a hardware interrupt each time a new
  * measurement is ready to be read.
  *
- * Measured ranges are output on the Serial Port, running at 115200 baud.
- *
- * The application supports the centre, on-board, sensor and up to two satellite boards.
+ *  Measured ranges are ouput on the Serial Port, running at 115200 baud.
  *
- * The User Blue button switches between the currently selected sensor to display range
- * results from.
+ *  The User Blue button stops the current measurement and entire program,
+ *  releasing all resources.
  *
- * The Black Reset button is used to restart the program.
+ *  The Black Reset button is used to restart the program.
  *
- * *** NOTE : By default hardlinks U10, U11, U15 & U18, on the underside of
+ *  *** NOTE : By default hardlinks U10, U11, U15 & U18, on the underside of
  *            the X-NUCELO-53L0A1 expansion board are not made/OFF.
  *            These links must be made to allow interrupts from the Satellite boards
  *            to be received.
@@ -28,156 +26,53 @@
  *            Alternate INT_R is on CN9 Connector pin 5 as D2.
  *            The pinouts are shown here : https://developer.mbed.org/components/X-NUCLEO-53L1A1/
  */
- 
+
 #include <stdio.h>
 
 #include "mbed.h"
 #include "XNucleo53L1A1.h"
 #include "vl53L1x_I2c.h"
 
-#define VL53L1_I2C_SDA   D14 
-#define VL53L1_I2C_SCL   D15 
-
-#if USER_BUTTON==PC_13  // we are cross compiling for Nucleo-64s
-InterruptIn stop_button(USER_BUTTON);
-#endif
-
-/* Installed sensors count */
-int sensorCnt = 0;
-
-/* installed sensors prefixes */
-char installedSensors[3];
+#define VL53L1_I2C_SDA   D14
+#define VL53L1_I2C_SCL   D15
 
 static XNucleo53L1A1 *board=NULL;
-Serial pc(SERIAL_TX, SERIAL_RX); 
+Serial pc(SERIAL_TX, SERIAL_RX);
 
-/* interrupt requests */
-volatile bool centerSensor = false;
-volatile bool leftSensor = false;
-volatile bool rightSensor = false;
-volatile bool int_measuring_stop = false;
-/* Current sensor number*/
-volatile int currentSensor = 0;
-
-/* current displayed sensor change IRQ */
-volatile bool switchChanged = false;
+/* flags that handle interrupt request for sensor and user blue button*/
+volatile bool int_sensor = false;
+volatile bool int_stop = false;
 
 /* ISR callback function of the centre sensor */
-void sensor_centre_irq(void)
+void sensor_irq(void)
 {
-    centerSensor = true;
+    int_sensor = true;
     board->sensor_centre->disable_interrupt_measure_detection_irq();
 }
 
-/* ISR callback function of the left sensor */
-void sensor_left_irq(void)
+/* Start the sensor ranging */
+int init_sensor()
 {
-    leftSensor = true;
-    board->sensor_left->disable_interrupt_measure_detection_irq();
-}
+    int status = 0;
+    /* start the measure on the center sensor */
+    if (NULL != board->sensor_centre) {
+        status = board->sensor_centre->stop_measurement();
+        if (status != 0) {
+                return status;
+        }
 
-/* ISR callback function of the right sensor */
-void sensor_right_irq(void)
-{
-    rightSensor = true;
-    board->sensor_right->disable_interrupt_measure_detection_irq();
+        status = board->sensor_centre->start_measurement(&sensor_irq);
+        if (status != 0) {
+            return status;
+        }
+    }
+    return status;
 }
 
 /* ISR callback function of the user blue button to switch measuring sensor. */
-void switch_measuring_sensor_irq(void)
-{
-    stop_button.disable_irq();
-    switchChanged = true;
-}
-
-/*
- * This function calls the interrupt handler for each sensor
- * and outputs the range
- */
-inline void measure_sensors()
+void measuring_stop_irq(void)
 {
-    bool current = false;
-    uint16_t distance = 0;
-
-    /* Handle the interrupt and output the range from the centre sensor */
-    if (centerSensor) {
-        centerSensor = false;
-        board->sensor_centre->handle_irq(&distance);
-        current = (currentSensor == 0);
-        if (current) {
-            printf("Centre: %d\r\n", distance);
-        }
-    }
-
-    /* Handle the interrupt and output the range from the left sensor */
-    if (leftSensor) {
-        leftSensor = false;
-        board->sensor_left->handle_irq(&distance);
-        current = (installedSensors[currentSensor] == 'L');
-        if (current) {
-            printf("Left: %d\r\n", distance);
-        }
-    }
-
-    /* Handle the interrupt and output the range from the right sensor */
-    if (rightSensor) {
-        rightSensor = false;
-        board->sensor_right->handle_irq(&distance);
-        current = (installedSensors[currentSensor] == 'R');
-        if (current) {
-            printf("Right: %d\r\n", distance);
-        }
-    }
-}
-
-/*
- * Add to an array a character that represents the sensor and start ranging
- */
-int init_sensors_array()
-{
-    int status = 0;
-    sensorCnt = 0;
-    /* start the measure on the center sensor */
-    if (NULL != board->sensor_centre) {
-        installedSensors[sensorCnt] = 'C';
-        status = board->sensor_centre->stop_measurement();
-        if (status != 0) {
-            return status;
-        }
-        status = board->sensor_centre->start_measurement(&sensor_centre_irq);
-        if (status != 0) {
-            return status;
-        }
-        ++sensorCnt;
-    }
-    /* start the measure on the left sensor */
-    if (NULL != board->sensor_left) {
-        installedSensors[sensorCnt] = 'L';
-        status = board->sensor_left->stop_measurement();
-        if (status != 0) {
-            return status;
-        }
-        status = board->sensor_left->start_measurement(&sensor_left_irq);
-        if (status != 0) {
-            return status;
-        }
-        ++sensorCnt;
-    }
-    /* start the measure on the right sensor */
-    if (NULL != board->sensor_right) {
-        installedSensors[sensorCnt] = 'R';
-        status = board->sensor_right->stop_measurement();
-        if (status != 0) {
-            return status;
-        }
-        status = board->sensor_right->start_measurement(&sensor_right_irq);
-        if (status != 0) {
-            return status;
-        }
-        ++sensorCnt;
-    }
-    currentSensor = 0;
-    return status;
+    int_stop = true;
 }
 
 /*
@@ -186,6 +81,7 @@
 int range_measure(vl53L1X_DevI2C *device_i2c)
 {
     int status = 0;
+    uint16_t distance = 0;
 
     /* creates the 53L1A1 expansion board singleton obj */
     board = XNucleo53L1A1::instance(device_i2c, A2, D9, D2);
@@ -198,28 +94,29 @@
     }
 
     /* init an array with chars to id the sensors */
-    status = init_sensors_array();
+    status = init_sensor();
     if (status != 0) {
         printf("Failed to init sensors!\r\n");
         return status;
     }
 
     printf("Entering loop mode\r\n");
-
     /* Main ranging interrupt loop */
     while (true) {
-        measure_sensors();
-        if (switchChanged) {
-            ++currentSensor;
-            if (currentSensor == sensorCnt)
-                currentSensor = 0;
-            printf("Sensor changed to %c\r\n", installedSensors[currentSensor]);
-            switchChanged = false;
-            stop_button.enable_irq();
+        if (int_sensor) {
+            int_sensor = false;
+            status = board->sensor_centre->handle_irq(&distance);
+            printf("distance: %d\r\n", distance);
+        }
+
+        if (int_stop) {
+            printf("\r\nEnding loop mode \r\n");
+            break;
         }
     }
-    delete board;
+
     return status;
+
 }
 
 /*=================================== Main ==================================
@@ -227,11 +124,9 @@
 int main()
 {
 #if USER_BUTTON==PC_13  // we are cross compiling for Nucleo-f401
-    stop_button.rise(&switch_measuring_sensor_irq);
-    stop_button.enable_irq();
+    InterruptIn stop_button(USER_BUTTON);
+    stop_button.rise(&measuring_stop_irq);
 #endif
-    vl53L1X_DevI2C *dev_I2C = new vl53L1X_DevI2C(VL53L1_I2C_SDA, VL53L1_I2C_SCL);
-    range_measure(dev_I2C);  // start continuous measures
-return 0;
+    vl53L1X_DevI2C *device_i2c = new vl53L1X_DevI2C(VL53L1_I2C_SDA, VL53L1_I2C_SCL);
+    range_measure(device_i2c);  // start continuous measures
 }
-