
programme de tournesol photovoltaique pour le cours d'interface
Dependencies: BSP_DISCO_F746NG
Diff: main.cpp
- Revision:
- 0:6d4f8bd2994a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jun 21 16:19:41 2021 +0000 @@ -0,0 +1,176 @@ +#include "mbed.h" +#include "stm32746g_discovery_lcd.h" +#include "stm32746g_discovery_ts.h" +#include "SolarPannel.h" +#include "pres.h" + + +#define K 3.2 + +struct bouton{ + + uint16_t Xpos; + uint16_t Ypos; + uint16_t Xtaille; + uint16_t Ytaille; + uint16_t couleur; +}; + +void drawImage_image(int offsetX, int offsetY); +bouton init_bouton (bouton x, uint16_t Xpos, uint16_t Ypos, uint16_t Xtaille, uint16_t Ytaille, uint16_t couleur); +void draw_bouton (bouton x, uint8_t *texte); +bool getbouton (bouton x); + +TS_StateTypeDef TS_State; +SOLAR_PANNEL sl; + +int main() +{ + struct bouton bp_gauche; + struct bouton bp_droite; + struct bouton bp_mode; + + TS_StateTypeDef TS_State; + + uint16_t x, y; + uint8_t text[30]; + uint8_t status; + uint8_t idx; + uint8_t cleared = 0; + uint8_t prev_nb_touches = 0; + bool boutton_test; + + uint8_t texte_D[] = ">"; + uint8_t texte_G[] = "<"; + uint8_t texte_manuel[] = "manuel"; + uint8_t texte_auto[] = "auto"; + + int state = 0; + + BSP_LCD_Init(); + BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS); + BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER); + + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE); + HAL_Delay(1000); + + status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); + if (status != TS_OK) { + BSP_LCD_Clear(LCD_COLOR_RED); + BSP_LCD_SetBackColor(LCD_COLOR_RED); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE); + } else { + BSP_LCD_Clear(LCD_COLOR_GREEN); + BSP_LCD_SetBackColor(LCD_COLOR_GREEN); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE); + } + + HAL_Delay(1000); + /*BSP_LCD_SetFont(&Font12); + BSP_LCD_SetBackColor(LCD_COLOR_BLUE); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE);*/ + + drawImage_image(0, 0); + + bp_droite = init_bouton (bp_droite, 425, 100, 30, 50, LCD_COLOR_WHITE); + bp_gauche = init_bouton (bp_gauche, 25, 100, 30, 50, LCD_COLOR_WHITE); + bp_mode = init_bouton (bp_mode, 205, 225, 80, 40, LCD_COLOR_WHITE); + + while(1) { + + switch (state){ + case 0 : + + draw_bouton(bp_gauche, texte_G); + draw_bouton(bp_droite, texte_D); + draw_bouton(bp_mode, texte_manuel); + + if (getbouton(bp_gauche))sl.rotate(LEFT, 0.3); + else if (getbouton(bp_droite))sl.rotate(RIGHT, 0.3); + else sl.stop(); + + if (getbouton(bp_mode))state = 1; + + break; + + case 1: + if (getbouton(bp_mode) == 0) state = 2; + break; + + case 2: + drawImage_image(0, 0); + draw_bouton(bp_mode, texte_auto); + state = 3; + break; + + case 3: + + if (sl.getDelta() > 0 && sl.getDelta() < 1)sl.rotate(RIGHT, (sl.getDelta()*K)); + else if (sl.getDelta() < 0 && sl.getDelta() > -1)sl.rotate(LEFT, (sl.getDelta() * (-K))); + else sl.stop(); + + if (getbouton(bp_mode)){ + state = 4; + sl.stop(); + } + + break; + + case 4: + if (getbouton(bp_mode) == 0){ + state = 0; + } + break; + } + } + +} + +void draw_bouton (bouton x, uint8_t *texte){ + + BSP_LCD_DrawRect( x.Xpos, x.Ypos, x.Xtaille, x.Ytaille); + BSP_LCD_FillRect( x.Xpos, x.Ypos, x.Xtaille, x.Ytaille); + + BSP_LCD_SetFont(&Font12); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_BLACK); + BSP_LCD_DisplayStringAt(x.Xpos + (x.Xtaille/2) - (sizeof(texte)-1) , x.Ypos + (x.Ytaille/2), (uint8_t *)texte, LEFT_MODE); +} + +bool getbouton (bouton x){ + + BSP_TS_GetState(&TS_State); + + if (TS_State.touchDetected && TS_State.touchX[0] < (x.Xpos + x.Xtaille) && TS_State.touchX[0] > x.Xpos && TS_State.touchY[0] < (x.Ypos + x.Ytaille) && TS_State.touchY[0] > x.Ypos){ + return 1; + } + else return 0; + +} + +bouton init_bouton (bouton x, uint16_t Xpos, uint16_t Ypos, uint16_t Xtaille, uint16_t Ytaille, uint16_t couleur){ + x.Xpos = Xpos; + x.Ypos = Ypos; + x.Xtaille = Xtaille; + x.Ytaille = Ytaille; + x.couleur = couleur; + + return x; +} + +void drawImage_image(int offsetX, int offsetY){ + int x = 0; + int y = 0; + uint32_t* dataPtr = (uint32_t*)pres.data; + while(y < pres.height) { + while(x < pres.width) { + BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr); + dataPtr++; + x++; + } + x = 0; + y++; + } +} \ No newline at end of file