The threading model should be set from configure, not config.h.
[maemo-rb.git] / apps / plugins / oscilloscope.c
blob0bf951f069adcdda1047a2862e86c662f82ce8d9
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Oscilloscope, with many different modes of operation.
12 * Copyright (C) 2004-2006 Jens Arnold
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
24 #include "plugin.h"
25 #include "lib/helper.h"
26 #include "lib/pluginlib_exit.h"
28 #include "lib/xlcd.h"
29 #include "lib/configfile.h"
33 /* variable button definitions */
34 #if CONFIG_KEYPAD == RECORDER_PAD
35 #define OSCILLOSCOPE_QUIT BUTTON_OFF
36 #define OSCILLOSCOPE_DRAWMODE BUTTON_F1
37 #define OSCILLOSCOPE_ADVMODE BUTTON_F2
38 #define OSCILLOSCOPE_ORIENTATION BUTTON_F3
39 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
40 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
41 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
42 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
43 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
45 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
46 #define OSCILLOSCOPE_QUIT BUTTON_OFF
47 #define OSCILLOSCOPE_DRAWMODE BUTTON_F1
48 #define OSCILLOSCOPE_ADVMODE BUTTON_F2
49 #define OSCILLOSCOPE_ORIENTATION BUTTON_F3
50 #define OSCILLOSCOPE_PAUSE BUTTON_SELECT
51 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
52 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
53 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
54 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
56 #elif CONFIG_KEYPAD == ONDIO_PAD
57 #define OSCILLOSCOPE_QUIT BUTTON_OFF
58 #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_MENU
59 #define OSCILLOSCOPE_DRAWMODE (BUTTON_MENU | BUTTON_REL)
60 #define OSCILLOSCOPE_ADVMODE (BUTTON_MENU | BUTTON_RIGHT)
61 #define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT)
62 #define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF)
63 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
64 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
65 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
66 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
68 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
69 #define OSCILLOSCOPE_QUIT BUTTON_OFF
70 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
71 #define OSCILLOSCOPE_ADVMODE BUTTON_MODE
72 #define OSCILLOSCOPE_ORIENTATION BUTTON_REC
73 #define OSCILLOSCOPE_PAUSE BUTTON_ON
74 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
75 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
76 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
77 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
78 #define OSCILLOSCOPE_RC_QUIT BUTTON_RC_STOP
80 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
81 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
82 #define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU)
83 #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_PLAY)
84 #define OSCILLOSCOPE_ADVMODE (BUTTON_SELECT | BUTTON_RIGHT)
85 #define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT)
86 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
87 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
88 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
89 #define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_FWD
90 #define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_BACK
92 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
93 #define OSCILLOSCOPE_QUIT BUTTON_POWER
94 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
95 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
96 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
97 #define OSCILLOSCOPE_PAUSE BUTTON_A
98 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
99 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
100 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
101 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
103 #elif (CONFIG_KEYPAD == SANSA_E200_PAD)
104 #define OSCILLOSCOPE_QUIT BUTTON_POWER
105 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
106 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
107 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
108 #define OSCILLOSCOPE_PAUSE BUTTON_REC
109 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
110 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
111 #define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_FWD
112 #define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_BACK
114 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
115 #define OSCILLOSCOPE_QUIT (BUTTON_HOME|BUTTON_REPEAT)
116 #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_REL)
117 #define OSCILLOSCOPE_ADVMODE (BUTTON_SELECT | BUTTON_RIGHT)
118 #define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT)
119 #define OSCILLOSCOPE_PAUSE BUTTON_UP
120 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
121 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
122 #define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_FWD
123 #define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_BACK
125 #elif (CONFIG_KEYPAD == SANSA_C200_PAD)
126 #define OSCILLOSCOPE_QUIT BUTTON_POWER
127 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
128 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
129 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
130 #define OSCILLOSCOPE_PAUSE BUTTON_REC
131 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
132 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
133 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
134 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
136 #elif (CONFIG_KEYPAD == SANSA_CLIP_PAD)
137 #define OSCILLOSCOPE_QUIT BUTTON_POWER
138 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
139 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
140 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
141 #define OSCILLOSCOPE_PAUSE BUTTON_HOME
142 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
143 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
144 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
145 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
147 #elif (CONFIG_KEYPAD == SANSA_M200_PAD)
148 #define OSCILLOSCOPE_QUIT BUTTON_POWER
149 #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_REL)
150 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
151 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
152 #define OSCILLOSCOPE_PAUSE (BUTTON_SELECT | BUTTON_UP)
153 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
154 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
155 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
156 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
158 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
159 #define OSCILLOSCOPE_QUIT BUTTON_POWER
160 #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_SELECT
161 #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_REL)
162 #define OSCILLOSCOPE_ADVMODE BUTTON_REC
163 #define OSCILLOSCOPE_ORIENTATION_PRE BUTTON_SELECT
164 #define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_REPEAT)
165 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
166 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
167 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
168 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
169 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
171 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
172 #define OSCILLOSCOPE_QUIT BUTTON_POWER
173 #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_REW
174 #define OSCILLOSCOPE_DRAWMODE (BUTTON_REW | BUTTON_REL)
175 #define OSCILLOSCOPE_ADVMODE BUTTON_FF
176 #define OSCILLOSCOPE_ORIENTATION_PRE BUTTON_REW
177 #define OSCILLOSCOPE_ORIENTATION (BUTTON_REW | BUTTON_REPEAT)
178 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
179 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
180 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
181 #define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_UP
182 #define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_DOWN
184 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
185 #define OSCILLOSCOPE_QUIT BUTTON_BACK
186 #define OSCILLOSCOPE_DRAWMODE BUTTON_PREV
187 #define OSCILLOSCOPE_ADVMODE BUTTON_NEXT
188 #define OSCILLOSCOPE_ORIENTATION BUTTON_MENU
189 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
190 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
191 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
192 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
193 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
195 #elif (CONFIG_KEYPAD == MROBE100_PAD)
196 #define OSCILLOSCOPE_QUIT BUTTON_POWER
197 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
198 #define OSCILLOSCOPE_ADVMODE BUTTON_MENU
199 #define OSCILLOSCOPE_ORIENTATION BUTTON_PLAY
200 #define OSCILLOSCOPE_PAUSE BUTTON_DISPLAY
201 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
202 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
203 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
204 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
206 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
207 #define OSCILLOSCOPE_QUIT BUTTON_RC_REC
208 #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_RC_MODE
209 #define OSCILLOSCOPE_DRAWMODE (BUTTON_RC_MODE|BUTTON_REL)
210 #define OSCILLOSCOPE_ADVMODE BUTTON_RC_MENU
211 #define OSCILLOSCOPE_ORIENTATION_PRE BUTTON_RC_MODE
212 #define OSCILLOSCOPE_ORIENTATION (BUTTON_RC_MODE|BUTTON_REPEAT)
213 #define OSCILLOSCOPE_PAUSE BUTTON_RC_PLAY
214 #define OSCILLOSCOPE_SPEED_UP BUTTON_RC_FF
215 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_RC_REW
216 #define OSCILLOSCOPE_VOL_UP BUTTON_RC_VOL_UP
217 #define OSCILLOSCOPE_VOL_DOWN BUTTON_RC_VOL_DOWN
219 #elif CONFIG_KEYPAD == COWON_D2_PAD
220 #define OSCILLOSCOPE_QUIT BUTTON_POWER
221 #define OSCILLOSCOPE_VOL_UP BUTTON_PLUS
222 #define OSCILLOSCOPE_VOL_DOWN BUTTON_MINUS
224 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
225 #define OSCILLOSCOPE_QUIT BUTTON_BACK
226 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
227 #define OSCILLOSCOPE_ADVMODE BUTTON_CUSTOM
228 #define OSCILLOSCOPE_ORIENTATION BUTTON_MENU
229 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
230 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
231 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
232 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
233 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
235 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
236 #define OSCILLOSCOPE_QUIT BUTTON_POWER
237 #define OSCILLOSCOPE_DRAWMODE BUTTON_MENU
238 #define OSCILLOSCOPE_ADVMODE BUTTON_VIEW
239 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
240 #define OSCILLOSCOPE_PAUSE BUTTON_SELECT
241 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
242 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
243 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
244 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
246 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
247 #define OSCILLOSCOPE_QUIT BUTTON_POWER
248 #define OSCILLOSCOPE_DRAWMODE BUTTON_MENU
249 #define OSCILLOSCOPE_ADVMODE BUTTON_RIGHT
250 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
251 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
252 #define OSCILLOSCOPE_SPEED_UP BUTTON_NEXT
253 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_PREV
254 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
255 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
257 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
258 #define OSCILLOSCOPE_QUIT BUTTON_POWER
259 #define OSCILLOSCOPE_DRAWMODE BUTTON_MENU
260 #define OSCILLOSCOPE_ADVMODE BUTTON_RIGHT
261 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
262 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
263 #define OSCILLOSCOPE_SPEED_UP BUTTON_NEXT
264 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_PREV
265 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
266 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
268 #elif CONFIG_KEYPAD == ONDAVX747_PAD
269 #define OSCILLOSCOPE_QUIT BUTTON_POWER
270 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
271 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
273 #elif CONFIG_KEYPAD == ONDAVX777_PAD
274 #define OSCILLOSCOPE_QUIT BUTTON_POWER
276 #elif CONFIG_KEYPAD == MROBE500_PAD
277 #define OSCILLOSCOPE_QUIT BUTTON_POWER
279 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
280 #define OSCILLOSCOPE_QUIT BUTTON_REC
281 #define OSCILLOSCOPE_DRAWMODE (BUTTON_PLAY|BUTTON_LEFT)
282 #define OSCILLOSCOPE_ADVMODE (BUTTON_PLAY|BUTTON_RIGHT)
283 #define OSCILLOSCOPE_ORIENTATION (BUTTON_PLAY|BUTTON_UP)
284 #define OSCILLOSCOPE_PAUSE (BUTTON_PLAY|BUTTON_DOWN)
285 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
286 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
287 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
288 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
290 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
291 #define OSCILLOSCOPE_QUIT BUTTON_REC
292 #define OSCILLOSCOPE_DRAWMODE BUTTON_MENU
293 #define OSCILLOSCOPE_ADVMODE BUTTON_CANCEL
294 #define OSCILLOSCOPE_ORIENTATION BUTTON_OK
295 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
296 #define OSCILLOSCOPE_SPEED_UP BUTTON_PREV
297 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_NEXT
298 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
299 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
301 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
302 #define OSCILLOSCOPE_QUIT (BUTTON_REC | BUTTON_PLAY)
303 #define OSCILLOSCOPE_DRAWMODE BUTTON_FUNC
304 #define OSCILLOSCOPE_ADVMODE BUTTON_REC
305 #define OSCILLOSCOPE_ORIENTATION (BUTTON_FUNC|BUTTON_REPEAT)
306 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
307 #define OSCILLOSCOPE_SPEED_UP BUTTON_FF
308 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_REW
309 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
310 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
312 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
313 #define OSCILLOSCOPE_QUIT (BUTTON_MENU | BUTTON_REPEAT)
314 #define OSCILLOSCOPE_DRAWMODE BUTTON_ENTER
315 #define OSCILLOSCOPE_ADVMODE BUTTON_REC
316 #define OSCILLOSCOPE_ORIENTATION BUTTON_MENU
317 #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
318 #define OSCILLOSCOPE_SPEED_UP BUTTON_FF
319 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_REW
320 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
321 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
323 #elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
324 #define OSCILLOSCOPE_QUIT BUTTON_POWER
325 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
326 #define OSCILLOSCOPE_ADVMODE BUTTON_BACK
327 #define OSCILLOSCOPE_ORIENTATION (BUTTON_BACK|BUTTON_REPEAT)
328 #define OSCILLOSCOPE_PAUSE BUTTON_PLAYPAUSE
329 #define OSCILLOSCOPE_SPEED_UP BUTTON_LEFT
330 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_RIGHT
331 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
332 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
334 #elif (CONFIG_KEYPAD == SANSA_CONNECT_PAD)
335 #define OSCILLOSCOPE_QUIT BUTTON_POWER
336 #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
337 #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
338 #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
339 #define OSCILLOSCOPE_PAUSE BUTTON_NEXT
340 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
341 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
342 #define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
343 #define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
345 #elif (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
346 #define OSCILLOSCOPE_QUIT BUTTON_BACK
347 #define OSCILLOSCOPE_DRAWMODE BUTTON_USER
348 #define OSCILLOSCOPE_ADVMODE BUTTON_MENU
349 #define OSCILLOSCOPE_ORIENTATION BUTTON_POWER
350 #define OSCILLOSCOPE_PAUSE BUTTON_SELECT
351 #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
352 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
353 #define OSCILLOSCOPE_VOL_UP BUTTON_UP
354 #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
356 #elif (CONFIG_KEYPAD == HM60X_PAD)
357 #define OSCILLOSCOPE_QUIT BUTTON_POWER
358 #define OSCILLOSCOPE_DRAWMODE (BUTTON_POWER | BUTTON_SELECT)
359 #define OSCILLOSCOPE_ADVMODE (BUTTON_POWER | BUTTON_RIGHT)
360 #define OSCILLOSCOPE_ORIENTATION (BUTTON_POWER | BUTTON_LEFT)
361 #define OSCILLOSCOPE_PAUSE BUTTON_SELECT
362 #define OSCILLOSCOPE_SPEED_UP BUTTON_UP
363 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_DOWN
364 #define OSCILLOSCOPE_VOL_UP BUTTON_RIGHT
365 #define OSCILLOSCOPE_VOL_DOWN BUTTON_LEFT
367 #elif (CONFIG_KEYPAD == HM801_PAD)
368 #define OSCILLOSCOPE_QUIT BUTTON_POWER
369 #define OSCILLOSCOPE_DRAWMODE BUTTON_PREV
370 #define OSCILLOSCOPE_ADVMODE BUTTON_NEXT
371 #define OSCILLOSCOPE_ORIENTATION BUTTON_PLAY
372 #define OSCILLOSCOPE_PAUSE BUTTON_SELECT
373 #define OSCILLOSCOPE_SPEED_UP BUTTON_UP
374 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_DOWN
375 #define OSCILLOSCOPE_VOL_UP BUTTON_RIGHT
376 #define OSCILLOSCOPE_VOL_DOWN BUTTON_LEFT
378 #else
379 #error No keymap defined!
380 #endif
382 #ifdef HAVE_TOUCHSCREEN
383 #ifndef OSCILLOSCOPE_QUIT
384 #define OSCILLOSCOPE_QUIT BUTTON_TOPLEFT
385 #endif
386 #ifndef OSCILLOSCOPE_DRAWMODE
387 #define OSCILLOSCOPE_DRAWMODE BUTTON_TOPMIDDLE
388 #endif
389 #ifndef OSCILLOSCOPE_ADVMODE
390 #define OSCILLOSCOPE_ADVMODE BUTTON_BOTTOMMIDDLE
391 #endif
392 #ifndef OSCILLOSCOPE_ORIENTATION
393 #define OSCILLOSCOPE_ORIENTATION BUTTON_BOTTOMLEFT
394 #endif
395 #ifndef OSCILLOSCOPE_PAUSE
396 #define OSCILLOSCOPE_PAUSE BUTTON_CENTER
397 #endif
398 #ifndef OSCILLOSCOPE_SPEED_UP
399 #define OSCILLOSCOPE_SPEED_UP BUTTON_MIDRIGHT
400 #endif
401 #ifndef OSCILLOSCOPE_SPEED_DOWN
402 #define OSCILLOSCOPE_SPEED_DOWN BUTTON_MIDLEFT
403 #endif
404 #ifndef OSCILLOSCOPE_VOL_UP
405 #define OSCILLOSCOPE_VOL_UP BUTTON_TOPRIGHT
406 #endif
407 #ifndef OSCILLOSCOPE_VOL_DOWN
408 #define OSCILLOSCOPE_VOL_DOWN BUTTON_BOTTOMRIGHT
409 #endif
410 #endif
412 /* colours */
413 #if LCD_DEPTH > 1
414 #ifdef HAVE_LCD_COLOR
415 #define BACKG_COLOR LCD_BLACK
416 #define GRAPH_COLOR LCD_RGBPACK(128, 255, 0)
417 #define CURSOR_COLOR LCD_RGBPACK(255, 0, 0)
418 #else
419 #define BACKG_COLOR LCD_WHITE
420 #define GRAPH_COLOR LCD_BLACK
421 #define CURSOR_COLOR LCD_DARKGRAY
422 #endif
423 #endif
425 enum { DRAW_FILLED, DRAW_LINE, DRAW_PIXEL, MAX_DRAW };
426 enum { ADV_SCROLL, ADV_WRAP, MAX_ADV };
427 enum { OSC_HORIZ, OSC_VERT, MAX_OSC };
429 #define CFGFILE_VERSION 0 /* Current config file version */
430 #define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */
433 #define MAX_PEAK 0x8000
435 #if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
436 #define mas_codec_readreg(x) rand()%MAX_PEAK
437 #endif
439 /* global variables */
441 /* settings */
442 struct osc_config {
443 int delay; /* in ticks */
444 int draw;
445 int advance;
446 int orientation;
449 struct osc_config osc_disk = { 2, DRAW_FILLED, ADV_SCROLL, OSC_HORIZ };
450 struct osc_config osc; /* running config */
452 static const char cfg_filename[] = "oscilloscope.cfg";
453 static char *draw_str[3] = { "filled", "line", "pixel" };
454 static char *advance_str[2] = { "scroll", "wrap" };
455 static char *orientation_str[2] = { "horizontal", "vertical" };
457 struct configdata disk_config[] = {
458 { TYPE_INT, 1, 99, { .int_p = &osc_disk.delay }, "delay", NULL },
459 { TYPE_ENUM, 0, MAX_DRAW, { .int_p = &osc_disk.draw }, "draw", draw_str },
460 { TYPE_ENUM, 0, MAX_ADV, { .int_p = &osc_disk.advance }, "advance",
461 advance_str },
462 { TYPE_ENUM, 0, MAX_OSC, { .int_p = &osc_disk.orientation }, "orientation",
463 orientation_str }
467 long last_tick = 0; /* time of last drawing */
468 int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */
469 int last_left; /* last channel values */
470 int last_right;
472 unsigned char message[16]; /* message to display */
473 bool displaymsg = false;
474 int font_height = 8;
476 /* implementation */
478 static void anim_horizontal(int cur_left, int cur_right)
480 int cur_x, x;
481 int left, right, dl, dr;
482 long cur_tick = *rb->current_tick;
483 long d = (cur_tick - last_tick) / osc.delay;
484 bool full_update = false;
486 if (d == 0) /* too early, bail out */
487 return;
489 last_tick = cur_tick;
491 if (d > HZ) /* first call or too much delay, (re)start */
493 last_left = cur_left;
494 last_right = cur_right;
495 return;
497 cur_x = last_pos + d;
499 if (cur_x >= LCD_WIDTH)
501 if (osc.advance == ADV_SCROLL)
503 int shift = cur_x - (LCD_WIDTH-1);
504 xlcd_scroll_left(shift);
505 full_update = true;
506 cur_x -= shift;
507 last_pos -= shift;
509 else
511 cur_x -= LCD_WIDTH;
514 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
516 if (cur_x > last_pos)
518 rb->lcd_fillrect(last_pos + 1, 0, d, LCD_HEIGHT);
520 else
522 rb->lcd_fillrect(last_pos + 1, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
523 rb->lcd_fillrect(0, 0, cur_x + 1, LCD_HEIGHT);
525 rb->lcd_set_drawmode(DRMODE_SOLID);
527 switch (osc.draw)
529 case DRAW_FILLED:
530 left = last_left;
531 right = last_right;
532 dl = (cur_left - left) / d;
533 dr = (cur_right - right) / d;
535 for (x = last_pos + 1; d > 0; x++, d--)
537 if (x == LCD_WIDTH)
538 x = 0;
540 left += dl;
541 right += dr;
543 rb->lcd_vline(x, LCD_HEIGHT/2-1,
544 LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16));
545 rb->lcd_vline(x, LCD_HEIGHT/2+1,
546 LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16));
548 break;
550 case DRAW_LINE:
551 if (cur_x > last_pos)
553 rb->lcd_drawline(
554 last_pos, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_left) >> 16),
555 cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
557 rb->lcd_drawline(
558 last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16),
559 cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16)
562 else
564 left = last_left
565 + (LCD_WIDTH - last_pos) * (last_left - cur_left) / d;
566 right = last_right
567 + (LCD_WIDTH - last_pos) * (last_right - cur_right) / d;
569 rb->lcd_drawline(
570 last_pos, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_left) >> 16),
571 LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16)
573 rb->lcd_drawline(
574 last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16),
575 LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16)
577 if (cur_x > 0)
579 rb->lcd_drawline(
580 0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
581 cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
583 rb->lcd_drawline(
584 0, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16),
585 cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16)
589 break;
591 case DRAW_PIXEL:
592 left = last_left;
593 right = last_right;
594 dl = (cur_left - left) / d;
595 dr = (cur_right - right) / d;
597 for (x = last_pos + 1; d > 0; x++, d--)
599 if (x == LCD_WIDTH)
600 x = 0;
602 left += dl;
603 right += dr;
605 rb->lcd_drawpixel(x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16));
606 rb->lcd_drawpixel(x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16));
608 break;
611 last_left = cur_left;
612 last_right = cur_right;
614 if (displaymsg)
616 int width;
618 rb->lcd_getstringsize(message, &width, NULL);
619 last_pos -= width - 1;
620 rb->lcd_putsxy(last_pos, 0, message);
621 displaymsg = false;
623 if (last_pos < 0)
624 last_pos = 0;
627 if (full_update)
629 rb->lcd_update();
631 else
633 #if LCD_DEPTH > 1 /* cursor bar */
634 rb->lcd_set_foreground(CURSOR_COLOR);
635 rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
636 rb->lcd_set_foreground(GRAPH_COLOR);
637 #else
638 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
639 rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
640 rb->lcd_set_drawmode(DRMODE_SOLID);
641 #endif
643 if (cur_x > last_pos)
645 rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT);
647 else
649 rb->lcd_update_rect(last_pos, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
650 rb->lcd_update_rect(0, 0, cur_x + 2, LCD_HEIGHT);
653 last_pos = cur_x;
656 static void anim_vertical(int cur_left, int cur_right)
658 int cur_y, y;
659 int left, right, dl, dr;
660 long cur_tick = *rb->current_tick;
661 long d = (cur_tick - last_tick) / osc.delay;
662 bool full_update = false;
664 if (d == 0) /* too early, bail out */
665 return;
667 last_tick = cur_tick;
669 if (d > HZ) /* first call or too much delay, (re)start */
671 last_left = cur_left;
672 last_right = cur_right;
673 return;
675 cur_y = last_pos + d;
677 if (cur_y >= LCD_HEIGHT)
679 if (osc.advance == ADV_SCROLL)
681 int shift = cur_y - (LCD_HEIGHT-1);
682 xlcd_scroll_up(shift);
683 full_update = true;
684 cur_y -= shift;
685 last_pos -= shift;
687 else
689 cur_y -= LCD_HEIGHT;
692 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
694 if (cur_y > last_pos)
696 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d);
698 else
700 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, LCD_HEIGHT - last_pos);
701 rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 1);
703 rb->lcd_set_drawmode(DRMODE_SOLID);
705 switch (osc.draw)
707 case DRAW_FILLED:
708 left = last_left;
709 right = last_right;
710 dl = (cur_left - left) / d;
711 dr = (cur_right - right) / d;
713 for (y = last_pos + 1; d > 0; y++, d--)
715 if (y == LCD_HEIGHT)
716 y = 0;
718 left += dl;
719 right += dr;
721 rb->lcd_hline(LCD_WIDTH/2-1,
722 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), y);
723 rb->lcd_hline(LCD_WIDTH/2+1,
724 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), y);
726 break;
728 case DRAW_LINE:
729 if (cur_y > last_pos)
731 rb->lcd_drawline(
732 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos,
733 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
735 rb->lcd_drawline(
736 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
737 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
740 else
742 left = last_left
743 + (LCD_HEIGHT - last_pos) * (last_left - cur_left) / d;
744 right = last_right
745 + (LCD_HEIGHT - last_pos) * (last_right - cur_right) / d;
747 rb->lcd_drawline(
748 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos,
749 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), LCD_HEIGHT
751 rb->lcd_drawline(
752 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
753 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT
755 if (cur_y > 0)
757 rb->lcd_drawline(
758 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), 0,
759 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
761 rb->lcd_drawline(
762 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0,
763 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
767 break;
769 case DRAW_PIXEL:
770 left = last_left;
771 right = last_right;
772 dl = (cur_left - left) / d;
773 dr = (cur_right - right) / d;
775 for (y = last_pos + 1; d > 0; y++, d--)
777 if (y == LCD_HEIGHT)
778 y = 0;
780 left += dl;
781 right += dr;
783 rb->lcd_drawpixel(LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), y);
784 rb->lcd_drawpixel(LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), y);
786 break;
789 last_left = cur_left;
790 last_right = cur_right;
792 if (displaymsg)
794 last_pos -= font_height - 1;
795 rb->lcd_putsxy(0, last_pos, message);
796 displaymsg = false;
798 if (last_pos < 0)
799 last_pos = 0;
802 if (full_update)
804 rb->lcd_update();
806 else
808 #if LCD_DEPTH > 1 /* cursor bar */
809 rb->lcd_set_foreground(CURSOR_COLOR);
810 rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
811 rb->lcd_set_foreground(GRAPH_COLOR);
812 #else
813 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
814 rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
815 rb->lcd_set_drawmode(DRMODE_SOLID);
816 #endif
818 if (cur_y > last_pos)
820 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2);
822 else
824 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, LCD_HEIGHT - last_pos);
825 rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2);
828 last_pos = cur_y;
831 static void cleanup(void)
833 #if LCD_DEPTH > 1
834 rb->lcd_set_foreground(LCD_DEFAULT_FG);
835 rb->lcd_set_background(LCD_DEFAULT_BG);
836 #endif
837 /* Turn on backlight timeout (revert to settings) */
838 backlight_use_settings();
841 enum plugin_status plugin_start(const void* parameter)
843 int button, vol;
844 #if defined(OSCILLOSCOPE_DRAWMODE_PRE) || defined(OSCILLOSCOPE_ORIENTATION_PRE)
845 int lastbutton = BUTTON_NONE;
846 #endif
847 bool exit = false;
848 bool paused = false;
849 bool tell_speed;
851 (void)parameter;
853 atexit(cleanup);
854 configfile_load(cfg_filename, disk_config,
855 sizeof(disk_config) / sizeof(disk_config[0]),
856 CFGFILE_MINVERSION);
857 rb->memcpy(&osc, &osc_disk, sizeof(osc)); /* copy to running config */
859 #if LCD_DEPTH > 1
860 rb->lcd_set_foreground(GRAPH_COLOR);
861 rb->lcd_set_background(BACKG_COLOR);
862 rb->lcd_set_backdrop(NULL);
863 rb->lcd_clear_display();
864 rb->lcd_update();
865 #endif
867 /* Turn off backlight timeout */
868 backlight_ignore_timeout();
870 rb->lcd_getstringsize("A", NULL, &font_height);
872 while (!exit)
874 if (!paused)
876 int left, right;
878 rb->sleep(MAX(last_tick + osc.delay - *rb->current_tick - 1, 0));
880 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
881 left = rb->mas_codec_readreg(0xC);
882 right = rb->mas_codec_readreg(0xD);
883 #elif (CONFIG_CODEC == SWCODEC)
884 static struct pcm_peaks peaks;
885 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
886 &peaks);
887 left = peaks.left; right = peaks.right;
888 #endif
889 if (osc.orientation == OSC_HORIZ)
890 anim_horizontal(left, right);
891 else
892 anim_vertical(left, right);
895 tell_speed = false;
896 button = rb->button_get(paused);
897 switch (button)
899 #ifdef OSCILLOSCOPE_RC_QUIT
900 case OSCILLOSCOPE_RC_QUIT:
901 #endif
902 case OSCILLOSCOPE_QUIT:
903 exit = true;
904 break;
906 case OSCILLOSCOPE_ADVMODE:
907 if (++osc.advance >= MAX_ADV)
908 osc.advance = 0;
909 break;
911 case OSCILLOSCOPE_DRAWMODE:
912 #ifdef OSCILLOSCOPE_DRAWMODE_PRE
913 if (lastbutton != OSCILLOSCOPE_DRAWMODE_PRE)
914 break;
915 #endif
916 if (++osc.draw >= MAX_DRAW)
917 osc.draw = 0;
918 break;
920 case OSCILLOSCOPE_ORIENTATION:
921 #ifdef OSCILLOSCOPE_ORIENTATION_PRE
922 if (lastbutton != OSCILLOSCOPE_ORIENTATION_PRE)
923 break;
924 #endif
925 if (++osc.orientation >= MAX_OSC)
926 osc.orientation = 0;
927 last_pos = 0;
928 last_tick = 0;
929 displaymsg = false;
930 rb->lcd_clear_display();
931 rb->lcd_update();
932 break;
934 case OSCILLOSCOPE_PAUSE:
935 paused = !paused;
936 last_tick = 0;
937 break;
939 case OSCILLOSCOPE_SPEED_UP:
940 case OSCILLOSCOPE_SPEED_UP | BUTTON_REPEAT:
941 if (osc.delay > 1)
943 osc.delay--;
944 tell_speed = true;
946 break;
948 case OSCILLOSCOPE_SPEED_DOWN:
949 case OSCILLOSCOPE_SPEED_DOWN | BUTTON_REPEAT:
950 osc.delay++;
951 tell_speed = true;
952 break;
954 case OSCILLOSCOPE_VOL_UP:
955 case OSCILLOSCOPE_VOL_UP | BUTTON_REPEAT:
956 vol = rb->global_settings->volume;
957 if (vol < rb->sound_max(SOUND_VOLUME))
959 vol++;
960 rb->sound_set(SOUND_VOLUME, vol);
961 rb->global_settings->volume = vol;
963 break;
965 case OSCILLOSCOPE_VOL_DOWN:
966 case OSCILLOSCOPE_VOL_DOWN | BUTTON_REPEAT:
967 vol = rb->global_settings->volume;
968 if (vol > rb->sound_min(SOUND_VOLUME))
970 vol--;
971 rb->sound_set(SOUND_VOLUME, vol);
972 rb->global_settings->volume = vol;
974 break;
976 default:
977 exit_on_usb(button);
978 break;
980 #if defined(OSCILLOSCOPE_DRAWMODE_PRE) || defined(OSCILLOSCOPE_ORIENTATION_PRE)
981 if (button != BUTTON_NONE)
982 lastbutton = button;
983 #endif
985 if (tell_speed)
987 rb->snprintf(message, sizeof(message), "%s%d",
988 (osc.orientation == OSC_VERT) ? "Speed: " : "",
989 100 / osc.delay);
990 displaymsg = true;
993 if (rb->memcmp(&osc, &osc_disk, sizeof(osc))) /* save settings if changed */
995 rb->memcpy(&osc_disk, &osc, sizeof(osc));
996 configfile_save(cfg_filename, disk_config,
997 sizeof(disk_config) / sizeof(disk_config[0]),
998 CFGFILE_VERSION);
1000 return PLUGIN_OK;