Accept FS#8341 - rename BUTTON_SCROLL_UP/DOWN to FWD/BACK on the e200 to make it...
[Rockbox.git] / apps / plugins / rockboy / sys_rockbox.c
blobbcd795cdedb8ca3a0c17e56137739ae74bccff02
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 Michiel van der Kolk, Jens Arnold
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "rockmacros.h"
21 #include "fb.h"
22 #include "input.h"
23 #include "lcd-gb.h"
24 #include "hw.h"
25 #include "config.h"
27 #if CONFIG_KEYPAD == SANSA_E200_PAD
28 #define ROCKBOY_SCROLLWHEEL
29 #define ROCKBOY_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
30 #define ROCKBOY_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
31 #endif
33 struct fb fb IBSS_ATTR;
35 extern int debug_trace;
37 unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton;
38 #ifdef HAVE_WHEEL_POSITION
39 int oldwheel = -1, wheel;
41 static int wheelmap[8] = {
42 PAD_UP, /* Top */
43 PAD_A, /* Top-right */
44 PAD_RIGHT, /* Right */
45 PAD_START, /* Bottom-right */
46 PAD_DOWN, /* Bottom */
47 PAD_SELECT, /* Bottom-left */
48 PAD_LEFT, /* Left */
49 PAD_B /* Top-left */
51 #endif
53 int released, pressed;
56 #ifdef ROCKBOY_SCROLLWHEEL
57 /* Scrollwheel events are posted directly and not polled by the button
58 driver - synthesize polling */
59 static inline unsigned int read_scroll_wheel(void)
61 unsigned int buttons = BUTTON_NONE;
62 unsigned int btn;
64 /* Empty out the button queue and see if any scrollwheel events were
65 posted */
68 btn = rb->button_get_w_tmo(0);
69 buttons |= btn;
71 while (btn != BUTTON_NONE);
73 return buttons & (ROCKBOY_SCROLLWHEEL_CC | ROCKBOY_SCROLLWHEEL_CW);
75 #endif
77 void ev_poll(void)
79 event_t ev;
80 newbuttonstate = rb->button_status();
81 #ifdef ROCKBOY_SCROLLWHEEL
82 newbuttonstate |= read_scroll_wheel();
83 #endif
84 released = ~newbuttonstate & oldbuttonstate;
85 pressed = newbuttonstate & ~oldbuttonstate;
86 oldbuttonstate = newbuttonstate;
87 #if (LCD_WIDTH == 160) && (LCD_HEIGHT == 128) && (LCD_DEPTH == 2)
88 if (rb->button_hold()&~holdbutton)
89 fb.mode=(fb.mode+1)%4;
90 holdbutton=rb->button_hold();
91 #elif CONFIG_KEYPAD == RECORDER_PAD
92 if (pressed & BUTTON_ON)
93 fb.mode=(fb.mode+1)%4;
94 #endif
96 #ifdef HAVE_WHEEL_POSITION
97 /* Get the current wheel position - 0..95 or -1 for untouched */
98 wheel = rb->wheel_status();
100 /* Convert to number from 0 to 7 - clockwise from top */
101 if ( wheel > 0 ){
102 wheel += 6;
103 wheel /= 12;
104 if ( wheel > 7 ) wheel = 0;
107 if ( wheel != oldwheel ) {
108 if (oldwheel >= 0) {
109 ev.type = EV_RELEASE;
110 ev.code = wheelmap[oldwheel];
111 ev_postevent(&ev);
114 if (wheel >= 0) {
115 ev.type = EV_PRESS;
116 ev.code = wheelmap[wheel];
117 ev_postevent(&ev);
121 oldwheel = wheel;
122 if(released) {
123 ev.type = EV_RELEASE;
124 if ( released & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
125 if ( released & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
127 if(pressed) { /* button press */
128 ev.type = EV_PRESS;
129 if ( pressed & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
130 if ( pressed & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
132 #else
133 if(released) {
134 ev.type = EV_RELEASE;
135 if(released & options.LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); }
136 if(released & options.RIGHT) {ev.code=PAD_RIGHT; ev_postevent(&ev);}
137 if(released & options.DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); }
138 if(released & options.UP) { ev.code=PAD_UP; ev_postevent(&ev); }
139 if(released & options.A) { ev.code=PAD_A; ev_postevent(&ev); }
140 if(released & options.B) { ev.code=PAD_B; ev_postevent(&ev); }
141 if(released & options.START) {
142 ev.code=PAD_START;
143 ev_postevent(&ev);
145 if(released & options.SELECT) {
146 ev.code=PAD_SELECT;
147 ev_postevent(&ev);
150 if(pressed) { /* button press */
151 ev.type = EV_PRESS;
152 if(pressed & options.LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); }
153 if(pressed & options.RIGHT) { ev.code=PAD_RIGHT; ev_postevent(&ev);}
154 if(pressed & options.DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); }
155 if(pressed & options.UP) { ev.code=PAD_UP; ev_postevent(&ev); }
156 if(pressed & options.A) { ev.code=PAD_A; ev_postevent(&ev); }
157 if(pressed & options.B) { ev.code=PAD_B; ev_postevent(&ev); }
158 if(pressed & options.START) {
159 ev.code=PAD_START;
160 ev_postevent(&ev);
162 if(pressed & options.SELECT) {
163 ev.code=PAD_SELECT;
164 ev_postevent(&ev);
166 #endif
167 #if CONFIG_KEYPAD == IPOD_4G_PAD
168 if(rb->button_hold()) {
169 #else
170 if(pressed & options.MENU) {
171 #endif
172 #if (CONFIG_KEYPAD != RECORDER_PAD)
173 #ifdef HAVE_WHEEL_POSITION
174 rb->wheel_send_events(true);
175 #endif
176 if (do_user_menu() == USER_MENU_QUIT)
177 #endif
179 die("");
180 cleanshut=1;
182 #ifdef HAVE_WHEEL_POSITION
183 rb->wheel_send_events(false);
184 #endif
187 #ifndef HAVE_WHEEL_POSITION
189 #endif
192 /* New frameskip, makes more sense to me and performs as well */
193 inline void vid_begin(void)
195 static int skip = 0;
196 if (skip<options.frameskip)
198 skip++;
199 fb.enabled=0;
201 else
203 skip=0;
204 fb.enabled=1;
208 void vid_init(void)
210 fb.enabled=1;
212 #if defined(HAVE_LCD_COLOR)
213 fb.cc[0].r = 3; /* 8-5 (wasted bits on red) */
214 fb.cc[0].l = 11; /* this is the offset to the R bits (16-5) */
215 fb.cc[1].r = 2; /* 8-6 (wasted bits on green) */
216 fb.cc[1].l = 5; /* This is the offset to the G bits (16-5-6) */
217 fb.cc[2].r = 3; /* 8-5 (wasted bits on red) */
218 fb.cc[2].l = 0; /* This is the offset to the B bits (16-5-6-5) */
219 #else
220 fb.mode=3;
221 #endif
224 #if !defined(HAVE_LCD_COLOR)
225 /* Color targets are handled in lcd.c */
226 fb_data *frameb;
227 void vid_update(int scanline)
229 register int cnt=0;
230 int scanline_remapped;
231 #if (LCD_HEIGHT == 64) && (LCD_DEPTH == 1) /* Archos */
232 int balance = 0;
233 if (fb.mode==1)
234 scanline-=16;
235 else if (fb.mode==2)
236 scanline-=8;
237 scanline_remapped = scanline / 16;
238 frameb = rb->lcd_framebuffer + scanline_remapped * LCD_WIDTH;
239 while (cnt < 160) {
240 balance += LCD_WIDTH;
241 if (balance > 0)
243 #if (CONFIG_CPU == SH7034) && !defined(SIMULATOR)
244 asm volatile (
245 "mov.b @%0,r0 \n"
246 "add %1,%0 \n"
247 "tst #0x02, r0 \n" /* ~bit 1 */
248 "rotcr r1 \n"
249 "mov.b @%0,r0 \n"
250 "add %1,%0 \n"
251 "tst #0x02, r0 \n" /* ~bit 1 */
252 "rotcr r1 \n"
253 "mov.b @%0,r0 \n"
254 "add %1,%0 \n"
255 "tst #0x02, r0 \n" /* ~bit 1 */
256 "rotcr r1 \n"
257 "mov.b @%0,r0 \n"
258 "add %1,%0 \n"
259 "tst #0x02, r0 \n" /* ~bit 1 */
260 "rotcr r1 \n"
261 "mov.b @%0,r0 \n"
262 "add %1,%0 \n"
263 "tst #0x02, r0 \n" /* ~bit 1 */
264 "rotcr r1 \n"
265 "mov.b @%0,r0 \n"
266 "add %1,%0 \n"
267 "tst #0x02, r0 \n" /* ~bit 1 */
268 "rotcr r1 \n"
269 "mov.b @%0,r0 \n"
270 "add %1,%0 \n"
271 "tst #0x02, r0 \n" /* ~bit 1 */
272 "rotcr r1 \n"
273 "mov.b @%0,r0 \n"
274 "add %1,%0 \n"
275 "tst #0x02, r0 \n" /* ~bit 1 */
276 "rotcr r1 \n"
278 "shlr16 r1 \n"
279 "shlr8 r1 \n"
280 "not r1,r1 \n" /* account for negated bits */
281 "mov.b r1,@%2 \n"
282 : /* outputs */
283 : /* inputs */
284 /* %0 */ "r"(scan.buf[0] + cnt),
285 /* %1 */ "r"(256), /* scan.buf line length */
286 /* %2 */ "r"(frameb++)
287 : /* clobbers */
288 "r0", "r1"
290 #else
291 register unsigned scrbyte = 0;
292 if (scan.buf[0][cnt] & 0x02) scrbyte |= 0x01;
293 if (scan.buf[1][cnt] & 0x02) scrbyte |= 0x02;
294 if (scan.buf[2][cnt] & 0x02) scrbyte |= 0x04;
295 if (scan.buf[3][cnt] & 0x02) scrbyte |= 0x08;
296 if (scan.buf[4][cnt] & 0x02) scrbyte |= 0x10;
297 if (scan.buf[5][cnt] & 0x02) scrbyte |= 0x20;
298 if (scan.buf[6][cnt] & 0x02) scrbyte |= 0x40;
299 if (scan.buf[7][cnt] & 0x02) scrbyte |= 0x80;
300 *(frameb++) = scrbyte;
301 #endif
302 balance -= 160;
304 cnt ++;
306 rb->lcd_update_rect(0, (scanline/2) & ~7, LCD_WIDTH, 8);
307 #elif (LCD_HEIGHT == 128) && (LCD_DEPTH == 2) /* iriver H1x0 */
308 if (fb.mode==1)
309 scanline-=16;
310 else if (fb.mode==2)
311 scanline-=8;
312 scanline_remapped = scanline / 4;
313 frameb = rb->lcd_framebuffer + scanline_remapped * LCD_WIDTH;
314 while (cnt < 160) {
315 *(frameb++) = (scan.buf[0][cnt]&0x3) |
316 ((scan.buf[1][cnt]&0x3)<<2) |
317 ((scan.buf[2][cnt]&0x3)<<4) |
318 ((scan.buf[3][cnt]&0x3)<<6);
319 cnt++;
321 rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4);
322 #elif defined(HAVE_LCD_COLOR)
323 /* handled in lcd.c now */
324 #endif /* LCD_HEIGHT */
326 #endif