wtorek, 20 grudnia 2016

[5] STM32F7 - CubeMx - Wyświetlacz cz. 2 - Touchpad, Biblioteka STemWin

Ten post chciałbym poświęcić na opisanie sposobu przygotowania projektu dotyczącego biblioteki STemWin. Będzie on kontynuacją wcześniejszej części gdzie zostały przedstawiony sposób wygenerowania projektu oraz dołączenia potrzebnych plików.

Touchpad


Panel dotykowy będzie działał tak ja poprzednio czyli albo w obsłudze przerwania od timera, bądź w pętli while, przy czym ten pierwszy sposób jest zdecydowanie wygodniejszy oraz dużo lepiej się prezentuje.


Włączenie i inicjalizacja timera są takie same jak w poprzedniej części, różnica dotyczy jedynie sposobu przekazywania wyników pomiarów do biblioteki STemWin. Ta biblioteka sama zajmuje się wyrywaniem dotyku na ekranie, przez co nie trzeba definiować w jakim miejscu znajduje się aktualne przyciśnięcie klawisza.

  1. /*  Wyglad struktury def w pliku GUI_Type.h
  2.     * typedef struct {
  3.     * int x,y;
  4.     * U8  Pressed;
  5.     * U8  Layer;
  6.     * } GUI_PID_STATE;
  7. */
  8. GUI_PID_STATE TS_State;
  9. TS_StateTypeDef ts;
  10. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  11. {
  12.     if(htim->Instance==TIM6)
  13.     {
  14.         BSP_TS_GetState(&ts);                   //Pobranie stanu
  15.         if (ts.touchDetected)                   //Wykrycie dotyku
  16.         {
  17.             TS_State.Pressed = ts.touchDetected;
  18.             TS_State.y = ts.touchY[0];
  19.             TS_State.x = ts.touchX[0];
  20.             GUI_PID_StoreState(&TS_State);      //Przekazanie stanu
  21.         }
  22.         else                                    //Brak dotkniecia
  23.         {
  24.             TS_State.Pressed = 0;
  25.             TS_State.y = -1;
  26.             TS_State.x = -1;
  27.             GUI_PID_StoreState(&TS_State);      //Przekazanie stanu
  28.         }
  29.     }
  30. }

Jak widać różnica polega na wywołaniu funkcji GUI_PID_StoreState(&TS_State);, do której przekazywany jest stan przycisku. Odczyt następuje poprzez wykorzystanie funkcji z BSB pobierającej stan przycisku.

STemWin


Jak już wspomniałem dołączenie biblioteki do projektu znajduje się w Cz.1. Teraz natomiast przejdę do wygenerowania przykładowych programów wraz z ich opisem.

Okno główne można wykonać na dwa sposoby pierwszym z nich jest użycie przygotowanego programu emWin GUIBilder, zlokalizowanego w przykładach od ST w folderze: Middlewares\ST\STemWin\Software. Program ten wykonuje plik w języku c z domyślną nazwą WindowDLG. Jego nazwę można dowolnie modyfikować. Dosyć dużą niedogodnością, jest to, że w tym programie można stworzyć tylko jedno okno, nie ma możliwości ich zagnieżdżania. Jedynym wyjściem jest wygenerowanie okna podstawowego, i w kodzie przygotowanie kolejnych przejść. W momencie gdy okno było już poprawnie ustawione to nie było żadnych przeszkód aby wygenerować obraz wtedy.

W nim można definiować przyciski, napisy, slidery itp. Jedyne czego nie udało mi się dokonać przy pomocy tego programu to wyświetlenie zdjęcia, jeśli włączone było okno z pozostałymi przyciskami. Czyli obrazek był widoczny, gdy okno główne było wyłączone i na odwrót.

