1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "gx_api.h"
6 #include "all_widgets_5_4_1_resources.h"
7 #include "all_widgets_5_4_1_specifications.h"
8 
9 #define ID_SCROLL_WHEEL_DAY   0xf0
10 #define ID_SCROLL_WHEEL_MONTH 0xf1
11 #define ID_SCROLL_WHEEL_YEAR  0xf2
12 
13 extern GX_WINDOW    *pScrollWheelScreen;
14 extern int           scroll_wheel_selected;
15 extern TX_SEMAPHORE *selected_semaphore;
16 
17 VOID day_count_update();
18 VOID animation_speed_set();
19 
20 /* Define day wheel callback function. */
day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL * wheel,INT row)21 GX_CONST GX_CHAR *day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL *wheel, INT row)
22 {
23     sprintf(wheel->gx_numeric_scroll_wheel_string_buffer, "%02d", row + 1);
24     return wheel->gx_numeric_scroll_wheel_string_buffer;
25 }
26 
string_to_int(const char * string)27 int string_to_int(const char *string)
28 {
29     int value = 0;
30 
31     while (string[0])
32     {
33         value = value * 10 + string[0] - '0';
34         string++;
35     }
36 
37     return value;
38 }
39 
select_day()40 VOID select_day()
41 {
42     int selected_day;
43     GX_SINGLE_LINE_TEXT_INPUT *input;
44     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
45 
46     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
47 
48     gx_widget_find(pScrollWheelScreen, ID_DAY_INPUT, GX_SEARCH_DEPTH_INFINITE, &input);
49 
50     if (input && day_wheel)
51     {
52         selected_day = string_to_int(input->gx_single_line_text_input_buffer);
53         gx_scroll_wheel_selected_set(day_wheel, selected_day - 1);
54     }
55 }
56 
57 /* Override default event processing of scroll wheel screen. */
scroll_wheel_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)58 UINT scroll_wheel_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
59 {
60 
61     switch (event_ptr->gx_event_type)
62     {
63     case GX_EVENT_SHOW:
64         pScrollWheelScreen = window;
65         gx_window_event_process(window, event_ptr);
66         animation_speed_set();
67         break;
68 
69     case GX_SIGNAL(ID_DAY_WHEEL, GX_EVENT_LIST_SELECT):
70         if(selected_semaphore)
71         {
72             tx_semaphore_put(selected_semaphore);
73         }
74         break;
75 
76     case GX_SIGNAL(ID_MONTH_WHEEL, GX_EVENT_LIST_SELECT):
77         if(selected_semaphore)
78         {
79             tx_semaphore_put(selected_semaphore);
80         }
81         break;
82 
83     case GX_SIGNAL(ID_YEAR_WHEEL, GX_EVENT_LIST_SELECT):
84         day_count_update();
85         break;
86 
87     case GX_SIGNAL(ID_DAY_SELECT, GX_EVENT_CLICKED):
88         select_day();
89         break;
90 
91     default:
92         return gx_window_event_process(window, event_ptr);
93     }
94 
95     return 0;
96 }
97 
animation_speed_set()98 VOID animation_speed_set()
99 {
100     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
101     GX_NUMERIC_SCROLL_WHEEL *year_wheel;
102     GX_STRING_SCROLL_WHEEL *month_wheel;
103 
104     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
105     gx_widget_find(pScrollWheelScreen, ID_YEAR_WHEEL, GX_SEARCH_DEPTH_INFINITE, &year_wheel);
106     gx_widget_find(pScrollWheelScreen, ID_MONTH_WHEEL, GX_SEARCH_DEPTH_INFINITE, &month_wheel);
107 
108     gx_scroll_wheel_speed_set(day_wheel, GX_FIXED_VAL_MAKE(1), 100, 10, 2);
109     gx_scroll_wheel_speed_set(month_wheel, (GX_FIXED_VAL_MAKE(1) / 2), 100, 10, 2);
110     gx_scroll_wheel_speed_set(year_wheel, GX_FIXED_VAL_MAKE(2), 100, 10, 2);
111 }
112 
day_count_update()113 VOID day_count_update()
114 {
115     int year;
116     int month;
117     int day_count;
118     int new_day_count;
119 
120     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
121     GX_NUMERIC_SCROLL_WHEEL *year_wheel;
122     GX_STRING_SCROLL_WHEEL *month_wheel;
123 
124     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
125     gx_widget_find(pScrollWheelScreen, ID_YEAR_WHEEL, GX_SEARCH_DEPTH_INFINITE, &year_wheel);
126     gx_widget_find(pScrollWheelScreen, ID_MONTH_WHEEL, GX_SEARCH_DEPTH_INFINITE, &month_wheel);
127 
128     year = year_wheel->gx_numeric_scroll_wheel_start_val;
129     year += year_wheel->gx_scroll_wheel_selected_row;
130 
131     month = month_wheel->gx_scroll_wheel_selected_row + 1;
132     day_count = GX_ABS(day_wheel->gx_numeric_scroll_wheel_end_val - day_wheel->gx_numeric_scroll_wheel_start_val) + 1;
133 
134     switch (month)
135     {
136     case 1:
137     case 3:
138     case 5:
139     case 7:
140     case 8:
141     case 10:
142     case 12:
143         new_day_count = 31;
144         break;
145 
146     case 2:
147         if ((!(year % 400)) ||
148             (!(year % 4) && (year % 400)))
149         {
150             new_day_count = 29;
151         }
152         else
153         {
154             new_day_count = 28;
155         }
156         break;
157 
158     default:
159         new_day_count = 30;
160         break;
161     }
162 
163     if (new_day_count != day_count)
164     {
165         gx_numeric_scroll_wheel_range_set(day_wheel, 1, new_day_count);
166     }
167 }
168