1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include "demo_guix_car_infotainment.h"
4 
5 #if (MAIN_DISPLAY_X_RESOLUTION == 640)
6 #define SCREEN_WEATHER_WIN_OFF_SHIFT 84
7 #endif
8 
9 static GX_RESOURCE_ID main_weather_icon_ids[] = { GX_PIXELMAP_ID_WEATHER_ICON_PARTLY_CLOUDY_OFF, GX_PIXELMAP_ID_WEATHER_ICON_PARTLY_CLOUDY };
10 static GX_RESOURCE_ID screen_weather_icon_ids[] = { GX_PIXELMAP_ID_WEATHER_ICON_PARTLY_CLOUDY_SMALL_OFF, GX_PIXELMAP_ID_WEATHER_ICON_PARTLY_CLOUDY_SMALL };
11 static GX_RESOURCE_ID logo_ids[] = { GX_PIXELMAP_ID_MICROSOFT_LOGO_OFF, GX_PIXELMAP_ID_MICROSOFT_AZURE_LOGO };
12 extern INT bottom_button_alpha;
13 
14 /******************************************************************************************/
15 /* Deselect buttons in main screen.                                                       */
16 /******************************************************************************************/
screen_btn_deselect()17 VOID screen_btn_deselect()
18 {
19     GX_WIDGET *child = main_screen.main_screen_btn_window.gx_widget_first_child;
20 
21     while (child)
22     {
23         if ((child->gx_widget_type == GX_TYPE_PIXELMAP_BUTTON) &&
24             (child->gx_widget_style & GX_STYLE_BUTTON_PUSHED))
25         {
26             ((GX_BUTTON *)child)->gx_button_deselect_handler(child, GX_FALSE);
27 
28             return;
29         }
30 
31         child = child->gx_widget_next;
32 
33     }
34 }
35 
36 /******************************************************************************************/
37 /* Enable/Disable child widgets.                                                          */
38 /******************************************************************************************/
enable_disable_widget(GX_WIDGET * parent,GX_BOOL enable)39 VOID enable_disable_widget(GX_WIDGET *parent, GX_BOOL enable)
40 {
41     GX_WIDGET* child = parent->gx_widget_first_child;
42 
43     if (enable)
44     {
45         gx_widget_style_add(parent, GX_STYLE_ENABLED);
46     }
47     else
48     {
49         gx_widget_style_remove(parent, GX_STYLE_ENABLED);
50     }
51 
52     while (child)
53     {
54         enable_disable_widget(child, enable);
55 
56         child = child->gx_widget_next;
57     }
58 }
59 
60 /******************************************************************************************/
61 /* Show/Hide screen contents.                                                             */
62 /******************************************************************************************/
show_hide_screen_contents(GX_WINDOW * parent,GX_BOOL show)63 VOID show_hide_screen_contents(GX_WINDOW* parent, GX_BOOL show)
64 {
65     GX_WIDGET *child = parent->gx_widget_first_child;
66     INT shift;
67 
68     while (child)
69     {
70         switch (child->gx_widget_id)
71         {
72         case ID_MAIN_WEATHER_WIN:
73             enable_disable_widget(child, show);
74             gx_icon_pixelmap_set(&main_screen.main_screen_weather_icon, main_weather_icon_ids[show], main_weather_icon_ids[show]);
75             break;
76 
77         case ID_SCREEN_WEATHER_WIN:
78             enable_disable_widget(child, show);
79             gx_icon_pixelmap_set(&((SCREEN_BASE_CONTROL_BLOCK *)parent)->screen_base_weather_icon, screen_weather_icon_ids[show], screen_weather_icon_ids[show]);
80 
81             if (show)
82             {
83                 shift = -SCREEN_WEATHER_WIN_OFF_SHIFT;
84             }
85             else
86             {
87                 shift = SCREEN_WEATHER_WIN_OFF_SHIFT;
88             }
89             gx_widget_shift(child, shift, 0, GX_TRUE);
90             break;
91 
92         case ID_BTN_WIN:
93             enable_disable_widget(child, show);
94 
95             if (show)
96             {
97                 bottom_button_alpha = 255;
98             }
99             else
100             {
101                 bottom_button_alpha = 50;
102             }
103             break;
104 
105         case ID_LOGO:
106             gx_icon_pixelmap_set((GX_ICON*)child, logo_ids[show] , logo_ids[show]);
107             break;
108 
109         case ID_ON_OFF_BTN:
110             break;
111 
112         default:
113             if (show)
114             {
115                 gx_widget_show(child);
116             }
117             else
118             {
119                 gx_widget_hide(child);
120             }
121             break;
122         }
123 
124         child = child->gx_widget_next;
125     }
126 }
127 
128 /******************************************************************************************/
129 /* Override the default event processing of "base" to handle signals from my child        */
130 /* widgets.                                                                               */
131 /******************************************************************************************/
base_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)132 UINT base_event_process(GX_WINDOW* window, GX_EVENT* event_ptr)
133 {
134     switch (event_ptr->gx_event_type)
135     {
136         case GX_SIGNAL(ID_VEHICLE_BTN, GX_EVENT_RADIO_SELECT):
137             ToggleScreen((GX_WINDOW*)&vehicle_screen);
138             break;
139 
140         case GX_SIGNAL(ID_CLIMATE_BTN, GX_EVENT_RADIO_SELECT):
141             ToggleScreen((GX_WINDOW*)&climate_screen);
142             break;
143 
144         case GX_SIGNAL(ID_PHONE_BTN, GX_EVENT_RADIO_SELECT):
145             ToggleScreen((GX_WINDOW*)&phone_screen);
146             break;
147 
148         case GX_SIGNAL(ID_AUDIO_BTN, GX_EVENT_RADIO_SELECT):
149             ToggleScreen((GX_WINDOW*)&audio_screen);
150             break;
151 
152         case GX_SIGNAL(ID_VIDEO_BTN, GX_EVENT_RADIO_SELECT):
153             ToggleScreen((GX_WINDOW*)&video_screen);
154             break;
155 
156         case GX_SIGNAL(ID_ON_OFF_BTN, GX_EVENT_CLICKED):
157             if (main_screen.main_screen_on_off_text.gx_prompt_text_id == GX_STRING_ID_OFF)
158             {
159                 gx_window_wallpaper_set(window, GX_PIXELMAP_ID_BG_OFF, GX_PIXELMAP_ID_BG_OFF);
160                 show_hide_screen_contents(window, GX_FALSE);
161                 gx_prompt_text_id_set(&main_screen.main_screen_on_off_text, GX_STRING_ID_ON);
162             }
163             else
164             {
165                 gx_window_wallpaper_set(window, GX_PIXELMAP_ID_BG_IMAGE, GX_PIXELMAP_ID_BG_IMAGE);
166                 show_hide_screen_contents(window, GX_TRUE);
167                 gx_prompt_text_id_set(&main_screen.main_screen_on_off_text, GX_STRING_ID_OFF);
168             }
169             break;
170 
171         default:
172             return gx_window_event_process(window, event_ptr);
173     }
174 
175     return 0;
176 }
177 
178 /******************************************************************************************/
179 /* Override the default event processing of "screen_base" to handle signals from my       */
180 /* child widgets.                                                                         */
181 /******************************************************************************************/
screen_base_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)182 UINT screen_base_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
183 {
184     switch (event_ptr->gx_event_type)
185     {
186     case GX_SIGNAL(ID_HOME_BTN, GX_EVENT_CLICKED):
187         ToggleScreen((GX_WINDOW *)&main_screen);
188         screen_btn_deselect();
189         break;
190 
191     default:
192         return base_event_process(window, event_ptr);
193     }
194 
195     return 0;
196 }