Obraz udało mi się w późniejszym okresie odpowiednio załadować z pliku, co opiszę w następnym poście. Poniżej wygenerowany plik c z przykładowym oknem główny:

  1. // USER START (Optionally insert additional includes)
  2. // USER END
  3. #include "DIALOG.h"
  4. #include "button.h"
  5. #include <stdint.h>
  6. /*********************************************************************
  7. *
  8. *       Defines
  9. *
  10. **********************************************************************
  11. */
  12. #define ID_WINDOW_0  (GUI_ID_USER + 0x00)
  13. #define ID_BUTTON_0  (GUI_ID_USER + 0x01)
  14. #define ID_BUTTON_1  (GUI_ID_USER + 0x02)
  15. #define ID_BUTTON_2  (GUI_ID_USER + 0x03)
  16. #define ID_BUTTON_3  (GUI_ID_USER + 0x04)
  17. #define ID_BUTTON_4  (GUI_ID_USER + 0x06)
  18. #define ID_BUTTON_5  (GUI_ID_USER + 0x07)
  19. #define ID_BUTTON_6  (GUI_ID_USER + 0x08)
  20. #define ID_BUTTON_7  (GUI_ID_USER + 0x09)
  21. #define ID_BUTTON_8  (GUI_ID_USER + 0x0A)
  22. #define ID_BUTTON_9  (GUI_ID_USER + 0x0B)
  23. #define ID_BUTTON_10  (GUI_ID_USER + 0x0C)
  24. #define ID_BUTTON_11  (GUI_ID_USER + 0x0D)
  25. #define ID_BUTTON_12  (GUI_ID_USER + 0x0E)
  26. #define ID_BUTTON_13  (GUI_ID_USER + 0x0F)
  27. #define ID_BUTTON_14  (GUI_ID_USER + 0x10)
  28. #define ID_BUTTON_15  (GUI_ID_USER + 0x11)
  29. // USER START (Optionally insert additional defines)
  30. // USER END
  31. /*********************************************************************
  32. *
  33. *       Static data
  34. *
  35. **********************************************************************
  36. */
  37. // USER START (Optionally insert additional static data)
  38. // USER END
  39. /*********************************************************************
  40. *
  41. *       _aDialogCreate
  42. */
  43. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  44.   { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 3, 1, 480, 272, 0, 0x0, 0 },
  45.   { BUTTON_CreateIndirect, "przycisk3", ID_BUTTON_0, 375, 140, 100, 50, 0, 0x0, 0 },
  46.   { BUTTON_CreateIndirect, "przycisk1", ID_BUTTON_1, 375, 20, 100, 50, 0, 0x0, 0 },
  47.   { BUTTON_CreateIndirect, "przycisk2", ID_BUTTON_2, 375, 80, 100, 50, 0, 0x0, 0 },
  48.   { BUTTON_CreateIndirect, "przycisk4", ID_BUTTON_3, 375, 200, 100, 50, 0, 0x0, 0 },
  49.   { BUTTON_CreateIndirect, "PIN_1", ID_BUTTON_4, 20, 30, 40, 40, 0, 0x0, 0 },
  50.   { BUTTON_CreateIndirect, "PIN_2", ID_BUTTON_5, 80, 30, 40, 40, 0, 0x0, 0 },
  51.   { BUTTON_CreateIndirect, "PIN_3", ID_BUTTON_6, 140, 30, 40, 40, 0, 0x0, 0 },
  52.   { BUTTON_CreateIndirect, "PIN_4", ID_BUTTON_7, 20, 90, 40, 40, 0, 0x0, 0 },
  53.   { BUTTON_CreateIndirect, "PIN_5", ID_BUTTON_8, 80, 90, 40, 40, 0, 0x0, 0 },
  54.   { BUTTON_CreateIndirect, "PIN_6", ID_BUTTON_9, 140, 90, 40, 40, 0, 0x0, 0 },
  55.   { BUTTON_CreateIndirect, "PIN_7", ID_BUTTON_10, 19, 150, 40, 40, 0, 0x0, 0 },
  56.   { BUTTON_CreateIndirect, "PIN_8", ID_BUTTON_11, 80, 150, 40, 40, 0, 0x0, 0 },
  57.   { BUTTON_CreateIndirect, "PIN_9", ID_BUTTON_12, 140, 150, 40, 40, 0, 0x0, 0 },
  58.   { BUTTON_CreateIndirect, "PIN_0", ID_BUTTON_13, 80, 210, 40, 40, 0, 0x0, 0 },
  59.   { BUTTON_CreateIndirect, "PIN_STAR", ID_BUTTON_14, 20, 210, 40, 40, 0, 0x0, 0 },
  60.   { BUTTON_CreateIndirect, "PIN_HASH", ID_BUTTON_15, 140, 210, 40, 40, 0, 0x0, 0 },
  61.   // USER START (Optionally insert additional widgets)
  62.   // USER END
  63. };
  64. /*********************************************************************
  65. *
  66. *       Static code
  67. *
  68. **********************************************************************
  69. */
  70. // USER START (Optionally insert additional static code)
  71. typedef struct KodPin{
  72.     uint8_t pin_1_cyfra;
  73.     uint8_t pin_2_cyfra;
  74.     uint8_t pin_3_cyfra;
  75.     uint8_t pin_4_cyfra;
  76. }KodPin_t;
  77. typedef enum{
  78.     Pin_Resoult_NieUstawione = 0,
  79.     Pin_Resoult_Ustawiony_1 = 1,
  80.     Pin_Resoult_Ustawiony_2 = 2,
  81.     Pin_Resoult_Ustawiony_3 = 3,
  82.     Pin_Resoult_Ustawiony_4 = 4
  83. }Pin_Resoult_t;
  84. typedef enum{
  85.     Rodzaj_1 = 1,
  86.     Rodzaj_2 = 2,
  87.     Rodzaj_3 = 3,
  88.     Rodzaj_4 = 4
  89. }Rodzaj_Wy_We_t;
  90. KodPin_t Kod_Pin_Do_Wyswietlenia;
  91. uint8_t Kod_Pin_Stan = 1;
  92. uint8_t kolor = 0;
  93. Pin_Resoult_t Przypisz_Pin(uint8_t cyfra);
  94. void Ustaw_Rodzaj_We_Wy(Rodzaj_Wy_We_t przelaczanie);
  95. // USER END
  96. /*********************************************************************
  97. *
  98. *       _cbDialog
  99. */
  100. WM_HWIN hItem;
  101. static void _cbDialog(WM_MESSAGE * pMsg) {
  102.   //WM_HWIN hItem;
  103.   int     NCode;
  104.   int     Id;
  105.   // USER START (Optionally insert additional variables)
  106.   static uint8_t przelaczanie_stat = 0;
  107.   static uint8_t blokada_klawiatury = 0;
  108.   // USER END
  109.   switch (pMsg->MsgId)
  110.   {
  111.   case WM_INIT_DIALOG:
  112.     //
  113.     // Initialization of 'Window'
  114.     //
  115.     hItem = pMsg->hWin;
  116.     WINDOW_SetBkColor(hItem, GUI_RED);
  117.     //
  118.     // Initialization of 'klucz'
  119.     //
  120.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  121.     BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
  122.     BUTTON_SetText(hItem, "Podaj Pin");
  123.     //
  124.     // Initialization of 'wejscie'
  125.     //
  126.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
  127.     BUTTON_SetText(hItem, "Przycisk 1");
  128.     BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
  129.     //
  130.     // Initialization of 'wyjscie'
  131.     //
  132.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
  133.     BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
  134.     BUTTON_SetText(hItem, "Przycisk 2");
  135.     //
  136.     // Initialization of 'funkcje'
  137.     //
  138.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
  139.     BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
  140.     BUTTON_SetText(hItem, "Przycisk 4");
  141.     //
  142.     // Initialization of 'PIN_TEXT'
  143.     //
  144.     //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
  145.     //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
  146.     //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
  147.     //TEXT_SetText(hItem, "");
  148.     //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  149.     //
  150.     // Initialization of 'PIN_1'
  151.     //
  152.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
  153.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  154.     BUTTON_SetText(hItem, "1");
  155.     //
  156.     // Initialization of 'PIN_2'
  157.     //
  158.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
  159.     BUTTON_SetText(hItem, "2");
  160.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  161.     //
  162.     // Initialization of 'PIN_3'
  163.     //
  164.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_6);
  165.     BUTTON_SetText(hItem, "3");
  166.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  167.     //
  168.     // Initialization of 'PIN_4'
  169.     //
  170.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_7);
  171.     BUTTON_SetText(hItem, "4");
  172.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  173.     //
  174.     // Initialization of 'PIN_5'
  175.     //
  176.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);
  177.     BUTTON_SetText(hItem, "5");
  178.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  179.     //
  180.     // Initialization of 'PIN_6'
  181.     //
  182.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_9);
  183.     BUTTON_SetText(hItem, "6");
  184.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  185.     //
  186.     // Initialization of 'PIN_7'
  187.     //
  188.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_10);
  189.     BUTTON_SetText(hItem, "7");
  190.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  191.     //
  192.     // Initialization of 'PIN_8'
  193.     //
  194.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_11);
  195.     BUTTON_SetText(hItem, "8");
  196.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  197.     //
  198.     // Initialization of 'PIN_9'
  199.     //
  200.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_12);
  201.     BUTTON_SetText(hItem, "9");
  202.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  203.     //
  204.     // Initialization of 'PIN_0'
  205.     //
  206.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_13);
  207.     BUTTON_SetText(hItem, "0");
  208.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  209.     //
  210.     // Initialization of 'PIN_STAR'
  211.     //
  212.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_14);
  213.     BUTTON_SetText(hItem, "*");
  214.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  215.     //
  216.     // Initialization of 'PIN_HASH'
  217.     //
  218.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_15);
  219.     BUTTON_SetText(hItem, "#");
  220.     BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
  221.     //
  222.     // Initialization of 'ENT_TEXT'
  223.     //
  224.     //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
  225.     //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
  226.     //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  227.     //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
  228.     //TEXT_SetText(hItem, "Wejscie");
  229.     //
  230.     // Initialization of 'NR_Karty'
  231.     //
  232.     //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
  233.     //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
  234.     //TEXT_SetText(hItem, "");
  235.     //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
  236.     //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  237.     // USER START (Optionally insert additional code for further widget initialization)
  238.     // USER END
  239.     break;
  240.   case WM_NOTIFY_PARENT:
  241.     Id    = WM_GetId(pMsg->hWinSrc);
  242.     NCode = pMsg->Data.v;
  243.     switch(Id) {
  244.     case ID_BUTTON_0: // Notifications sent by 'klucz'
  245.       switch(NCode) {
  246.       case WM_NOTIFICATION_CLICKED:
  247.         // USER START (Optionally insert code for reacting on notification message)
  248.         if(blokada_klawiatury == 0)
  249.         {
  250.             Ustaw_Rodzaj_We_Wy(Rodzaj_4);
  251.             blokada_klawiatury = 1;
  252.         }
  253.         else if(blokada_klawiatury == 1)
  254.         {
  255.             Ustaw_Rodzaj_We_Wy(Rodzaj_1);
  256.             blokada_klawiatury = 0;
  257.             Kod_Pin_Stan = 5;
  258.             Kod_Pin_Stan = Przypisz_Pin(0);
  259.         }
  260.         // USER END
  261.         break;
  262.       case WM_NOTIFICATION_RELEASED:
  263.         // USER START (Optionally insert code for reacting on notification message)
  264.         // USER END
  265.         break;
  266.       // USER START (Optionally insert additional code for further notification handling)
  267.       // USER END
  268.       }
  269.       break;
  270.     case ID_BUTTON_1: // Notifications sent by 'wejscie'
  271.       switch(NCode) {
  272.       case WM_NOTIFICATION_CLICKED:
  273.         // USER START (Optionally insert code for reacting on notification message)
  274.           Ustaw_Rodzaj_We_Wy(Rodzaj_1);
  275.           Kod_Pin_Stan = 5;
  276.           Kod_Pin_Stan = Przypisz_Pin(0);
  277.           blokada_klawiatury = 0;
  278.         // USER END
  279.         break;
  280.       case WM_NOTIFICATION_RELEASED:
  281.         // USER START (Optionally insert code for reacting on notification message)
  282.         // USER END
  283.         break;
  284.       // USER START (Optionally insert additional code for further notification handling)
  285.       // USER END
  286.       }
  287.       break;
  288.     case ID_BUTTON_2: // Notifications sent by 'wyjscie'
  289.       switch(NCode) {
  290.       case WM_NOTIFICATION_CLICKED:
  291.         // USER START (Optionally insert code for reacting on notification message)
  292.         if(0 == przelaczanie_stat)
  293.         {
  294.             Ustaw_Rodzaj_We_Wy(Rodzaj_2);
  295.             blokada_klawiatury = 0;
  296.             przelaczanie_stat = 1;
  297.             Kod_Pin_Stan = 5;
  298.             Kod_Pin_Stan = Przypisz_Pin(0);
  299.         }
  300.         else if(1 == przelaczanie_stat)
  301.         {
  302.             Ustaw_Rodzaj_We_Wy(Rodzaj_3);
  303.             blokada_klawiatury = 0;
  304.             przelaczanie_stat = 0;
  305.             Kod_Pin_Stan = 5;
  306.             Kod_Pin_Stan = Przypisz_Pin(0);
  307.         }
  308.         // USER END
  309.         break;
  310.       case WM_NOTIFICATION_RELEASED:
  311.         // USER START (Optionally insert code for reacting on notification message)
  312.         // USER END
  313.         break;
  314.       // USER START (Optionally insert additional code for further notification handling)
  315.       // USER END
  316.       }
  317.       break;
  318.     case ID_BUTTON_3: // Notifications sent by 'funkcje'
  319.       switch(NCode) {
  320.       case WM_NOTIFICATION_CLICKED:
  321.         // USER START (Optionally insert code for reacting on notification message)
  322.         GUI_DispStringAt("Przycisk 4", 200, 22);
  323.         GUI_SetBkColor(GUI_RED);
  324.         // USER END
  325.         break;
  326.       case WM_NOTIFICATION_RELEASED:
  327.         // USER START (Optionally insert code for reacting on notification message)
  328.         // USER END
  329.         break;
  330.       // USER START (Optionally insert additional code for further notification handling)
  331.       // USER END
  332.       }
  333.       break;
  334.     case ID_BUTTON_4: // Notifications sent by 'PIN_1'
  335.       switch(NCode) {
  336.       case WM_NOTIFICATION_CLICKED:
  337.         // USER START (Optionally insert code for reacting on notification message)
  338.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(1); }
  339.         // USER END
  340.         break;
  341.       case WM_NOTIFICATION_RELEASED:
  342.         // USER START (Optionally insert code for reacting on notification message)
  343.         // USER END
  344.         break;
  345.       // USER START (Optionally insert additional code for further notification handling)
  346.       // USER END
  347.       }
  348.       break;
  349.     case ID_BUTTON_5: // Notifications sent by 'PIN_2'
  350.       switch(NCode) {
  351.       case WM_NOTIFICATION_CLICKED:
  352.         // USER START (Optionally insert code for reacting on notification message)
  353.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(2); }
  354.         // USER END
  355.         break;
  356.       case WM_NOTIFICATION_RELEASED:
  357.         // USER START (Optionally insert code for reacting on notification message)
  358.         // USER END
  359.         break;
  360.       // USER START (Optionally insert additional code for further notification handling)
  361.       // USER END
  362.       }
  363.       break;
  364.     case ID_BUTTON_6: // Notifications sent by 'PIN_3'
  365.       switch(NCode) {
  366.       case WM_NOTIFICATION_CLICKED:
  367.         // USER START (Optionally insert code for reacting on notification message)
  368.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(3); }
  369.         // USER END
  370.         break;
  371.       case WM_NOTIFICATION_RELEASED:
  372.         // USER START (Optionally insert code for reacting on notification message)
  373.         // USER END
  374.         break;
  375.       // USER START (Optionally insert additional code for further notification handling)
  376.       // USER END
  377.       }
  378.       break;
  379.     case ID_BUTTON_7: // Notifications sent by 'PIN_4'
  380.       switch(NCode) {
  381.       case WM_NOTIFICATION_CLICKED:
  382.         // USER START (Optionally insert code for reacting on notification message)
  383.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(4); }
  384.         // USER END
  385.         break;
  386.       case WM_NOTIFICATION_RELEASED:
  387.         // USER START (Optionally insert code for reacting on notification message)
  388.         // USER END
  389.         break;
  390.       // USER START (Optionally insert additional code for further notification handling)
  391.       // USER END
  392.       }
  393.       break;
  394.     case ID_BUTTON_8: // Notifications sent by 'PIN_5'
  395.       switch(NCode) {
  396.       case WM_NOTIFICATION_CLICKED:
  397.         // USER START (Optionally insert code for reacting on notification message)
  398.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(5); }
  399.         // USER END
  400.         break;
  401.       case WM_NOTIFICATION_RELEASED:
  402.         // USER START (Optionally insert code for reacting on notification message)
  403.         // USER END
  404.         break;
  405.       // USER START (Optionally insert additional code for further notification handling)
  406.       // USER END
  407.       }
  408.       break;
  409.     case ID_BUTTON_9: // Notifications sent by 'PIN_6'
  410.       switch(NCode) {
  411.       case WM_NOTIFICATION_CLICKED:
  412.         // USER START (Optionally insert code for reacting on notification message)
  413.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(6); }
  414.         // USER END
  415.         break;
  416.       case WM_NOTIFICATION_RELEASED:
  417.         // USER START (Optionally insert code for reacting on notification message)
  418.         // USER END
  419.         break;
  420.       // USER START (Optionally insert additional code for further notification handling)
  421.       // USER END
  422.       }
  423.       break;
  424.     case ID_BUTTON_10: // Notifications sent by 'PIN_7'
  425.       switch(NCode)
  426.       {
  427.       case WM_NOTIFICATION_CLICKED:
  428.         // USER START (Optionally insert code for reacting on notification message)
  429.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(7); }
  430.         // USER END
  431.         break;
  432.       case WM_NOTIFICATION_RELEASED:
  433.         // USER START (Optionally insert code for reacting on notification message)
  434.         // USER END
  435.         break;
  436.       // USER START (Optionally insert additional code for further notification handling)
  437.       // USER END
  438.       }
  439.       break;
  440.     case ID_BUTTON_11: // Notifications sent by 'PIN_8'
  441.       switch(NCode) {
  442.       case WM_NOTIFICATION_CLICKED:
  443.         // USER START (Optionally insert code for reacting on notification message)
  444.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(8); }
  445.         // USER END
  446.         break;
  447.       case WM_NOTIFICATION_RELEASED:
  448.         // USER START (Optionally insert code for reacting on notification message)
  449.         // USER END
  450.         break;
  451.       // USER START (Optionally insert additional code for further notification handling)
  452.       // USER END
  453.       }
  454.       break;
  455.     case ID_BUTTON_12: // Notifications sent by 'PIN_9'
  456.       switch(NCode) {
  457.       case WM_NOTIFICATION_CLICKED:
  458.         // USER START (Optionally insert code for reacting on notification message)
  459.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(9); }
  460.         // USER END
  461.         break;
  462.       case WM_NOTIFICATION_RELEASED:
  463.         // USER START (Optionally insert code for reacting on notification message)
  464.         // USER END
  465.         break;
  466.       // USER START (Optionally insert additional code for further notification handling)
  467.       // USER END
  468.       }
  469.       break;
  470.     case ID_BUTTON_13: // Notifications sent by 'PIN_0'
  471.       switch(NCode) {
  472.       case WM_NOTIFICATION_CLICKED:
  473.         // USER START (Optionally insert code for reacting on notification message)
  474.           if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(0); }
  475.         // USER END
  476.         break;
  477.       case WM_NOTIFICATION_RELEASED:
  478.         // USER START (Optionally insert code for reacting on notification message)
  479.         // USER END
  480.         break;
  481.       // USER START (Optionally insert additional code for further notification handling)
  482.       // USER END
  483.       }
  484.       break;
  485.     case ID_BUTTON_14: // Notifications sent by 'PIN_STAR'
  486.       switch(NCode) {
  487.       case WM_NOTIFICATION_CLICKED:
  488.         // USER START (Optionally insert code for reacting on notification message)
  489.           if(blokada_klawiatury == 1) { }
  490.         // USER END
  491.         break;
  492.       case WM_NOTIFICATION_RELEASED:
  493.         // USER START (Optionally insert code for reacting on notification message)
  494.         // USER END
  495.         break;
  496.       // USER START (Optionally insert additional code for further notification handling)
  497.       // USER END
  498.       }
  499.       break;
  500.     case ID_BUTTON_15: // Notifications sent by 'PIN_HASH'
  501.       switch(NCode) {
  502.       case WM_NOTIFICATION_CLICKED:
  503.         // USER START (Optionally insert code for reacting on notification message)
  504.         if(blokada_klawiatury == 1) {
  505.                 Kod_Pin_Stan = 5;
  506.                 Kod_Pin_Stan = Przypisz_Pin(0);
  507.         }
  508.         // USER END
  509.         break;
  510.       case WM_NOTIFICATION_RELEASED:
  511.         // USER START (Optionally insert code for reacting on notification message)
  512.         // USER END
  513.         break;
  514.       // USER START (Optionally insert additional code for further notification handling)
  515.       // USER END
  516.       }
  517.       break;
  518.     // USER START (Optionally insert additional code for further Ids)
  519.     // USER END
  520.     }
  521.     break;
  522.   // USER START (Optionally insert additional message handling)
  523.   // USER END
  524.   default:
  525.     WM_DefaultProc(pMsg);
  526.     break;
  527.   }
  528. }
  529. /*********************************************************************
  530. *
  531. *       Public code
  532. *
  533. **********************************************************************
  534. */
  535. /*********************************************************************
  536. *
  537. *       CreateWindow
  538. */
  539. WM_HWIN CreateWindow(void);
  540. WM_HWIN CreateWindow(void) {
  541.   WM_HWIN hWin;
  542.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  543.   return hWin;
  544. }
  545. // USER START (Optionally insert additional public code)
  546. Pin_Resoult_t Przypisz_Pin(uint8_t cyfra)
  547. {
  548.     if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_1)
  549.     {
  550.         Kod_Pin_Do_Wyswietlenia.pin_1_cyfra = cyfra;
  551.         GUI_SetFont(GUI_FONT_20B_ASCII);
  552.         GUI_DispDecAt((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra), 70, 10, 1);
  553.         GUI_SetBkColor(GUI_RED);
  554.         return (Pin_Resoult_Ustawiony_1+1);
  555.     }
  556.     else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_2)
  557.     {
  558.         Kod_Pin_Do_Wyswietlenia.pin_2_cyfra = cyfra;
  559.         GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
  560.         GUI_SetFont(GUI_FONT_20B_ASCII);
  561.         GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*10)+Kod_Pin_Do_Wyswietlenia.pin_2_cyfra), 100, 20, 2);
  562.         GUI_SetBkColor(GUI_RED);
  563.         return (Pin_Resoult_Ustawiony_2+1);
  564.     }
  565.     else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_3)
  566.     {
  567.         Kod_Pin_Do_Wyswietlenia.pin_3_cyfra = cyfra;
  568.         GUI_SetFont(GUI_FONT_20B_ASCII);
  569.         GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*100)
  570.                 +(Kod_Pin_Do_Wyswietlenia.pin_2_cyfra*10)
  571.                 +(Kod_Pin_Do_Wyswietlenia.pin_3_cyfra)), 70, 10, 3);
  572.         GUI_SetBkColor(GUI_RED);
  573.         return (Pin_Resoult_Ustawiony_3+1);
  574.     }
  575.     else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_4)
  576.     {
  577.         Kod_Pin_Do_Wyswietlenia.pin_4_cyfra = cyfra;
  578.         GUI_SetFont(GUI_FONT_20B_ASCII);
  579.         GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*1000)
  580.                 +(Kod_Pin_Do_Wyswietlenia.pin_2_cyfra*100)
  581.                 +(Kod_Pin_Do_Wyswietlenia.pin_3_cyfra*10)
  582.                 +(Kod_Pin_Do_Wyswietlenia.pin_4_cyfra)), 70, 10, 4);
  583.        GUI_SetBkColor(GUI_RED);
  584.         return (Pin_Resoult_Ustawiony_4+1);
  585.     }
  586.     else if(Kod_Pin_Stan == 5)
  587.     {
  588.         GUI_ClearRect(70, 0, 140, 28);
  589.         GUI_SetBkColor(GUI_RED);
  590.         return (Pin_Resoult_Ustawiony_1);
  591.     }
  592.     else
  593.     {
  594.         return Pin_Resoult_NieUstawione;
  595.     }
  596. }
  597. void Ustaw_Rodzaj_We_Wy(Rodzaj_Wy_We_t przelaczanie)
  598. {
  599.     //(int x0, int y0, int x1, int y1);
  600.     GUI_SetBkColor(GUI_RED);
  601.     //(int x0, int y0, int x1, int y1);
  602.     GUI_ClearRect(200, 0, 365, 42);
  603.     GUI_SetBkColor(GUI_RED);
  604.     GUI_SetFont(GUI_FONT_20B_ASCII);
  605.     if(przelaczanie == Rodzaj_1)//1
  606.     {
  607.         GUI_DispStringAt("Przycisk 1", 200, 22);
  608.         GUI_SetBkColor(GUI_RED);
  609.     }
  610.     else if(przelaczanie == Rodzaj_2) //2
  611.     {
  612.         GUI_DispStringAt("Przycisk 2", 200, 22);
  613.         GUI_SetBkColor(GUI_RED);
  614.     }
  615.     else if(przelaczanie == Rodzaj_3)
  616.     {
  617.         GUI_DispStringAt("Przycisk 4", 200, 22);
  618.         GUI_SetBkColor(GUI_RED);
  619.     }
  620.     else if(przelaczanie == Rodzaj_4)
  621.     {
  622.         GUI_DispStringAt("Przycisk 3", 200, 22);
  623.         GUI_SetBkColor(GUI_RED);
  624.     }
  625. }
  626. // USER END

