1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 
6 #include "generic_scroll_wheel_resources.h"
7 #include "generic_scroll_wheel_specifications.h"
8 
9 #define MEMORY_SIZE (DISPLAY_1_X_RESOLUTION * DISPLAY_1_Y_RESOLUTION)
10 #define SCROLL_WHEEL_VISIBLE_ROWS 6
11 #define SCROLL_WHEEL_ICON_WIDTH   38
12 #define SCROLL_WHEEL_ICON_HEIGHT  38
13 
14 /* Define the ThreadX demo thread control block and stack.  */
15 
16 TX_THREAD          demo_thread;
17 UCHAR              demo_thread_stack[4096];
18 GX_WINDOW_ROOT    *root;
19 TX_BYTE_POOL       memory_pool;
20 GX_UBYTE           memory_buffer[MEMORY_SIZE];
21 
22 /* Define vertical list row item structure. */
23 typedef struct {
24     GX_NUMERIC_PROMPT prompt;
25     GX_ICON   icon;
26 }SCROLL_WHEEL_ROW;
27 
28 SCROLL_WHEEL_ROW  scroll_wheel_nowrap_rows[SCROLL_WHEEL_VISIBLE_ROWS + 1];
29 SCROLL_WHEEL_ROW  scroll_wheel_wrap_rows[SCROLL_WHEEL_VISIBLE_ROWS + 1];
30 
31 /* Define prototypes.   */
32 VOID  demo_thread_entry(ULONG thread_input);
33 extern UINT win32_graphics_driver_setup_565rgb(GX_DISPLAY *display);
34 void widget_scroll_wheel_init();
35 void string_to_int(char* str, int len, int* value);
36 
main(int argc,char ** argv)37 int main(int argc, char ** argv)
38 {
39   tx_kernel_enter();
40   return(0);
41 }
42 
43 
memory_allocate(ULONG size)44 VOID* memory_allocate(ULONG size)
45 {
46     VOID* memptr;
47 
48     if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
49     {
50         return memptr;
51     }
52 
53     return NULL;
54 }
55 
memory_free(VOID * mem)56 VOID memory_free(VOID* mem)
57 {
58     tx_byte_release(mem);
59 }
60 
tx_application_define(void * first_unused_memory)61 VOID tx_application_define(void *first_unused_memory)
62 {
63     /* Create the main demo thread.  */
64     tx_thread_create(&demo_thread, "GUIX Demo Thread", demo_thread_entry,
65                      0,  demo_thread_stack, sizeof(demo_thread_stack),
66                      1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
67 }
68 
demo_thread_entry(ULONG thread_input)69 VOID  demo_thread_entry(ULONG thread_input)
70 {
71     /* create byte pool for rotate to use */
72     tx_byte_pool_create(&memory_pool, "memory poll", memory_buffer, MEMORY_SIZE);
73 
74     /* Initialize GUIX.  */
75     gx_system_initialize();
76 
77     gx_system_memory_allocator_set(memory_allocate, memory_free);
78 
79     gx_studio_display_configure(DISPLAY_1, win32_graphics_driver_setup_565rgb,
80                                 LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
81 
82     /* create the button screen */
83     gx_studio_named_widget_create("main_screen", (GX_WIDGET*)root, GX_NULL);
84 
85     widget_scroll_wheel_init();
86 
87     /* Show the root window to make it and patients screen visible.  */
88     gx_widget_show(root);
89 
90     /* let GUIX run */
91     gx_system_start();
92 }
93 
main_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)94 UINT main_screen_event_process(GX_WINDOW* window, GX_EVENT* event_ptr)
95 {
96     GX_CHAR* input_string;
97     UINT string_size;
98     UINT value;
99 
100     switch (event_ptr->gx_event_type)
101     {
102     case GX_SIGNAL(ID_SET_TOTAL_ROWS, GX_EVENT_CLICKED):
103         gx_single_line_text_input_buffer_get(&main_screen.main_screen_text_input_total_row, &input_string, &string_size, GX_NULL);
104         string_to_int(input_string, string_size, &value);
105 
106         gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel, value);
107         gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel_nowrap, value);
108         gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel_wrap, value);
109         break;
110 
111     case GX_SIGNAL(ID_SET_SELECTED_ROW, GX_EVENT_CLICKED):
112         gx_single_line_text_input_buffer_get(&main_screen.main_screen_text_input_selected_row, &input_string, &string_size, GX_NULL);
113         string_to_int(input_string, string_size, &value);
114 
115         gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel, value);
116         gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel_nowrap, value);
117         gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel_wrap, value);
118         break;
119 
120     default:
121         return gx_window_event_process(window, event_ptr);
122     }
123 
124     return 0;
125 }
126 
custom_prompt_draw(GX_NUMERIC_PROMPT * prompt)127 void custom_prompt_draw(GX_NUMERIC_PROMPT* prompt)
128 {
129 
130     /* draw widget background. */
131     gx_widget_background_draw((GX_WIDGET*)prompt);
132 
133     if (prompt->gx_widget_style & GX_STYLE_DRAW_SELECTED)
134     {
135         prompt->gx_prompt_font_id = GX_FONT_ID_SELECTED;
136     }
137     else
138     {
139         prompt->gx_prompt_font_id = GX_FONT_ID_NORMAL;
140     }
141 
142     /* draw the text. */
143     gx_prompt_text_draw((GX_PROMPT *)prompt);
144 
145     /* Draw children widgets of prompt widget.  */
146     gx_widget_children_draw((GX_WIDGET*)prompt);
147 }
148 
widget_scroll_callback(GX_GENERIC_SCROLL_WHEEL * wheel,GX_WIDGET * widget,INT index)149 void widget_scroll_callback(GX_GENERIC_SCROLL_WHEEL* wheel, GX_WIDGET* widget, INT index)
150 {
151     GX_BOOL created;
152     GX_RECTANGLE size;
153     SCROLL_WHEEL_ROW* row = (SCROLL_WHEEL_ROW*)widget;
154     int width;
155 
156     gx_widget_created_test(widget, &created);
157 
158     if (!created)
159     {
160         gx_window_client_width_get((GX_WINDOW *)wheel, &width);
161 
162         gx_utility_rectangle_define(&size, 0, 0, width - 1, wheel->gx_scroll_wheel_row_height - 1);
163         gx_numeric_prompt_create((GX_NUMERIC_PROMPT*)&row->prompt, "", wheel, 0, GX_STYLE_ENABLED | GX_STYLE_TRANSPARENT, 0, &size);
164 
165         size.gx_rectangle_top = (size.gx_rectangle_top + size.gx_rectangle_bottom - SCROLL_WHEEL_ICON_HEIGHT) >> 1;
166         size.gx_rectangle_left = size.gx_rectangle_right - SCROLL_WHEEL_ICON_WIDTH - 1;
167 
168         gx_icon_create(&row->icon, "", &row->prompt, GX_PIXELMAP_ID_I_PATIENTLIST_LG, GX_STYLE_TRANSPARENT, 0, size.gx_rectangle_left, size.gx_rectangle_top);
169 
170         gx_widget_draw_set(widget, custom_prompt_draw);
171         gx_prompt_font_set((GX_PROMPT*)&row->prompt, GX_FONT_ID_NORMAL);
172         gx_prompt_text_color_set((GX_PROMPT*)&row->prompt, GX_COLOR_ID_TEXT, GX_COLOR_ID_SELECTED, GX_COLOR_ID_DISABLED_TEXT);
173     }
174 
175     gx_numeric_prompt_value_set((GX_NUMERIC_PROMPT*)&row->prompt, index);
176 }
177 
widget_scroll_wheel_init()178 void widget_scroll_wheel_init()
179 {
180     INT index = 0;
181     GX_GENERIC_SCROLL_WHEEL *nowrap_wheel = &main_screen.main_screen_scroll_wheel_nowrap;
182     GX_GENERIC_SCROLL_WHEEL *wrap_wheel = &main_screen.main_screen_scroll_wheel_wrap;
183 
184     while (index <= SCROLL_WHEEL_VISIBLE_ROWS)
185     {
186         widget_scroll_callback(nowrap_wheel, &scroll_wheel_nowrap_rows[index], index);
187         widget_scroll_callback(wrap_wheel, &scroll_wheel_wrap_rows[index], index);
188 
189         index++;
190     }
191 
192     gx_scroll_wheel_speed_set(nowrap_wheel,
193         GX_FIXED_VAL_MAKE(1),     /* The rate of start speed to flick speed. */
194         GX_FIXED_VAL_MAKE(1) / 5, /* The rate of end speed to flick speed. */
195         10,                       /* Max steps fro scrolling. */
196         2);                       /* Delay time of each step. */
197 
198     gx_scroll_wheel_speed_set(wrap_wheel, GX_FIXED_VAL_MAKE(1), GX_FIXED_VAL_MAKE(1) / 2, 10, 2);
199 }
200 
201 /******************************************************************************************/
202 /* Convert string to integer value.                                                       */
203 /******************************************************************************************/
string_to_int(char * str,int len,int * value)204 void string_to_int(char* str, int len, int* value)
205 {
206     int index;
207 
208     *value = 0;
209 
210     for (index = 0; index < len; index++)
211     {
212         *value = *value * 10;
213         *value += str[index] - '0';
214     }
215 }
216