Librairie adaptée au laboratoire 2
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Revision 56:37d1736bd896, committed 2017-03-13
- Comitter:
- davide.aliprandi@st.com
- Date:
- Mon Mar 13 17:57:03 2017 +0100
- Parent:
- 55:a37f407230ca
- Child:
- 57:fa4c622b04a7
- Commit message:
- Aligning to ARM mbed coding style.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Components/Display/Display.h Mon Mar 13 17:57:03 2017 +0100 @@ -0,0 +1,345 @@ +/** + ****************************************************************************** + * @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 + +#define DP (1<<7) +#define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP ) +#define S0 (1<<0) +#define S1 (1<<1) +#define S2 (1<<2) +#define S3 (1<<3) +#define S4 (1<<4) +#define S5 (1<<5) +#define S6 (1<<6) + +#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 +{ +public: + /** Constructor + * @param[in] &stmpe_1600 device handler to be used for display control + */ + Display(STMPE1600 &stmpe_1600) : stmpe1600(stmpe_1600) { + stmpe1600.setGPIOdir (GPIO_7, OUTPUT); // Digit1 + stmpe1600.setGPIOdir (GPIO_8, OUTPUT); // Digit2 + stmpe1600.setGPIOdir (GPIO_9, OUTPUT); // Digit3 + stmpe1600.setGPIOdir (GPIO_10, OUTPUT); // Digit4 + + stmpe1600.setGPIOdir (GPIO_0, OUTPUT); // SegmentA + stmpe1600.setGPIOdir (GPIO_1, OUTPUT); // SegmentB + stmpe1600.setGPIOdir (GPIO_2, OUTPUT); // SegmentC + stmpe1600.setGPIOdir (GPIO_3, OUTPUT); // SegmentD + stmpe1600.setGPIOdir (GPIO_4, OUTPUT); // SegmentE + stmpe1600.setGPIOdir (GPIO_5, OUTPUT); // SegmentF + stmpe1600.setGPIOdir (GPIO_6, OUTPUT); // SegmentG + } + + /*** 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 (char str[4], char strlen) + { + int i, dgt; + const char *pc; + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + + for (i=0, dgt=4-strlen, pc=str; i<strlen && *pc!=0; i++, pc++, dgt++) { + _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], dgt); + if ( (pc+1)== '.') { + pc++; + } + wait_ms(DISPLAY_DELAY); + stmpe1600.read_16_bit_reg(GPSR_0_7, pdata); + *pdata = *pdata | (uint16_t)0x0780; // all digits off + stmpe1600.write_16_bit_reg(GPSR_0_7, pdata); + } + } + + /** + * @brief Print the digit on display + * @param[in] Digit value to be printed + * @param[in] Digit to be used [min 0, max 3] + * @return void + */ + void DisplayDigit (char *val, char dgt) + { + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + + stmpe1600.read_16_bit_reg(GPSR_0_7, pdata); + *pdata = *pdata | (uint16_t)0x0780; // all digits off + stmpe1600.write_16_bit_reg(GPSR_0_7, pdata); + _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt); + } + +private: + void _V2_Set7Segment( int Leds, int digit ) + { + //Digits_off(); + uint16_t dgt; + dgt = 1<<digit; + dgt = ((uint16_t)dgt)<<7; + dgt = ~dgt; + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + + + /* set the exppinname state to lvl */ + stmpe1600.read_16_bit_reg(GPSR_0_7, pdata); + *pdata = *pdata | (uint16_t)0x007F; // 7 segments off + stmpe1600.write_16_bit_reg(GPSR_0_7, pdata); + + int mask=1; + for (int i=0; i<7; i++) { + if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask; + mask = mask<<1; + } + *pdata = *pdata & dgt; + stmpe1600.write_16_bit_reg(GPSR_0_7, pdata); + } + STMPE1600 &stmpe1600; +}; + +#ifdef __cplusplus +} +#endif +#endif // __DISPLAY_H
--- a/Components/Display/Display_class.h Fri Mar 03 15:06:18 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,346 +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 - -#define DP (1<<7) -#define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP ) -#define S0 (1<<0) -#define S1 (1<<1) -#define S2 (1<<2) -#define S3 (1<<3) -#define S4 (1<<4) -#define S5 (1<<5) -#define S6 (1<<6) - -#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 -{ - public: - /** Constructor - * @param[in] &stmpe_1600 device handler to be used for display control - */ - Display(STMPE1600 &stmpe_1600) : stmpe1600(stmpe_1600) { - stmpe1600.setGPIOdir (GPIO_7, OUTPUT); // Digit1 - stmpe1600.setGPIOdir (GPIO_8, OUTPUT); // Digit2 - stmpe1600.setGPIOdir (GPIO_9, OUTPUT); // Digit3 - stmpe1600.setGPIOdir (GPIO_10, OUTPUT); // Digit4 - - stmpe1600.setGPIOdir (GPIO_0, OUTPUT); // SegmentA - stmpe1600.setGPIOdir (GPIO_1, OUTPUT); // SegmentB - stmpe1600.setGPIOdir (GPIO_2, OUTPUT); // SegmentC - stmpe1600.setGPIOdir (GPIO_3, OUTPUT); // SegmentD - stmpe1600.setGPIOdir (GPIO_4, OUTPUT); // SegmentE - stmpe1600.setGPIOdir (GPIO_5, OUTPUT); // SegmentF - stmpe1600.setGPIOdir (GPIO_6, OUTPUT); // SegmentG - } - - /*** 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 DisplayString (char str[4], char strlen) - { - int i, dgt; - const char *pc; - uint8_t data[2]; - uint16_t *pdata = (uint16_t*)data; - - for(i=0, dgt=4-strlen, pc=str; i<strlen && *pc!=0; i++, pc++, dgt++) - { - _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], dgt); - if( *(pc+1)== '.') - { - pc++; - } - wait_ms(DISPLAY_DELAY); - stmpe1600.read16bitReg(GPSR_0_7, pdata); - *pdata = *pdata | (uint16_t)0x0780; // all digits off - stmpe1600.write16bitReg(GPSR_0_7, pdata); - } - - } - - /** - * @brief Print the digit on display - * @param[in] Digit value to be printed - * @param[in] Digit to be used [min 0, max 3] - * @return void - */ - void DisplayDigit (char *val, char dgt) - { - uint8_t data[2]; - uint16_t *pdata = (uint16_t*)data; - - stmpe1600.read16bitReg(GPSR_0_7, pdata); - *pdata = *pdata | (uint16_t)0x0780; // all digits off - stmpe1600.write16bitReg(GPSR_0_7, pdata); - _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt); - } - -private: - void _V2_Set7Segment( int Leds, int digit ) - { - //Digits_off(); - uint16_t dgt; - dgt = 1<<digit; - dgt = ((uint16_t)dgt)<<7; - dgt = ~dgt; - uint8_t data[2]; - uint16_t *pdata = (uint16_t*)data; - - - /* set the exppinname state to lvl */ - stmpe1600.read16bitReg(GPSR_0_7, pdata); - *pdata = *pdata | (uint16_t)0x007F; // 7 segments off - stmpe1600.write16bitReg(GPSR_0_7, pdata); - - int mask=1; - for (int i=0; i<7; i++) - { - if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask; - mask = mask<<1; - } - *pdata = *pdata & dgt; - stmpe1600.write16bitReg(GPSR_0_7, pdata); - } - STMPE1600 &stmpe1600; -}; - -#ifdef __cplusplus -} -#endif -#endif // __DISPLAY_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Components/STMPE1600/Stmpe1600.h Mon Mar 13 17:57:03 2017 +0100 @@ -0,0 +1,326 @@ +/** + ****************************************************************************** + * @file Stmpe1600.h + * @author AST / EST + * @version V0.0.1 + * @date 14-April-2015 + * @brief Header file for component stmpe1600 + ****************************************************************************** + * @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 __Stmpe1600_CLASS +#define __Stmpe1600_CLASS +/* Includes ------------------------------------------------------------------*/ +#include "DevI2C.h" + +#define STMPE1600_DEF_DEVICE_ADDRESS (uint8_t)0x42*2 +#define STMPE1600_DEF_DIGIOUT_LVL 1 + +/** Stmpe1600 registr map **/ +#define ChipID_0_7 (uint8_t)0x00 +#define ChipID_8_15 (uint8_t)0x01 +#define VersionId (uint8_t)0x02 +#define SYS_CTRL (uint8_t)0x03 +#define IEGPIOR_0_7 (uint8_t)0x08 +#define IEGPIOR_8_15 (uint8_t)0x09 +#define ISGPIOR_0_7 (uint8_t)0x0A +#define ISGPIOR_8_15 (uint8_t)0x0B +#define GPMR_0_7 (uint8_t)0x10 +#define GPMR_8_15 (uint8_t)0x11 +#define GPSR_0_7 (uint8_t)0x12 +#define GPSR_8_15 (uint8_t)0x13 +#define GPDR_0_7 (uint8_t)0x14 +#define GPDR_8_15 (uint8_t)0x15 +#define GPIR_0_7 (uint8_t)0x16 +#define GPIR_8_15 (uint8_t)0x17 + +#define SOFT_RESET (uint8_t)0x80 + +typedef enum { + // GPIO Expander pin names + GPIO_0=0, + GPIO_1, + GPIO_2, + GPIO_3, + GPIO_4, + GPIO_5, + GPIO_6, + GPIO_7, + GPIO_8, + GPIO_9, + GPIO_10, + GPIO_11, + GPIO_12, + GPIO_13, + GPIO_14, + GPIO_15, + NOT_CON +} exp_gpio_pin_name; + +typedef enum { + INPUT = 0, + OUTPUT, + NOT_CONNECTED +} exp_gpio_pin_direction; + + +/* Classes -------------------------------------------------------------------*/ + +/** + * Class representing a single stmpe1600 GPIO expander output pin + */ +class Stmpe1600DigiOut { +public: + /** Constructor + * @param[in] &i2c device I2C to be used for communication + * @param[in] outpinname the desired out pin name to be created + * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) + * @param[in] lvl the default ot pin level + */ + Stmpe1600DigiOut (DevI2C &i2c, ExpGpioPinName outpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS, bool lvl=STMPE1600_DEF_DIGIOUT_LVL): + _dev_i2c(i2c), + _expdevaddr(DevAddr), + _exppinname(outpinname) + { + uint8_t data[2]; + if (_exppinname == NOT_CON) { + return; + } + /* set the _exppinname as output */ + _dev_i2c.i2c_read(data, _expdevaddr, GPDR_0_7, 1); + _dev_i2c.i2c_read(&data[1], _expdevaddr, GPDR_8_15, 1); + *(uint16_t*)data = *(uint16_t*)data | (1<<(uint16_t)_exppinname); // set gpio as out + _dev_i2c.i2c_write(data, _expdevaddr, GPDR_0_7, 1); + _dev_i2c.i2c_write(&data[1], _expdevaddr, GPDR_8_15, 1); + write (lvl); + } + + /** + * @brief Write on the out pin + * @param[in] lvl level to write + * @return 0 on Success + */ + void write (int lvl) + { + uint8_t data[2]; + if (_exppinname == NOT_CON) return; + /* set the _exppinname state to lvl */ + _dev_i2c.i2c_read(data, _expdevaddr, GPSR_0_7, 2); + *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t)_exppinname)); // set pin mask + if (lvl) *(uint16_t*)data = *(uint16_t*)data | (uint16_t)(1<<(uint16_t)_exppinname); + _dev_i2c.i2c_write(data, _expdevaddr, GPSR_0_7, 2); + } + + /** + * @brief Overload assignement operator + */ + Stmpe1600DigiOut& operator=(int lvl) + { + write (lvl); + return *this; + } + +private: + DevI2C &_dev_i2c; + uint8_t _expdevaddr; + ExpGpioPinName _exppinname; +}; + +/* Classes -------------------------------------------------------------------*/ +/** Class representing a single stmpe1600 GPIO expander input pin + */ +class Stmpe1600DigiIn +{ +public: + /** Constructor + * @param[in] &i2c device I2C to be used for communication + * @param[in] inpinname the desired input pin name to be created + * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) + */ + Stmpe1600DigiIn (DevI2C &i2c, ExpGpioPinName inpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS): _dev_i2c(i2c), _expdevaddr(DevAddr), _exppinname(inpinname) + { + uint8_t data[2]; + if (_exppinname == NOT_CON) return; + /* set the _exppinname as input pin direction */ + _dev_i2c.i2c_read(data, _expdevaddr, GPDR_0_7, 2); + *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t) _exppinname)); // set gpio as in + _dev_i2c.i2c_write(data, _expdevaddr, GPDR_0_7, 2); + } + + /** + * @brief Read the input pin + * @return The pin logical state 0 or 1 + */ + bool read () { + uint8_t data[2]; + if (_exppinname == NOT_CON) { + return 0; + } + + /* read the _exppinname */ + _dev_i2c.i2c_read(data, _expdevaddr, GPMR_0_7, 2); + *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(1<<(uint16_t)_exppinname); // mask the in gpio + + if (data[0] || data[1]) { + return 1; + } + return 0; + } + + operator int() { + return read(); + } + +private: + DevI2C &_dev_i2c; + uint8_t _expdevaddr; + ExpGpioPinName _exppinname; +}; + + +/* Classes -------------------------------------------------------------------*/ + +/** + * Class representing a whole stmpe1600 component (16 gpio) + */ +class Stmpe1600 { +public: + /** Constructor + * @param[in] &i2c device I2C to be used for communication + * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) + */ + Stmpe1600 (DevI2C &i2c, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS ) : _dev_i2c(i2c) + { + _dev_i2c = i2c; + _expdevaddr = DevAddr; + write_sys_ctrl (SOFT_RESET); + + _gpdro_15 = (uint16_t)0; // gpio dir all IN + _write_16_bit_reg (GPDR_0_7, &_gpdro_15); + _gpsro_15 = (uint16_t)0x0ffff; // gpio status all 1 + _write_16_bit_reg (GPSR_0_7, &_gpsro_15); + } + + /** + * @brief Write the SYS_CTRL register + * @param[in] Data to be written (bit fields) + */ + void write_sys_ctrl (uint8_t data) // data = SOFT_RESET reset the device + { + _dev_i2c.i2c_write((uint8_t*)SYS_CTRL, _expdevaddr, data, 1); + } + + /** + * @brief Set the out pin + * @param[in] The pin name + * @return 0 on Success + */ + bool set_gpio (ExpGpioPinName pin_name) + { + if (pin_name == NOT_CON) return true; + _gpsro_15 = _gpsro_15 | ((uint16_t)0x0001<<pin_name); + _write_16_bit_reg (GPSR_0_7 , &_gpsro_15); + return false; + } + + /** + * @brief Clear the out pin + * @param[in] The pin name + * @return 0 on Success + */ + bool clr_gpio (ExpGpioPinName pin_name) + { + if (pin_name == NOT_CON) return true; + _gpsro_15 = _gpsro_15 & (~((uint16_t)0x0001<<pin_name)); + (GPSR_0_7 , &_gpsro_15); + return false; + } + + /** + * @brief Read the input pin + * @param[in] The pin name + * @return The logical pin level + */ + bool rd_gpio (ExpGpioPinName pin_name) + { + uint16_t gpmr0_15; + if (pin_name == NOT_CON) return true; + _read_16_bit_reg (GPMR_0_7, &gpmr0_15); + gpmr0_15 = gpmr0_15 & ((uint16_t)0x0001<<pin_name); + if (gpmr0_15) { + return true; + } + return false; + } + + /** + * @brief Set the pin direction + * @param[in] The pin name + * @param[in] The pin direction + * @return 0 on success + */ + bool _set_gpio_dir (ExpGpioPinName pin_name, exp_gpio_pin_direction pin_dir) + { + if (pin_name == NOT_CON || pin_dir == NOT_CONNECTED) { + return true; + } + _gpdro_15 = _gpdro_15 & (~((uint16_t)0x0001<<pin_name)); // clear the Pin + _gpdro_15 = _gpdro_15 | ((uint16_t)pin_dir<<pin_name); + _write_16_bit_reg (GPDR_0_7 , &_gpdro_15); + return false; + } + + /** + * @brief Read a 16 bits register + * @param[in] The register address + * @param[in] The pointer to the read data + */ + void _read_16_bit_reg (uint8_t reg_16_addr, uint16_t *reg_16_data) + { + _dev_i2c.i2c_read((uint8_t*)reg_16_data, _expdevaddr, reg_16_addr, 2); + } + + /** + * @brief Write a 16 bits register + * @param[in] The register address + * @param[in] The pointer to the data to be written + */ + void _write_16_bit_reg (uint8_t reg_16_addr, uint16_t *reg_16_data) + { + _dev_i2c.i2c_write((uint8_t*)reg_16_data, _expdevaddr, reg_16_addr, 2); + } + +private: + DevI2C &_dev_i2c; + uint16_t _gpdro_15; // local copy of bit direction reg + uint16_t _gpsro_15; // local copy of bit status reg + uint8_t _expdevaddr; // expander device i2c addr +}; + +#endif // __Stmpe1600_CLASS
--- a/Components/STMPE1600/stmpe1600_class.h Fri Mar 03 15:06:18 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,309 +0,0 @@ -/** - ****************************************************************************** - * @file stmpe1600_class.h - * @author AST / EST - * @version V0.0.1 - * @date 14-April-2015 - * @brief Header file for component stmpe1600 - ****************************************************************************** - * @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 __STMPE1600_CLASS -#define __STMPE1600_CLASS -/* Includes ------------------------------------------------------------------*/ -#include "DevI2C.h" - -#define STMPE1600_DEF_DEVICE_ADDRESS (uint8_t)0x42*2 -#define STMPE1600_DEF_DIGIOUT_LVL 1 - -/** STMPE1600 registr map **/ -#define ChipID_0_7 (uint8_t)0x00 -#define ChipID_8_15 (uint8_t)0x01 -#define VersionId (uint8_t)0x02 -#define SYS_CTRL (uint8_t)0x03 -#define IEGPIOR_0_7 (uint8_t)0x08 -#define IEGPIOR_8_15 (uint8_t)0x09 -#define ISGPIOR_0_7 (uint8_t)0x0A -#define ISGPIOR_8_15 (uint8_t)0x0B -#define GPMR_0_7 (uint8_t)0x10 -#define GPMR_8_15 (uint8_t)0x11 -#define GPSR_0_7 (uint8_t)0x12 -#define GPSR_8_15 (uint8_t)0x13 -#define GPDR_0_7 (uint8_t)0x14 -#define GPDR_8_15 (uint8_t)0x15 -#define GPIR_0_7 (uint8_t)0x16 -#define GPIR_8_15 (uint8_t)0x17 - -#define SOFT_RESET (uint8_t)0x80 - - typedef enum { - // GPIO Expander pin names - GPIO_0=0, - GPIO_1, - GPIO_2, - GPIO_3, - GPIO_4, - GPIO_5, - GPIO_6, - GPIO_7, - GPIO_8, - GPIO_9, - GPIO_10, - GPIO_11, - GPIO_12, - GPIO_13, - GPIO_14, - GPIO_15, - NOT_CON -} ExpGpioPinName; - -typedef enum { - INPUT = 0, - OUTPUT, - NOT_CONNECTED -}ExpGpioPinDirection; - -/* Classes -------------------------------------------------------------------*/ -/** Class representing a single stmpe1600 GPIO expander output pin - */ -class STMPE1600DigiOut { - - public: - /** Constructor - * @param[in] &i2c device I2C to be used for communication - * @param[in] outpinname the desired out pin name to be created - * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) - * @param[in] lvl the default ot pin level - */ - STMPE1600DigiOut (DevI2C &i2c, ExpGpioPinName outpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS, bool lvl=STMPE1600_DEF_DIGIOUT_LVL): dev_i2c(i2c), expdevaddr(DevAddr), exppinname(outpinname) - { - uint8_t data[2]; - if (exppinname == NOT_CON) return; - /* set the exppinname as output */ - dev_i2c.i2c_read(data, expdevaddr, GPDR_0_7, 1); - dev_i2c.i2c_read(&data[1], expdevaddr, GPDR_8_15, 1); - *(uint16_t*)data = *(uint16_t*)data | (1<<(uint16_t)exppinname); // set gpio as out - dev_i2c.i2c_write(data, expdevaddr, GPDR_0_7, 1); - dev_i2c.i2c_write(&data[1], expdevaddr, GPDR_8_15, 1); - write(lvl); - } - - /** - * @brief Write on the out pin - * @param[in] lvl level to write - * @return 0 on Success - */ - void write (int lvl) - { - uint8_t data[2]; - if (exppinname == NOT_CON) return; - /* set the exppinname state to lvl */ - dev_i2c.i2c_read(data, expdevaddr, GPSR_0_7, 2); - *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t)exppinname)); // set pin mask - if (lvl) *(uint16_t*)data = *(uint16_t*)data | (uint16_t)(1<<(uint16_t)exppinname); - dev_i2c.i2c_write(data, expdevaddr, GPSR_0_7, 2); - } - - /** - * @brief Overload assignement operator - */ - STMPE1600DigiOut& operator=(int lvl) - { - write (lvl); - return *this; - } - - private: - DevI2C &dev_i2c; - uint8_t expdevaddr; - ExpGpioPinName exppinname; -}; - -/* Classes -------------------------------------------------------------------*/ -/** Class representing a single stmpe1600 GPIO expander input pin - */ -class STMPE1600DigiIn -{ - public: - /** Constructor - * @param[in] &i2c device I2C to be used for communication - * @param[in] inpinname the desired input pin name to be created - * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) - */ - STMPE1600DigiIn (DevI2C &i2c, ExpGpioPinName inpinname, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS): dev_i2c(i2c), expdevaddr(DevAddr), exppinname(inpinname) - { - uint8_t data[2]; - if (exppinname == NOT_CON) return; - /* set the exppinname as input pin direction */ - dev_i2c.i2c_read(data, expdevaddr, GPDR_0_7, 2); - *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(~(1<<(uint16_t)exppinname)); // set gpio as in - dev_i2c.i2c_write(data, expdevaddr, GPDR_0_7, 2); - } - - /** - * @brief Read the input pin - * @return The pin logical state 0 or 1 - */ - bool read () - { - uint8_t data[2]; - if (exppinname == NOT_CON) return 0; - /* read the exppinname */ - dev_i2c.i2c_read(data, expdevaddr, GPMR_0_7, 2); - *(uint16_t*)data = *(uint16_t*)data & (uint16_t)(1<<(uint16_t)exppinname); // mask the in gpio - if (data[0] || data[1]) return 1; - return 0; - } - - operator int() - { - return read(); - } - - private: - DevI2C &dev_i2c; - uint8_t expdevaddr; - ExpGpioPinName exppinname; -}; - -/* Classes -------------------------------------------------------------------*/ -/** Class representing a whole stmpe1600 component (16 gpio) - */ -class STMPE1600 { - - public: - /** Constructor - * @param[in] &i2c device I2C to be used for communication - * @param[in] DevAddr the stmpe1600 I2C device addres (deft STMPE1600_DEF_DEVICE_ADDRESS) - */ - STMPE1600 (DevI2C &i2c, uint8_t DevAddr=STMPE1600_DEF_DEVICE_ADDRESS ) : dev_i2c(i2c) - { - dev_i2c = i2c; - expdevaddr = DevAddr; - writeSYS_CTRL (SOFT_RESET); - - GPDR0_15 = (uint16_t)0; // gpio dir all IN - write16bitReg (GPDR_0_7, &GPDR0_15); - GPSR0_15 = (uint16_t)0x0ffff; // gpio status all 1 - write16bitReg (GPSR_0_7, &GPSR0_15); - } - - /** - * @brief Write the SYS_CTRL register - * @param[in] Data to be written (bit fields) - */ - void writeSYS_CTRL (uint8_t data) // data = SOFT_RESET reset the device - { - dev_i2c.i2c_write((uint8_t*)SYS_CTRL, expdevaddr, data, 1); - } - - /** - * @brief Set the out pin - * @param[in] The pin name - * @return 0 on Success - */ - bool setGPIO (ExpGpioPinName PinName) - { - if (PinName == NOT_CON) return true; - GPSR0_15 = GPSR0_15 | ((uint16_t)0x0001<<PinName); - write16bitReg (GPSR_0_7 , &GPSR0_15); - return false; - } - - /** - * @brief Clear the out pin - * @param[in] The pin name - * @return 0 on Success - */ - bool clrGPIO (ExpGpioPinName PinName) - { - if (PinName == NOT_CON) return true; - GPSR0_15 = GPSR0_15 & (~((uint16_t)0x0001<<PinName)); - write16bitReg (GPSR_0_7 , &GPSR0_15); - return false; - } - - /** - * @brief Read the input pin - * @param[in] The pin name - * @return The logical pin level - */ - bool rdGPIO (ExpGpioPinName PinName) - { - uint16_t gpmr0_15; - if (PinName == NOT_CON) return true; - read16bitReg (GPMR_0_7, &gpmr0_15); - gpmr0_15 = gpmr0_15 & ((uint16_t)0x0001<<PinName); - if (gpmr0_15) return true; - return false; - } - - /** - * @brief Set the pin direction - * @param[in] The pin name - * @param[in] The pin direction - * @return 0 on success - */ - bool setGPIOdir (ExpGpioPinName PinName, ExpGpioPinDirection PinDir) - { - if (PinName == NOT_CON || PinDir == NOT_CONNECTED) return true; - GPDR0_15 = GPDR0_15 & (~((uint16_t)0x0001<<PinName)); // clear the Pin - GPDR0_15 = GPDR0_15 | ((uint16_t)PinDir<<PinName); - write16bitReg (GPDR_0_7 , &GPDR0_15); - return false; - } - - /** - * @brief Read a 16 bits register - * @param[in] The register address - * @param[in] The pointer to the read data - */ - void read16bitReg (uint8_t Reg16Addr, uint16_t *Reg16Data) - { - dev_i2c.i2c_read((uint8_t*)Reg16Data, expdevaddr, Reg16Addr, 2); - } - - /** - * @brief Write a 16 bits register - * @param[in] The register address - * @param[in] The pointer to the data to be written - */ - void write16bitReg (uint8_t Reg16Addr, uint16_t *Reg16Data) - { - dev_i2c.i2c_write((uint8_t*)Reg16Data, expdevaddr, Reg16Addr, 2); - } - - private: - DevI2C &dev_i2c; - uint16_t GPDR0_15; // local copy of bit direction reg - uint16_t GPSR0_15; // local copy of bit status reg - uint8_t expdevaddr; // expander device i2c addr -}; - -#endif // __STMPE1600_CLASS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Components/Switch/Switch.h Mon Mar 13 17:57:03 2017 +0100 @@ -0,0 +1,87 @@ +/** + ****************************************************************************** + * @file Switch.h + * @author AST / EST + * @version V0.0.1 + * @date 14-April-2015 + * @brief Header file for red switch + ****************************************************************************** + * @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 __SWITCH_H +#define __SWITCH_H + + +/* Includes ------------------------------------------------------------------*/ + +#include "mbed.h" +#include "Stmpe1600.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + RANGE = 0, + ALS +} SwitchState; + + +/* Classes -------------------------------------------------------------------*/ + +/** + * Class representing Red Switch + */ + +class Switch +{ +public: + Switch(STMPE1600 &stmpe_1600, ExpGpioPinName Pin_Name=GPIO_11) : stmpe1600(stmpe_1600), PinName(Pin_Name) { + stmpe1600.set_gpio_dir(PinName, INPUT); + } + + bool rd_switch () { + return stmpe1600.rd_gpio(PinName); + } + + operator int() { + return rd_switch(); + } + + private: + STMPE1600 &stmpe1600; + ExpGpioPinName PinName; +}; + +#ifdef __cplusplus +} +#endif +#endif // __SWITCH_H
--- a/Components/Switch/Switch_class.h Fri Mar 03 15:06:18 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/** - ****************************************************************************** - * @file Switch_class.h - * @author AST / EST - * @version V0.0.1 - * @date 14-April-2015 - * @brief Header file for red switch - ****************************************************************************** - * @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 __SWITCH_H -#define __SWITCH_H - -/* Includes ------------------------------------------------------------------*/ -#include "mbed.h" -#include "stmpe1600_class.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - RANGE = 0, - ALS -}SwitchState; - -/* Classes -------------------------------------------------------------------*/ -/** Class representing Red Switch - */ - -class SWITCH -{ - public: - SWITCH(STMPE1600 &stmpe_1600, ExpGpioPinName Pin_Name=GPIO_11) : stmpe1600(stmpe_1600), PinName(Pin_Name) { - stmpe1600.setGPIOdir(PinName, INPUT); - } - - bool RdSwitch () { - return stmpe1600.rdGPIO(PinName); - } - - operator int() - { - return RdSwitch(); - } - - private: - STMPE1600 &stmpe1600; - ExpGpioPinName PinName; -}; - -#ifdef __cplusplus -} -#endif -#endif // __SWITCH_H \ No newline at end of file
--- a/Components/VL6180X/vl6180x_class.h Fri Mar 03 15:06:18 2017 +0000 +++ b/Components/VL6180X/vl6180x_class.h Mon Mar 13 17:57:03 2017 +0100 @@ -218,7 +218,7 @@ * @brief Disable interrupt measure IRQ * @return 0 on Success */ - void DisableInterruptMeasureDetectionIRQ(void) + void disable_interrupt_measure_detection_irq(void) { if (gpio1Int != NULL) gpio1Int->disable_irq(); }
--- a/Components/VL6180X/vl6180x_platform.h Fri Mar 03 15:06:18 2017 +0000 +++ b/Components/VL6180X/vl6180x_platform.h Mon Mar 13 17:57:03 2017 +0100 @@ -29,9 +29,9 @@ #include "vl6180x_def.h" -#define VL6180x_SINGLE_DEVICE_DRIVER 0 +#define VL6180x_SINGLE_DEVICE_DRIVER 0 #define VL6180x_RANGE_STATUS_ERRSTRING 1 -#define VL6180X_SAFE_POLLING_ENTER 0 +#define VL6180X_SAFE_POLLING_ENTER 0 #define VL6180X_LOG_ENABLE 0 #define MY_LOG 1 @@ -58,15 +58,15 @@ trace_printf("beg %s start @%d\t" fmt "\n", __func__, LOG_GET_TIME(), ##__VA_ARGS__) #define LOG_FUNCTION_END(status)\ - trace_printf("end %s @%d %d\n", __func__, LOG_GET_TIME(), (int)status) + trace_printf("end %s @%d %d\n", __func__, LOG_GET_TIME(), (int)status) #define LOG_FUNCTION_END_FMT(status, fmt, ... )\ - trace_printf("End %s @%d %d\t"fmt"\n" , __func__, LOG_GET_TIME(), (int)status, ##__VA_ARGS__) + trace_printf("End %s @%d %d\t"fmt"\n" , __func__, LOG_GET_TIME(), (int)status, ##__VA_ARGS__) #define VL6180x_ErrLog(msg, ... )\ - do{\ + do {\ trace_printf("ERR in %s line %d\n" msg, __func__, __LINE__, ##__VA_ARGS__);\ - }while(0) + } while(0) #else /* VL6180X_LOG_ENABLE no logging */ //void OnErrLog(void); @@ -76,13 +76,11 @@ #define VL6180x_ErrLog(... ) //OnErrLog() //(void)0 #endif - #ifdef MY_LOG /* define printf as pc.printf in order to change the baudrate */ extern Serial pc; #define printf(...) pc.printf(__VA_ARGS__) #endif - #if VL6180x_SINGLE_DEVICE_DRIVER #error "VL6180x_SINGLE_DEVICE_DRIVER must be set" #endif @@ -101,8 +99,4 @@ #define VL6180xDevDataGet(dev, field) (dev->Data.field) #define VL6180xDevDataSet(dev, field, data) (dev->Data.field)=(data) - #endif /* VL6180x_PLATFORM */ - - -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XNucleo6180xa1.cpp Mon Mar 13 17:57:03 2017 +0100 @@ -0,0 +1,172 @@ +/** + ****************************************************************************** + * @file XNucleo6180xa1.cpp + * @author AST / EST + * @version V0.0.1 + * @date 13-April-2015 + * @brief Implementation file for the X_NUCLEO_VL6180XA1 singleton class + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ + +#include "XNucleo6180xa1.h" + + +/* Static variables ----------------------------------------------------------*/ + +XNucleo6180xa1 *XNucleo6180xa1::_instance = NULL; + + +/* Methods -------------------------------------------------------------------*/ + +XNucleo6180xa1 *XNucleo6180xa1::instance(DevI2C *ext_i2c) +{ + if (_instance==NULL) { + _instance=new X_NUCLEO_6180XA1(ext_i2c); + } else { + VL6180x_ErrLog("Failed to create X_NUCLEO_6180XA1 instance\n\r"); + } + return _instance; +} + +XNucleo6180xa1 *XNucleo6180xa1::instance(DevI2C *ext_i2c, + PinName gpio1_top, PinName gpio1_bottom, + PinName gpio1_left, PinName gpio1_right) +{ + if (_instance==NULL) { + //_instance=new X_NUCLEO_6180XA1(ext_i2c); + _instance=new X_NUCLEO_6180XA1(ext_i2c, gpio1_top, gpio1_bottom, gpio1_left, gpio1_right); + } else { + VL6180x_ErrLog("Failed to create X_NUCLEO_6180XA1 instance\n\r"); + } + return _instance; +} + +int XNucleo6180xa1::init_board() +{ + int status, n_dev=0; uint8_t sensor_address; + + if (sensor_top) { + sensor_top->VL6180x_Off(); + } + if (sensor_bottom) { + sensor_bottom->VL6180x_Off(); + } + if (sensor_left) { + sensor_left->VL6180x_Off(); + } + if (sensor_right) { + sensor_right->VL6180x_Off(); + } + + sensor_address = NEW_SENSOR_TOP_ADDRESS; + status=sensor_top->init(&sensor_address); + if (status) { + printf("Error: Mandatory top sensor fail, Init failed!\n\r"); + if (sensor_top !=NULL) { + delete sensor_top; + sensor_top=NULL; + } + if (sensor_left !=NULL) { + delete sensor_left; + sensor_left=NULL; + } + if (sensor_bottom !=NULL) { + delete sensor_bottom; + sensor_bottom=NULL; + } + if (sensor_right !=NULL) { + delete sensor_right; + sensor_right=NULL; + } + n_dev=0; + return 1; + } else { + printf("Sensor top present\n\r"); + n_dev++; + } + + sensor_address = NEW_SENSOR_BOTTOM_ADDRESS; + status=1; + if (sensor_bottom) { + status=sensor_bottom->init(&sensor_address); + } + if (status) + { + printf("Sensor bottom not present\n\r"); + if (sensor_bottom !=NULL) { + delete sensor_bottom; + sensor_bottom=NULL; + } + } else { + printf("Sensor bottom present\n\r"); + n_dev++; + } + + sensor_address = NEW_SENSOR_LEFT_ADDRESS; + status=1; + if (sensor_left) { + status=sensor_left->init(&sensor_address); + } + if (status) { + printf("Sensor left not present\n\r"); + if (sensor_left !=NULL) { + delete sensor_left; + sensor_left=NULL; + } + } else { + printf("Sensor left present\n\r"); + n_dev++; + } + + sensor_address = NEW_SENSOR_RIGHT_ADDRESS; + status=1; + if (sensor_right) { + status=sensor_right->init(&sensor_address); + } + if (status) { + printf("Sensor right not present\n\r"); + if (sensor_right!=NULL) { + delete sensor_right; + sensor_right=NULL; + } + } else { + printf("Sensor right present\n\r"); + n_dev++; + } + + if (n_dev==0) { + return 1; + } else { + return 0; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XNucleo6180xa1.h Mon Mar 13 17:57:03 2017 +0100 @@ -0,0 +1,236 @@ +/** + ****************************************************************************** + * @file XNucleo6180xa1.h + * @author AST / EST + * @version V0.0.1 + * @date 13-April-2015 + * @brief Header file for class X_NUCLEO_6180XA1 representing a X-NUCLEO-6180XA1 + * expansion board + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent from recursive inclusion --------------------------------*/ + +#ifndef __X_NUCLEO_6180XA1_H +#define __X_NUCLEO_6180XA1_H + + +/* Includes ------------------------------------------------------------------*/ + +#include "mbed.h" +#include "vl6180x_class.h" +#include "Display_class.h" +#include "stmpe1600_class.h" +#include "DevI2C.h" +#include "Switch_class.h" + +/** New device addresses */ +#define NEW_SENSOR_TOP_ADDRESS 0x10 +#define NEW_SENSOR_BOTTOM_ADDRESS 0x11 +#define NEW_SENSOR_LEFT_ADDRESS 0x12 +#define NEW_SENSOR_RIGHT_ADDRESS 0x13 + + +/* Classes--------------------------------------------------------------------*/ + +/** + * Class representing the X-NUCLEO-VL6180XA1 expansion board singleton obj + */ +class XNucleo6180xa1 +{ +protected: + /** Constructor 1 + * @brief x_nucleo_6180xa1 board Constructor. Default the INT gpio \ + * configuration as the electrical schematic. Self sensing for optional \ + * expansion sensors (L/B/R). + * @param[in] &i2c device I2C to be used for communication + */ + XNucleo6180xa1(DevI2C *ext_i2c) : dev_i2c(ext_i2c) + { + stmpe1600 = new STMPE1600(*ext_i2c); + stmpe1600->writeSYS_CTRL (SOFT_RESET); + Switch = new SWITCH (*stmpe1600, GPIO_11); + display = new Display(*stmpe1600); + + _gpio0_top=new STMPE1600DigiOut(*dev_i2c, GPIO_12); + sensor_top=new VL6180X(*dev_i2c, *_gpio0_top, A3); + + _gpio0_bottom=new STMPE1600DigiOut(*dev_i2c, GPIO_13); + sensor_bottom=new VL6180X(*dev_i2c, *_gpio0_bottom, A2); + + _gpio0_left=new STMPE1600DigiOut(*dev_i2c, GPIO_14); + sensor_left=new VL6180X(*dev_i2c, *_gpio0_left, D13); + + _gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15); + sensor_right=new VL6180X(*dev_i2c, *_gpio0_right, D2); + + if (init_board()) { // init failed + printf ("ERROR Init X-NUCLEO-6180XA1 Board\n\r"); + } + } + + /** Constructor 2 + * @param[in] &i2c device I2C to be used for communication + * @param[in] PinName gpio1_top Mbed DigitalOut pin name to be used as a top sensor GPIO_1 INT + * @param[in] PinName gpio1_bottom Mbed DigitalOut pin name to be used as a bottom sensor GPIO_1 INT + * @param[in] PinName gpio1_left Mbed DigitalOut pin name to be used as a left sensor GPIO_1 INT + * @param[in] PinName gpio1_right Mbed DigitalOut pin name to be used as a right sensor GPIO_1 INT + */ + XNucleo6180xa1(DevI2C *ext_i2c, PinName gpio1_top, PinName gpio1_bottom, + PinName gpio1_left, PinName gpio1_right) : dev_i2c(ext_i2c) { + stmpe1600 = new STMPE1600(*ext_i2c); + stmpe1600->writeSYS_CTRL (SOFT_RESET); + Switch = new SWITCH (*stmpe1600, GPIO_11); + display = new Display(*stmpe1600); + + _gpio0_top=new STMPE1600DigiOut(*dev_i2c, GPIO_12); + sensor_top=new VL6180X(*dev_i2c, *_gpio0_top, gpio1_top); + + _gpio0_bottom=new STMPE1600DigiOut(*dev_i2c, GPIO_13); + sensor_bottom=new VL6180X(*dev_i2c, *_gpio0_bottom, gpio1_bottom); + + _gpio0_left=new STMPE1600DigiOut(*dev_i2c, GPIO_14); + sensor_left=new VL6180X(*dev_i2c, *_gpio0_left, gpio1_left); + + _gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15); + sensor_right=new VL6180X(*dev_i2c, *_gpio0_right, gpio1_right); + } + + /** + * @brief Override default copy constructor as empty + * @param[in] &XNucleo6180xa1 singleton object reference + * @return + */ + XNucleo6180xa1() {}; + + /** + * @brief Override default assignement operator to avoid multiple singletons + * @param[in] &XNucleo6180xa1 singleton object reference + * @return + */ + void operator = (const XNucleo6180xa1&); + +public: + /** + * @brief Creates a singleton object instance + * @param[in] &i2c device I2C to be used for communication + * @return Pointer to the object instance + */ + static XNucleo6180xa1 *instance(DevI2C *ext_i2c); + + /** + * @brief Creates a singleton object instance + * @param[in] &i2c device I2C to be used for communication + * @param[in] PinName gpio1_top the pin connected to top sensor INT + * @param[in] PinName gpio1_bottem the pin connected to bottom sensor INT + * @param[in] PinName gpio1_left the pin connected to left sensor INT + * @param[in] PinName gpio1_right the pin connected to right sensor INT + * @return Pointer to the object instance + */ + static XNucleo6180xa1 *instance(DevI2C *ext_i2c, PinName gpio1_top, PinName gpio1_bottom, + PinName gpio1_left, PinName gpio1_right); + + /** + * @brief Initialize the board and sensors with deft values + * @return 0 on success + */ + int init_board(); + + /** + * @brief Read the on board red slider switch + * @return 0 or 1 according to switch position + */ + bool rd_switch () { + return the_switch->rd_switch(); + } + + /** + * @brief Check the presence of sensor top. To be called after init_board + * @return true is present, false if absent + */ + bool is_sensor_top_present() { + if (sensor_top) { + return true; + } + return false; + } + + /** + * @brief Check the presence of sensor bottom. To be called after init_board + * @return true is present, false if absent + */ + bool is_sensor_bottom_present() { + if (sensor_bottom) { + return true; + } + return false; + } + + /** + * @brief Check the presence of sensor left. To be called after init_board + * @return true is present, false if absent + */ + bool is_sensor_left_present() { + if (sensor_left) { + return true; + } + return false; + } + + /** + * @brief Check the presence of sensor right. To be called after init_board + * @return true is present, false if absent + */ + bool is_sensor_right_present() { + if (sensor_right) { + return true; + } + return false; + } + + DevI2C *dev_i2c; + VL6180X *sensor_top; + VL6180X *sensor_bottom; + VL6180X *sensor_left; + VL6180X *sensor_right; + STMPE1600 *stmpe1600; + SWITCH *the_witch; + Display *display; + +private: + STMPE1600DigiOut *_gpio0_top; + STMPE1600DigiOut *_gpio0_bottom; + STMPE1600DigiOut *_gpio0_left; + STMPE1600DigiOut *_gpio0_right; + static XNucleo6180xa1 *_instance; +}; + +#endif /* __X_NUCLEO_6180XA1_H */
--- a/x_nucleo_6180xa1.cpp Fri Mar 03 15:06:18 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - ****************************************************************************** - * @file x_nucleo_6180xa1.cpp - * @author AST / EST - * @version V0.0.1 - * @date 13-April-2015 - * @brief Implementation file for the X_NUCLEO_VL6180XA1 singleton class - ****************************************************************************** - * @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. - * - ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "x_nucleo_6180xa1.h" - -/* Static variables ----------------------------------------------------------*/ -X_NUCLEO_6180XA1* X_NUCLEO_6180XA1::_instance = NULL; - -X_NUCLEO_6180XA1* X_NUCLEO_6180XA1::Instance(DevI2C *ext_i2c) -{ - if(_instance==NULL) - _instance=new X_NUCLEO_6180XA1(ext_i2c); - else - VL6180x_ErrLog("Failed to create X_NUCLEO_6180XA1 instance\n\r"); - return _instance; -} - -X_NUCLEO_6180XA1* X_NUCLEO_6180XA1::Instance(DevI2C *ext_i2c, - PinName gpio1_top, PinName gpio1_bottom, - PinName gpio1_left, PinName gpio1_right) -{ - if(_instance==NULL) - //_instance=new X_NUCLEO_6180XA1(ext_i2c); - _instance=new X_NUCLEO_6180XA1(ext_i2c, gpio1_top, gpio1_bottom, gpio1_left, gpio1_right); - else - VL6180x_ErrLog("Failed to create X_NUCLEO_6180XA1 instance\n\r"); - return _instance; -} - - -int X_NUCLEO_6180XA1::InitBoard() -{ - int status, n_dev=0; uint8_t sensor_address; - - if (sensor_top) sensor_top->VL6180x_Off(); - if (sensor_bottom) sensor_bottom->VL6180x_Off(); - if (sensor_left) sensor_left->VL6180x_Off(); - if (sensor_right) sensor_right->VL6180x_Off(); - sensor_address = NEW_SENSOR_TOP_ADDRESS; - status=sensor_top->Init(&sensor_address); - if(status) - { - printf("Error: Mandatory top sensor fail, Init failed!\n\r"); - if (sensor_top !=NULL) { delete sensor_top; sensor_top=NULL; } - if (sensor_left !=NULL) {delete sensor_left; sensor_left=NULL; } - if (sensor_bottom !=NULL){ delete sensor_bottom; sensor_bottom=NULL; } - if (sensor_right !=NULL) { delete sensor_right; sensor_right=NULL; } - n_dev=0; - return 1; - } - else - { - printf("Sensor top present\n\r"); - n_dev++; - } - sensor_address = NEW_SENSOR_BOTTOM_ADDRESS; - status=1; - if (sensor_bottom) status=sensor_bottom->Init(&sensor_address); - if(status) - { - printf("Sensor bottom not present\n\r"); - if (sensor_bottom !=NULL) { delete sensor_bottom; sensor_bottom=NULL; } - } - else - { - printf("Sensor bottom present\n\r"); - n_dev++; - } - sensor_address = NEW_SENSOR_LEFT_ADDRESS; - status=1; - if (sensor_left) status=sensor_left->Init(&sensor_address); - if(status) - { - printf("Sensor left not present\n\r"); - if (sensor_left !=NULL) {delete sensor_left; sensor_left=NULL; } - } - else - { - printf("Sensor left present\n\r"); - n_dev++; - } - sensor_address = NEW_SENSOR_RIGHT_ADDRESS; - status=1; - if (sensor_right) status=sensor_right->Init(&sensor_address); - if(status) - { - printf("Sensor right not present\n\r"); - if (sensor_right !=NULL) { delete sensor_right; sensor_right=NULL; } - } - else - { - printf("Sensor right present\n\r"); - n_dev++; - } - if(n_dev==0) - return 1; - else - return 0; -} - -
--- a/x_nucleo_6180xa1.h Fri Mar 03 15:06:18 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -/** - ****************************************************************************** - * @file x_nucleo_6180xa1.h - * @author AST / EST - * @version V0.0.1 - * @date 13-April-2015 - * @brief Header file for class X_NUCLEO_6180XA1 representing a X-NUCLEO-6180XA1 - * expansion board - ****************************************************************************** - * @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. - * - ****************************************************************************** - */ - -/* Define to prevent from recursive inclusion --------------------------------*/ -#ifndef __X_NUCLEO_6180XA1_H -#define __X_NUCLEO_6180XA1_H - -/* Includes ------------------------------------------------------------------*/ -#include "mbed.h" -#include "vl6180x_class.h" -#include "Display_class.h" -#include "stmpe1600_class.h" -#include "DevI2C.h" -#include "Switch_class.h" - -/** New device addresses */ -#define NEW_SENSOR_TOP_ADDRESS 0x10 -#define NEW_SENSOR_BOTTOM_ADDRESS 0x11 -#define NEW_SENSOR_LEFT_ADDRESS 0x12 -#define NEW_SENSOR_RIGHT_ADDRESS 0x13 - -/* Classes--------------------------------------------------------------------*/ - -/* Classes -------------------------------------------------------------------*/ -/** Class representing the X-NUCLEO-VL6180XA1 expansion board singleton obj - */ -class X_NUCLEO_6180XA1 -{ -protected: - /** Constructor 1 - * @brief x_nucleo_6180xa1 board Constructor. Default the INT gpio \ - * configuration as the electrical schematic. Self sensing for optional \ - * expansion sensors (L/B/R). - * @param[in] &i2c device I2C to be used for communication - */ - X_NUCLEO_6180XA1(DevI2C *ext_i2c) : dev_i2c(ext_i2c) - { - stmpe1600 = new STMPE1600(*ext_i2c); - stmpe1600->writeSYS_CTRL (SOFT_RESET); - Switch = new SWITCH (*stmpe1600, GPIO_11); - display = new Display(*stmpe1600); - - gpio0_top=new STMPE1600DigiOut(*dev_i2c, GPIO_12); - sensor_top=new VL6180X(*dev_i2c, *gpio0_top, A3); - - gpio0_bottom=new STMPE1600DigiOut(*dev_i2c, GPIO_13); - sensor_bottom=new VL6180X(*dev_i2c, *gpio0_bottom, A2); - - gpio0_left=new STMPE1600DigiOut(*dev_i2c, GPIO_14); - sensor_left=new VL6180X(*dev_i2c, *gpio0_left, D13); - - gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15); - sensor_right=new VL6180X(*dev_i2c, *gpio0_right, D2); - - if (InitBoard()) { // init failed - printf ("ERROR Init X-NUCLEO-6180XA1 Board\n\r"); - } - } - - /** Constructor 2 - * @param[in] &i2c device I2C to be used for communication - * @param[in] PinName gpio1_top Mbed DigitalOut pin name to be used as a top sensor GPIO_1 INT - * @param[in] PinName gpio1_bottom Mbed DigitalOut pin name to be used as a bottom sensor GPIO_1 INT - * @param[in] PinName gpio1_left Mbed DigitalOut pin name to be used as a left sensor GPIO_1 INT - * @param[in] PinName gpio1_right Mbed DigitalOut pin name to be used as a right sensor GPIO_1 INT - */ - X_NUCLEO_6180XA1(DevI2C *ext_i2c, PinName gpio1_top, PinName gpio1_bottom, - PinName gpio1_left, PinName gpio1_right) : dev_i2c(ext_i2c) { - stmpe1600 = new STMPE1600(*ext_i2c); - stmpe1600->writeSYS_CTRL (SOFT_RESET); - Switch = new SWITCH (*stmpe1600, GPIO_11); - display = new Display(*stmpe1600); - - gpio0_top=new STMPE1600DigiOut(*dev_i2c, GPIO_12); - sensor_top=new VL6180X(*dev_i2c, *gpio0_top, gpio1_top); - - gpio0_bottom=new STMPE1600DigiOut(*dev_i2c, GPIO_13); - sensor_bottom=new VL6180X(*dev_i2c, *gpio0_bottom, gpio1_bottom); - - gpio0_left=new STMPE1600DigiOut(*dev_i2c, GPIO_14); - sensor_left=new VL6180X(*dev_i2c, *gpio0_left, gpio1_left); - - gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15); - sensor_right=new VL6180X(*dev_i2c, *gpio0_right, gpio1_right); - } - - /** - * @brief Override default copy constructor as empty - * @param[in] &X_NUCLEO_6180XA1 singleton object reference - * @return - */ - X_NUCLEO_6180XA1() {}; - - /** - * @brief Override default assignement operator to avoid multiple singletons - * @param[in] &X_NUCLEO_6180XA1 singleton object reference - * @return - */ - void operator = (const X_NUCLEO_6180XA1&); - -public: - /** - * @brief Creates a singleton object instance - * @param[in] &i2c device I2C to be used for communication - * @return Pointer to the object instance - */ - static X_NUCLEO_6180XA1 *Instance(DevI2C *ext_i2c); - - /** - * @brief Creates a singleton object instance - * @param[in] &i2c device I2C to be used for communication - * @param[in] PinName gpio1_top the pin connected to top sensor INT - * @param[in] PinName gpio1_bottem the pin connected to bottom sensor INT - * @param[in] PinName gpio1_left the pin connected to left sensor INT - * @param[in] PinName gpio1_right the pin connected to right sensor INT - * @return Pointer to the object instance - */ - static X_NUCLEO_6180XA1 *Instance(DevI2C *ext_i2c, PinName gpio1_top, PinName gpio1_bottom, - PinName gpio1_left, PinName gpio1_right); - - /** - * @brief Initialize the board and sensors with deft values - * @return 0 on success - */ - int InitBoard(); - - /** - * @brief Read the on board red slider switch - * @return 0 or 1 according to switch position - */ - bool RdSwitch () { - return Switch->RdSwitch(); - } - - /** - * @brief Check the presence of sensor top. To be called after InitBoard - * @return true is present, false if absent - */ - bool isSensorTopPresent() { - if (sensor_top) return true; - return false; - } - - /** - * @brief Check the presence of sensor bottom. To be called after InitBoard - * @return true is present, false if absent - */ - bool isSensorBottomPresent() { - if (sensor_bottom) return true; - return false; - } - - /** - * @brief Check the presence of sensor left. To be called after InitBoard - * @return true is present, false if absent - */ - bool isSensorLeftPresent() { - if (sensor_left) return true; - return false; - } - - /** - * @brief Check the presence of sensor right. To be called after InitBoard - * @return true is present, false if absent - */ - bool isSensorRightPresent() { - if (sensor_right) return true; - return false; - } - - DevI2C *dev_i2c; - VL6180X *sensor_top; - VL6180X *sensor_bottom; - VL6180X *sensor_left; - VL6180X *sensor_right; - STMPE1600 * stmpe1600; - SWITCH * Switch; - Display *display; - -private: - STMPE1600DigiOut *gpio0_top; - STMPE1600DigiOut *gpio0_bottom; - STMPE1600DigiOut *gpio0_left; - STMPE1600DigiOut *gpio0_right; - static X_NUCLEO_6180XA1 *_instance; -}; - -#endif /* __X_NUCLEO_6180XA1_H */