Library for use with VL53L0X, cut 1.1, based on mass-market API v1.1.

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Dependents:   ConcorsoFinal HelloWorld_IHM01A1 m3pi_BT m3pi_LIDAR ... more

Fork of X_NUCLEO_53L0A1 by ST Expansion SW Team

X-NUCLEO-53L0A1 Proximity Sensor Expansion Board Firmware Package

Introduction

This firmware package includes Component Device Drivers and the Board Support Package for STMicroelectronics' X-NUCLEO-53L0A1 Proximity sensor expansion board based on VL53L0X.

Firmware Library

Class X_NUCLEO_53L0A1 is intended to represent the Proximity sensor expansion board with the same name.

The expansion board provides support for the following components:

  1. on-board VL53L0X proximity sensor,
  2. up to two additional VL53L0X Satellites,
  3. on-board 4-digit display

It is intentionally implemented as a singleton because only one X-NUCLEO-VL53L0A1 may be deployed at a time in a HW component stack. In order to get the singleton instance you have to call class method `Instance()`, e.g.:

// Sensors expansion board singleton instance
static X_NUCLEO_53L0A1 *board = X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);

Example Applications

The library and sample application code were tested against mbed revision 143, dated 26th May 2017.

Revision:
16:27d3d95c8593
Parent:
14:8320b5ff96fa
Child:
17:f8187a3fa36e
diff -r 8320b5ff96fa -r 27d3d95c8593 Components/Display/Display.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Display/Display.h	Tue Aug 22 14:39:51 2017 +0000
@@ -0,0 +1,410 @@
+/**
+ ******************************************************************************
+ * @file    Display.h
+ * @author  AST / EST
+ * @version V0.0.1
+ * @date    14-April-2015
+ * @brief   Header file for display
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+*/
+
+#ifndef __DISPLAY_H
+#define __DISPLAY_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mbed.h"
+#include "Stmpe1600.h"
+#include "DevI2C.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * GPIO monitor pin state register
+ * 16 bit register LSB at lowest offset (little endian)
+ */
+#define GPMR    0x10
+/**
+ * STMPE1600 GPIO set pin state register
+ * 16 bit register LSB at lowest offset (little endian)
+ */
+#define GPSR    0x12
+/**
+ * STMPE1600 GPIO set pin direction register
+ * 16 bit register LSB at lowest offset
+ */
+#define GPDR    0x14
+
+
+/**
+ * cache the full set of expanded GPIO values to avoid i2c reading
+ */
+static union CurIOVal_u {
+    uint8_t bytes[4];   /*!<  4 bytes array i/o view */
+    uint32_t u32;       /*!<  single dword i/o view */
+}
+/** cache the extended IO values */
+cur_io_val;
+
+/**
+ * lookup table for digit to bit position
+ */
+static int  display_bit_posn[4] = {0, 7, 16, 16 + 7};
+
+/**
+ * @defgroup XNUCLEO53L0A1_7Segment 7 segment display
+ *
+ * macro use for human readable segment building
+ * @code
+ *  --s0--
+ *  s    s
+ *  5    1
+ *  --s6--
+ *  s    s
+ *  4    2
+ *  --s3-- . s7 (dp)
+ * @endcode
+ *
+ * @{
+ */
+/** decimal point bit mapping*  */
+#define DP  (1 << 7)
+
+/** sgement s0 bit mapping*/
+#define S0 (1 << 3)
+/** sgement s1 bit mapping*/
+#define S1 (1 << 5)
+/** sgement s2 bit mapping*/
+#define S2 (1 << 6)
+/** sgement s3 bit mapping*/
+#define S3 (1 << 4)
+/** sgement s4 bit mapping*/
+#define S4 (1 << 0)
+/** sgement s5 bit mapping*/
+#define S5 (1 << 1)
+/** sgement s6 bit mapping*/
+#define S6 (1 << 2)
+
+/**
+ * build a character by defining the non lighted segment (not one and no DP)
+ *
+ * @param  ... literal sum and or combine of any macro to define any segment #S0 .. #S6
+ *
+ * example '9' is all segment on but S4
+ * @code
+ *   ['9']=           NOT_7_NO_DP(S4),
+ * @endcode
+ */
+#define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP )
+
+/**
+ * Ascii to 7 segment  lookup table
+ *
+ * Most common character are supported and follow http://www.twyman.org.uk/Fonts/
+ * few extra special \@ ^~ ... etc are present for specific demo purpose
+ */
+#ifndef __cpluplus
+/* refer to http://www.twyman.org.uk/Fonts/ */
+static const uint8_t ascii_to_display_lut[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    [32] =           0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0,
+    [42] =           NOT_7_NO_DP(),
+    0, 0,
+    [45] =           S6,
+    0, 0,
+    [48] =           NOT_7_NO_DP(S6),
+    [49] =           S1 + S2,
+    [50] =           S0 + S1 + S6 + S4 + S3,
+    [51] =           NOT_7_NO_DP(S4 + S5),
+    [52] =           S5 + S1 + S6 + S2,
+    [53] =           NOT_7_NO_DP(S1 + S4),
+    [54] =           NOT_7_NO_DP(S1),
+    [55] =           S0 + S1 + S2,
+    [56] =           NOT_7_NO_DP(0),
+    [57] =           NOT_7_NO_DP(S4),
+    0, 0, 0,
+    [61] =           S3 + S6,
+    0,
+    [63] =           NOT_7_NO_DP(S5 + S3 + S2),
+    [64] =           S0 + S3,
+    [65] =           NOT_7_NO_DP(S3),
+    [66] =           NOT_7_NO_DP(S0 + S1),    /* as b  */
+    [67] =           S0 + S3 + S4 + S5, // same as [
+    [68] =           S0 + S3 + S4 + S5, // same as [ DUMMY
+    [69] =           NOT_7_NO_DP(S1 + S2),
+    [70] =           S6 + S5 + S4 + S0,
+    [71] =           NOT_7_NO_DP(S4),    /* same as 9 */
+    [72] =           NOT_7_NO_DP(S0 + S3),
+    [73] =           S1 + S2,
+    [74] =           S1 + S2 + S3 + S4,
+    [75] =           NOT_7_NO_DP(S0 + S3),    /* same as H */
+    [76] =           S3 + S4 + S5,
+    [77] =           S0 + S4 + S2, /* same as  m*/
+    [78] =           S2 + S4 + S6, /* same as n*/
+    [79] =           NOT_7_NO_DP(S6),
+    [80] =           S0 + S1 + S2 + S5 + S6, // sames as 'q'
+    [81] =           NOT_7_NO_DP(S3 + S2),
+    [82] =           S4 + S6,
+    [83] =           NOT_7_NO_DP(S1 + S4),    /* sasme as 5 */
+    [84] =           NOT_7_NO_DP(S0 + S1 + S2),    /* sasme as t */
+    [85] =           NOT_7_NO_DP(S6 + S0),
+    [86] =           S4 + S3 + S2, // is u but u use U
+    [87] =           S1 + S3 + S5,
+    [88] =           NOT_7_NO_DP(S0 + S3),    // similar to H
+    [89] =           NOT_7_NO_DP(S0 + S4),
+    [90] =           S0 + S1 + S6 + S4 + S3, // same as 2
+    [91] =           S0 + S3 + S4 + S5,
+    0,
+    [93] =           S0 + S3 + S2 + S1,
+    [94] =           S0, /* use as top bar */
+    [95] =           S3,
+    0,
+    [97] =           S2 + S3 + S4 + S6,
+    [98] =           NOT_7_NO_DP(S0 + S1),
+    [99] =           S6 + S4 + S3,
+    [100] =           NOT_7_NO_DP(S0 + S5),
+    [101] =           NOT_7_NO_DP(S2),
+    [102] =           S6 + S5 + S4 + S0, /* same as F */
+    [103] =           NOT_7_NO_DP(S4),    /* same as 9 */
+    [104] =           S6 + S5 + S4 + S2,
+    [105] =           S4,
+    [106] =           S1 + S2 + S3 + S4,
+    [107] =           S6 + S5 + S4 + S2, /* a h */
+    [108] =           S3 + S4,
+    [109] =           S0 + S4 + S2, /* same as  */
+    [110] =           S2 + S4 + S6,
+    [111] =           S6 + S4 + S3 + S2,
+    [112] =           NOT_7_NO_DP(S3 + S2),    // same as P
+    [113] =           S0 + S1 + S2 + S5 + S6,
+    [114] =           S4 + S6,
+    [115] =           NOT_7_NO_DP(S1 + S4),
+    [116] =           NOT_7_NO_DP(S0 + S1 + S2),
+    [117] =           S4 + S3 + S2 + S5 + S1, // U
+    [118] =           S4 + S3 + S2, // is u but u use U
+    [119] =           S1 + S3 + S5,
+    [120] =           NOT_7_NO_DP(S0 + S3),    // similar to H
+    [121] =           NOT_7_NO_DP(S0 + S4),
+    [122] =           S0 + S1 + S6 + S4 + S3, // same as 2
+    0, 0, 0,
+    [126] =           S0 + S3 + S6 /* 3 h bar */
+};
+#else
+/* refer to http://www.twyman.org.uk/Fonts/ */
+static const uint8_t ascii_to_display_lut[256] = {
+    [' '] =           0,
+    ['-'] =           S6,
+    ['_'] =           S3,
+    ['='] =           S3 + S6,
+    ['~'] =           S0 + S3 + S6, /* 3 h bar */
+    ['^'] =           S0, /* use as top bar */
+
+    ['?'] =           NOT_7_NO_DP(S5 + S3 + S2),
+    ['*'] =           NOT_7_NO_DP(),
+    ['['] =           S0 + S3 + S4 + S5,
+    [']'] =           S0 + S3 + S2 + S1,
+    ['@'] =           S0 + S3,
+
+    ['0'] =           NOT_7_NO_DP(S6),
+    ['1'] =           S1 + S2,
+    ['2'] =           S0 + S1 + S6 + S4 + S3,
+    ['3'] =           NOT_7_NO_DP(S4 + S5),
+    ['4'] =           S5 + S1 + S6 + S2,
+    ['5'] =           NOT_7_NO_DP(S1 + S4),
+    ['6'] =           NOT_7_NO_DP(S1),
+    ['7'] =           S0 + S1 + S2,
+    ['8'] =           NOT_7_NO_DP(0),
+    ['9'] =           NOT_7_NO_DP(S4),
+
+    ['a'] =           S2 + S3 + S4 + S6,
+    ['b'] =           NOT_7_NO_DP(S0 + S1),
+    ['c'] =           S6 + S4 + S3,
+    ['d'] =           NOT_7_NO_DP(S0 + S5),
+    ['e'] =           NOT_7_NO_DP(S2),
+    ['f'] =           S6 + S5 + S4 + S0, /* same as F */
+    ['g'] =           NOT_7_NO_DP(S4),    /* same as 9 */
+    ['h'] =           S6 + S5 + S4 + S2,
+    ['i'] =           S4,
+    ['j'] =           S1 + S2 + S3 + S4,
+    ['k'] =           S6 + S5 + S4 + S2, /* a h */
+    ['l'] =           S3 + S4,
+    ['m'] =           S0 + S4 + S2, /* same as  */
+    ['n'] =           S2 + S4 + S6,
+    ['o'] =           S6 + S4 + S3 + S2,
+    ['p'] =           NOT_7_NO_DP(S3 + S2),    // same as P
+    ['q'] =           S0 + S1 + S2 + S5 + S6,
+    ['r'] =           S4 + S6,
+    ['s'] =           NOT_7_NO_DP(S1 + S4),
+    ['t'] =           NOT_7_NO_DP(S0 + S1 + S2),
+    ['u'] =           S4 + S3 + S2 + S5 + S1, // U
+    ['v'] =           S4 + S3 + S2, // is u but u use U
+    ['w'] =           S1 + S3 + S5,
+    ['x'] =           NOT_7_NO_DP(S0 + S3),    // similar to H
+    ['y'] =           NOT_7_NO_DP(S0 + S4),
+    ['z'] =           S0 + S1 + S6 + S4 + S3, // same as 2
+
+    ['A'] =           NOT_7_NO_DP(S3),
+    ['B'] =           NOT_7_NO_DP(S0 + S1),    /* as b  */
+    ['C'] =           S0 + S3 + S4 + S5, // same as [
+    ['E'] =           NOT_7_NO_DP(S1 + S2),
+    ['F'] =           S6 + S5 + S4 + S0,
+    ['G'] =           NOT_7_NO_DP(S4),    /* same as 9 */
+    ['H'] =           NOT_7_NO_DP(S0 + S3),
+    ['I'] =           S1 + S2,
+    ['J'] =           S1 + S2 + S3 + S4,
+    ['K'] =           NOT_7_NO_DP(S0 + S3),    /* same as H */
+    ['L'] =           S3 + S4 + S5,
+    ['M'] =           S0 + S4 + S2, /* same as  m*/
+    ['N'] =           S2 + S4 + S6, /* same as n*/
+    ['O'] =           NOT_7_NO_DP(S6),
+    ['P'] =           S0 + S1 + S2 + S5 + S6, // sames as 'q'
+    ['Q'] =           NOT_7_NO_DP(S3 + S2),
+    ['R'] =           S4 + S6,
+    ['S'] =           NOT_7_NO_DP(S1 + S4),    /* sasme as 5 */
+    ['T'] =           NOT_7_NO_DP(S0 + S1 + S2),    /* sasme as t */
+    ['U'] =           NOT_7_NO_DP(S6 + S0),
+    ['V'] =           S4 + S3 + S2, // is u but u use U
+    ['W'] =           S1 + S3 + S5,
+    ['X'] =           NOT_7_NO_DP(S0 + S3),    // similar to H
+    ['Y'] =           NOT_7_NO_DP(S0 + S4),
+    ['Z'] =           S0 + S1 + S6 + S4 + S3 // same as 2
+};
+#endif
+
+
+#undef S0
+#undef S1
+#undef S2
+#undef S3
+#undef S4
+#undef S5
+#undef S6
+#undef DP
+
+/** @} */
+
+//#define DISPLAY_DELAY   1  // in mSec
+
+/* Classes -------------------------------------------------------------------*/
+/** Class representing Display
+ */
+
+class Display
+{
+private:
+    Stmpe1600 &stmpe1600_exp0;
+    Stmpe1600 &stmpe1600_exp1;
+public:
+    /** Constructor
+    * @param[in] &stmpe_1600 device handler to be used for display control
+    */
+    Display(Stmpe1600 &stmpe_1600_exp0, Stmpe1600 &stmpe_1600_exp1) : stmpe1600_exp0(stmpe_1600_exp0),
+        stmpe1600_exp1(stmpe_1600_exp1)
+    {
+        uint16_t expander_data;
+
+        // detect the extenders
+        stmpe1600_exp0.read_16bit_reg(0x00, &expander_data);
+//        if (ExpanderData != 0x1600) {/* log - failed to find expander exp0 */ }
+        stmpe1600_exp1.read_16bit_reg(0x00, &expander_data);
+//        if (ExpanderData != 0x1600) {/* log - failed to find expander exp1 */ }
+
+        // configure all necessary GPIO pins as outputs
+        expander_data = 0xFFFF;
+        stmpe1600_exp0.write_16bit_reg(GPDR, &expander_data);
+        expander_data = 0xBFFF; // leave bit 14 as an input, for the pushbutton, PB1.
+        stmpe1600_exp1.write_16bit_reg(GPDR, &expander_data);
+
+        // shut down all segment and all device
+        expander_data = 0x7F + (0x7F << 7);
+        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+    }
+
+    /*** Interface Methods ***/
+    /**
+     * @brief       Print the string on display
+     * @param[in]   String to be printed
+     * @param[in]   String lenght [min 1, max 4]
+     * @return      void
+     */
+    void display_string(const char *str)
+    {
+        uint16_t expander_data;
+        uint32_t segments;
+        int bit_posn;
+        int i;
+
+        for (i = 0; (i < 4 && str[i] != 0); i++) {
+            segments = (uint32_t) ascii_to_display_lut[(uint8_t) str[i]];
+            segments = (~segments) & 0x7F;
+            bit_posn = display_bit_posn[i];
+            cur_io_val.u32 &= ~(0x7F << bit_posn);
+            cur_io_val.u32 |= segments << bit_posn;
+        }
+        /* clear unused digit */
+        for (; i < 4; i++) {
+            bit_posn = display_bit_posn[i];
+            cur_io_val.u32 |= 0x7F << bit_posn;
+        }
+
+//        stmpe1600_exp0.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[0]);
+//        stmpe1600_exp1.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[2]);
+
+// ordered low-byte/high-byte!
+        cur_io_val.bytes[1] |= 0xC0; // ensure highest bits are high, as these are xshutdown pins for left & right sensors!
+        expander_data = (cur_io_val.bytes[1] << 8) + cur_io_val.bytes[0];
+        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
+        cur_io_val.bytes[3] |= 0x80; // ensure highest bit is high, as this is xshutdown pin on central sensor!
+        expander_data = (cur_io_val.bytes[3] << 8) + cur_io_val.bytes[2];
+        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+
+    }
+
+    void clear_display(void)
+    {
+        uint16_t expander_data;
+
+        expander_data = 0x7F + (0x7F << 7);
+        stmpe1600_exp0.write_16bit_reg(GPSR, &expander_data);
+        stmpe1600_exp1.write_16bit_reg(GPSR, &expander_data);
+    }
+
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif // __DISPLAY_H