Librairie adaptée au laboratoire 2
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Revision 36:f6278b3e7c82, committed 2015-11-24
- Comitter:
- mapellil
- Date:
- Tue Nov 24 16:04:41 2015 +0000
- Parent:
- 35:407b0b127eb8
- Child:
- 37:837cffa6b530
- Commit message:
- Exposed GPIOs on constructor, code cleanup, doxy comment
Changed in this revision
--- a/Components/Display/Display_class.h Wed Nov 18 16:35:04 2015 +0000 +++ b/Components/Display/Display_class.h Tue Nov 24 16:04:41 2015 +0000 @@ -47,12 +47,6 @@ extern "C" { #endif -#define DISPLAY_USING_STMPE1600 - -#ifndef DISPLAY_USING_STMPE1600 -#define FAST_DISPLAY // fast quick and dirty display to speed up -#endif - #define DP (1<<7) #define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP ) #define S0 (1<<0) @@ -141,8 +135,6 @@ ['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 - - }; #undef S0 @@ -159,232 +151,37 @@ /* Classes -------------------------------------------------------------------*/ /** Class representing Display */ -#ifndef DISPLAY_USING_STMPE1600 class Display { public: - -#ifndef FAST_DISPLAY - - Display(DevI2C &i2c, STMPE1600DigiOut &D1, STMPE1600DigiOut &D2, STMPE1600DigiOut &D3, STMPE1600DigiOut &D4, - STMPE1600DigiOut &D_A, STMPE1600DigiOut &D_B, STMPE1600DigiOut &D_C, STMPE1600DigiOut &D_D, - STMPE1600DigiOut &D_E, STMPE1600DigiOut &D_F, STMPE1600DigiOut &D_G) - : Display_D1(D1), Display_D2(D2), Display_D3(D3), Display_D4(D4), Display_A(D_A), Display_B(D_B), - Display_C(D_C), Display_D(D_D), Display_E(D_E), Display_F(D_F), Display_G(D_G), dev_i2c(i2c) - { - pDisplay_DGT[0] = &Display_D1; - pDisplay_DGT[1] = &Display_D2; - pDisplay_DGT[2] = &Display_D3; - pDisplay_DGT[3] = &Display_D4; - pDisplay_SEG[0] = &Display_A; - pDisplay_SEG[1] = &Display_B; - pDisplay_SEG[2] = &Display_C; - pDisplay_SEG[3] = &Display_D; - pDisplay_SEG[4] = &Display_E; - pDisplay_SEG[5] = &Display_F; - pDisplay_SEG[6] = &Display_G; - - for (int i=0; i<4; i++) { *pDisplay_DGT[i]=1; } - for (int i=0; i<7; i++) { *pDisplay_SEG[i]=1; } - } -#else - Display(DevI2C &i2c) : dev_i2c(i2c) {} -#endif - -#ifndef FAST_DISPLAY - void Digits_off (void) // all 4 digits off - { - Display_D1=1; - Display_D2=1; - Display_D3=1; - Display_D4=1; - } - - void Digits_on (void) // all 4 digits on - { - Display_D1=0; - Display_D2=0; - Display_D3=0; - Display_D4=0; - } - - void Digit_on (int digit) // digits on - { - *pDisplay_DGT[digit] = 0; - } - - void Digit_off (int digit) // digits off - { - *pDisplay_DGT[digit] = 1; - } - - void Segments_off () // all 7 segments off - { - Display_A=1; - Display_B=1; - Display_C=1; - Display_D=1; - Display_E=1; - Display_F=1; - Display_G=1; - } - - void Segment_off (int seg) // segment off - { - *pDisplay_SEG[seg] = 1; - } - - void Segment_on (int seg) // segment on - { - *pDisplay_SEG[seg] = 0; - } - - - void DisplayString (char str[4]) - { - int i; - const char *pc; - - for( i=0, pc=str; i<4 && *pc!=0 ; i++, pc++) - { - _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], i); - if( *(pc+1)== '.') - { - pc++; - } - wait_ms(DISPLAY_DELAY); - Digits_off(); - } - } - - - void _V2_Set7Segment( int Leds, int digit ) - { - //Digits_off(); - Segments_off(); // 7 seg off */ - int mask=1; - for (int i=0; i<7; i++) - { - if (Leds & mask) Segment_on(i); - mask = mask<<1; - } - Digit_on(digit); - } - - -#else - - void DisplayDigit (char *val, char dgt) - { - uint8_t data[2]; - uint16_t *pdata = (uint16_t*)data; - dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - *pdata = *pdata | (uint16_t)0x0780; // all digits off - dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - - _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt); - } - - void DisplayString (char str[4], char strlen) - { - int i, dgt; - const char *pc; - uint8_t data[2]; - uint16_t *pdata = (uint16_t*)data; - - //dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - //*pdata = *pdata | (uint16_t)0x0780; // all digits off - //dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - - 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); - dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - *pdata = *pdata | (uint16_t)0x0780; // all digits off - dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - } - } - - - 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 */ - dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - *pdata = *pdata | (uint16_t)0x007F; // 7 segments off - dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - - int mask=1; - for (int i=0; i<7; i++) - { - if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask; - mask = mask<<1; - } - *pdata = *pdata & dgt; - dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 - } -#endif - - - private: - -#ifndef FAST_DISPLAY - STMPE1600DigiOut &Display_D1; - STMPE1600DigiOut &Display_D2; - STMPE1600DigiOut &Display_D3; - STMPE1600DigiOut &Display_D4; - STMPE1600DigiOut *pDisplay_DGT[4]; // the 4 display digits - - STMPE1600DigiOut &Display_A; - STMPE1600DigiOut &Display_B; - STMPE1600DigiOut &Display_C; - STMPE1600DigiOut &Display_D; - STMPE1600DigiOut &Display_E; - STMPE1600DigiOut &Display_F; - STMPE1600DigiOut &Display_G; - STMPE1600DigiOut *pDisplay_SEG[7]; // the 7 digit segmments -#endif - DevI2C &dev_i2c; -}; - -#else // defined DISPLAY_USING_STMPE1600 - -class Display -{ - public: - - 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 + /** 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); // Digit4 - stmpe1600.setGPIOdir (GPIO_1, OUTPUT); // Digit4 - stmpe1600.setGPIOdir (GPIO_2, OUTPUT); // Digit4 - stmpe1600.setGPIOdir (GPIO_3, OUTPUT); // Digit4 - stmpe1600.setGPIOdir (GPIO_4, OUTPUT); // Digit4 - stmpe1600.setGPIOdir (GPIO_5, OUTPUT); // Digit4 - stmpe1600.setGPIOdir (GPIO_6, 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]; @@ -403,21 +200,28 @@ stmpe1600.write16bitReg(GPSR_0_7, pdata); } - } - - void DisplayDigit (char *val, char dgt) - { + } + + /** + * @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); + stmpe1600.read16bitReg(GPSR_0_7, pdata); *pdata = *pdata | (uint16_t)0x0780; // all digits off - stmpe1600.write16bitReg(GPSR_0_7, pdata); + stmpe1600.write16bitReg(GPSR_0_7, pdata); _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt); - } + } - void _V2_Set7Segment( int Leds, int digit ) - { +private: + void _V2_Set7Segment( int Leds, int digit ) + { //Digits_off(); uint16_t dgt; dgt = 1<<digit; @@ -428,9 +232,9 @@ /* set the exppinname state to lvl */ - stmpe1600.read16bitReg(GPSR_0_7, pdata); + stmpe1600.read16bitReg(GPSR_0_7, pdata); *pdata = *pdata | (uint16_t)0x007F; // 7 segments off - stmpe1600.write16bitReg(GPSR_0_7, pdata); + stmpe1600.write16bitReg(GPSR_0_7, pdata); int mask=1; for (int i=0; i<7; i++) @@ -439,14 +243,10 @@ mask = mask<<1; } *pdata = *pdata & dgt; - stmpe1600.write16bitReg(GPSR_0_7, pdata); - } - - private: - STMPE1600 &stmpe1600; - + stmpe1600.write16bitReg(GPSR_0_7, pdata); + } + STMPE1600 &stmpe1600; }; -#endif #ifdef __cplusplus }
--- a/Components/STMPE1600/stmpe1600_class.h Wed Nov 18 16:35:04 2015 +0000 +++ b/Components/STMPE1600/stmpe1600_class.h Tue Nov 24 16:04:41 2015 +0000 @@ -1,10 +1,10 @@ /** ****************************************************************************** - * @file vl6180x_class.h + * @file stmpe1600_class.h * @author AST / EST * @version V0.0.1 * @date 14-April-2015 - * @brief Header file for component VL6180X + * @brief Header file for component stmpe1600 ****************************************************************************** * @attention * @@ -80,7 +80,7 @@ GPIO_13, GPIO_14, GPIO_15, - NOT_CON + NOT_CON } ExpGpioPinName; typedef enum { @@ -89,10 +89,18 @@ 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]; @@ -106,6 +114,11 @@ 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]; @@ -116,7 +129,10 @@ 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); @@ -129,9 +145,17 @@ 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]; @@ -142,6 +166,10 @@ 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]; @@ -164,10 +192,16 @@ 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; @@ -180,51 +214,86 @@ 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); } - - 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 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; + } - 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; - } - - 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; - } - - 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);
--- a/x_nucleo_6180xa1.cpp Wed Nov 18 16:35:04 2015 +0000 +++ b/x_nucleo_6180xa1.cpp Tue Nov 24 16:04:41 2015 +0000 @@ -42,7 +42,6 @@ /* Static variables ----------------------------------------------------------*/ X_NUCLEO_6180XA1* X_NUCLEO_6180XA1::_instance = NULL; - X_NUCLEO_6180XA1* X_NUCLEO_6180XA1::Instance(DevI2C *ext_i2c) { if(_instance==NULL) @@ -52,6 +51,18 @@ 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() {
--- a/x_nucleo_6180xa1.h Wed Nov 18 16:35:04 2015 +0000 +++ b/x_nucleo_6180xa1.h Tue Nov 24 16:04:41 2015 +0000 @@ -56,31 +56,22 @@ /* Classes--------------------------------------------------------------------*/ +/* Classes -------------------------------------------------------------------*/ +/** Class representing the X-NUCLEO-VL6180XA1 expansion board + */ class X_NUCLEO_6180XA1 { public: + /** Constructor 1 + * @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); + stmpe1600 = new STMPE1600(*ext_i2c); + stmpe1600->writeSYS_CTRL (SOFT_RESET); Switch = new SWITCH (*stmpe1600, GPIO_11); - display = new Display(*stmpe1600); - - /*digit1=new STMPE1600DigiOut(*dev_i2c, GPIO_7); - digit2=new STMPE1600DigiOut(*dev_i2c, GPIO_8); - digit3=new STMPE1600DigiOut(*dev_i2c, GPIO_9); - digit4=new STMPE1600DigiOut(*dev_i2c, GPIO_10); + display = new Display(*stmpe1600); - dispA=new STMPE1600DigiOut(*dev_i2c, GPIO_0); - dispB=new STMPE1600DigiOut(*dev_i2c, GPIO_1); - dispC=new STMPE1600DigiOut(*dev_i2c, GPIO_2); - dispD=new STMPE1600DigiOut(*dev_i2c, GPIO_3); - dispE=new STMPE1600DigiOut(*dev_i2c, GPIO_4); - dispF=new STMPE1600DigiOut(*dev_i2c, GPIO_5); - dispG=new STMPE1600DigiOut(*dev_i2c, GPIO_6);*/ - //display=new Display(*digit1,*digit2,*digit3,*digit4,*dispA,*dispB,*dispC,*dispD,*dispE,*dispF,*dispG); - //display=new Display(*ext_i2c); - gpio0_top=new STMPE1600DigiOut(*dev_i2c, GPIO_12); sensor_top=new VL6180X(*dev_i2c, *gpio0_top, PB_0); @@ -93,7 +84,35 @@ gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15); sensor_right=new VL6180X(*dev_i2c, *gpio0_right, PA_10); } - + + /** 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); + 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); + } + + /** Destructor + */ ~X_NUCLEO_6180XA1() { if(gpio0_top!=NULL) @@ -136,62 +155,62 @@ delete sensor_right; sensor_right=NULL; } - /*delete digit1; - delete digit2; - delete digit3; - delete digit4; - delete dispA; - delete dispB; - delete dispC; - delete dispD; - delete dispE; - delete dispF; - delete dispG;*/ - delete stmpe1600; - delete Switch; - delete display; + delete stmpe1600; + stmpe1600 = NULL; + delete Switch; + Switch = NULL; + delete display; + display = NULL; _instance=NULL; } + /** + * @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(); } - + DevI2C *dev_i2c; - VL6180X *sensor_top; VL6180X *sensor_bottom; VL6180X *sensor_left; VL6180X *sensor_right; - - STMPE1600 * stmpe1600; - SWITCH * Switch; - + STMPE1600 * stmpe1600; + SWITCH * Switch; STMPE1600DigiOut *gpio0_top; STMPE1600DigiOut *gpio0_bottom; STMPE1600DigiOut *gpio0_left; - STMPE1600DigiOut *gpio0_right; + STMPE1600DigiOut *gpio0_right; + Display *display; - STMPE1600DigiOut *digit1; - STMPE1600DigiOut *digit2; - STMPE1600DigiOut *digit3; - STMPE1600DigiOut *digit4; - - STMPE1600DigiOut *dispA; - STMPE1600DigiOut *dispB; - STMPE1600DigiOut *dispC; - STMPE1600DigiOut *dispD; - STMPE1600DigiOut *dispE; - STMPE1600DigiOut *dispF; - STMPE1600DigiOut *dispG; - - Display *display; - - static X_NUCLEO_6180XA1 *Instance(DevI2C *ext_i2c); - - int InitBoard(); - - private: + private: static X_NUCLEO_6180XA1 *_instance; };