Graficzny interfejs użytkownika GUI: graficzny menedżer plików i obsługa kart SD (7)

W artykule przedstawiamy projekt graficznego menadżera plików, jego dostępne możliwości oraz sposób rozbudowy o dodatkowe elementy funkcjonalne. Jako nośnik informacji wykorzystano kartę SD montowaną w gnieździe płyty bazowej układu.

Fot. 1. Elementy składowe układu testowego

Fot. 1. Elementy składowe układu testowego

Menedżer plików jest programem służącym do zarządzania strukturą plików i katalogów. Do głównych jego zadań można zaliczyć: kopiowanie, podgląd struktury drzewa, przenoszenie, usuwanie, zakładanie katalogów, uruchamianie programów itd. Realizacja takiego narzędzia w systemach wbudowanych jest stosunkowo prosta, gdy mamy gotową bibliotekę interfejsu graficznego użytkownika oraz bibliotekę do obsługi dysków zewnętrznych – wystarczy tylko je poprawnie zintegrować.

Prezentowany poniżej menedżer plików powstał na bazie biblioteki ST Embedded GUI Library (rozszerzonej o dodatkowe komponenty i moduły w ramach własnej biblioteki GxFreeGUI) oraz biblioteki FatFS (obsługa kart SD). Całość została tak zaprojektowana, aby umożliwić łatwiejszą ewentualną rozbudowę projektu (dodanie dodatkowych funkcji do samego menedżera i podłączenie obsługi innych formatów plików).

Na początku warto omówić część graficzną aplikacji. Standardowa biblioteka od ST zawiera dwie grupy plików: EmbeddedGUI HAL (sterowniki wyświetlacza i panelu dotykowego) i EmbeddedGUI Library (implementacja prostych komponentów graficznych). Natomiast biblioteka GxFreeGUI rozszerza tę ostatnią grupę o takie komponenty jak: Drawbox, Listbox, OnScreenKeyboard i Textbox oraz wprowadza trzecią grupę plików EmbeddedGUI Apps, w której zawarte są konkretne aplikacje zbudowane z istniejących komponentów takie jak: okno dialogowe, okno menedżera plików, przeglądarka plików graficznych BMP i GIF oraz przeglądarka plików tekstowych.

 

Fot. 2. Główne okno menadżera plików

Fot. 2. Główne okno menadżera plików

 

Moduł menadżera plików (GxFreeGUI_FileManager.c) (fotografia 2) stanowi swojego rodzaju punkt startowy. Jest on tworzony w pamięci mikrokontrolera za pomocą funkcji Create_FileManager() i przywoływany na ekran wyświetlacza za pomocą funkcji Show_FileManager():

W pierwszej funkcji na powyższym listingu są tworzone proste komponenty i sama strona do której następnie te pierwsze zostają przypisane pod określoną pozycją. Można również zauważyć, że unikalne ID tworzonych komponentów nie są podawane jawnie – są one zdefiniowane w osobnym pliku ComponentsIDDef.h, co pozwala uniknąć nieuważnego przypisania dwóch takich samych ID do różnych komponentów. Ostatnia funkcja jest odpowiedzialna za schowanie poprzednio wyświetlanej strony (wskazywana przez zmienną CurrentScreen) i wyświetlenie strony menadżera. Przy okazji jest sprawdzane, czy karta SD jest obecna w gnieździe i jeśli tak to jest automatycznie inicjalizowana (funkcja do_ORD()). Dzięki temu, że każda funkcja Show() z grupy EmbeddedGUI Apps przyjmuje jako argument wskaźnik do funkcji powrotnej rodzica (np. do funkcji Show_ParentScreen()) nie ma konieczności podawania jej konkretnej nazwy przy wyjściu z danego okna za pomocą funkcji Hide(). Jeśli wywołanie strony ma odbywać się w jedną stronę (bez możliwości schowania strony) to należy przekazać dla funkcji Show() jako argument wartość NULL.

Należy przy tym jeszcze wspomnieć o pliku rejestracyjnym AppsList.c. Jeśli oferowana lista obsługiwanych formatów plików nie jest wystarczająca to można ją w łatwy sposób poszerzyć poprzez implementację odpowiednich dekoderów i modułów aplikacji (kod których jest dołączany do grupy EmbeddedGUI Apps w osobnych plikach), a także zarejestrowanie formatu pliku i dwóch rodzajów funkcji w omawianym pliku rejestracyjnym. W odpowiednim pliku nagłówkowym trzeba jeszcze zmienić wartość stałej NR_OF_APPS, która reprezentuje liczbę zaimplementowanych dekoderów plików + 1. Taka forma podłączania modułów zwalnia od konieczności jawnego wywoływania funkcji Create() i Show() – jest to robione automatycznie z poziomu modułu menadżera:

