Diff: Components/Display/Display.h
- Revision:
- 0:293607457a02
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/Display/Display.h Fri Oct 16 15:04:28 2020 +0000
@@ -0,0 +1,415 @@
+/**
+ ******************************************************************************
+ * @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.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
+ */
+//<<<<<<< local
+ Display(Stmpe1600 *stmpe_1600_exp0, Stmpe1600 *stmpe_1600_exp1) : stmpe1600_exp0(stmpe_1600_exp0),
+ stmpe1600_exp1(stmpe_1600_exp1)
+//=======
+// Display(Stmpe1600 &stmpe_1600_exp0, Stmpe1600 &stmpe_1600_exp1) : stmpe1600_exp0(&stmpe_1600_exp0),
+// stmpe1600_exp1(&stmpe_1600_exp1)
+//>>>>>>> other
+ {
+ 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