diff options
author | Tomer Shalev <shalev.tomer@gmail.com> | 2009-10-19 21:19:30 +0000 |
---|---|---|
committer | Tomer Shalev <shalev.tomer@gmail.com> | 2009-10-19 21:19:30 +0000 |
commit | 5d585f4b9be0c3a5c6e669133ad0d9a01f8ffb62 (patch) | |
tree | 7ce435a09b4a52ac0b41b398ec3352edcfc7c115 /apps/gui/usb_screen.c | |
parent | 37daec75fb9412377c8670955ce641a6a812aa69 (diff) | |
download | rockbox-5d585f4b9be0c3a5c6e669133ad0d9a01f8ffb62.tar.gz rockbox-5d585f4b9be0c3a5c6e669133ad0d9a01f8ffb62.zip |
Extract usb_screen logic out of screens.c into apps/gui/usb_screen.c
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23273 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/usb_screen.c')
-rw-r--r-- | apps/gui/usb_screen.c | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/apps/gui/usb_screen.c b/apps/gui/usb_screen.c new file mode 100644 index 0000000000..6e7c24920f --- /dev/null +++ b/apps/gui/usb_screen.c | |||
@@ -0,0 +1,312 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id: screens.c 23269 2009-10-19 20:06:51Z tomers $ | ||
9 | * | ||
10 | * Copyright (C) 2002 Björn Stenberg | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "action.h" | ||
23 | #ifdef HAVE_REMOTE_LCD | ||
24 | #include "lcd-remote.h" | ||
25 | #endif | ||
26 | #include "lang.h" | ||
27 | #include "usb.h" | ||
28 | #if defined(HAVE_USBSTACK) | ||
29 | #include "usb_core.h" | ||
30 | #ifdef USB_ENABLE_HID | ||
31 | #include "usb_keymaps.h" | ||
32 | #endif | ||
33 | #endif | ||
34 | #include "settings.h" | ||
35 | #include "appevents.h" | ||
36 | |||
37 | #ifdef HAVE_LCD_BITMAP | ||
38 | #include "bitmaps/usblogo.h" | ||
39 | #endif | ||
40 | |||
41 | #ifdef HAVE_REMOTE_LCD | ||
42 | #include "bitmaps/remote_usblogo.h" | ||
43 | #endif | ||
44 | |||
45 | #ifndef SIMULATOR | ||
46 | |||
47 | #ifdef USB_ENABLE_HID | ||
48 | int usb_keypad_mode; | ||
49 | #endif | ||
50 | |||
51 | static int handle_usb_events(void) | ||
52 | { | ||
53 | #if (CONFIG_STORAGE & STORAGE_MMC) | ||
54 | int next_update=0; | ||
55 | #endif /* STORAGE_MMC */ | ||
56 | |||
57 | /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */ | ||
58 | while(1) | ||
59 | { | ||
60 | int button; | ||
61 | #ifdef USB_ENABLE_HID | ||
62 | if (usb_core_driver_enabled(USB_DRIVER_HID)) | ||
63 | { | ||
64 | button = get_hid_usb_action(); | ||
65 | |||
66 | /* On mode change, we need to refresh the screen */ | ||
67 | if (button == ACTION_USB_HID_MODE_SWITCH_NEXT || | ||
68 | button == ACTION_USB_HID_MODE_SWITCH_PREV) | ||
69 | { | ||
70 | break; | ||
71 | } | ||
72 | } | ||
73 | else | ||
74 | #endif | ||
75 | { | ||
76 | button = button_get_w_tmo(HZ/2); | ||
77 | /* hid emits the event in get_action */ | ||
78 | send_event(GUI_EVENT_ACTIONUPDATE, NULL); | ||
79 | } | ||
80 | |||
81 | switch(button) | ||
82 | { | ||
83 | case SYS_USB_DISCONNECTED: | ||
84 | usb_acknowledge(SYS_USB_DISCONNECTED_ACK); | ||
85 | return 1; | ||
86 | case SYS_TIMEOUT: | ||
87 | break; | ||
88 | } | ||
89 | |||
90 | #if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */ | ||
91 | if(TIME_AFTER(current_tick,next_update)) | ||
92 | { | ||
93 | if(usb_inserted()) { | ||
94 | led(mmc_usb_active(HZ)); | ||
95 | } | ||
96 | next_update=current_tick+HZ/2; | ||
97 | } | ||
98 | #endif /* STORAGE_MMC */ | ||
99 | } | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | #endif | ||
104 | |||
105 | #ifdef USB_NONE | ||
106 | void gui_usb_screen_run(void) | ||
107 | { | ||
108 | } | ||
109 | #else | ||
110 | #define MODE_NAME_LEN 32 | ||
111 | |||
112 | struct usb_screen_vps_t | ||
113 | { | ||
114 | struct viewport parent; | ||
115 | #ifdef HAVE_LCD_BITMAP | ||
116 | struct viewport logo; | ||
117 | #ifdef USB_ENABLE_HID | ||
118 | struct viewport title; | ||
119 | #endif | ||
120 | #endif | ||
121 | }; | ||
122 | |||
123 | #ifdef HAVE_LCD_BITMAP | ||
124 | static void usb_screen_fix_viewports(struct screen *screen, | ||
125 | struct usb_screen_vps_t *usb_screen_vps) | ||
126 | { | ||
127 | int logo_width, logo_height; | ||
128 | struct viewport *parent = &usb_screen_vps->parent; | ||
129 | struct viewport *logo = &usb_screen_vps->logo; | ||
130 | |||
131 | #ifdef HAVE_REMOTE_LCD | ||
132 | if (screen->screen_type == SCREEN_REMOTE) | ||
133 | { | ||
134 | logo_width = BMPWIDTH_remote_usblogo; | ||
135 | logo_height = BMPHEIGHT_remote_usblogo; | ||
136 | } | ||
137 | else | ||
138 | #endif | ||
139 | { | ||
140 | logo_width = BMPWIDTH_usblogo; | ||
141 | logo_height = BMPHEIGHT_usblogo; | ||
142 | } | ||
143 | |||
144 | viewport_set_defaults(parent, screen->screen_type); | ||
145 | if (parent->width < logo_width || parent->height < logo_height) | ||
146 | viewport_set_fullscreen(parent, screen->screen_type); | ||
147 | |||
148 | *logo = *parent; | ||
149 | logo->x = parent->width - logo_width; | ||
150 | logo->y = (parent->height - logo_height) / 2; | ||
151 | logo->width = logo_width; | ||
152 | logo->height = logo_height; | ||
153 | |||
154 | #ifdef USB_ENABLE_HID | ||
155 | struct viewport *title = &usb_screen_vps->title; | ||
156 | int char_height, nb_lines; | ||
157 | |||
158 | /* nb_lines only returns the number of fully visible lines, small screens | ||
159 | or really large fonts could cause problems with the calculation below. | ||
160 | */ | ||
161 | nb_lines = viewport_get_nb_lines(parent); | ||
162 | if (nb_lines == 0) | ||
163 | nb_lines++; | ||
164 | |||
165 | char_height = parent->height/nb_lines; | ||
166 | |||
167 | *title = *parent; | ||
168 | title->y = logo->y + logo->height + char_height; | ||
169 | #endif | ||
170 | } | ||
171 | #endif | ||
172 | |||
173 | static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar) | ||
174 | { | ||
175 | int i; | ||
176 | int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */ | ||
177 | |||
178 | FOR_NB_SCREENS(i) | ||
179 | { | ||
180 | struct screen *screen = &screens[i]; | ||
181 | |||
182 | struct usb_screen_vps_t *usb_screen_vps = &usb_screen_vps_ar[i]; | ||
183 | struct viewport *parent = &usb_screen_vps->parent; | ||
184 | #ifdef HAVE_LCD_BITMAP | ||
185 | struct viewport *logo = &usb_screen_vps->logo; | ||
186 | #endif | ||
187 | |||
188 | screen->set_viewport(parent); | ||
189 | screen->backdrop_show(BACKDROP_MAIN); | ||
190 | screen->backlight_on(); | ||
191 | screen->clear_viewport(); | ||
192 | |||
193 | #ifdef HAVE_LCD_BITMAP | ||
194 | screen->set_viewport(logo); | ||
195 | #ifdef HAVE_REMOTE_LCD | ||
196 | if (i == SCREEN_REMOTE) | ||
197 | { | ||
198 | screen->bitmap(remote_usblogo, 0, 0, logo->width, | ||
199 | logo->height); | ||
200 | } | ||
201 | else | ||
202 | #endif | ||
203 | { | ||
204 | screen->transparent_bitmap(usblogo, 0, 0, logo->width, | ||
205 | logo->height); | ||
206 | #ifdef USB_ENABLE_HID | ||
207 | screen->set_viewport(&usb_screen_vps->title); | ||
208 | usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER; | ||
209 | screen->puts_scroll(0, 0, str(keypad_mode_name_get())); | ||
210 | #endif /* USB_ENABLE_HID */ | ||
211 | } | ||
212 | screen->set_viewport(parent); | ||
213 | |||
214 | #else /* HAVE_LCD_BITMAP */ | ||
215 | screen->double_height(false); | ||
216 | screen->puts_scroll(0, 0, "[USB Mode]"); | ||
217 | status_set_param(false); | ||
218 | status_set_audio(false); | ||
219 | status_set_usb(true); | ||
220 | #endif /* HAVE_LCD_BITMAP */ | ||
221 | |||
222 | screen->update_viewport(); | ||
223 | screen->set_viewport(NULL); | ||
224 | |||
225 | /* force statusbar by ignoring the setting */ | ||
226 | usb_bars |= VP_SB_IGNORE_SETTING(i); | ||
227 | } | ||
228 | |||
229 | viewportmanager_set_statusbar(usb_bars); | ||
230 | } | ||
231 | |||
232 | void gui_usb_screen_run(void) | ||
233 | { | ||
234 | int i; | ||
235 | int old_bars = viewportmanager_get_statusbar(); | ||
236 | struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS]; | ||
237 | #if defined HAVE_TOUCHSCREEN | ||
238 | enum touchscreen_mode old_mode = touchscreen_get_mode(); | ||
239 | |||
240 | /* TODO: Paint buttons on screens OR switch to point mode and use | ||
241 | * touchscreen as a touchpad to move the host's mouse cursor */ | ||
242 | touchscreen_set_mode(TOUCHSCREEN_BUTTON); | ||
243 | #endif | ||
244 | |||
245 | #ifndef SIMULATOR | ||
246 | usb_acknowledge(SYS_USB_CONNECTED_ACK); | ||
247 | #endif | ||
248 | |||
249 | #ifdef USB_ENABLE_HID | ||
250 | usb_keypad_mode = global_settings.usb_keypad_mode; | ||
251 | #endif | ||
252 | |||
253 | FOR_NB_SCREENS(i) | ||
254 | { | ||
255 | struct screen *screen = &screens[i]; | ||
256 | |||
257 | screen->set_viewport(NULL); | ||
258 | #ifdef HAVE_LCD_BITMAP | ||
259 | usb_screen_fix_viewports(screen, &usb_screen_vps_ar[i]); | ||
260 | #endif | ||
261 | } | ||
262 | |||
263 | while (1) | ||
264 | { | ||
265 | usb_screens_draw(usb_screen_vps_ar); | ||
266 | #ifdef SIMULATOR | ||
267 | if (button_get_w_tmo(HZ/2)) | ||
268 | break; | ||
269 | send_event(GUI_EVENT_ACTIONUPDATE, NULL); | ||
270 | #else | ||
271 | if (handle_usb_events()) | ||
272 | break; | ||
273 | #endif /* SIMULATOR */ | ||
274 | } | ||
275 | |||
276 | FOR_NB_SCREENS(i) | ||
277 | { | ||
278 | const struct viewport* vp = NULL; | ||
279 | |||
280 | #if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID) | ||
281 | vp = &usb_screen_vps_ar[i].title; | ||
282 | #elif !defined(HAVE_LCD_BITMAP) | ||
283 | vp = &usb_screen_vps_ar[i].parent; | ||
284 | #endif | ||
285 | if (vp) | ||
286 | screens[i].scroll_stop(vp); | ||
287 | } | ||
288 | #ifdef USB_ENABLE_HID | ||
289 | if (global_settings.usb_keypad_mode != usb_keypad_mode) | ||
290 | { | ||
291 | global_settings.usb_keypad_mode = usb_keypad_mode; | ||
292 | settings_save(); | ||
293 | } | ||
294 | #endif | ||
295 | |||
296 | #ifdef HAVE_TOUCHSCREEN | ||
297 | touchscreen_set_mode(old_mode); | ||
298 | #endif | ||
299 | |||
300 | #ifdef HAVE_LCD_CHARCELLS | ||
301 | status_set_usb(false); | ||
302 | #endif /* HAVE_LCD_CHARCELLS */ | ||
303 | FOR_NB_SCREENS(i) | ||
304 | { | ||
305 | screens[i].backlight_on(); | ||
306 | } | ||
307 | viewportmanager_set_statusbar(old_bars); | ||
308 | send_event(GUI_EVENT_REFRESH, NULL); | ||
309 | |||
310 | } | ||
311 | #endif /* !defined(USB_NONE) */ | ||
312 | |||