Make mini2440 compile again.
[kugel-rb.git] / apps / gui / usb_screen.c
bloba92ecac27f23c032166eeef335ce958c62bc5178
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Björn Stenberg
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "action.h"
23 #include "font.h"
24 #ifdef HAVE_REMOTE_LCD
25 #include "lcd-remote.h"
26 #endif
27 #include "lang.h"
28 #include "usb.h"
29 #if defined(HAVE_USBSTACK)
30 #include "usb_core.h"
31 #ifdef USB_ENABLE_HID
32 #include "usb_keymaps.h"
33 #endif
34 #endif
35 #include "settings.h"
36 #include "led.h"
37 #include "appevents.h"
38 #include "usb_screen.h"
40 #ifdef HAVE_LCD_BITMAP
41 #include "bitmaps/usblogo.h"
42 #endif
44 #ifdef HAVE_REMOTE_LCD
45 #include "bitmaps/remote_usblogo.h"
46 #endif
48 #if (CONFIG_STORAGE & STORAGE_MMC)
49 #include "ata_mmc.h"
50 #endif
52 #ifdef USB_ENABLE_HID
53 int usb_keypad_mode;
54 static bool usb_hid;
55 #endif
57 #ifndef SIMULATOR
59 static int handle_usb_events(void)
61 #if (CONFIG_STORAGE & STORAGE_MMC)
62 int next_update=0;
63 #endif /* STORAGE_MMC */
65 /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
66 while(1)
68 int button;
69 #ifdef USB_ENABLE_HID
70 if (usb_hid)
72 button = get_hid_usb_action();
74 /* On mode change, we need to refresh the screen */
75 if (button == ACTION_USB_HID_MODE_SWITCH_NEXT ||
76 button == ACTION_USB_HID_MODE_SWITCH_PREV)
78 break;
81 else
82 #endif
84 button = button_get_w_tmo(HZ/2);
85 /* hid emits the event in get_action */
86 send_event(GUI_EVENT_ACTIONUPDATE, NULL);
89 switch(button)
91 case SYS_USB_DISCONNECTED:
92 usb_acknowledge(SYS_USB_DISCONNECTED_ACK);
93 return 1;
94 case SYS_CHARGER_DISCONNECTED:
95 /*reset rockbox battery runtime*/
96 global_status.runtime = 0;
97 break;
98 case SYS_TIMEOUT:
99 break;
102 #if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */
103 if(TIME_AFTER(current_tick,next_update))
105 if(usb_inserted()) {
106 led(mmc_usb_active(HZ));
108 next_update=current_tick+HZ/2;
110 #endif /* STORAGE_MMC */
113 return 0;
115 #endif /* SIMULATOR */
117 #define MODE_NAME_LEN 32
119 struct usb_screen_vps_t
121 struct viewport parent;
122 #ifdef HAVE_LCD_BITMAP
123 struct viewport logo;
124 #ifdef USB_ENABLE_HID
125 struct viewport title;
126 #endif
127 #endif
130 #ifdef HAVE_LCD_BITMAP
131 static void usb_screen_fix_viewports(struct screen *screen,
132 struct usb_screen_vps_t *usb_screen_vps)
134 bool disable = true;
135 int logo_width, logo_height;
136 struct viewport *parent = &usb_screen_vps->parent;
137 struct viewport *logo = &usb_screen_vps->logo;
139 #ifdef HAVE_REMOTE_LCD
140 if (screen->screen_type == SCREEN_REMOTE)
142 logo_width = BMPWIDTH_remote_usblogo;
143 logo_height = BMPHEIGHT_remote_usblogo;
145 else
146 #endif
148 logo_width = BMPWIDTH_usblogo;
149 logo_height = BMPHEIGHT_usblogo;
152 viewport_set_defaults(parent, screen->screen_type);
153 disable = (parent->width < logo_width || parent->height < logo_height);
154 viewportmanager_theme_enable(screen->screen_type, !disable, parent);
156 *logo = *parent;
157 logo->x = parent->x + parent->width - logo_width;
158 logo->y = parent->y + (parent->height - logo_height) / 2;
159 logo->width = logo_width;
160 logo->height = logo_height;
162 #ifdef USB_ENABLE_HID
163 if (usb_hid)
165 struct viewport *title = &usb_screen_vps->title;
166 int char_height = font_get(parent->font)->height;
167 *title = *parent;
168 title->y = logo->y + logo->height + char_height;
169 title->height = char_height;
170 /* try to fit logo and title to parent */
171 if (parent->y + parent->height < title->y + title->height)
173 logo->y = parent->y;
174 title->y = parent->y + logo->height;
177 #endif
179 #endif
181 static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar)
183 int i;
184 FOR_NB_SCREENS(i)
186 struct screen *screen = &screens[i];
188 struct usb_screen_vps_t *usb_screen_vps = &usb_screen_vps_ar[i];
189 struct viewport *parent = &usb_screen_vps->parent;
190 #ifdef HAVE_LCD_BITMAP
191 struct viewport *logo = &usb_screen_vps->logo;
192 #endif
194 screen->set_viewport(parent);
195 screen->clear_viewport();
196 screen->backlight_on();
198 #ifdef HAVE_LCD_BITMAP
199 screen->set_viewport(logo);
200 #ifdef HAVE_REMOTE_LCD
201 if (i == SCREEN_REMOTE)
203 screen->bitmap(remote_usblogo, 0, 0, logo->width,
204 logo->height);
206 else
207 #endif
209 screen->transparent_bitmap(usblogo, 0, 0, logo->width,
210 logo->height);
211 #ifdef USB_ENABLE_HID
212 if (usb_hid)
214 screen->set_viewport(&usb_screen_vps->title);
215 usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER;
216 screen->puts_scroll(0, 0, str(keypad_mode_name_get()));
218 #endif /* USB_ENABLE_HID */
220 screen->set_viewport(parent);
222 #else /* HAVE_LCD_BITMAP */
223 screen->double_height(false);
224 screen->puts_scroll(0, 0, "[USB Mode]");
225 status_set_param(false);
226 status_set_audio(false);
227 status_set_usb(true);
228 #endif /* HAVE_LCD_BITMAP */
230 screen->set_viewport(NULL);
231 screen->update_viewport();
235 void gui_usb_screen_run(void)
237 int i;
238 struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS];
239 #if defined HAVE_TOUCHSCREEN
240 enum touchscreen_mode old_mode = touchscreen_get_mode();
242 /* TODO: Paint buttons on screens OR switch to point mode and use
243 * touchscreen as a touchpad to move the host's mouse cursor */
244 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
245 #endif
247 #ifndef SIMULATOR
248 usb_acknowledge(SYS_USB_CONNECTED_ACK);
249 #endif
251 #ifdef USB_ENABLE_HID
252 usb_hid = global_settings.usb_hid;
253 usb_keypad_mode = global_settings.usb_keypad_mode;
254 #endif
256 FOR_NB_SCREENS(i)
258 struct screen *screen = &screens[i];
260 screen->set_viewport(NULL);
261 #ifdef HAVE_LCD_BITMAP
262 usb_screen_fix_viewports(screen, &usb_screen_vps_ar[i]);
263 #endif
266 while (1)
268 usb_screens_draw(usb_screen_vps_ar);
269 #ifdef SIMULATOR
270 if (button_get_w_tmo(HZ/2))
271 break;
272 send_event(GUI_EVENT_ACTIONUPDATE, NULL);
273 #else
274 if (handle_usb_events())
275 break;
276 #endif /* SIMULATOR */
279 FOR_NB_SCREENS(i)
281 const struct viewport* vp = NULL;
283 #if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID)
284 vp = usb_hid ? &usb_screen_vps_ar[i].title : NULL;
285 #elif !defined(HAVE_LCD_BITMAP)
286 vp = &usb_screen_vps_ar[i].parent;
287 #endif
288 if (vp)
289 screens[i].scroll_stop(vp);
291 #ifdef USB_ENABLE_HID
292 if (global_settings.usb_keypad_mode != usb_keypad_mode)
294 global_settings.usb_keypad_mode = usb_keypad_mode;
295 settings_save();
297 #endif
299 #ifdef HAVE_TOUCHSCREEN
300 touchscreen_set_mode(old_mode);
301 #endif
303 #ifdef HAVE_LCD_CHARCELLS
304 status_set_usb(false);
305 #endif /* HAVE_LCD_CHARCELLS */
306 FOR_NB_SCREENS(i)
308 screens[i].backlight_on();
309 viewportmanager_theme_undo(i, false);