GUIX Studio: mikrokontrolery Renesas Synergy w aplikacjach graficznych [2]
Konfiguracja obiektu Prompt ekranu Window 1 została pokazana na rysunku 47 i 48. Obiekt instructions ma wykonywać akcję po przyciśnięciu i dlatego ma zaznaczona opcję Enable. Obiekt Window 1 text zmienia tylko napis przez siebie wyświetlany i nie ma zaznaczonej opcji Enable. Analogicznie wykonujemy konfigurację elementów Prompt umieszczonych w oknie window2 – rysunki 49 i 50.
Po umieszczeniu wszystkich elementów graficznych i ich skonfigurowaniu aplikacja GUIX Studio wygeneruje 4 pliki: guiapp_resources.c, guiapp_resources.h, guispp_specificiations.c i guispp_specificiations.h i umieści je w folderze gui. Żeby to się stało trzeba z menu Project uruchomić Generate All Output Files – rysunek 51.
W plikach wygenerowanych przez GUIX Studio są umieszczone definicje elementów graficznych oraz funkcje ich rysownia na ekranie.
Ostatni etap, to napisanie funkcji, która reaguje na zdarzenia pochodzące z obsługi interfejsu dotykowego. Każdy element graficzny może zgłaszać zdarzenie po przyciśnięciu obszaru ekranu, na którym ten element jest umieszczony. Taką funkcję można napisać samodzielnie, ale wymaga to sporej wiedzy i żmudnego wczytywania się w dokumentację użytych elementów biblioteki SSP. Dużo łatwiej jest posiłkować się gotowym rozwiązaniem, które potem będzie można adaptować do własnych celów. Firma Renesas umieściła w nocie aplikacyjnej R12AB0021EU0100 gotowy plik guiapp_event_handlers.c. Na listingach 2 i 3 pokazano procedury dla obsługi ekranów 1 i 2.
List. 2. Obsługa zdarzeń dla ekranu 1
UINT window1_handler(GX_WINDOW *widget, GX_EVENT *event_ptr) { UINT result = gx_window_event_process(widget, event_ptr); switch (event_ptr->gx_event_type) { case GX_SIGNAL(ID_BUTTONENABLER, GX_EVENT_TOGGLE_ON): button_enabled = true; update_text_id(widget->gx_widget_parent, ID_WINDOWCHANGER, GX_STRING_ID_BUTTON_ENABLED); update_text_id(widget->gx_widget_parent, ID_INSTRUCTIONS, GX_STRING_ID_INSTRUCT_BUTTON); break; case GX_SIGNAL(ID_BUTTONENABLER, GX_EVENT_TOGGLE_OFF): button_enabled = false; update_text_id(widget->gx_widget_parent, ID_WINDOWCHANGER, GX_STRING_ID_BUTTON_DISABLED); update_text_id(widget->gx_widget_parent, ID_INSTRUCTIONS, GX_STRING_ID_INSTRUCT_CHECKBOX); break; case GX_SIGNAL(ID_WINDOWCHANGER, GX_EVENT_CLICKED): if(button_enabled){ show_window((GX_WINDOW*)&window2, (GX_WIDGET*)widget, true); } break; default: gx_window_event_process(widget, event_ptr); break; } return result; }
List. 3. Obsługa zdarzeń dla ekranu windows 2
UINT window2_handler(GX_WINDOW *widget, GX_EVENT *event_ptr) { UINT result = gx_window_event_process(widget, event_ptr); switch (event_ptr->gx_event_type){ case GX_EVENT_PEN_UP: show_window((GX_WINDOW*)&window1, (GX_WIDGET*)widget, true); break; default: result = gx_window_event_process(widget, event_ptr); break; } return result; } static UINT show_window(GX_WINDOW * p_new, GX_WIDGET * p_widget, bool detach_old) { UINT err = GX_SUCCESS; if (!p_new->gx_widget_parent) { err = gx_widget_attach(p_window_root, p_new); } else { err = gx_widget_show(p_new); } gx_system_focus_claim(p_new); GX_WIDGET * p_old = p_widget; if (p_old && detach_old) { if (p_old != (GX_WIDGET*)p_new) { gx_widget_detach(p_old); } } return err; }