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.
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.
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:
Jego wywołanie oraz załadowanie na ekran prezentuje się następująco:
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.
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:
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:
Wykrywanie dotyku umieściłem w funkcji dotyczącej obsługi przerwania od timera. Tam należy wprowadzić:
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.
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.
- /* Wyglad struktury def w pliku GUI_Type.h
- * typedef struct {
- * int x,y;
- * U8 Pressed;
- * U8 Layer;
- * } GUI_PID_STATE;
- */
- GUI_PID_STATE TS_State;
- TS_StateTypeDef ts;
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if(htim->Instance==TIM6)
- {
- BSP_TS_GetState(&ts); //Pobranie stanu
- if (ts.touchDetected) //Wykrycie dotyku
- {
- TS_State.Pressed = ts.touchDetected;
- TS_State.y = ts.touchY[0];
- TS_State.x = ts.touchX[0];
- GUI_PID_StoreState(&TS_State); //Przekazanie stanu
- }
- else //Brak dotkniecia
- {
- TS_State.Pressed = 0;
- TS_State.y = -1;
- TS_State.x = -1;
- GUI_PID_StoreState(&TS_State); //Przekazanie stanu
- }
- }
- }
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:
- // USER START (Optionally insert additional includes)
- // USER END
- #include "DIALOG.h"
- #include "button.h"
- #include <stdint.h>
- /*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
- #define ID_WINDOW_0 (GUI_ID_USER + 0x00)
- #define ID_BUTTON_0 (GUI_ID_USER + 0x01)
- #define ID_BUTTON_1 (GUI_ID_USER + 0x02)
- #define ID_BUTTON_2 (GUI_ID_USER + 0x03)
- #define ID_BUTTON_3 (GUI_ID_USER + 0x04)
- #define ID_BUTTON_4 (GUI_ID_USER + 0x06)
- #define ID_BUTTON_5 (GUI_ID_USER + 0x07)
- #define ID_BUTTON_6 (GUI_ID_USER + 0x08)
- #define ID_BUTTON_7 (GUI_ID_USER + 0x09)
- #define ID_BUTTON_8 (GUI_ID_USER + 0x0A)
- #define ID_BUTTON_9 (GUI_ID_USER + 0x0B)
- #define ID_BUTTON_10 (GUI_ID_USER + 0x0C)
- #define ID_BUTTON_11 (GUI_ID_USER + 0x0D)
- #define ID_BUTTON_12 (GUI_ID_USER + 0x0E)
- #define ID_BUTTON_13 (GUI_ID_USER + 0x0F)
- #define ID_BUTTON_14 (GUI_ID_USER + 0x10)
- #define ID_BUTTON_15 (GUI_ID_USER + 0x11)
- // USER START (Optionally insert additional defines)
- // USER END
- /*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
- // USER START (Optionally insert additional static data)
- // USER END
- /*********************************************************************
- *
- * _aDialogCreate
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 3, 1, 480, 272, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "przycisk3", ID_BUTTON_0, 375, 140, 100, 50, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "przycisk1", ID_BUTTON_1, 375, 20, 100, 50, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "przycisk2", ID_BUTTON_2, 375, 80, 100, 50, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "przycisk4", ID_BUTTON_3, 375, 200, 100, 50, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_1", ID_BUTTON_4, 20, 30, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_2", ID_BUTTON_5, 80, 30, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_3", ID_BUTTON_6, 140, 30, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_4", ID_BUTTON_7, 20, 90, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_5", ID_BUTTON_8, 80, 90, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_6", ID_BUTTON_9, 140, 90, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_7", ID_BUTTON_10, 19, 150, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_8", ID_BUTTON_11, 80, 150, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_9", ID_BUTTON_12, 140, 150, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_0", ID_BUTTON_13, 80, 210, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_STAR", ID_BUTTON_14, 20, 210, 40, 40, 0, 0x0, 0 },
- { BUTTON_CreateIndirect, "PIN_HASH", ID_BUTTON_15, 140, 210, 40, 40, 0, 0x0, 0 },
- // USER START (Optionally insert additional widgets)
- // USER END
- };
- /*********************************************************************
- *
- * Static code
- *
- **********************************************************************
- */
- // USER START (Optionally insert additional static code)
- typedef struct KodPin{
- uint8_t pin_1_cyfra;
- uint8_t pin_2_cyfra;
- uint8_t pin_3_cyfra;
- uint8_t pin_4_cyfra;
- }KodPin_t;
- typedef enum{
- Pin_Resoult_NieUstawione = 0,
- Pin_Resoult_Ustawiony_1 = 1,
- Pin_Resoult_Ustawiony_2 = 2,
- Pin_Resoult_Ustawiony_3 = 3,
- Pin_Resoult_Ustawiony_4 = 4
- }Pin_Resoult_t;
- typedef enum{
- Rodzaj_1 = 1,
- Rodzaj_2 = 2,
- Rodzaj_3 = 3,
- Rodzaj_4 = 4
- }Rodzaj_Wy_We_t;
- KodPin_t Kod_Pin_Do_Wyswietlenia;
- uint8_t Kod_Pin_Stan = 1;
- uint8_t kolor = 0;
- Pin_Resoult_t Przypisz_Pin(uint8_t cyfra);
- void Ustaw_Rodzaj_We_Wy(Rodzaj_Wy_We_t przelaczanie);
- // USER END
- /*********************************************************************
- *
- * _cbDialog
- */
- WM_HWIN hItem;
- static void _cbDialog(WM_MESSAGE * pMsg) {
- //WM_HWIN hItem;
- int NCode;
- int Id;
- // USER START (Optionally insert additional variables)
- static uint8_t przelaczanie_stat = 0;
- static uint8_t blokada_klawiatury = 0;
- // USER END
- switch (pMsg->MsgId)
- {
- case WM_INIT_DIALOG:
- //
- // Initialization of 'Window'
- //
- hItem = pMsg->hWin;
- WINDOW_SetBkColor(hItem, GUI_RED);
- //
- // Initialization of 'klucz'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
- BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
- BUTTON_SetText(hItem, "Podaj Pin");
- //
- // Initialization of 'wejscie'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
- BUTTON_SetText(hItem, "Przycisk 1");
- BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
- //
- // Initialization of 'wyjscie'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
- BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
- BUTTON_SetText(hItem, "Przycisk 2");
- //
- // Initialization of 'funkcje'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
- BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
- BUTTON_SetText(hItem, "Przycisk 4");
- //
- // Initialization of 'PIN_TEXT'
- //
- //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
- //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
- //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
- //TEXT_SetText(hItem, "");
- //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
- //
- // Initialization of 'PIN_1'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- BUTTON_SetText(hItem, "1");
- //
- // Initialization of 'PIN_2'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
- BUTTON_SetText(hItem, "2");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_3'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_6);
- BUTTON_SetText(hItem, "3");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_4'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_7);
- BUTTON_SetText(hItem, "4");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_5'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);
- BUTTON_SetText(hItem, "5");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_6'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_9);
- BUTTON_SetText(hItem, "6");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_7'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_10);
- BUTTON_SetText(hItem, "7");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_8'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_11);
- BUTTON_SetText(hItem, "8");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_9'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_12);
- BUTTON_SetText(hItem, "9");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_0'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_13);
- BUTTON_SetText(hItem, "0");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_STAR'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_14);
- BUTTON_SetText(hItem, "*");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'PIN_HASH'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_15);
- BUTTON_SetText(hItem, "#");
- BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
- //
- // Initialization of 'ENT_TEXT'
- //
- //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
- //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
- //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
- //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
- //TEXT_SetText(hItem, "Wejscie");
- //
- // Initialization of 'NR_Karty'
- //
- //hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
- //TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
- //TEXT_SetText(hItem, "");
- //TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
- //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
- // USER START (Optionally insert additional code for further widget initialization)
- // USER END
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch(Id) {
- case ID_BUTTON_0: // Notifications sent by 'klucz'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 0)
- {
- Ustaw_Rodzaj_We_Wy(Rodzaj_4);
- blokada_klawiatury = 1;
- }
- else if(blokada_klawiatury == 1)
- {
- Ustaw_Rodzaj_We_Wy(Rodzaj_1);
- blokada_klawiatury = 0;
- Kod_Pin_Stan = 5;
- Kod_Pin_Stan = Przypisz_Pin(0);
- }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_1: // Notifications sent by 'wejscie'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- Ustaw_Rodzaj_We_Wy(Rodzaj_1);
- Kod_Pin_Stan = 5;
- Kod_Pin_Stan = Przypisz_Pin(0);
- blokada_klawiatury = 0;
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_2: // Notifications sent by 'wyjscie'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(0 == przelaczanie_stat)
- {
- Ustaw_Rodzaj_We_Wy(Rodzaj_2);
- blokada_klawiatury = 0;
- przelaczanie_stat = 1;
- Kod_Pin_Stan = 5;
- Kod_Pin_Stan = Przypisz_Pin(0);
- }
- else if(1 == przelaczanie_stat)
- {
- Ustaw_Rodzaj_We_Wy(Rodzaj_3);
- blokada_klawiatury = 0;
- przelaczanie_stat = 0;
- Kod_Pin_Stan = 5;
- Kod_Pin_Stan = Przypisz_Pin(0);
- }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_3: // Notifications sent by 'funkcje'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- GUI_DispStringAt("Przycisk 4", 200, 22);
- GUI_SetBkColor(GUI_RED);
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_4: // Notifications sent by 'PIN_1'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(1); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_5: // Notifications sent by 'PIN_2'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(2); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_6: // Notifications sent by 'PIN_3'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(3); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_7: // Notifications sent by 'PIN_4'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(4); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_8: // Notifications sent by 'PIN_5'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(5); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_9: // Notifications sent by 'PIN_6'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(6); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_10: // Notifications sent by 'PIN_7'
- switch(NCode)
- {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(7); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_11: // Notifications sent by 'PIN_8'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(8); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_12: // Notifications sent by 'PIN_9'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(9); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_13: // Notifications sent by 'PIN_0'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { Kod_Pin_Stan = Przypisz_Pin(0); }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_14: // Notifications sent by 'PIN_STAR'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) { }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- case ID_BUTTON_15: // Notifications sent by 'PIN_HASH'
- switch(NCode) {
- case WM_NOTIFICATION_CLICKED:
- // USER START (Optionally insert code for reacting on notification message)
- if(blokada_klawiatury == 1) {
- Kod_Pin_Stan = 5;
- Kod_Pin_Stan = Przypisz_Pin(0);
- }
- // USER END
- break;
- case WM_NOTIFICATION_RELEASED:
- // USER START (Optionally insert code for reacting on notification message)
- // USER END
- break;
- // USER START (Optionally insert additional code for further notification handling)
- // USER END
- }
- break;
- // USER START (Optionally insert additional code for further Ids)
- // USER END
- }
- break;
- // USER START (Optionally insert additional message handling)
- // USER END
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * CreateWindow
- */
- WM_HWIN CreateWindow(void);
- WM_HWIN CreateWindow(void) {
- WM_HWIN hWin;
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
- return hWin;
- }
- // USER START (Optionally insert additional public code)
- Pin_Resoult_t Przypisz_Pin(uint8_t cyfra)
- {
- if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_1)
- {
- Kod_Pin_Do_Wyswietlenia.pin_1_cyfra = cyfra;
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispDecAt((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra), 70, 10, 1);
- GUI_SetBkColor(GUI_RED);
- return (Pin_Resoult_Ustawiony_1+1);
- }
- else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_2)
- {
- Kod_Pin_Do_Wyswietlenia.pin_2_cyfra = cyfra;
- GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*10)+Kod_Pin_Do_Wyswietlenia.pin_2_cyfra), 100, 20, 2);
- GUI_SetBkColor(GUI_RED);
- return (Pin_Resoult_Ustawiony_2+1);
- }
- else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_3)
- {
- Kod_Pin_Do_Wyswietlenia.pin_3_cyfra = cyfra;
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*100)
- +(Kod_Pin_Do_Wyswietlenia.pin_2_cyfra*10)
- +(Kod_Pin_Do_Wyswietlenia.pin_3_cyfra)), 70, 10, 3);
- GUI_SetBkColor(GUI_RED);
- return (Pin_Resoult_Ustawiony_3+1);
- }
- else if(Kod_Pin_Stan == Pin_Resoult_Ustawiony_4)
- {
- Kod_Pin_Do_Wyswietlenia.pin_4_cyfra = cyfra;
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispDecAt(((Kod_Pin_Do_Wyswietlenia.pin_1_cyfra*1000)
- +(Kod_Pin_Do_Wyswietlenia.pin_2_cyfra*100)
- +(Kod_Pin_Do_Wyswietlenia.pin_3_cyfra*10)
- +(Kod_Pin_Do_Wyswietlenia.pin_4_cyfra)), 70, 10, 4);
- GUI_SetBkColor(GUI_RED);
- return (Pin_Resoult_Ustawiony_4+1);
- }
- else if(Kod_Pin_Stan == 5)
- {
- GUI_ClearRect(70, 0, 140, 28);
- GUI_SetBkColor(GUI_RED);
- return (Pin_Resoult_Ustawiony_1);
- }
- else
- {
- return Pin_Resoult_NieUstawione;
- }
- }
- void Ustaw_Rodzaj_We_Wy(Rodzaj_Wy_We_t przelaczanie)
- {
- //(int x0, int y0, int x1, int y1);
- GUI_SetBkColor(GUI_RED);
- //(int x0, int y0, int x1, int y1);
- GUI_ClearRect(200, 0, 365, 42);
- GUI_SetBkColor(GUI_RED);
- GUI_SetFont(GUI_FONT_20B_ASCII);
- if(przelaczanie == Rodzaj_1)//1
- {
- GUI_DispStringAt("Przycisk 1", 200, 22);
- GUI_SetBkColor(GUI_RED);
- }
- else if(przelaczanie == Rodzaj_2) //2
- {
- GUI_DispStringAt("Przycisk 2", 200, 22);
- GUI_SetBkColor(GUI_RED);
- }
- else if(przelaczanie == Rodzaj_3)
- {
- GUI_DispStringAt("Przycisk 4", 200, 22);
- GUI_SetBkColor(GUI_RED);
- }
- else if(przelaczanie == Rodzaj_4)
- {
- GUI_DispStringAt("Przycisk 3", 200, 22);
- GUI_SetBkColor(GUI_RED);
- }
- }
- // USER END
Jego wywołanie oraz załadowanie na ekran prezentuje się następująco:
- status = BSP_TS_Init(480, 272);
- BSP_SDRAM_Init();
- __HAL_RCC_CRC_CLK_ENABLE();
- GUI_Init(); //Inicjalizacja biblioteki graficznej
- GUI_Clear(); //Czyszczenei wyswietlacza
- GUI_SetLayerVisEx(2, 1); //Ustawienie warstw
- GUI_SelectLayer(1); //Wybranie aktywnej
- GUI_SetBkColor(GUI_WHITE);
- GUI_SetBkColor(GUI_RED); //Wybranie koloru tla
- TS_State.Layer = 1; //Wybranie wartstwy
- GUI_Exec();
- Pasek_Postepu();
- GUI_Delay(100);
- CreateWindow(); //Stworzenie okna wygenerowanego przez GUIBuilder
- GUI_Delay(100);
- GUI_SetLayerVisEx(2, 1); //Ustawienie warstw
- GUI_SelectLayer(1);
- 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.
- #include "GUI.h"
- #include "WM.h"
- #include "DIALOG.h"
- 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:
- void Glowne_Okno_Programu(void)
- {
- BUTTON_Handle hB1, hB2, hB3, hB4, hB5, hB6, hB7, hB8;
- GUI_SetBkColor(GUI_RED);
- //Wyswietlenie
- GUI_Exec();
- //Usuniecie funkcjonalnosci przycisku
- //WM_DeleteWindow(hB1);
- //Wykasowanie przycisku z ekranu
- //GUI_ClearRect(10, 50, 269, 90);
- //Stworzenie przyciskow za pomoca widzetu button
- hB1 = BUTTON_CreateEx(10, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
- hB2 = BUTTON_CreateEx(125, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
- hB3 = BUTTON_CreateEx(10, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON3);
- hB4 = BUTTON_CreateEx(125, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON4);
- hB5 = BUTTON_CreateEx(240, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON5);
- hB6 = BUTTON_CreateEx(355, 90, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON6);
- hB7 = BUTTON_CreateEx(240, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON7);
- hB8 = BUTTON_CreateEx(355, 150, 105, 50, 0, WM_CF_SHOW, 0, GUI_ID_BUTTON8);
- //Wybranie czcionki dla przyciskow
- BUTTON_SetFont(hB1, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB2, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB3, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB4, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB5, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB6, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB7, &GUI_Font13HB_ASCII);
- BUTTON_SetFont(hB8, &GUI_Font13HB_ASCII);
- //Ustawienie tekstu
- BUTTON_SetText(hB1, "Przycisk 1");
- BUTTON_SetText(hB2, "Przycisk 2");
- BUTTON_SetText(hB3, "Przycisk 3");
- BUTTON_SetText(hB4, "Przycisk 4");
- BUTTON_SetText(hB5, "Przycisk 5");
- BUTTON_SetText(hB6, "Przycisk 6");
- BUTTON_SetText(hB7, "Przycisk 7");
- BUTTON_SetText(hB8, "Przycisk 8");
- //Wyswietl
- GUI_Exec();
- }
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:
- void Pasek_Postepu(void)
- {
- uint8_t i;
- PROGBAR_Handle hProgbar;
- hProgbar = PROGBAR_CreateEx(130, 135, 250, 30, 0, WM_CF_SHOW, 0, GUI_ID_PROGBAR0); //Stworzenie widgeta
- PROGBAR_SetFont(hProgbar, &GUI_Font8x16); //Czcionka
- PROGBAR_SetText(hProgbar, "wczytywanie..prosze czekac.."); //Ustawienie tekstu
- for (i = 1; i <= 100; i++)
- {
- PROGBAR_SetValue(hProgbar, i); //Wlaczenie paska
- GUI_Delay(20); //Opoznienie
- }
- }
Wykrywanie dotyku umieściłem w funkcji dotyczącej obsługi przerwania od timera. Tam należy wprowadzić:
- switch (GUI_GetKey())
- {
- case GUI_ID_BUTTON1:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_1", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON2:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_2", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON3:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_3", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON4:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_4", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON5:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_5", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON6:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_6", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON7:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_7", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- case GUI_ID_BUTTON8:
- GUI_SetFont(GUI_FONT_20B_ASCII);
- GUI_DispStringAt("Przycisk_8", 200, 22);
- GUI_SetBkColor(GUI_RED);
- GUI_Exec();
- break;
- default:
- break;
- }
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.