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