Jego wywołanie oraz załadowanie na ekran prezentuje się następująco:

  1.   status = BSP_TS_Init(480, 272);
  2.   BSP_SDRAM_Init();
  3.   __HAL_RCC_CRC_CLK_ENABLE();
  4.   GUI_Init();                 //Inicjalizacja biblioteki graficznej
  5.   GUI_Clear();             //Czyszczenei wyswietlacza
  6.   GUI_SetLayerVisEx(2, 1); //Ustawienie warstw
  7.   GUI_SelectLayer(1);      //Wybranie aktywnej
  8.   GUI_SetBkColor(GUI_WHITE);
  9.   GUI_SetBkColor(GUI_RED); //Wybranie koloru tla
  10.   TS_State.Layer = 1;      //Wybranie wartstwy
  11.   GUI_Exec();
  12.   Pasek_Postepu();
  13.   GUI_Delay(100);
  14.   CreateWindow();          //Stworzenie okna wygenerowanego przez GUIBuilder
  15.   GUI_Delay(100);
  16.   GUI_SetLayerVisEx(2, 1); //Ustawienie warstw
  17.   GUI_SelectLayer(1);
  18.   GUI_Delay(100);

Jeśli chodzi natomiast o wyświetlanie tekstu na wygenerowanym oknie, to należy wykonać przeróbkę pliku LCDConf, ponieważ nie działa on odpowiednio. Tzn. zawsze wysuwa na pierwszy plan wygenerowane okno z pliku .c. Natomiast będzie on się sprawdzał świetnie w przypadku wykonania własnoręcznie przycisków sliderów itp w kodzie. Ja swój plik zmodyfikowałem pod sterownik znaleziony w internecie, jest on natomiast przerobioną wersją sterownika wypuszczonego przez firmę ST. Cały plik z nim znajduje się w plikach do pobrania.

