summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-03-11 01:13:51 +0000
committerJens Arnold <amiconn@rockbox.org>2006-03-11 01:13:51 +0000
commitf9765d3f5c503d1ea2ef7467294eeac275643ce5 (patch)
tree485255cc78324b4d2686242982511e29393c9e29
parenta738c3be31637872c622953fe749e10e295a9cd4 (diff)
downloadrockbox-f9765d3f5c503d1ea2ef7467294eeac275643ce5.tar.gz
rockbox-f9765d3f5c503d1ea2ef7467294eeac275643ce5.zip
Oscilloscope: * Added moving cursor bar. * Fixed several off-by-one errors which lead to glitches when wrapping around. * Settings are saved to disk. * Code cleanup.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8992 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/oscilloscope.c317
1 files changed, 191 insertions, 126 deletions
diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c
index 2d1425b5b7..da0bf0275b 100644
--- a/apps/plugins/oscilloscope.c
+++ b/apps/plugins/oscilloscope.c
@@ -7,7 +7,7 @@
7* \/ \/ \/ \/ \/ 7* \/ \/ \/ \/ \/
8* $Id$ 8* $Id$
9* 9*
10* Oscilloscope, with the thought-to-be impossible horizontal aspect! 10* Oscilloscope, with many different modes of operation.
11* 11*
12* Copyright (C) 2004-2006 Jens Arnold 12* Copyright (C) 2004-2006 Jens Arnold
13* 13*
@@ -23,105 +23,129 @@
23 23
24#ifdef HAVE_LCD_BITMAP 24#ifdef HAVE_LCD_BITMAP
25#include "xlcd.h" 25#include "xlcd.h"
26#include "configfile.h"
26 27
27PLUGIN_HEADER 28PLUGIN_HEADER
28 29
29/* The different drawing modes */
30#define OSC_MODE_FILLED 0
31#define OSC_MODE_OUTLINE 1
32#define OSC_MODE_PIXEL 2
33#define OSC_MODE_COUNT 3
34
35#define MAX_PEAK 0x8000
36
37/* variable button definitions */ 30/* variable button definitions */
38#if CONFIG_KEYPAD == RECORDER_PAD 31#if CONFIG_KEYPAD == RECORDER_PAD
39#define OSCILLOSCOPE_QUIT BUTTON_OFF 32#define OSCILLOSCOPE_QUIT BUTTON_OFF
40#define OSCILLOSCOPE_MODE BUTTON_F1 33#define OSCILLOSCOPE_DRAWMODE BUTTON_F1
41#define OSCILLOSCOPE_SCROLL BUTTON_F2 34#define OSCILLOSCOPE_ADVMODE BUTTON_F2
42#define OSCILLOSCOPE_ORIENTATION BUTTON_F3 35#define OSCILLOSCOPE_ORIENTATION BUTTON_F3
43#define OSCILLOSCOPE_PAUSE BUTTON_PLAY 36#define OSCILLOSCOPE_PAUSE BUTTON_PLAY
44#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 37#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
45#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 38#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
46#define OSCILLOSCOPE_VOL_UP BUTTON_UP 39#define OSCILLOSCOPE_VOL_UP BUTTON_UP
47#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN 40#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
48 41
49#elif CONFIG_KEYPAD == ONDIO_PAD 42#elif CONFIG_KEYPAD == ONDIO_PAD
50#define OSCILLOSCOPE_QUIT BUTTON_OFF 43#define OSCILLOSCOPE_QUIT BUTTON_OFF
51#define OSCILLOSCOPE_MODE_PRE BUTTON_MENU 44#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_MENU
52#define OSCILLOSCOPE_MODE (BUTTON_MENU | BUTTON_REL) 45#define OSCILLOSCOPE_DRAWMODE (BUTTON_MENU | BUTTON_REL)
53#define OSCILLOSCOPE_SCROLL (BUTTON_MENU | BUTTON_RIGHT) 46#define OSCILLOSCOPE_ADVMODE (BUTTON_MENU | BUTTON_RIGHT)
54#define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT) 47#define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT)
55#define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF) 48#define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF)
56#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 49#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
57#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 50#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
58#define OSCILLOSCOPE_VOL_UP BUTTON_UP 51#define OSCILLOSCOPE_VOL_UP BUTTON_UP
59#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN 52#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
60 53
61#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 54#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
62#define OSCILLOSCOPE_QUIT BUTTON_OFF 55#define OSCILLOSCOPE_QUIT BUTTON_OFF
63#define OSCILLOSCOPE_MODE BUTTON_SELECT 56#define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
64#define OSCILLOSCOPE_SCROLL BUTTON_MODE 57#define OSCILLOSCOPE_ADVMODE BUTTON_MODE
65#define OSCILLOSCOPE_ORIENTATION BUTTON_REC 58#define OSCILLOSCOPE_ORIENTATION BUTTON_REC
66#define OSCILLOSCOPE_PAUSE BUTTON_ON 59#define OSCILLOSCOPE_PAUSE BUTTON_ON
67#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 60#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
68#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 61#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
69#define OSCILLOSCOPE_VOL_UP BUTTON_UP 62#define OSCILLOSCOPE_VOL_UP BUTTON_UP
70#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN 63#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
71 64
72#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) 65#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
73#define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU) 66#define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU)
74#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_PLAY) 67#define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_PLAY)
75#define OSCILLOSCOPE_SCROLL (BUTTON_SELECT | BUTTON_RIGHT) 68#define OSCILLOSCOPE_ADVMODE (BUTTON_SELECT | BUTTON_RIGHT)
76#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT) 69#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT)
77#define OSCILLOSCOPE_PAUSE BUTTON_PLAY 70#define OSCILLOSCOPE_PAUSE BUTTON_PLAY
78#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 71#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
79#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 72#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
80#define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_FWD 73#define OSCILLOSCOPE_VOL_UP BUTTON_SCROLL_FWD
81#define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_BACK 74#define OSCILLOSCOPE_VOL_DOWN BUTTON_SCROLL_BACK
82 75
83#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 76#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
84#define OSCILLOSCOPE_QUIT BUTTON_POWER 77#define OSCILLOSCOPE_QUIT BUTTON_POWER
85#define OSCILLOSCOPE_MODE BUTTON_SELECT 78#define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
86#define OSCILLOSCOPE_SCROLL BUTTON_DOWN 79#define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
87#define OSCILLOSCOPE_ORIENTATION BUTTON_UP 80#define OSCILLOSCOPE_ORIENTATION BUTTON_UP
88#define OSCILLOSCOPE_PAUSE BUTTON_A 81#define OSCILLOSCOPE_PAUSE BUTTON_A
89#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 82#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
90#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 83#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
91#define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP 84#define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
92#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN 85#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
93 86
94#elif CONFIG_KEYPAD == IAUDIO_X5_PAD 87#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
95#define OSCILLOSCOPE_QUIT BUTTON_POWER 88#define OSCILLOSCOPE_QUIT BUTTON_POWER
96#define OSCILLOSCOPE_MODE_PRE BUTTON_SELECT 89#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_SELECT
97#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_REL) 90#define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_REL)
98#define OSCILLOSCOPE_SCROLL BUTTON_REC 91#define OSCILLOSCOPE_ADVMODE BUTTON_REC
99#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_REPEAT) 92#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_REPEAT)
100#define OSCILLOSCOPE_PAUSE BUTTON_PLAY 93#define OSCILLOSCOPE_PAUSE BUTTON_PLAY
101#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT 94#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
102#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT 95#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
103#define OSCILLOSCOPE_VOL_UP BUTTON_UP 96#define OSCILLOSCOPE_VOL_UP BUTTON_UP
104#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN 97#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
105 98
106#endif 99#endif
107 100
108#if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) 101/* colours */
109#define mas_codec_readreg(x) rand()%MAX_PEAK 102#if LCD_DEPTH > 1
103#ifdef HAVE_LCD_COLOR
104#define BACKG_COLOR LCD_BLACK
105#define GRAPH_COLOR LCD_RGBPACK(128, 255, 0)
106#define CURSOR_COLOR LCD_RGBPACK(255, 0, 0)
107#else
108#define BACKG_COLOR LCD_WHITE
109#define GRAPH_COLOR LCD_BLACK
110#define CURSOR_COLOR LCD_DARKGRAY
111#endif
110#endif 112#endif
111 113
112/* prototypes */ 114enum { DRAW_FILLED, DRAW_LINE, DRAW_PIXEL, MAX_DRAW };
115enum { ADV_SCROLL, ADV_WRAP, MAX_ADV };
116enum { OSC_HORIZ, OSC_VERT, MAX_OSC };
113 117
114void anim_horizontal(int, int); 118#define CFGFILE_VERSION 0 /* Current config file version */
115void anim_vertical(int, int); 119#define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */
120
121
122#define MAX_PEAK 0x8000
123
124#if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
125#define mas_codec_readreg(x) rand()%MAX_PEAK
126#endif
116 127
117/* global variables */ 128/* global variables */
118 129
119struct plugin_api* rb; /* global api struct pointer */ 130struct plugin_api* rb; /* global api struct pointer */
120 131
121int osc_mode = OSC_MODE_FILLED; 132/* settings */
122int osc_delay = 2; /* in ticks */ 133int osc_delay = 2; /* in ticks */
123bool osc_scroll = true; 134int osc_draw = DRAW_FILLED;
124void (*anim)(int, int) = anim_horizontal; 135int osc_advance = ADV_SCROLL;
136int osc_orientation = OSC_HORIZ;
137
138static const char cfg_filename[] = "oscilloscope.cfg";
139static char *draw_str[3] = { "filled", "line", "pixel" };
140static char *advance_str[2] = { "scroll", "wrap" };
141static char *orientation_str[2] = { "horizontal", "vertical" };
142
143struct configdata config[] = {
144 { TYPE_INT, 1, 99, &osc_delay, "delay", NULL, NULL },
145 { TYPE_ENUM, 0, MAX_DRAW, &osc_draw, "draw", draw_str, NULL },
146 { TYPE_ENUM, 0, MAX_ADV, &osc_advance, "advance", advance_str, NULL },
147 { TYPE_ENUM, 0, MAX_OSC, &osc_orientation, "orientation", orientation_str, NULL }
148};
125 149
126long last_tick = 0; /* time of last drawing */ 150long last_tick = 0; /* time of last drawing */
127int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */ 151int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */
@@ -157,7 +181,7 @@ void anim_horizontal(int cur_left, int cur_right)
157 181
158 if (cur_x >= LCD_WIDTH) 182 if (cur_x >= LCD_WIDTH)
159 { 183 {
160 if (osc_scroll) /* scroll */ 184 if (osc_advance == ADV_SCROLL)
161 { 185 {
162 int shift = cur_x - (LCD_WIDTH-1); 186 int shift = cur_x - (LCD_WIDTH-1);
163 xlcd_scroll_left(shift); 187 xlcd_scroll_left(shift);
@@ -165,7 +189,7 @@ void anim_horizontal(int cur_left, int cur_right)
165 cur_x -= shift; 189 cur_x -= shift;
166 last_pos -= shift; 190 last_pos -= shift;
167 } 191 }
168 else /* wrap */ 192 else
169 { 193 {
170 cur_x -= LCD_WIDTH; 194 cur_x -= LCD_WIDTH;
171 } 195 }
@@ -174,18 +198,18 @@ void anim_horizontal(int cur_left, int cur_right)
174 198
175 if (cur_x > last_pos) 199 if (cur_x > last_pos)
176 { 200 {
177 rb->lcd_fillrect(last_pos + 1, 0, d + 2, LCD_HEIGHT); 201 rb->lcd_fillrect(last_pos + 1, 0, d, LCD_HEIGHT);
178 } 202 }
179 else 203 else
180 { 204 {
181 rb->lcd_fillrect(last_pos + 1, 0, (LCD_WIDTH-1) - last_pos, LCD_HEIGHT); 205 rb->lcd_fillrect(last_pos + 1, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
182 rb->lcd_fillrect(0, 0, cur_x + 2, LCD_HEIGHT); 206 rb->lcd_fillrect(0, 0, cur_x + 1, LCD_HEIGHT);
183 } 207 }
184 rb->lcd_set_drawmode(DRMODE_SOLID); 208 rb->lcd_set_drawmode(DRMODE_SOLID);
185 209
186 switch (osc_mode) 210 switch (osc_draw)
187 { 211 {
188 case OSC_MODE_FILLED: 212 case DRAW_FILLED:
189 left = last_left; 213 left = last_left;
190 right = last_right; 214 right = last_right;
191 dl = (cur_left - left) / d; 215 dl = (cur_left - left) / d;
@@ -206,7 +230,7 @@ void anim_horizontal(int cur_left, int cur_right)
206 } 230 }
207 break; 231 break;
208 232
209 case OSC_MODE_OUTLINE: 233 case DRAW_LINE:
210 if (cur_x > last_pos) 234 if (cur_x > last_pos)
211 { 235 {
212 rb->lcd_drawline( 236 rb->lcd_drawline(
@@ -230,21 +254,24 @@ void anim_horizontal(int cur_left, int cur_right)
230 LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16) 254 LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16)
231 ); 255 );
232 rb->lcd_drawline( 256 rb->lcd_drawline(
233 0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
234 cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
235 );
236 rb->lcd_drawline(
237 last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16), 257 last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16),
238 LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16) 258 LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16)
239 ); 259 );
240 rb->lcd_drawline( 260 if (cur_x > 0)
241 0, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16), 261 {
242 cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16) 262 rb->lcd_drawline(
243 ); 263 0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
264 cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
265 );
266 rb->lcd_drawline(
267 0, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16),
268 cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16)
269 );
270 }
244 } 271 }
245 break; 272 break;
246 273
247 case OSC_MODE_PIXEL: 274 case DRAW_PIXEL:
248 left = last_left; 275 left = last_left;
249 right = last_right; 276 right = last_right;
250 dl = (cur_left - left) / d; 277 dl = (cur_left - left) / d;
@@ -266,20 +293,30 @@ void anim_horizontal(int cur_left, int cur_right)
266 } 293 }
267 last_left = cur_left; 294 last_left = cur_left;
268 last_right = cur_right; 295 last_right = cur_right;
269 296
270 if (full_update) 297 if (full_update)
271 { 298 {
272 rb->lcd_update(); 299 rb->lcd_update();
273 } 300 }
274 else 301 else
275 { 302 {
303#if LCD_DEPTH > 1 /* cursor bar */
304 rb->lcd_set_foreground(CURSOR_COLOR);
305 rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
306 rb->lcd_set_foreground(GRAPH_COLOR);
307#else
308 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
309 rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
310 rb->lcd_set_drawmode(DRMODE_SOLID);
311#endif
312
276 if (cur_x > last_pos) 313 if (cur_x > last_pos)
277 { 314 {
278 rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT); 315 rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT);
279 } 316 }
280 else 317 else
281 { 318 {
282 rb->lcd_update_rect(last_pos, 0, (LCD_WIDTH-1) - last_pos, LCD_HEIGHT); 319 rb->lcd_update_rect(last_pos, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
283 rb->lcd_update_rect(0, 0, cur_x + 2, LCD_HEIGHT); 320 rb->lcd_update_rect(0, 0, cur_x + 2, LCD_HEIGHT);
284 } 321 }
285 } 322 }
@@ -309,7 +346,7 @@ void anim_vertical(int cur_left, int cur_right)
309 346
310 if (cur_y >= LCD_HEIGHT) 347 if (cur_y >= LCD_HEIGHT)
311 { 348 {
312 if (osc_scroll) /* scroll */ 349 if (osc_advance == ADV_SCROLL)
313 { 350 {
314 int shift = cur_y - (LCD_HEIGHT-1); 351 int shift = cur_y - (LCD_HEIGHT-1);
315 xlcd_scroll_up(shift); 352 xlcd_scroll_up(shift);
@@ -317,7 +354,7 @@ void anim_vertical(int cur_left, int cur_right)
317 cur_y -= shift; 354 cur_y -= shift;
318 last_pos -= shift; 355 last_pos -= shift;
319 } 356 }
320 else /* wrap */ 357 else
321 { 358 {
322 cur_y -= LCD_HEIGHT; 359 cur_y -= LCD_HEIGHT;
323 } 360 }
@@ -326,18 +363,18 @@ void anim_vertical(int cur_left, int cur_right)
326 363
327 if (cur_y > last_pos) 364 if (cur_y > last_pos)
328 { 365 {
329 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d + 2); 366 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d);
330 } 367 }
331 else 368 else
332 { 369 {
333 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos); 370 rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, LCD_HEIGHT - last_pos);
334 rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 2); 371 rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 1);
335 } 372 }
336 rb->lcd_set_drawmode(DRMODE_SOLID); 373 rb->lcd_set_drawmode(DRMODE_SOLID);
337 374
338 switch (osc_mode) 375 switch (osc_draw)
339 { 376 {
340 case OSC_MODE_FILLED: 377 case DRAW_FILLED:
341 left = last_left; 378 left = last_left;
342 right = last_right; 379 right = last_right;
343 dl = (cur_left - left) / d; 380 dl = (cur_left - left) / d;
@@ -358,7 +395,7 @@ void anim_vertical(int cur_left, int cur_right)
358 } 395 }
359 break; 396 break;
360 397
361 case OSC_MODE_OUTLINE: 398 case DRAW_LINE:
362 if (cur_y > last_pos) 399 if (cur_y > last_pos)
363 { 400 {
364 rb->lcd_drawline( 401 rb->lcd_drawline(
@@ -382,21 +419,24 @@ void anim_vertical(int cur_left, int cur_right)
382 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), LCD_HEIGHT 419 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), LCD_HEIGHT
383 ); 420 );
384 rb->lcd_drawline( 421 rb->lcd_drawline(
385 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), 0,
386 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
387 );
388 rb->lcd_drawline(
389 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos, 422 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
390 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT 423 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT
391 ); 424 );
392 rb->lcd_drawline( 425 if (cur_y > 0)
393 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0, 426 {
394 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y 427 rb->lcd_drawline(
395 ); 428 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), 0,
429 LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
430 );
431 rb->lcd_drawline(
432 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0,
433 LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
434 );
435 }
396 } 436 }
397 break; 437 break;
398 438
399 case OSC_MODE_PIXEL: 439 case DRAW_PIXEL:
400 left = last_left; 440 left = last_left;
401 right = last_right; 441 right = last_right;
402 dl = (cur_left - left) / d; 442 dl = (cur_left - left) / d;
@@ -435,13 +475,23 @@ void anim_vertical(int cur_left, int cur_right)
435 } 475 }
436 else 476 else
437 { 477 {
478#if LCD_DEPTH > 1 /* cursor bar */
479 rb->lcd_set_foreground(CURSOR_COLOR);
480 rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
481 rb->lcd_set_foreground(GRAPH_COLOR);
482#else
483 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
484 rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
485 rb->lcd_set_drawmode(DRMODE_SOLID);
486#endif
487
438 if (cur_y > last_pos) 488 if (cur_y > last_pos)
439 { 489 {
440 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2); 490 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2);
441 } 491 }
442 else 492 else
443 { 493 {
444 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos); 494 rb->lcd_update_rect(0, last_pos, LCD_WIDTH, LCD_HEIGHT - last_pos);
445 rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2); 495 rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2);
446 } 496 }
447 } 497 }
@@ -451,9 +501,11 @@ void anim_vertical(int cur_left, int cur_right)
451void cleanup(void *parameter) 501void cleanup(void *parameter)
452{ 502{
453 (void)parameter; 503 (void)parameter;
454#ifdef HAVE_LCD_COLOR 504#if LCD_DEPTH > 1
455 rb->lcd_set_foreground(LCD_DEFAULT_FG); 505 rb->lcd_set_foreground(LCD_DEFAULT_FG);
456 rb->lcd_set_background(LCD_DEFAULT_BG); 506 rb->lcd_set_background(LCD_DEFAULT_BG);
507#endif
508#ifdef HAVE_LCD_COLOR
457 rb->backlight_set_timeout(rb->global_settings->backlight_timeout); 509 rb->backlight_set_timeout(rb->global_settings->backlight_timeout);
458#endif 510#endif
459} 511}
@@ -470,12 +522,18 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
470 rb = api; 522 rb = api;
471 523
472 xlcd_init(rb); 524 xlcd_init(rb);
473 525 configfile_init(rb);
474#ifdef HAVE_LCD_COLOR 526
475 rb->lcd_set_foreground(LCD_RGBPACK(128, 255, 0)); 527 configfile_load(cfg_filename, config, sizeof(config) / sizeof(config[0]),
476 rb->lcd_set_background(LCD_BLACK); 528 CFGFILE_MINVERSION);
529
530#if LCD_DEPTH > 1
531 rb->lcd_set_foreground(GRAPH_COLOR);
532 rb->lcd_set_background(BACKG_COLOR);
477 rb->lcd_clear_display(); 533 rb->lcd_clear_display();
478 rb->lcd_update(); 534 rb->lcd_update();
535#endif
536#ifdef HAVE_LCD_COLOR
479 rb->backlight_set_timeout(1); /* keep the light on */ 537 rb->backlight_set_timeout(1); /* keep the light on */
480#endif 538#endif
481 rb->lcd_getstringsize("A", NULL, &font_height); 539 rb->lcd_getstringsize("A", NULL, &font_height);
@@ -494,7 +552,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
494#elif (CONFIG_CODEC == SWCODEC) 552#elif (CONFIG_CODEC == SWCODEC)
495 rb->pcm_calculate_peaks(&left, &right); 553 rb->pcm_calculate_peaks(&left, &right);
496#endif 554#endif
497 anim(left, right); 555 if (osc_orientation == OSC_HORIZ)
556 anim_horizontal(left, right);
557 else
558 anim_vertical(left, right);
498 } 559 }
499 560
500 tell_speed = false; 561 tell_speed = false;
@@ -505,23 +566,25 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
505 exit = true; 566 exit = true;
506 break; 567 break;
507 568
508 case OSCILLOSCOPE_SCROLL: 569 case OSCILLOSCOPE_ADVMODE:
509 osc_scroll = !osc_scroll; 570 if (++osc_advance >= MAX_ADV)
571 osc_advance = 0;
510 break; 572 break;
511 573
512 case OSCILLOSCOPE_MODE: 574 case OSCILLOSCOPE_DRAWMODE:
513#ifdef OSCILLOSCOPE_MODE_PRE 575#ifdef OSCILLOSCOPE_DRAWMODE_PRE
514 if (lastbutton != OSCILLOSCOPE_MODE_PRE) 576 if (lastbutton != OSCILLOSCOPE_DRAWMODE_PRE)
515 break; 577 break;
516#endif 578#endif
517 if (++osc_mode >= OSC_MODE_COUNT) 579 if (++osc_draw >= MAX_DRAW)
518 osc_mode = 0; 580 osc_draw = 0;
519 break; 581 break;
520 582
521 case OSCILLOSCOPE_ORIENTATION: 583 case OSCILLOSCOPE_ORIENTATION:
522 anim = (anim == anim_horizontal) ? anim_vertical : anim_horizontal; 584 if (++osc_orientation >= MAX_OSC)
585 osc_orientation = 0;
523 last_pos = 0; 586 last_pos = 0;
524 last_tick = 0; 587 last_tick = 0;
525 displaymsg = false; 588 displaymsg = false;
526 rb->lcd_clear_display(); 589 rb->lcd_clear_display();
527 rb->lcd_update(); 590 rb->lcd_update();
@@ -585,6 +648,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
585 } 648 }
586 } 649 }
587 cleanup(NULL); 650 cleanup(NULL);
651 configfile_save(cfg_filename, config, sizeof(config) / sizeof(config[0]),
652 CFGFILE_VERSION);
588 return PLUGIN_OK; 653 return PLUGIN_OK;
589} 654}
590#endif /* HAVE_LCD_BITMAP */ 655#endif /* HAVE_LCD_BITMAP */