diff options
-rw-r--r-- | apps/plugins/oscilloscope.c | 317 |
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 | ||
27 | PLUGIN_HEADER | 28 | PLUGIN_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 */ | 114 | enum { DRAW_FILLED, DRAW_LINE, DRAW_PIXEL, MAX_DRAW }; |
115 | enum { ADV_SCROLL, ADV_WRAP, MAX_ADV }; | ||
116 | enum { OSC_HORIZ, OSC_VERT, MAX_OSC }; | ||
113 | 117 | ||
114 | void anim_horizontal(int, int); | 118 | #define CFGFILE_VERSION 0 /* Current config file version */ |
115 | void 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 | ||
119 | struct plugin_api* rb; /* global api struct pointer */ | 130 | struct plugin_api* rb; /* global api struct pointer */ |
120 | 131 | ||
121 | int osc_mode = OSC_MODE_FILLED; | 132 | /* settings */ |
122 | int osc_delay = 2; /* in ticks */ | 133 | int osc_delay = 2; /* in ticks */ |
123 | bool osc_scroll = true; | 134 | int osc_draw = DRAW_FILLED; |
124 | void (*anim)(int, int) = anim_horizontal; | 135 | int osc_advance = ADV_SCROLL; |
136 | int osc_orientation = OSC_HORIZ; | ||
137 | |||
138 | static const char cfg_filename[] = "oscilloscope.cfg"; | ||
139 | static char *draw_str[3] = { "filled", "line", "pixel" }; | ||
140 | static char *advance_str[2] = { "scroll", "wrap" }; | ||
141 | static char *orientation_str[2] = { "horizontal", "vertical" }; | ||
142 | |||
143 | struct 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 | ||
126 | long last_tick = 0; /* time of last drawing */ | 150 | long last_tick = 0; /* time of last drawing */ |
127 | int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */ | 151 | int 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) | |||
451 | void cleanup(void *parameter) | 501 | void 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 */ |