1 #include "demo_guix_smart_watch.h"
2 
3 /* Extern system time.  */
4 extern TIME system_time;
5 static TIME screen_time_record = { -1, -1, -1, -1, -1, -1 };
6 
7 /* Define text id list for day of week names.  */
8 static GX_RESOURCE_ID day_name_ids[] = {
9     GX_STRING_ID_SUNDAY,
10     GX_STRING_ID_MONDAY,
11     GX_STRING_ID_TUESDAY,
12     GX_STRING_ID_WEDNESDAY,
13     GX_STRING_ID_THURSDAY,
14     GX_STRING_ID_FRIDAY,
15     GX_STRING_ID_SATURDAY
16 };
17 
18 /* Define text id list for month names.  */
19 static GX_RESOURCE_ID month_name_ids[] = {
20     GX_STRING_ID_JANUARY,
21     GX_STRING_ID_FEBRUARY,
22     GX_STRING_ID_MARCH,
23     GX_STRING_ID_APRIL,
24     GX_STRING_ID_MAY,
25     GX_STRING_ID_JUNE,
26     GX_STRING_ID_JULY,
27     GX_STRING_ID_AUGUST,
28     GX_STRING_ID_SEPTEMBER,
29     GX_STRING_ID_OCTOBER,
30     GX_STRING_ID_NOVEMBER,
31     GX_STRING_ID_DECEMBER
32 };
33 
34 /******************************************************************************************/
35 /* Calculate string length.                                                               */
36 /******************************************************************************************/
string_length_get(GX_CONST GX_CHAR * input_string,UINT max_string_length)37 static UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length)
38 {
39     UINT length = 0;
40 
41     if (input_string)
42     {
43         /* Traverse the string.  */
44         for (length = 0; input_string[length]; length++)
45         {
46             /* Check if the string length is bigger than the max string length.  */
47             if (length >= max_string_length)
48             {
49                 break;
50             }
51         }
52     }
53 
54     return length;
55 }
56 
57 /******************************************************************************************/
58 /* Update clock time.                                                                     */
59 /******************************************************************************************/
screen_time_update()60 static VOID screen_time_update()
61 {
62     GX_RESOURCE_ID am_pm_text_id;
63     GX_CHAR date_string_buffer[20];
64     GX_STRING string;
65 
66     if (system_time.second & 0x1)
67     {
68         gx_widget_fill_color_set(&home_screen.home_screen_time_second_up, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE);
69         gx_widget_fill_color_set(&home_screen.home_screen_time_second_down, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE);
70     }
71     else
72     {
73         gx_widget_fill_color_set(&home_screen.home_screen_time_second_up, GX_COLOR_ID_GRAY, GX_COLOR_ID_GRAY, GX_COLOR_ID_GRAY);
74         gx_widget_fill_color_set(&home_screen.home_screen_time_second_down, GX_COLOR_ID_GRAY, GX_COLOR_ID_GRAY, GX_COLOR_ID_GRAY);
75     }
76 
77     if (system_time.hour < 12)
78     {
79         am_pm_text_id = GX_STRING_ID_AM;
80     }
81     else
82     {
83         am_pm_text_id = GX_STRING_ID_PM;
84     }
85 
86     if (screen_time_record.hour != system_time.hour)
87     {
88         gx_numeric_prompt_value_set(&home_screen.home_screen_time_hour, system_time.hour);
89     }
90 
91     if (screen_time_record.minute != system_time.minute)
92     {
93         gx_numeric_prompt_value_set(&home_screen.home_screen_time_minute, system_time.minute);
94     }
95 
96     if (home_screen.home_screen_am_pm.gx_prompt_text_id != am_pm_text_id)
97     {
98         gx_prompt_text_id_set(&home_screen.home_screen_am_pm, am_pm_text_id);
99     }
100 
101     if (screen_time_record.day_of_week != system_time.day_of_week)
102     {
103         gx_prompt_text_id_set(&home_screen.home_screen_day_of_week, day_name_ids[system_time.day_of_week]);
104     }
105 
106     if ((screen_time_record.month != system_time.month) || (screen_time_record.day != system_time.day))
107     {
108         gx_widget_string_get_ext(&home_screen, month_name_ids[system_time.month - 1], &string);
109 
110         if (string.gx_string_ptr)
111         {
112             sprintf(date_string_buffer, ", %s %d", string.gx_string_ptr, system_time.day);
113 
114             string.gx_string_ptr = date_string_buffer;
115             string.gx_string_length = string_length_get(date_string_buffer, sizeof(date_string_buffer) - 1);
116             gx_prompt_text_set_ext(&home_screen.home_screen_date, &string);
117         }
118     }
119 
120     screen_time_record = system_time;
121 }
122 
123 /******************************************************************************************/
124 /* Override the default event processing of "home_screen" to handle signals from my child */
125 /* widgets.                                                                               */
126 /******************************************************************************************/
home_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)127 UINT home_screen_event_handler(GX_WINDOW* window, GX_EVENT* event_ptr)
128 {
129     switch (event_ptr->gx_event_type)
130     {
131     case GX_EVENT_SHOW:
132 
133         gx_window_event_process(window, event_ptr);
134 
135         /* Update clock time. */
136         screen_time_update();
137 
138         /* Start a timer to update clock.  */
139         gx_system_timer_start(window, SCREEN_CLOCK_TIMER_ID, GX_TICKS_SECOND, GX_TICKS_SECOND);
140 
141         return GX_SUCCESS;
142 
143     case GX_EVENT_HIDE:
144 
145         /* Stop clock timer.  */
146         gx_system_timer_stop(window, SCREEN_CLOCK_TIMER_ID);
147 
148         return gx_window_event_process(window, event_ptr);
149 
150     case USER_EVENT_ANIMATION_START:
151         gx_sprite_start(&home_screen.home_screen_sprite, 0);
152         break;
153 
154     case USER_EVENT_ANIMATION_STOP:
155         gx_sprite_stop(&home_screen.home_screen_sprite);
156         break;
157 
158     case GX_EVENT_TIMER:
159 
160         if (event_ptr->gx_event_payload.gx_event_timer_id == SCREEN_CLOCK_TIMER_ID)
161         {
162             /* Update clock time. */
163             screen_time_update();
164         }
165         break;
166 
167     default:
168         return gx_window_event_process(window, event_ptr);
169     }
170 
171     return 0;
172 }
173 
174 /******************************************************************************************/
175 /* Define format function for numeric prompt to show time.                                */
176 /******************************************************************************************/
time_format(GX_NUMERIC_PROMPT * prompt,INT value)177 VOID time_format(GX_NUMERIC_PROMPT* prompt, INT value)
178 {
179     if (value < 10)
180     {
181         prompt->gx_numeric_prompt_buffer[0] = '0';
182         prompt->gx_numeric_prompt_buffer[1] = '0' + value;
183     }
184     else if (value < 100)
185     {
186         prompt->gx_numeric_prompt_buffer[0] = '0' + (value / 10);
187         prompt->gx_numeric_prompt_buffer[1] = '0' + (value % 10);
188     }
189 }