Jerry Szczurak / X_NUCLEO_53L0A1

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Dependents:   Display_53L0A1_IntSatelites Display_53L0A1_InterruptMode

Fork of X_NUCLEO_53L0A1 by ST

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Display_class.h Source File

Display_class.h

00001 /**
00002  ******************************************************************************
00003  * @file    Display.h
00004  * @author  AST / EST
00005  * @version V0.0.1
00006  * @date    14-April-2015
00007  * @brief   Header file for display
00008  ******************************************************************************
00009  * @attention
00010  *
00011  * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
00012  *
00013  * Redistribution and use in source and binary forms, with or without modification,
00014  * are permitted provided that the following conditions are met:
00015  *   1. Redistributions of source code must retain the above copyright notice,
00016  *      this list of conditions and the following disclaimer.
00017  *   2. Redistributions in binary form must reproduce the above copyright notice,
00018  *      this list of conditions and the following disclaimer in the documentation
00019  *      and/or other materials provided with the distribution.
00020  *   3. Neither the name of STMicroelectronics nor the names of its contributors
00021  *      may be used to endorse or promote products derived from this software
00022  *       without specific prior written permission.
00023  *
00024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00027  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00028  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00029  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00030  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00031  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00032  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00033  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00034  *
00035  ******************************************************************************
00036 */
00037 
00038 #ifndef __DISPLAY_H
00039 #define __DISPLAY_H
00040 
00041 /* Includes ------------------------------------------------------------------*/
00042 #include "mbed.h"
00043 #include "stmpe1600_class.h"
00044 #include "DevI2C.h"
00045 
00046 #ifdef __cplusplus
00047 extern "C" {
00048 #endif
00049 
00050 /**
00051  * GPIO monitor pin state register
00052  * 16 bit register LSB at lowest offset (little endian)
00053  */
00054 #define GPMR    0x10
00055 /**
00056  * STMPE1600 GPIO set pin state register
00057  * 16 bit register LSB at lowest offset (little endian)
00058  */
00059 #define GPSR    0x12
00060 /**
00061  * STMPE1600 GPIO set pin direction register
00062  * 16 bit register LSB at lowest offset
00063  */
00064 #define GPDR    0x14
00065 
00066 
00067 /**
00068  * cache the full set of expanded GPIO values to avoid i2c reading
00069  */
00070 static union CurIOVal_u {
00071     uint8_t bytes [4];   /*!<  4 bytes array i/o view */
00072     uint32_t u32 ;       /*!<  single dword i/o view */
00073 }
00074 /** cache the extended IO values */
00075 CurIOVal;
00076 
00077 /**
00078  * lookup table for digit to bit position
00079  */
00080 static int  DisplayBitPos[4]={0, 7, 16, 16+7};
00081 
00082 /**
00083  * @defgroup XNUCLEO53L0A1_7Segment 7 segment display
00084  *
00085  * macro use for human readable segment building
00086  * @code
00087  *  --s0--
00088  *  s    s
00089  *  5    1
00090  *  --s6--
00091  *  s    s
00092  *  4    2
00093  *  --s3-- . s7 (dp)
00094  * @endcode
00095  *
00096  * @{
00097  */
00098 /** decimal point bit mapping*  */
00099 #define DP  (1<<7)
00100 
00101 /** sgement s0 bit mapping*/
00102 #define S0 (1<<3)
00103 /** sgement s1 bit mapping*/
00104 #define S1 (1<<5)
00105 /** sgement s2 bit mapping*/
00106 #define S2 (1<<6)
00107 /** sgement s3 bit mapping*/
00108 #define S3 (1<<4)
00109 /** sgement s4 bit mapping*/
00110 #define S4 (1<<0)
00111 /** sgement s5 bit mapping*/
00112 #define S5 (1<<1)
00113 /** sgement s6 bit mapping*/
00114 #define S6 (1<<2)
00115 
00116 /**
00117  * build a character by defining the non lighted segment (not one and no DP)
00118  *
00119  * @param  ... literal sum and or combine of any macro to define any segment #S0 .. #S6
00120  *
00121  * example '9' is all segment on but S4
00122  * @code
00123  *   ['9']=           NOT_7_NO_DP(S4),
00124  * @endcode
00125  */
00126 #define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP )
00127 
00128 /**
00129  * Ascii to 7 segment  lookup table
00130  *
00131  * Most common character are supported and follow http://www.twyman.org.uk/Fonts/
00132  * few extra special \@ ^~ ... etc are present for specific demo purpose
00133  */
00134 #ifndef __cpluplus
00135 /* refer to http://www.twyman.org.uk/Fonts/ */
00136 static const uint8_t ascii_to_display_lut[256]={
00137     0,0,0,0,0,0,0,0,
00138     0,0,0,0,0,0,0,0,
00139     0,0,0,0,0,0,0,0,
00140     0,0,0,0,0,0,0,0,
00141     [32]=           0,
00142     0,0,0,0,0,0,0,0,
00143     0,
00144     [42]=           NOT_7_NO_DP(),
00145     0,0,
00146     [45]=           S6,
00147     0,0,
00148     [48]=           NOT_7_NO_DP(S6),
00149     [49]=           S1+S2,
00150     [50]=           S0+S1+S6+S4+S3,
00151     [51]=           NOT_7_NO_DP(S4+S5),
00152     [52]=           S5+S1+S6+S2,
00153     [53]=           NOT_7_NO_DP(S1+S4),
00154     [54]=           NOT_7_NO_DP(S1),
00155     [55]=           S0+S1+S2,
00156     [56]=           NOT_7_NO_DP(0),
00157     [57]=           NOT_7_NO_DP(S4),
00158     0,0,0,
00159     [61]=           S3+S6,
00160     0,
00161     [63]=           NOT_7_NO_DP(S5+S3+S2),
00162     [64]=           S0+S3,
00163     [65]=           NOT_7_NO_DP(S3),
00164     [66]=           NOT_7_NO_DP(S0+S1), /* as b  */
00165     [67]=           S0+S3+S4+S5, // same as [
00166     [68]=           S0+S3+S4+S5, // same as [ DUMMY
00167     [69]=           NOT_7_NO_DP(S1+S2),
00168     [70]=           S6+S5+S4+S0,
00169     [71]=           NOT_7_NO_DP(S4), /* same as 9 */
00170     [72]=           NOT_7_NO_DP(S0+S3),
00171     [73]=           S1+S2,
00172     [74]=           S1+S2+S3+S4,
00173     [75]=           NOT_7_NO_DP(S0+S3), /* same as H */
00174     [76]=           S3+S4+S5,
00175     [77]=           S0+S4+S2, /* same as  m*/
00176     [78]=           S2+S4+S6, /* same as n*/
00177     [79]=           NOT_7_NO_DP(S6),
00178     [80]=           S0+S1+S2+S5+S6, // sames as 'q'
00179     [81]=           NOT_7_NO_DP(S3+S2),
00180     [82]=           S4+S6,
00181     [83]=           NOT_7_NO_DP(S1+S4), /* sasme as 5 */
00182     [84]=           NOT_7_NO_DP(S0+S1+S2), /* sasme as t */
00183     [85]=           NOT_7_NO_DP(S6+S0),
00184     [86]=           S4+S3+S2, // is u but u use U
00185     [87]=           S1+S3+S5,
00186     [88]=           NOT_7_NO_DP(S0+S3), // similar to H
00187     [89]=           NOT_7_NO_DP(S0+S4),
00188     [90]=           S0+S1+S6+S4+S3, // same as 2
00189     [91]=           S0+S3+S4+S5,
00190     0,
00191     [93]=           S0+S3+S2+S1,
00192     [94]=           S0, /* use as top bar */
00193     [95]=           S3,
00194     0,
00195     [97]=           S2+ S3+ S4+ S6 ,
00196     [98]=           NOT_7_NO_DP(S0+S1),
00197     [99]=           S6+S4+S3,
00198     [100]=           NOT_7_NO_DP(S0+S5),
00199     [101]=           NOT_7_NO_DP(S2),
00200     [102]=           S6+S5+S4+S0, /* same as F */
00201     [103]=           NOT_7_NO_DP(S4), /* same as 9 */
00202     [104]=           S6+S5+S4+S2,
00203     [105]=           S4,
00204     [106]=           S1+S2+S3+S4,
00205     [107]=           S6+S5+S4+S2, /* a h */
00206     [108]=           S3+S4,
00207     [109]=           S0+S4+S2, /* same as  */
00208     [110]=           S2+S4+S6,
00209     [111]=           S6+S4+S3+S2,
00210     [112]=           NOT_7_NO_DP(S3+S2), // same as P
00211     [113]=           S0+S1+S2+S5+S6,
00212     [114]=           S4+S6,
00213     [115]=           NOT_7_NO_DP(S1+S4),
00214     [116]=           NOT_7_NO_DP(S0+S1+S2),
00215     [117]=           S4+S3+S2+S5+S1, // U
00216     [118]=           S4+S3+S2, // is u but u use U
00217     [119]=           S1+S3+S5,
00218     [120]=           NOT_7_NO_DP(S0+S3), // similar to H
00219     [121]=           NOT_7_NO_DP(S0+S4),
00220     [122]=           S0+S1+S6+S4+S3, // same as 2
00221     0,0,0,
00222     [126]=           S0+S3+S6 /* 3 h bar */
00223 };
00224 #else
00225 /* refer to http://www.twyman.org.uk/Fonts/ */
00226 static const uint8_t ascii_to_display_lut[256]={
00227       [' ']=           0,
00228       ['-']=           S6,
00229       ['_']=           S3,
00230       ['=']=           S3+S6,
00231       ['~']=           S0+S3+S6, /* 3 h bar */
00232       ['^']=           S0, /* use as top bar */
00233 
00234       ['?']=           NOT_7_NO_DP(S5+S3+S2),
00235       ['*']=           NOT_7_NO_DP(),
00236       ['[']=           S0+S3+S4+S5,
00237       [']']=           S0+S3+S2+S1,
00238       ['@']=           S0+S3,
00239 
00240       ['0']=           NOT_7_NO_DP(S6),
00241       ['1']=           S1+S2,
00242       ['2']=           S0+S1+S6+S4+S3,
00243       ['3']=           NOT_7_NO_DP(S4+S5),
00244       ['4']=           S5+S1+S6+S2,
00245       ['5']=           NOT_7_NO_DP(S1+S4),
00246       ['6']=           NOT_7_NO_DP(S1),
00247       ['7']=           S0+S1+S2,
00248       ['8']=           NOT_7_NO_DP(0),
00249       ['9']=           NOT_7_NO_DP(S4),
00250 
00251       ['a']=           S2+ S3+ S4+ S6 ,
00252       ['b']=           NOT_7_NO_DP(S0+S1),
00253       ['c']=           S6+S4+S3,
00254       ['d']=           NOT_7_NO_DP(S0+S5),
00255       ['e']=           NOT_7_NO_DP(S2),
00256       ['f']=           S6+S5+S4+S0, /* same as F */
00257       ['g']=           NOT_7_NO_DP(S4), /* same as 9 */
00258       ['h']=           S6+S5+S4+S2,
00259       ['i']=           S4,
00260       ['j']=           S1+S2+S3+S4,
00261       ['k']=           S6+S5+S4+S2, /* a h */
00262       ['l']=           S3+S4,
00263       ['m']=           S0+S4+S2, /* same as  */
00264       ['n']=           S2+S4+S6,
00265       ['o']=           S6+S4+S3+S2,
00266       ['p']=           NOT_7_NO_DP(S3+S2), // same as P
00267       ['q']=           S0+S1+S2+S5+S6,
00268       ['r']=           S4+S6,
00269       ['s']=           NOT_7_NO_DP(S1+S4),
00270       ['t']=           NOT_7_NO_DP(S0+S1+S2),
00271       ['u']=           S4+S3+S2+S5+S1, // U
00272       ['v']=           S4+S3+S2, // is u but u use U
00273       ['w']=           S1+S3+S5,
00274       ['x']=           NOT_7_NO_DP(S0+S3), // similar to H
00275       ['y']=           NOT_7_NO_DP(S0+S4),
00276       ['z']=           S0+S1+S6+S4+S3, // same as 2
00277 
00278       ['A']=           NOT_7_NO_DP(S3),
00279       ['B']=           NOT_7_NO_DP(S0+S1), /* as b  */
00280       ['C']=           S0+S3+S4+S5, // same as [
00281       ['E']=           NOT_7_NO_DP(S1+S2),
00282       ['F']=           S6+S5+S4+S0,
00283       ['G']=           NOT_7_NO_DP(S4), /* same as 9 */
00284       ['H']=           NOT_7_NO_DP(S0+S3),
00285       ['I']=           S1+S2,
00286       ['J']=           S1+S2+S3+S4,
00287       ['K']=           NOT_7_NO_DP(S0+S3), /* same as H */
00288       ['L']=           S3+S4+S5,
00289       ['M']=           S0+S4+S2, /* same as  m*/
00290       ['N']=           S2+S4+S6, /* same as n*/
00291       ['O']=           NOT_7_NO_DP(S6),
00292       ['P']=           S0+S1+S2+S5+S6, // sames as 'q'
00293       ['Q']=           NOT_7_NO_DP(S3+S2),
00294       ['R']=           S4+S6,
00295       ['S']=           NOT_7_NO_DP(S1+S4), /* sasme as 5 */
00296       ['T']=           NOT_7_NO_DP(S0+S1+S2), /* sasme as t */
00297       ['U']=           NOT_7_NO_DP(S6+S0),
00298       ['V']=           S4+S3+S2, // is u but u use U
00299       ['W']=           S1+S3+S5,
00300       ['X']=           NOT_7_NO_DP(S0+S3), // similar to H
00301       ['Y']=           NOT_7_NO_DP(S0+S4),
00302       ['Z']=           S0+S1+S6+S4+S3 // same as 2
00303 };
00304 #endif
00305 
00306 
00307 #undef S0
00308 #undef S1
00309 #undef S2
00310 #undef S3
00311 #undef S4
00312 #undef S5
00313 #undef S6
00314 #undef DP
00315 
00316 /** @} */
00317 
00318 //#define DISPLAY_DELAY   1  // in mSec         
00319 
00320 /* Classes -------------------------------------------------------------------*/
00321 /** Class representing Display
00322  */ 
00323 
00324 class Display
00325 {
00326 private:
00327      STMPE1600 &stmpe1600_exp0;
00328      STMPE1600 &stmpe1600_exp1;
00329 public:
00330      /** Constructor
00331      * @param[in] &stmpe_1600 device handler to be used for display control
00332      */    
00333     Display (STMPE1600 &stmpe_1600_exp0, STMPE1600 &stmpe_1600_exp1) : stmpe1600_exp0(stmpe_1600_exp0), stmpe1600_exp1(stmpe_1600_exp1) {
00334         uint16_t ExpanderData;
00335 
00336         // detect the extenders
00337         stmpe1600_exp0.read16bitReg(0x00, &ExpanderData);
00338 //        if (ExpanderData != 0x1600) {/* log - failed to find expander exp0 */ }
00339         stmpe1600_exp1.read16bitReg(0x00, &ExpanderData);
00340 //        if (ExpanderData != 0x1600) {/* log - failed to find expander exp1 */ }
00341 
00342         // configure all necessary GPIO pins as outputs
00343         ExpanderData = 0xFFFF;
00344         stmpe1600_exp0.write16bitReg(GPDR, &ExpanderData);
00345         ExpanderData = 0xBFFF; // leave bit 14 as an input, for the pushbutton, PB1.
00346         stmpe1600_exp1.write16bitReg(GPDR, &ExpanderData);
00347 
00348         // shut down all segment and all device
00349         ExpanderData = 0x7F + (0x7F << 7);
00350         stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData);
00351         stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData);
00352     }
00353      
00354     /*** Interface Methods ***/
00355     /**
00356      * @brief       Print the string on display
00357      * @param[in]   String to be printed
00358      * @param[in]   String lenght [min 1, max 4]
00359      * @return      void
00360      */
00361     void DisplayString (const char *str)
00362     {
00363         uint16_t ExpanderData;
00364         uint32_t Segments;
00365         int BitPos;
00366         int i;
00367 
00368         for( i=0; i<4 && str[i]!=0; i++){
00369             Segments = (uint32_t)ascii_to_display_lut[(uint8_t)str[i]];
00370             Segments =(~Segments)&0x7F;
00371             BitPos=DisplayBitPos[i];
00372             CurIOVal.u32  &=~(0x7F<<BitPos);
00373             CurIOVal.u32  |= Segments<<BitPos;
00374         }
00375         /* clear unused digit */
00376         for( ; i<4;i++){
00377             BitPos=DisplayBitPos[i];
00378             CurIOVal.u32  |=0x7F<<BitPos;
00379         }
00380 
00381 //        stmpe1600_exp0.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[0]);
00382 //        stmpe1600_exp1.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[2]);
00383 
00384 // ordered low-byte/high-byte!
00385         CurIOVal.bytes [1] |= 0xC0; // ensure highest bits are high, as these are xshutdown pins for left & right sensors!
00386         ExpanderData = (CurIOVal.bytes [1] << 8) + CurIOVal.bytes [0];
00387         stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData);
00388         CurIOVal.bytes [3] |= 0x80; // ensure highest bit is high, as this is xshutdown pin on central sensor!
00389         ExpanderData = (CurIOVal.bytes [3] << 8) + CurIOVal.bytes [2];
00390         stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData);
00391 
00392     }
00393 
00394     void ClearDisplay(void)
00395     {
00396         uint16_t ExpanderData;
00397 
00398         ExpanderData = 0x7F + (0x7F << 7);
00399         stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData);
00400         stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData);
00401     }
00402 
00403 };
00404 
00405 #ifdef __cplusplus
00406 }
00407 #endif
00408 #endif // __DISPLAY_H
00409