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
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:
- on-board VL53L0X proximity sensor,
- up to two additional VL53L0X Satellites,
- 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
- Hello World 53L0
- Display 53L0A1
- Display 53L0A1 Interrupts
- Display 53L0A1 with satellites
- 53L0A1 Satellites with Interrupts
- 53L0A1_HandGestureRecognition
The library and sample application code were tested against mbed revision 143, dated 26th May 2017.
Diff: Components/Display/Display_class.h
- Revision:
- 16:27d3d95c8593
- Parent:
- 14:8320b5ff96fa
- Child:
- 17:f8187a3fa36e
--- a/Components/Display/Display_class.h Mon Aug 07 14:30:21 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,411 +0,0 @@
-/**
- ******************************************************************************
- * @file Display.h
- * @author AST / EST
- * @version V0.0.1
- * @date 14-April-2015
- * @brief Header file for display
- ******************************************************************************
- * @attention
- *
- * <h2><center>© 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_class.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
-

X-NUCLEO-53L0A1 Ranging Sensor Expansion Board