Moduł menadżera zawiera również funkcje typu event-handler wykorzystanych komponentów oraz funkcje do wykonywania operacji odczyt/zapis na plikach/katalogach:

Funkcja __process_indicator() wyświetla mały kwadracik w prawym dolnym rogu ekranu informując o tym czy jest wykonywana krytyczna operacja na nośniku (kolor czerwony – operacja trwa; czarny – operacja zakończona; wyświetlany tylko w ramach modułu menadżera). W funkcjach typu event-handler wywoływane są tylko odpowiadające im funkcje do(), a kilka z nich stanowi wyjątek:

Kilka wybranych funkcji wykonujących właściwe operacje zapis/odczyt na nośniku:

Funkcja do_MKDIR() tworzy katalog o nazwie przechowywanej w buforze dir_name. Jeżeli bufor ten zawiera pusty ciąg znaków to funkcja kończy swoje działanie bez wykonywania jakiejkolwiek operacji na nośniku, a w sytuacji gdy istnieje już katalog o podanej nazwie to jest tworzony nowy ale z doklejonym wolnym indeksem. W przypadku funkcji do_OPEN(), jeśli format pliku jest zarejestrowany (istnieje moduł który go otwiera) to wywoływana jest odpowiednia funkcja wskazywana przez i-ty element tablicy AppList_Open[], która przyjmuje następującą listę argumentów:

  • argv[0] – wskaźnik do funkcji powrotnej rodzica (funkcja Show()),
  • argv[1] – wskaźnik na obiekt typu FIL (obiekt wybranego pliku z listy),
  • argv[2] – wskaźnik na ciąg znaków (nazwa wybranego pliku).

 

Fot. 3. Okno dialogowe w którym można wprowadzać tekst

Fot. 3. Okno dialogowe w którym można wprowadzać tekst

 

Równie ważnym jest także wyświetlanie komunikatów i wprowadzanie tekstu. Do tego celu służy moduł GxFreeGUI_Dialog.c (fotografia 3). Z reguły funkcje typu Show() przyjmują tylko jeden argument (wskaźnik na funkcję powrotną), ale w przypadku okna dialogowego jest ich więcej:

  • DialogWindowType – rodzaj okna dialogowego:
    • DW_TEXT_INPUT – wyświetlenie komunikatu i wprowadzenie tekstu,
    • DW_TEXT_OUTPUT – tylko wyświetlenie komunikatu.
    • p – wskaźnik do funkcji powrotnej rodzica (funkcja Show()),
    • pContinue – wskaźnik do funkcji wywoływanej po kliknięciu przycisku OK,
    • argv[] – wskaźnik do listy dodatkowych argumentów:
      • dla DW_TEXT_INPUT:
        • [0] – wskaźnik do tekstu komunikatu,
        • [1] – wskaźnik do bufora w którym zostanie zapisany wprowadzony tekst,
  • dla DW_TEXT_OUTPUT:
    • [0] – wskaźnik do tekstu komunikatu.

Okno dialogowe jest tworzone przy wywołaniu funkcji Show() i usuwane z pamięci mikrokontrolera przy wywołaniu funkcji Hide():

Obsługa zdarzenia od wciśnięcia klawisza klawiatury ekranowej:

Fot. 4. Wyświetlanie plików tekstowych

Fot. 4. Wyświetlanie plików tekstowych

 

Za otwieranie i wyświetlanie plików odpowiadają funkcje Open<FileType>File() zdefiniowane w odpowiednich modułach (fotografie 4 i 5). Przykładowo, moduł do wyświetlania plików tekstowych pozwala wyprowadzić na ekran jego początek (tyle ile się zmieści w komponencie).

Fot. 5. Wyświetlanie plików graficznych

Fot. 5. Wyświetlanie plików graficznych

 

Biblioteka FatFS w wersji R0.09 współpracuje ze sterownikiem interfejsu SDIO mikrokontrolera. Jedyne zmiany jakie dokonano w stosunku do standardowych ustawień to zmiana wartości poniższych stałych (plik ffconf.h):

Powyższa konfiguracja wymaga obecności funkcji get_fattime() (plik diskio.c) która powinna zwracać aktualny czas – pozostaje do zaimplementowania. Zamiast tego jest wydawana stała wartość odpowiadająca dacie 1 stycznia 2000 roku, 01:01:02:

Jan Szemiet

Do pobrania

Autor: admin

Admin