1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include "demo_guix_car_infotainment.h"
4 
5 /* Define total number animatin steps.  */
6 #define TOTAL_NUMBER_ANIMATION_STEPS 10
7 
8 #define CURRENT_NUMBER_VAL_GET(target_val) \
9             (target_val * number_animation_step / TOTAL_NUMBER_ANIMATION_STEPS)
10 
11 /* Define sprite frame lists for light animation.  */
12 GX_SPRITE_FRAME light_frame_list_1[] = {
13     {GX_PIXELMAP_ID_LLIGHT01, 0, 0, 5, 0, 255},
14     {GX_PIXELMAP_ID_LLIGHT02, 0, 0, 5, 0, 255},
15     {GX_PIXELMAP_ID_LLIGHT03, 0, 0, 5, 0, 255},
16     {GX_PIXELMAP_ID_LLIGHT04, 0, 0, 5, 0, 255},
17     {GX_PIXELMAP_ID_LLIGHT05, 0, 0, 5, 0, 255},
18     {GX_PIXELMAP_ID_LLIGHT06, 0, 0, 5, 0, 255},
19     {GX_PIXELMAP_ID_LLIGHT07, 0, 0, 5, 0, 255},
20     {GX_PIXELMAP_ID_LLIGHT08, 0, 0, 5, 0, 255},
21     {GX_PIXELMAP_ID_LLIGHT09, 0, 0, 5, 0, 255},
22     {GX_PIXELMAP_ID_LLIGHT10, 0, 0, 5, 0, 255},
23     {GX_NULL, 0, 0, 5, 0, 255}
24 };
25 
26 GX_SPRITE_FRAME light_frame_list_2[] = {
27     {GX_NULL, 0, 0, 5, 0, 255},
28     {GX_PIXELMAP_ID_LLIGHT10, 0, 0, 5, 0, 255},
29     {GX_PIXELMAP_ID_LLIGHT09, 0, 0, 5, 0, 255},
30     {GX_PIXELMAP_ID_LLIGHT08, 0, 0, 5, 0, 255},
31     {GX_PIXELMAP_ID_LLIGHT07, 0, 0, 5, 0, 255},
32     {GX_PIXELMAP_ID_LLIGHT06, 0, 0, 5, 0, 255},
33     {GX_PIXELMAP_ID_LLIGHT05, 0, 0, 5, 0, 255},
34     {GX_PIXELMAP_ID_LLIGHT04, 0, 0, 5, 0, 255},
35     {GX_PIXELMAP_ID_LLIGHT03, 0, 0, 5, 0, 255},
36     {GX_PIXELMAP_ID_LLIGHT02, 0, 0, 5, 0, 255},
37     {GX_PIXELMAP_ID_LLIGHT01, 0, 0, 5, 0, 255}
38 };
39 
40 /* Define variables.  */
41 static INT number_animation_step;
42 static INT target_battery_usage = 86;
43 static INT target_miles = 382;
44 static INT target_washer_level = 54;
45 static INT target_light_level = 77;
46 static INT target_air_filter_usage = 74;
47 static INT target_front_left_brake_pad_usage = 61;
48 static INT target_front_right_brake_pad_usage = 65;
49 static INT target_rear_left_brake_pad_usage = 71;
50 static INT target_rear_right_brake_pad_usage = 75;
51 static INT target_front_left_tire_pressure = 35;
52 static INT target_front_right_tire_pressure = 35;
53 static INT target_rear_left_tire_pressure = 38;
54 static INT target_rear_right_tire_pressure = 38;
55 
56 /******************************************************************************************/
57 /* Start number animation.                                                                */
58 /******************************************************************************************/
number_animation_start()59 static VOID number_animation_start()
60 {
61     number_animation_step = 0;
62     gx_system_timer_start(&vehicle_screen, TIMER_ID_VEHICLE_NUMBER_ANIMATION, 40 / GX_SYSTEM_TIMER_MS, 40 / GX_SYSTEM_TIMER_MS);
63 }
64 
65 /******************************************************************************************/
66 /* Update number animation.                                                               */
67 /******************************************************************************************/
number_animation_update()68 static VOID number_animation_update()
69 {
70     number_animation_step++;
71 
72     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_battery_usage, CURRENT_NUMBER_VAL_GET(target_battery_usage));
73     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_miles, CURRENT_NUMBER_VAL_GET(target_miles));
74     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_windshield_washer_level, CURRENT_NUMBER_VAL_GET(target_washer_level));
75     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_lights_bulbs, CURRENT_NUMBER_VAL_GET(target_light_level));
76     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_air_filter_usage, CURRENT_NUMBER_VAL_GET(target_air_filter_usage));
77     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_front_left_brake_pad, CURRENT_NUMBER_VAL_GET(target_front_left_brake_pad_usage));
78     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_front_right_brake_pad, CURRENT_NUMBER_VAL_GET(target_front_right_brake_pad_usage));
79     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_rear_left_brake_pad, CURRENT_NUMBER_VAL_GET(target_rear_left_brake_pad_usage));
80     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_rear_right_brake_pad, CURRENT_NUMBER_VAL_GET(target_rear_right_brake_pad_usage));
81     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_front_left_tire_pressure, CURRENT_NUMBER_VAL_GET(target_front_left_tire_pressure));
82     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_front_right_tire_pressure, CURRENT_NUMBER_VAL_GET(target_front_right_tire_pressure));
83     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_rear_left_tire_pressure, CURRENT_NUMBER_VAL_GET(target_rear_left_tire_pressure));
84     gx_numeric_prompt_value_set(&vehicle_screen.vehicle_screen_rear_right_tire_pressure, CURRENT_NUMBER_VAL_GET(target_rear_right_tire_pressure));
85 
86     if (number_animation_step == TOTAL_NUMBER_ANIMATION_STEPS)
87     {
88         gx_system_timer_stop(&vehicle_screen, TIMER_ID_VEHICLE_NUMBER_ANIMATION);
89     }
90 }
91 
92 /******************************************************************************************/
93 /* Override the default event processing of "vehicle_screen" to handle signals from my    */
94 /* child widgets.                                                                         */
95 /******************************************************************************************/
vehicle_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)96 UINT vehicle_screen_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
97 {
98 GX_SPRITE *sprite;
99 
100     switch (event_ptr->gx_event_type)
101     {
102     case GX_EVENT_SHOW:
103         /* Start number animation. */
104         number_animation_start();
105 
106         screen_base_event_process(window, event_ptr);
107         break;
108 
109     case GX_EVENT_TIMER:
110         if (event_ptr->gx_event_payload.gx_event_timer_id == TIMER_ID_VEHICLE_NUMBER_ANIMATION)
111         {
112             /* Update number animation. */
113             number_animation_update();
114         }
115         else
116         {
117             screen_base_event_process(window, event_ptr);
118         }
119         break;
120 
121     case GX_SIGNAL(ID_LIGHT_SPRITE_LEFT, GX_EVENT_SPRITE_COMPLETE):
122     case GX_SIGNAL(ID_LIGHT_SPRITE_RIGHT, GX_EVENT_SPRITE_COMPLETE):
123         gx_widget_find(window, event_ptr->gx_event_sender, 2, &sprite);
124 
125         /* Toggle light frame list. */
126         if (sprite->gx_sprite_frame_list[0].gx_sprite_frame_pixelmap == light_frame_list_1[0].gx_sprite_frame_pixelmap)
127         {
128             gx_sprite_frame_list_set(sprite, light_frame_list_2, sizeof(light_frame_list_2) / sizeof(GX_SPRITE_FRAME));
129         }
130         else
131         {
132             gx_sprite_frame_list_set(sprite, light_frame_list_1, sizeof(light_frame_list_1) / sizeof(GX_SPRITE_FRAME));
133         }
134 
135         gx_sprite_start(sprite, 0);
136         break;
137 
138     case GX_SIGNAL(ID_MODE_ECO_BTN, GX_EVENT_RADIO_SELECT):
139         /* Update vechile mode to ECO. */
140         gx_prompt_text_id_set(&main_screen.main_screen_vehicle_mode_text, GX_STRING_ID_ECO);
141         gx_icon_pixelmap_set(&main_screen.main_screen_vehicle_mode_icon, GX_PIXELMAP_ID_V_MODE_BTN_ICON_ECO, GX_PIXELMAP_ID_V_MODE_BTN_ICON_ECO);
142         break;
143 
144     case GX_SIGNAL(ID_MODE_COMFORT_BTN, GX_EVENT_RADIO_SELECT):
145         /* Update vechile mode to Comfort. */
146         gx_prompt_text_id_set(&main_screen.main_screen_vehicle_mode_text, GX_STRING_ID_COMFORT);
147         gx_icon_pixelmap_set(&main_screen.main_screen_vehicle_mode_icon, GX_PIXELMAP_ID_HOME_MODE_BTN_ICON_COMFORT, GX_PIXELMAP_ID_HOME_MODE_BTN_ICON_COMFORT);
148         break;
149 
150     case GX_SIGNAL(ID_MODE_SPORT_BTN, GX_EVENT_RADIO_SELECT):
151         /* Update vechile mode to Sport. */
152         gx_prompt_text_id_set(&main_screen.main_screen_vehicle_mode_text, GX_STRING_ID_SPORT);
153         gx_icon_pixelmap_set(&main_screen.main_screen_vehicle_mode_icon, GX_PIXELMAP_ID_HOME_MODE_BTN_ICON_SPORT, GX_PIXELMAP_ID_HOME_MODE_BTN_ICON_SPORT);
154         break;
155 
156     default:
157         return screen_base_event_process(window, event_ptr);
158     }
159 
160     return 0;
161 }