fix FS#8187 - charging breaks sleep timer. Now if the timer goes off and the player...
[Rockbox.git] / apps / plugins / rockboy / sys_rockbox.c
blob7dc33797c3a5035e74e8585e9177300bafdf544d
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 Michiel van der Kolk, Jens Arnold
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 "rockmacros.h"
23 #include "fb.h"
24 #include "input.h"
25 #include "lcd-gb.h"
26 #include "hw.h"
27 #include "config.h"
29 #if CONFIG_KEYPAD == SANSA_E200_PAD
30 #define ROCKBOY_SCROLLWHEEL
31 #define ROCKBOY_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
32 #define ROCKBOY_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
33 #endif
35 struct fb fb IBSS_ATTR;
37 extern int debug_trace;
39 unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton;
40 #ifdef HAVE_WHEEL_POSITION
41 int oldwheel = -1, wheel;
43 static int wheelmap[8] = {
44 PAD_UP, /* Top */
45 PAD_A, /* Top-right */
46 PAD_RIGHT, /* Right */
47 PAD_START, /* Bottom-right */
48 PAD_DOWN, /* Bottom */
49 PAD_SELECT, /* Bottom-left */
50 PAD_LEFT, /* Left */
51 PAD_B /* Top-left */
53 #endif
55 int released, pressed;
58 #ifdef ROCKBOY_SCROLLWHEEL
59 /* Scrollwheel events are posted directly and not polled by the button
60 driver - synthesize polling */
61 static inline unsigned int read_scroll_wheel(void)
63 unsigned int buttons = BUTTON_NONE;
64 unsigned int btn;
66 /* Empty out the button queue and see if any scrollwheel events were
67 posted */
70 btn = rb->button_get_w_tmo(0);
71 buttons |= btn;
73 while (btn != BUTTON_NONE);
75 return buttons & (ROCKBOY_SCROLLWHEEL_CC | ROCKBOY_SCROLLWHEEL_CW);
77 #endif
79 void ev_poll(void)
81 event_t ev;
82 newbuttonstate = rb->button_status();
83 #ifdef ROCKBOY_SCROLLWHEEL
84 newbuttonstate |= read_scroll_wheel();
85 #endif
86 released = ~newbuttonstate & oldbuttonstate;
87 pressed = newbuttonstate & ~oldbuttonstate;
88 oldbuttonstate = newbuttonstate;
89 #if (LCD_WIDTH == 160) && (LCD_HEIGHT == 128) && (LCD_DEPTH == 2)
90 if (rb->button_hold()&~holdbutton)
91 fb.mode=(fb.mode+1)%4;
92 holdbutton=rb->button_hold();
93 #elif CONFIG_KEYPAD == RECORDER_PAD
94 if (pressed & BUTTON_ON)
95 fb.mode=(fb.mode+1)%4;
96 #endif
98 #ifdef HAVE_WHEEL_POSITION
99 /* Get the current wheel position - 0..95 or -1 for untouched */
100 wheel = rb->wheel_status();
102 /* Convert to number from 0 to 7 - clockwise from top */
103 if ( wheel > 0 ){
104 wheel += 6;
105 wheel /= 12;
106 if ( wheel > 7 ) wheel = 0;
109 if ( wheel != oldwheel ) {
110 if (oldwheel >= 0) {
111 ev.type = EV_RELEASE;
112 ev.code = wheelmap[oldwheel];
113 ev_postevent(&ev);
116 if (wheel >= 0) {
117 ev.type = EV_PRESS;
118 ev.code = wheelmap[wheel];
119 ev_postevent(&ev);
123 oldwheel = wheel;
124 if(released) {
125 ev.type = EV_RELEASE;
126 if ( released & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
127 if ( released & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
129 if(pressed) { /* button press */
130 ev.type = EV_PRESS;
131 if ( pressed & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
132 if ( pressed & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
134 #else
135 if(released) {
136 ev.type = EV_RELEASE;
137 if(released & options.LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); }
138 if(released & options.RIGHT) {ev.code=PAD_RIGHT; ev_postevent(&ev);}
139 if(released & options.DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); }
140 if(released & options.UP) { ev.code=PAD_UP; ev_postevent(&ev); }
141 if(released & options.A) { ev.code=PAD_A; ev_postevent(&ev); }
142 if(released & options.B) { ev.code=PAD_B; ev_postevent(&ev); }
143 if(released & options.START) {
144 ev.code=PAD_START;
145 ev_postevent(&ev);
147 if(released & options.SELECT) {
148 ev.code=PAD_SELECT;
149 ev_postevent(&ev);
152 if(pressed) { /* button press */
153 ev.type = EV_PRESS;
154 if(pressed & options.LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); }
155 if(pressed & options.RIGHT) { ev.code=PAD_RIGHT; ev_postevent(&ev);}
156 if(pressed & options.DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); }
157 if(pressed & options.UP) { ev.code=PAD_UP; ev_postevent(&ev); }
158 if(pressed & options.A) { ev.code=PAD_A; ev_postevent(&ev); }
159 if(pressed & options.B) { ev.code=PAD_B; ev_postevent(&ev); }
160 if(pressed & options.START) {
161 ev.code=PAD_START;
162 ev_postevent(&ev);
164 if(pressed & options.SELECT) {
165 ev.code=PAD_SELECT;
166 ev_postevent(&ev);
168 #endif
169 #if CONFIG_KEYPAD == IPOD_4G_PAD
170 if(rb->button_hold()) {
171 #else
172 if(pressed & options.MENU) {
173 #endif
174 #if (CONFIG_KEYPAD != RECORDER_PAD)
175 #ifdef HAVE_WHEEL_POSITION
176 rb->wheel_send_events(true);
177 #endif
178 if (do_user_menu() == USER_MENU_QUIT)
179 #endif
181 die("");
182 cleanshut=1;
184 #ifdef HAVE_WHEEL_POSITION
185 rb->wheel_send_events(false);
186 #endif
189 #ifndef HAVE_WHEEL_POSITION
191 #endif
194 /* New frameskip, makes more sense to me and performs as well */
195 inline void vid_begin(void)
197 static int skip = 0;
198 if (skip<options.frameskip)
200 skip++;
201 fb.enabled=0;
203 else
205 skip=0;
206 fb.enabled=1;
210 void vid_init(void)
212 fb.enabled=1;
214 #if defined(HAVE_LCD_COLOR)
215 fb.cc[0].r = 3; /* 8-5 (wasted bits on red) */
216 fb.cc[0].l = 11; /* this is the offset to the R bits (16-5) */
217 fb.cc[1].r = 2; /* 8-6 (wasted bits on green) */
218 fb.cc[1].l = 5; /* This is the offset to the G bits (16-5-6) */
219 fb.cc[2].r = 3; /* 8-5 (wasted bits on red) */
220 fb.cc[2].l = 0; /* This is the offset to the B bits (16-5-6-5) */
221 #else
222 fb.mode=3;
223 #endif
226 #if !defined(HAVE_LCD_COLOR)
227 /* Color targets are handled in lcd.c */
228 fb_data *frameb;
229 void vid_update(int scanline)
231 register int cnt=0;
232 int scanline_remapped;
233 #if (LCD_HEIGHT == 64) && (LCD_DEPTH == 1) /* Archos */
234 int balance = 0;
235 if (fb.mode==1)
236 scanline-=16;
237 else if (fb.mode==2)
238 scanline-=8;
239 scanline_remapped = scanline / 16;
240 frameb = rb->lcd_framebuffer + scanline_remapped * LCD_WIDTH;
241 while (cnt < 160) {
242 balance += LCD_WIDTH;
243 if (balance > 0)
245 #if (CONFIG_CPU == SH7034) && !defined(SIMULATOR)
246 asm volatile (
247 "mov.b @%0,r0 \n"
248 "add %1,%0 \n"
249 "tst #0x02, r0 \n" /* ~bit 1 */
250 "rotcr r1 \n"
251 "mov.b @%0,r0 \n"
252 "add %1,%0 \n"
253 "tst #0x02, r0 \n" /* ~bit 1 */
254 "rotcr r1 \n"
255 "mov.b @%0,r0 \n"
256 "add %1,%0 \n"
257 "tst #0x02, r0 \n" /* ~bit 1 */
258 "rotcr r1 \n"
259 "mov.b @%0,r0 \n"
260 "add %1,%0 \n"
261 "tst #0x02, r0 \n" /* ~bit 1 */
262 "rotcr r1 \n"
263 "mov.b @%0,r0 \n"
264 "add %1,%0 \n"
265 "tst #0x02, r0 \n" /* ~bit 1 */
266 "rotcr r1 \n"
267 "mov.b @%0,r0 \n"
268 "add %1,%0 \n"
269 "tst #0x02, r0 \n" /* ~bit 1 */
270 "rotcr r1 \n"
271 "mov.b @%0,r0 \n"
272 "add %1,%0 \n"
273 "tst #0x02, r0 \n" /* ~bit 1 */
274 "rotcr r1 \n"
275 "mov.b @%0,r0 \n"
276 "add %1,%0 \n"
277 "tst #0x02, r0 \n" /* ~bit 1 */
278 "rotcr r1 \n"
280 "shlr16 r1 \n"
281 "shlr8 r1 \n"
282 "not r1,r1 \n" /* account for negated bits */
283 "mov.b r1,@%2 \n"
284 : /* outputs */
285 : /* inputs */
286 /* %0 */ "r"(scan.buf[0] + cnt),
287 /* %1 */ "r"(256), /* scan.buf line length */
288 /* %2 */ "r"(frameb++)
289 : /* clobbers */
290 "r0", "r1"
292 #else
293 register unsigned scrbyte = 0;
294 if (scan.buf[0][cnt] & 0x02) scrbyte |= 0x01;
295 if (scan.buf[1][cnt] & 0x02) scrbyte |= 0x02;
296 if (scan.buf[2][cnt] & 0x02) scrbyte |= 0x04;
297 if (scan.buf[3][cnt] & 0x02) scrbyte |= 0x08;
298 if (scan.buf[4][cnt] & 0x02) scrbyte |= 0x10;
299 if (scan.buf[5][cnt] & 0x02) scrbyte |= 0x20;
300 if (scan.buf[6][cnt] & 0x02) scrbyte |= 0x40;
301 if (scan.buf[7][cnt] & 0x02) scrbyte |= 0x80;
302 *(frameb++) = scrbyte;
303 #endif
304 balance -= 160;
306 cnt ++;
308 rb->lcd_update_rect(0, (scanline/2) & ~7, LCD_WIDTH, 8);
309 #elif (LCD_HEIGHT == 128) && (LCD_DEPTH == 2) /* iriver H1x0 */
310 if (fb.mode==1)
311 scanline-=16;
312 else if (fb.mode==2)
313 scanline-=8;
314 scanline_remapped = scanline / 4;
315 frameb = rb->lcd_framebuffer + scanline_remapped * LCD_WIDTH;
316 while (cnt < 160) {
317 *(frameb++) = (scan.buf[0][cnt]&0x3) |
318 ((scan.buf[1][cnt]&0x3)<<2) |
319 ((scan.buf[2][cnt]&0x3)<<4) |
320 ((scan.buf[3][cnt]&0x3)<<6);
321 cnt++;
323 rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4);
324 #elif defined(HAVE_LCD_COLOR)
325 /* handled in lcd.c now */
326 #endif /* LCD_HEIGHT */
328 #endif