summaryrefslogtreecommitdiff
path: root/apps/gui/usb_screen.c
diff options
context:
space:
mode:
authorTomer Shalev <shalev.tomer@gmail.com>2009-10-19 21:19:30 +0000
committerTomer Shalev <shalev.tomer@gmail.com>2009-10-19 21:19:30 +0000
commit5d585f4b9be0c3a5c6e669133ad0d9a01f8ffb62 (patch)
tree7ce435a09b4a52ac0b41b398ec3352edcfc7c115 /apps/gui/usb_screen.c
parent37daec75fb9412377c8670955ce641a6a812aa69 (diff)
downloadrockbox-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.c312
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
48int usb_keypad_mode;
49#endif
50
51static 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
106void gui_usb_screen_run(void)
107{
108}
109#else
110#define MODE_NAME_LEN 32
111
112struct 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
124static 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
173static 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
232void 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