1 /* This is a small demo of the high-performance GUIX graphics framework. */
2
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "demo_guix_scroll_wheel_resources.h"
6 #include "demo_guix_scroll_wheel_specifications.h"
7
8 #define MEMORY_POOL_SIZE (DISPLAY_1_X_RESOLUTION * DISPLAY_1_Y_RESOLUTION)
9
10 /* Define variables. */
11 TX_BYTE_POOL memory_pool;
12 GX_COLOR memory_pool_buffer[MEMORY_POOL_SIZE];
13 GX_WINDOW_ROOT *root;
14
15 /* Define prototypes. */
16 VOID start_guix(VOID);
17 extern UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
18 VOID scrolling_speed_set();
19 VOID selected_day_set();
20 VOID day_wheel_range_set();
21 UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length);
22
23 /******************************************************************************************/
24 /* Application entry. */
25 /******************************************************************************************/
main(int argc,char ** argv)26 int main(int argc, char ** argv)
27 {
28 tx_kernel_enter();
29 return(0);
30 }
31
32 /******************************************************************************************/
33 /* Application defined memory allocate function. */
34 /******************************************************************************************/
memory_allocate(ULONG size)35 VOID *memory_allocate(ULONG size)
36 {
37 VOID *memptr;
38
39 if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
40 {
41 return memptr;
42 }
43
44 return NULL;
45 }
46
47 /******************************************************************************************/
48 /* Application defined memory free function. */
49 /******************************************************************************************/
memory_free(VOID * mem)50 VOID memory_free(VOID *mem)
51 {
52 tx_byte_release(mem);
53 }
54
55 /******************************************************************************************/
56 /* Define tx_application_define function. */
57 /******************************************************************************************/
tx_application_define(void * first_unused_memory)58 VOID tx_application_define(void *first_unused_memory)
59 {
60 /* create byte pool for rotate to use */
61 tx_byte_pool_create(&memory_pool, "memory_pool", memory_pool_buffer, MEMORY_POOL_SIZE * sizeof(GX_COLOR));
62
63 start_guix();
64 }
65
66 /******************************************************************************************/
67 /* Initiate and run GUIX. */
68 /******************************************************************************************/
start_guix(VOID)69 VOID start_guix(VOID)
70 {
71 /* Initialize GUIX. */
72 gx_system_initialize();
73
74 /* install our memory allocator and de-allocator */
75 gx_system_memory_allocator_set(memory_allocate, memory_free);
76
77 /* Configure display. */
78 gx_studio_display_configure(DISPLAY_1, win32_graphics_driver_setup_24xrgb,
79 LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
80
81 /* create the main screen */
82 gx_studio_named_widget_create("main_screen", (GX_WIDGET *) root, GX_NULL);
83
84 scrolling_speed_set();
85
86 /* Show the root window to make it and patients screen visible. */
87 gx_widget_show(root);
88
89 /* let GUIX run */
90 gx_system_start();
91 }
92
93 /******************************************************************************************/
94 /* Override the default event processing of "main_screen" to handle signals from my child */
95 /* widgets. */
96 /******************************************************************************************/
main_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)97 UINT main_screen_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
98 {
99 switch (event_ptr->gx_event_type)
100 {
101 case GX_SIGNAL(ID_ROUNED_CHECK, GX_EVENT_TOGGLE_ON):
102 /* Add round style. */
103 gx_widget_style_add(&main_screen.main_screen_scroll_wheel_day, GX_STYLE_TEXT_SCROLL_WHEEL_ROUND);
104 gx_widget_style_add(&main_screen.main_screen_scroll_wheel_month, GX_STYLE_TEXT_SCROLL_WHEEL_ROUND);
105 break;
106
107 case GX_SIGNAL(ID_ROUNED_CHECK, GX_EVENT_TOGGLE_OFF):
108 /* Remove round style. */
109 gx_widget_style_remove(&main_screen.main_screen_scroll_wheel_day, GX_STYLE_TEXT_SCROLL_WHEEL_ROUND);
110 gx_widget_style_remove(&main_screen.main_screen_scroll_wheel_month, GX_STYLE_TEXT_SCROLL_WHEEL_ROUND);
111 break;
112
113 case GX_SIGNAL(ID_WRAP_CHECK, GX_EVENT_TOGGLE_ON):
114 /* Add wrap style. */
115 gx_widget_style_add(&main_screen.main_screen_scroll_wheel_day, GX_STYLE_WRAP);
116 gx_widget_style_add(&main_screen.main_screen_scroll_wheel_month, GX_STYLE_WRAP);
117 break;
118
119 case GX_SIGNAL(ID_WRAP_CHECK, GX_EVENT_TOGGLE_OFF):
120 /* Remove wrap style. */
121 gx_widget_style_remove(&main_screen.main_screen_scroll_wheel_day, GX_STYLE_WRAP);
122 gx_widget_style_remove(&main_screen.main_screen_scroll_wheel_month, GX_STYLE_WRAP);
123 break;
124
125 case GX_SIGNAL(ID_SELECTED_DAY_SET, GX_EVENT_CLICKED):
126 /* Set selected day. */
127 selected_day_set();
128 break;
129
130 case GX_SIGNAL(ID_SCROLL_WHEEL_DAY, GX_EVENT_LIST_SELECT):
131 /* Update current selected row index of day wheel. */
132 gx_numeric_prompt_value_set(&main_screen.main_screen_selected_day_prompt, event_ptr->gx_event_payload.gx_event_longdata);
133 break;
134
135 case GX_SIGNAL(ID_SCROLL_WHEEL_MONTH, GX_EVENT_LIST_SELECT):
136 /* Update current selecrted row index of month wheel. */
137 gx_numeric_prompt_value_set(&main_screen.main_screen_selected_month_prompt, event_ptr->gx_event_payload.gx_event_longdata);
138 break;
139
140 case GX_SIGNAL(ID_RANGE_SET, GX_EVENT_CLICKED):
141 /* Set day wheel range. */
142 day_wheel_range_set();
143 break;
144
145 default:
146 return gx_window_event_process(window, event_ptr);
147 }
148 return 0;
149 }
150
151 /******************************************************************************************/
152 /* Row value format callback of day wheel. */
153 /******************************************************************************************/
day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL * wheel,INT row,GX_STRING * string)154 UINT day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL *wheel, INT row, GX_STRING *string)
155 {
156 sprintf(wheel->gx_numeric_scroll_wheel_string_buffer, "%02d", row + 1);
157
158 string->gx_string_ptr = wheel->gx_numeric_scroll_wheel_string_buffer;
159 string->gx_string_length = string_length_get(string->gx_string_ptr, GX_NUMERIC_PROMPT_BUFFER_SIZE - 1);
160
161 return GX_SUCCESS;
162 }
163
164 /******************************************************************************************/
165 /* Convert string to integer value. */
166 /******************************************************************************************/
string_to_int(char * str,int len,int * value)167 static void string_to_int(char *str, int len, int *value)
168 {
169 int index = 0;
170 int flag = 1;
171
172 *value = 0;
173
174 if (str[0] == '-')
175 {
176 flag = -1;
177 index = 1;
178 }
179
180 while(index < len)
181 {
182 *value = *value * 10;
183 *value += str[index] - '0';
184 index++;
185 }
186
187 *value = (*value) * flag;
188 }
189
190 /******************************************************************************************/
191 /* Set selected day. */
192 /******************************************************************************************/
selected_day_set()193 VOID selected_day_set()
194 {
195 GX_SINGLE_LINE_TEXT_INPUT *day_input;
196 GX_CHAR *input_buffer;
197 UINT string_size;
198 INT value;
199
200 day_input = &main_screen.main_screen_day_input;
201
202 /* Pick up buffer address and input string size. */
203 gx_single_line_text_input_buffer_get(day_input, &input_buffer, &string_size, GX_NULL);
204
205 /* Convert string to integer. */
206 string_to_int(input_buffer, string_size, &value);
207
208 /* Set selected day. */
209 gx_scroll_wheel_selected_set(&main_screen.main_screen_scroll_wheel_day, value - 1);
210 }
211
212 /******************************************************************************************/
213 /* Set day wheel range. */
214 /******************************************************************************************/
day_wheel_range_set()215 VOID day_wheel_range_set()
216 {
217 GX_CHAR *input_buffer;
218 UINT string_size;
219 INT start_val;
220 INT end_val;
221
222 /* Pick up buffer address and input string size. */
223 gx_single_line_text_input_buffer_get(&main_screen.main_screen_day_startval_input, &input_buffer, &string_size, GX_NULL);
224
225 /* Convert string to integer. */
226 string_to_int(input_buffer, string_size, &start_val);
227
228 /* Pick up buffer address and input string size. */
229 gx_single_line_text_input_buffer_get(&main_screen.main_screen_day_endval_input, &input_buffer, &string_size, GX_NULL);
230
231 /* Convert string to integer. */
232 string_to_int(input_buffer, string_size, &end_val);
233
234 /* Set day wheel range. */
235 gx_numeric_scroll_wheel_range_set(&main_screen.main_screen_scroll_wheel_day, start_val, end_val);
236 }
237
238 /******************************************************************************************/
239 /* Set scrolling speed. */
240 /******************************************************************************************/
scrolling_speed_set()241 VOID scrolling_speed_set()
242 {
243 GX_NUMERIC_SCROLL_WHEEL *day_wheel = &main_screen.main_screen_scroll_wheel_day;
244 GX_STRING_SCROLL_WHEEL *month_wheel = &main_screen.main_screen_scroll_wheel_month;
245
246 gx_scroll_wheel_speed_set(day_wheel,
247 GX_FIXED_VAL_MAKE(1), /* The rate of start speed to flick speed. */
248 GX_FIXED_VAL_MAKE(1) / 5, /* The rate of end speed to flick speed. */
249 10, /* Max steps fro scrolling. */
250 2); /* Delay time of each step. */
251
252 gx_scroll_wheel_speed_set(month_wheel, GX_FIXED_VAL_MAKE(1) / 2, 200, 10, 2);
253 }
254
255 /******************************************************************************************/
256 /* Calculate string length. */
257 /******************************************************************************************/
string_length_get(GX_CONST GX_CHAR * input_string,UINT max_string_length)258 UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length)
259 {
260 UINT length = 0;
261
262 if (input_string)
263 {
264 /* Traverse the string. */
265 for (length = 0; input_string[length]; length++)
266 {
267 /* Check if the string length is bigger than the max string length. */
268 if (length >= max_string_length)
269 {
270 break;
271 }
272 }
273 }
274
275 return length;
276 }
277