1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Jens Arnold 2006-03-11 01:13:51 +00:00
parent a738c3be31
commit f9765d3f5c

View file

@ -7,7 +7,7 @@
* \/ \/ \/ \/ \/ * \/ \/ \/ \/ \/
* $Id$ * $Id$
* *
* Oscilloscope, with the thought-to-be impossible horizontal aspect! * Oscilloscope, with many different modes of operation.
* *
* Copyright (C) 2004-2006 Jens Arnold * Copyright (C) 2004-2006 Jens Arnold
* *
@ -23,22 +23,15 @@
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#include "xlcd.h" #include "xlcd.h"
#include "configfile.h"
PLUGIN_HEADER PLUGIN_HEADER
/* The different drawing modes */
#define OSC_MODE_FILLED 0
#define OSC_MODE_OUTLINE 1
#define OSC_MODE_PIXEL 2
#define OSC_MODE_COUNT 3
#define MAX_PEAK 0x8000
/* variable button definitions */ /* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD #if CONFIG_KEYPAD == RECORDER_PAD
#define OSCILLOSCOPE_QUIT BUTTON_OFF #define OSCILLOSCOPE_QUIT BUTTON_OFF
#define OSCILLOSCOPE_MODE BUTTON_F1 #define OSCILLOSCOPE_DRAWMODE BUTTON_F1
#define OSCILLOSCOPE_SCROLL BUTTON_F2 #define OSCILLOSCOPE_ADVMODE BUTTON_F2
#define OSCILLOSCOPE_ORIENTATION BUTTON_F3 #define OSCILLOSCOPE_ORIENTATION BUTTON_F3
#define OSCILLOSCOPE_PAUSE BUTTON_PLAY #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -48,9 +41,9 @@ PLUGIN_HEADER
#elif CONFIG_KEYPAD == ONDIO_PAD #elif CONFIG_KEYPAD == ONDIO_PAD
#define OSCILLOSCOPE_QUIT BUTTON_OFF #define OSCILLOSCOPE_QUIT BUTTON_OFF
#define OSCILLOSCOPE_MODE_PRE BUTTON_MENU #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_MENU
#define OSCILLOSCOPE_MODE (BUTTON_MENU | BUTTON_REL) #define OSCILLOSCOPE_DRAWMODE (BUTTON_MENU | BUTTON_REL)
#define OSCILLOSCOPE_SCROLL (BUTTON_MENU | BUTTON_RIGHT) #define OSCILLOSCOPE_ADVMODE (BUTTON_MENU | BUTTON_RIGHT)
#define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT) #define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT)
#define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF) #define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF)
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -60,8 +53,8 @@ PLUGIN_HEADER
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
#define OSCILLOSCOPE_QUIT BUTTON_OFF #define OSCILLOSCOPE_QUIT BUTTON_OFF
#define OSCILLOSCOPE_MODE BUTTON_SELECT #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
#define OSCILLOSCOPE_SCROLL BUTTON_MODE #define OSCILLOSCOPE_ADVMODE BUTTON_MODE
#define OSCILLOSCOPE_ORIENTATION BUTTON_REC #define OSCILLOSCOPE_ORIENTATION BUTTON_REC
#define OSCILLOSCOPE_PAUSE BUTTON_ON #define OSCILLOSCOPE_PAUSE BUTTON_ON
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -71,8 +64,8 @@ PLUGIN_HEADER
#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
#define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU) #define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU)
#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_PLAY) #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_PLAY)
#define OSCILLOSCOPE_SCROLL (BUTTON_SELECT | BUTTON_RIGHT) #define OSCILLOSCOPE_ADVMODE (BUTTON_SELECT | BUTTON_RIGHT)
#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT) #define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_LEFT)
#define OSCILLOSCOPE_PAUSE BUTTON_PLAY #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -82,8 +75,8 @@ PLUGIN_HEADER
#elif (CONFIG_KEYPAD == GIGABEAT_PAD) #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
#define OSCILLOSCOPE_QUIT BUTTON_POWER #define OSCILLOSCOPE_QUIT BUTTON_POWER
#define OSCILLOSCOPE_MODE BUTTON_SELECT #define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
#define OSCILLOSCOPE_SCROLL BUTTON_DOWN #define OSCILLOSCOPE_ADVMODE BUTTON_DOWN
#define OSCILLOSCOPE_ORIENTATION BUTTON_UP #define OSCILLOSCOPE_ORIENTATION BUTTON_UP
#define OSCILLOSCOPE_PAUSE BUTTON_A #define OSCILLOSCOPE_PAUSE BUTTON_A
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -93,9 +86,9 @@ PLUGIN_HEADER
#elif CONFIG_KEYPAD == IAUDIO_X5_PAD #elif CONFIG_KEYPAD == IAUDIO_X5_PAD
#define OSCILLOSCOPE_QUIT BUTTON_POWER #define OSCILLOSCOPE_QUIT BUTTON_POWER
#define OSCILLOSCOPE_MODE_PRE BUTTON_SELECT #define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_SELECT
#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_REL) #define OSCILLOSCOPE_DRAWMODE (BUTTON_SELECT | BUTTON_REL)
#define OSCILLOSCOPE_SCROLL BUTTON_REC #define OSCILLOSCOPE_ADVMODE BUTTON_REC
#define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_REPEAT) #define OSCILLOSCOPE_ORIENTATION (BUTTON_SELECT | BUTTON_REPEAT)
#define OSCILLOSCOPE_PAUSE BUTTON_PLAY #define OSCILLOSCOPE_PAUSE BUTTON_PLAY
#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT #define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
@ -105,23 +98,54 @@ PLUGIN_HEADER
#endif #endif
/* colours */
#if LCD_DEPTH > 1
#ifdef HAVE_LCD_COLOR
#define BACKG_COLOR LCD_BLACK
#define GRAPH_COLOR LCD_RGBPACK(128, 255, 0)
#define CURSOR_COLOR LCD_RGBPACK(255, 0, 0)
#else
#define BACKG_COLOR LCD_WHITE
#define GRAPH_COLOR LCD_BLACK
#define CURSOR_COLOR LCD_DARKGRAY
#endif
#endif
enum { DRAW_FILLED, DRAW_LINE, DRAW_PIXEL, MAX_DRAW };
enum { ADV_SCROLL, ADV_WRAP, MAX_ADV };
enum { OSC_HORIZ, OSC_VERT, MAX_OSC };
#define CFGFILE_VERSION 0 /* Current config file version */
#define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */
#define MAX_PEAK 0x8000
#if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) #if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
#define mas_codec_readreg(x) rand()%MAX_PEAK #define mas_codec_readreg(x) rand()%MAX_PEAK
#endif #endif
/* prototypes */
void anim_horizontal(int, int);
void anim_vertical(int, int);
/* global variables */ /* global variables */
struct plugin_api* rb; /* global api struct pointer */ struct plugin_api* rb; /* global api struct pointer */
int osc_mode = OSC_MODE_FILLED; /* settings */
int osc_delay = 2; /* in ticks */ int osc_delay = 2; /* in ticks */
bool osc_scroll = true; int osc_draw = DRAW_FILLED;
void (*anim)(int, int) = anim_horizontal; int osc_advance = ADV_SCROLL;
int osc_orientation = OSC_HORIZ;
static const char cfg_filename[] = "oscilloscope.cfg";
static char *draw_str[3] = { "filled", "line", "pixel" };
static char *advance_str[2] = { "scroll", "wrap" };
static char *orientation_str[2] = { "horizontal", "vertical" };
struct configdata config[] = {
{ TYPE_INT, 1, 99, &osc_delay, "delay", NULL, NULL },
{ TYPE_ENUM, 0, MAX_DRAW, &osc_draw, "draw", draw_str, NULL },
{ TYPE_ENUM, 0, MAX_ADV, &osc_advance, "advance", advance_str, NULL },
{ TYPE_ENUM, 0, MAX_OSC, &osc_orientation, "orientation", orientation_str, NULL }
};
long last_tick = 0; /* time of last drawing */ long last_tick = 0; /* time of last drawing */
int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */ 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)
if (cur_x >= LCD_WIDTH) if (cur_x >= LCD_WIDTH)
{ {
if (osc_scroll) /* scroll */ if (osc_advance == ADV_SCROLL)
{ {
int shift = cur_x - (LCD_WIDTH-1); int shift = cur_x - (LCD_WIDTH-1);
xlcd_scroll_left(shift); xlcd_scroll_left(shift);
@ -165,7 +189,7 @@ void anim_horizontal(int cur_left, int cur_right)
cur_x -= shift; cur_x -= shift;
last_pos -= shift; last_pos -= shift;
} }
else /* wrap */ else
{ {
cur_x -= LCD_WIDTH; cur_x -= LCD_WIDTH;
} }
@ -174,18 +198,18 @@ void anim_horizontal(int cur_left, int cur_right)
if (cur_x > last_pos) if (cur_x > last_pos)
{ {
rb->lcd_fillrect(last_pos + 1, 0, d + 2, LCD_HEIGHT); rb->lcd_fillrect(last_pos + 1, 0, d, LCD_HEIGHT);
} }
else else
{ {
rb->lcd_fillrect(last_pos + 1, 0, (LCD_WIDTH-1) - last_pos, LCD_HEIGHT); rb->lcd_fillrect(last_pos + 1, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
rb->lcd_fillrect(0, 0, cur_x + 2, LCD_HEIGHT); rb->lcd_fillrect(0, 0, cur_x + 1, LCD_HEIGHT);
} }
rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_set_drawmode(DRMODE_SOLID);
switch (osc_mode) switch (osc_draw)
{ {
case OSC_MODE_FILLED: case DRAW_FILLED:
left = last_left; left = last_left;
right = last_right; right = last_right;
dl = (cur_left - left) / d; dl = (cur_left - left) / d;
@ -206,7 +230,7 @@ void anim_horizontal(int cur_left, int cur_right)
} }
break; break;
case OSC_MODE_OUTLINE: case DRAW_LINE:
if (cur_x > last_pos) if (cur_x > last_pos)
{ {
rb->lcd_drawline( rb->lcd_drawline(
@ -229,22 +253,25 @@ void anim_horizontal(int cur_left, int cur_right)
last_pos, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_left) >> 16), last_pos, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_left) >> 16),
LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16) LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16)
); );
rb->lcd_drawline(
0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
);
rb->lcd_drawline( rb->lcd_drawline(
last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16), last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16),
LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16) LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16)
); );
if (cur_x > 0)
{
rb->lcd_drawline(
0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
);
rb->lcd_drawline( rb->lcd_drawline(
0, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16), 0, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16),
cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16) cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_right) >> 16)
); );
} }
}
break; break;
case OSC_MODE_PIXEL: case DRAW_PIXEL:
left = last_left; left = last_left;
right = last_right; right = last_right;
dl = (cur_left - left) / d; dl = (cur_left - left) / d;
@ -273,13 +300,23 @@ void anim_horizontal(int cur_left, int cur_right)
} }
else else
{ {
#if LCD_DEPTH > 1 /* cursor bar */
rb->lcd_set_foreground(CURSOR_COLOR);
rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
rb->lcd_set_foreground(GRAPH_COLOR);
#else
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
rb->lcd_vline(cur_x + 1, 0, LCD_HEIGHT-1);
rb->lcd_set_drawmode(DRMODE_SOLID);
#endif
if (cur_x > last_pos) if (cur_x > last_pos)
{ {
rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT); rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT);
} }
else else
{ {
rb->lcd_update_rect(last_pos, 0, (LCD_WIDTH-1) - last_pos, LCD_HEIGHT); rb->lcd_update_rect(last_pos, 0, LCD_WIDTH - last_pos, LCD_HEIGHT);
rb->lcd_update_rect(0, 0, cur_x + 2, LCD_HEIGHT); rb->lcd_update_rect(0, 0, cur_x + 2, LCD_HEIGHT);
} }
} }
@ -309,7 +346,7 @@ void anim_vertical(int cur_left, int cur_right)
if (cur_y >= LCD_HEIGHT) if (cur_y >= LCD_HEIGHT)
{ {
if (osc_scroll) /* scroll */ if (osc_advance == ADV_SCROLL)
{ {
int shift = cur_y - (LCD_HEIGHT-1); int shift = cur_y - (LCD_HEIGHT-1);
xlcd_scroll_up(shift); xlcd_scroll_up(shift);
@ -317,7 +354,7 @@ void anim_vertical(int cur_left, int cur_right)
cur_y -= shift; cur_y -= shift;
last_pos -= shift; last_pos -= shift;
} }
else /* wrap */ else
{ {
cur_y -= LCD_HEIGHT; cur_y -= LCD_HEIGHT;
} }
@ -326,18 +363,18 @@ void anim_vertical(int cur_left, int cur_right)
if (cur_y > last_pos) if (cur_y > last_pos)
{ {
rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d + 2); rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d);
} }
else else
{ {
rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos); rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, LCD_HEIGHT - last_pos);
rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 2); rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 1);
} }
rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_set_drawmode(DRMODE_SOLID);
switch (osc_mode) switch (osc_draw)
{ {
case OSC_MODE_FILLED: case DRAW_FILLED:
left = last_left; left = last_left;
right = last_right; right = last_right;
dl = (cur_left - left) / d; dl = (cur_left - left) / d;
@ -358,7 +395,7 @@ void anim_vertical(int cur_left, int cur_right)
} }
break; break;
case OSC_MODE_OUTLINE: case DRAW_LINE:
if (cur_y > last_pos) if (cur_y > last_pos)
{ {
rb->lcd_drawline( rb->lcd_drawline(
@ -381,22 +418,25 @@ void anim_vertical(int cur_left, int cur_right)
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos, LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos,
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), LCD_HEIGHT LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), LCD_HEIGHT
); );
rb->lcd_drawline(
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), 0,
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
);
rb->lcd_drawline( rb->lcd_drawline(
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos, LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT
); );
if (cur_y > 0)
{
rb->lcd_drawline(
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), 0,
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
);
rb->lcd_drawline( rb->lcd_drawline(
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0, LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0,
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
); );
} }
}
break; break;
case OSC_MODE_PIXEL: case DRAW_PIXEL:
left = last_left; left = last_left;
right = last_right; right = last_right;
dl = (cur_left - left) / d; dl = (cur_left - left) / d;
@ -435,13 +475,23 @@ void anim_vertical(int cur_left, int cur_right)
} }
else else
{ {
#if LCD_DEPTH > 1 /* cursor bar */
rb->lcd_set_foreground(CURSOR_COLOR);
rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
rb->lcd_set_foreground(GRAPH_COLOR);
#else
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
rb->lcd_hline(0, LCD_WIDTH-1, cur_y + 1);
rb->lcd_set_drawmode(DRMODE_SOLID);
#endif
if (cur_y > last_pos) if (cur_y > last_pos)
{ {
rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2); rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2);
} }
else else
{ {
rb->lcd_update_rect(0, last_pos, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos); rb->lcd_update_rect(0, last_pos, LCD_WIDTH, LCD_HEIGHT - last_pos);
rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2); rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2);
} }
} }
@ -451,9 +501,11 @@ void anim_vertical(int cur_left, int cur_right)
void cleanup(void *parameter) void cleanup(void *parameter)
{ {
(void)parameter; (void)parameter;
#ifdef HAVE_LCD_COLOR #if LCD_DEPTH > 1
rb->lcd_set_foreground(LCD_DEFAULT_FG); rb->lcd_set_foreground(LCD_DEFAULT_FG);
rb->lcd_set_background(LCD_DEFAULT_BG); rb->lcd_set_background(LCD_DEFAULT_BG);
#endif
#ifdef HAVE_LCD_COLOR
rb->backlight_set_timeout(rb->global_settings->backlight_timeout); rb->backlight_set_timeout(rb->global_settings->backlight_timeout);
#endif #endif
} }
@ -470,12 +522,18 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb = api; rb = api;
xlcd_init(rb); xlcd_init(rb);
configfile_init(rb);
#ifdef HAVE_LCD_COLOR configfile_load(cfg_filename, config, sizeof(config) / sizeof(config[0]),
rb->lcd_set_foreground(LCD_RGBPACK(128, 255, 0)); CFGFILE_MINVERSION);
rb->lcd_set_background(LCD_BLACK);
#if LCD_DEPTH > 1
rb->lcd_set_foreground(GRAPH_COLOR);
rb->lcd_set_background(BACKG_COLOR);
rb->lcd_clear_display(); rb->lcd_clear_display();
rb->lcd_update(); rb->lcd_update();
#endif
#ifdef HAVE_LCD_COLOR
rb->backlight_set_timeout(1); /* keep the light on */ rb->backlight_set_timeout(1); /* keep the light on */
#endif #endif
rb->lcd_getstringsize("A", NULL, &font_height); rb->lcd_getstringsize("A", NULL, &font_height);
@ -494,7 +552,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
#elif (CONFIG_CODEC == SWCODEC) #elif (CONFIG_CODEC == SWCODEC)
rb->pcm_calculate_peaks(&left, &right); rb->pcm_calculate_peaks(&left, &right);
#endif #endif
anim(left, right); if (osc_orientation == OSC_HORIZ)
anim_horizontal(left, right);
else
anim_vertical(left, right);
} }
tell_speed = false; tell_speed = false;
@ -505,21 +566,23 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
exit = true; exit = true;
break; break;
case OSCILLOSCOPE_SCROLL: case OSCILLOSCOPE_ADVMODE:
osc_scroll = !osc_scroll; if (++osc_advance >= MAX_ADV)
osc_advance = 0;
break; break;
case OSCILLOSCOPE_MODE: case OSCILLOSCOPE_DRAWMODE:
#ifdef OSCILLOSCOPE_MODE_PRE #ifdef OSCILLOSCOPE_DRAWMODE_PRE
if (lastbutton != OSCILLOSCOPE_MODE_PRE) if (lastbutton != OSCILLOSCOPE_DRAWMODE_PRE)
break; break;
#endif #endif
if (++osc_mode >= OSC_MODE_COUNT) if (++osc_draw >= MAX_DRAW)
osc_mode = 0; osc_draw = 0;
break; break;
case OSCILLOSCOPE_ORIENTATION: case OSCILLOSCOPE_ORIENTATION:
anim = (anim == anim_horizontal) ? anim_vertical : anim_horizontal; if (++osc_orientation >= MAX_OSC)
osc_orientation = 0;
last_pos = 0; last_pos = 0;
last_tick = 0; last_tick = 0;
displaymsg = false; displaymsg = false;
@ -585,6 +648,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
} }
} }
cleanup(NULL); cleanup(NULL);
configfile_save(cfg_filename, config, sizeof(config) / sizeof(config[0]),
CFGFILE_VERSION);
return PLUGIN_OK; return PLUGIN_OK;
} }
#endif /* HAVE_LCD_BITMAP */ #endif /* HAVE_LCD_BITMAP */