Prawdopodobnie pojawi się bardzo duża liczba errorów natomiast nie ma się za bardzo co tym przejmować, jeśli nie wystąpi żaden błąd podczas kompilacji.

Aby plik był widoczny w main.c należy dołożyć następujące deklaracje do pliku main.h.

  1. #include "GUI.h"
  2. #include "WM.h"
  3. #include "DIALOG.h"
  4. WM_HWIN CreateWindow(void);

Drugi sposób polega natomiast na napisu całości w kodzie, przez co będzie wywoływana odpowiednia funkcja w programie, która wygeneruje przygotowane okno na ekranie:

  1. void Glowne_Okno_Programu(void)
  2. {
  3.     BUTTON_Handle hB1, hB2, hB3, hB4, hB5, hB6, hB7, hB8;
  4.     GUI_SetBkColor(GUI_RED);
  5.     //Wyswietlenie
  6.     GUI_Exec();
  7.     //Usuniecie funkcjonalnosci przycisku
  8.     //WM_DeleteWindow(hB1);
  9.     //Wykasowanie przycisku z ekranu
  10.     //GUI_ClearRect(10, 50, 269, 90);
  11.     //Stworzenie przyciskow za pomoca widzetu button
  12.     hB1 = BUTTON_CreateEx(10, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
  13.     hB2 = BUTTON_CreateEx(125, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
  14.     hB3 = BUTTON_CreateEx(10, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON3);
  15.     hB4 = BUTTON_CreateEx(125, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON4);
  16.     hB5 = BUTTON_CreateEx(240, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON5);
  17.     hB6 = BUTTON_CreateEx(355, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON6);
  18.     hB7 = BUTTON_CreateEx(240, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON7);
  19.     hB8 = BUTTON_CreateEx(355, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON8);
  20.     //Wybranie czcionki dla przyciskow
  21.     BUTTON_SetFont(hB1, &GUI_Font13HB_ASCII);
  22.     BUTTON_SetFont(hB2, &GUI_Font13HB_ASCII);
  23.     BUTTON_SetFont(hB3, &GUI_Font13HB_ASCII);
  24.     BUTTON_SetFont(hB4, &GUI_Font13HB_ASCII);
  25.     BUTTON_SetFont(hB5, &GUI_Font13HB_ASCII);
  26.     BUTTON_SetFont(hB6, &GUI_Font13HB_ASCII);
  27.     BUTTON_SetFont(hB7, &GUI_Font13HB_ASCII);
  28.     BUTTON_SetFont(hB8, &GUI_Font13HB_ASCII);
  29.     //Ustawienie tekstu
  30.     BUTTON_SetText(hB1, "Przycisk 1");
  31.     BUTTON_SetText(hB2, "Przycisk 2");
  32.     BUTTON_SetText(hB3, "Przycisk 3");
  33.     BUTTON_SetText(hB4, "Przycisk 4");
  34.     BUTTON_SetText(hB5, "Przycisk 5");
  35.     BUTTON_SetText(hB6, "Przycisk 6");
  36.     BUTTON_SetText(hB7, "Przycisk 7");
  37.     BUTTON_SetText(hB8, "Przycisk 8");
  38.     //Wyswietl
  39.     GUI_Exec();
  40. }

Tą funkcje wywołuje się podczas inicjalizacji całego systemu. W niej za pomocą widżetów zostały stworzone przyciski umieszczone w odpowiedniej lokalizacji.

Poniżej funkcja której wywołanie spowoduje wygenerowanie paska postępu na środku ekranu:

  1. void Pasek_Postepu(void)
  2. {
  3.     uint8_t i;
  4.     PROGBAR_Handle hProgbar;
  5.     hProgbar = PROGBAR_CreateEx(130, 135, 250, 30, 0, WM_CF_SHOW, 0, GUI_ID_PROGBAR0);  //Stworzenie widgeta
  6.     PROGBAR_SetFont(hProgbar, &GUI_Font8x16);                                           //Czcionka
  7.     PROGBAR_SetText(hProgbar, "wczytywanie..prosze czekac..");                          //Ustawienie tekstu
  8.     for (= 1; i <= 100; i++)
  9.     {
  10.         PROGBAR_SetValue(hProgbar, i);                                                  //Wlaczenie paska
  11.         GUI_Delay(20);                                                                  //Opoznienie
  12.     }
  13. }

Wykrywanie dotyku umieściłem w funkcji dotyczącej obsługi przerwania od timera. Tam należy wprowadzić:

  1.         switch (GUI_GetKey())
  2.         {
  3.             case GUI_ID_BUTTON1:
  4.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  5.                   GUI_DispStringAt("Przycisk_1", 200, 22);
  6.                   GUI_SetBkColor(GUI_RED);
  7.                   GUI_Exec();
  8.                 break;
  9.             case GUI_ID_BUTTON2:
  10.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  11.                   GUI_DispStringAt("Przycisk_2", 200, 22);
  12.                   GUI_SetBkColor(GUI_RED);
  13.                   GUI_Exec();
  14.                 break;
  15.             case GUI_ID_BUTTON3:
  16.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  17.                   GUI_DispStringAt("Przycisk_3", 200, 22);
  18.                   GUI_SetBkColor(GUI_RED);
  19.                   GUI_Exec();
  20.                 break;
  21.             case GUI_ID_BUTTON4:
  22.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  23.                   GUI_DispStringAt("Przycisk_4", 200, 22);
  24.                   GUI_SetBkColor(GUI_RED);
  25.                   GUI_Exec();
  26.                 break;
  27.             case GUI_ID_BUTTON5:
  28.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  29.                   GUI_DispStringAt("Przycisk_5", 200, 22);
  30.                   GUI_SetBkColor(GUI_RED);
  31.                   GUI_Exec();
  32.                 break;
  33.             case GUI_ID_BUTTON6:
  34.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  35.                   GUI_DispStringAt("Przycisk_6", 200, 22);
  36.                   GUI_SetBkColor(GUI_RED);
  37.                   GUI_Exec();
  38.                 break;
  39.             case GUI_ID_BUTTON7:
  40.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  41.                   GUI_DispStringAt("Przycisk_7", 200, 22);
  42.                   GUI_SetBkColor(GUI_RED);
  43.                   GUI_Exec();
  44.                 break;
  45.             case GUI_ID_BUTTON8:
  46.                   GUI_SetFont(GUI_FONT_20B_ASCII);
  47.                   GUI_DispStringAt("Przycisk_8", 200, 22);
  48.                   GUI_SetBkColor(GUI_RED);
  49.                   GUI_Exec();
  50.                 break;
  51.             default:
  52.                 break;
  53.         }

Wtedy gdy zostanie wykryte kliknięcie przycisku to wcześniej ustawiona funkcja wykryje czy został on naciśnięty po czym wejście do instrukcji warunkowej select case, gdzie wykonana wyświetlenie danych.

Jeśli chciałoby się stworzyć menu zagnieżdżone, wtedy należałoby po wybraniu przycisku czyścić ekran z niepotrzebnych elementów oraz widżetów, których funkcjonalność usuwa się za pomocą WM_DeleteWindow(nazwa); po czym trzeba wyczyścić obszar na którym znajdował się przycisk, ponieważ będzie on dalej widoczny, mimo że nie będzie już działał.

Kolejną część chciałbym poświęcić na wyświetlenie zdjęć z karty SD oraz ustawianiu odpowiednich parametrów przeźroczystości ekranu.

Pliki z projektem oraz plikami do CubeMx z tego posta oraz z Cz. 1 można znaleźć na dysku Google pod tym linkiem.