1
0
Fork 0
forked from len0rd/rockbox

Only save settings if they changed (saves a disk spinup otherwise).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8994 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-03-11 08:35:45 +00:00
parent cc4dc39dde
commit 37f529cc3c

View file

@ -130,23 +130,29 @@ enum { OSC_HORIZ, OSC_VERT, MAX_OSC };
struct plugin_api* rb; /* global api struct pointer */ struct plugin_api* rb; /* global api struct pointer */
/* settings */ /* settings */
int osc_delay = 2; /* in ticks */ struct osc_config {
int osc_draw = DRAW_FILLED; int delay; /* in ticks */
int osc_advance = ADV_SCROLL; int draw;
int osc_orientation = OSC_HORIZ; int advance;
int orientation;
};
struct osc_config osc_disk = { 2, DRAW_FILLED, ADV_SCROLL, OSC_HORIZ };
struct osc_config osc; /* running config */
static const char cfg_filename[] = "oscilloscope.cfg"; static const char cfg_filename[] = "oscilloscope.cfg";
static char *draw_str[3] = { "filled", "line", "pixel" }; static char *draw_str[3] = { "filled", "line", "pixel" };
static char *advance_str[2] = { "scroll", "wrap" }; static char *advance_str[2] = { "scroll", "wrap" };
static char *orientation_str[2] = { "horizontal", "vertical" }; static char *orientation_str[2] = { "horizontal", "vertical" };
struct configdata config[] = { struct configdata disk_config[] = {
{ TYPE_INT, 1, 99, &osc_delay, "delay", NULL, NULL }, { TYPE_INT, 1, 99, &osc_disk.delay, "delay", NULL, NULL },
{ TYPE_ENUM, 0, MAX_DRAW, &osc_draw, "draw", draw_str, NULL }, { TYPE_ENUM, 0, MAX_DRAW, &osc_disk.draw, "draw", draw_str, NULL },
{ TYPE_ENUM, 0, MAX_ADV, &osc_advance, "advance", advance_str, NULL }, { TYPE_ENUM, 0, MAX_ADV, &osc_disk.advance, "advance", advance_str, NULL },
{ TYPE_ENUM, 0, MAX_OSC, &osc_orientation, "orientation", orientation_str, NULL } { TYPE_ENUM, 0, MAX_OSC, &osc_disk.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. */
int last_left; /* last channel values */ int last_left; /* last channel values */
@ -163,7 +169,7 @@ void anim_horizontal(int cur_left, int cur_right)
int cur_x, x; int cur_x, x;
int left, right, dl, dr; int left, right, dl, dr;
long cur_tick = *rb->current_tick; long cur_tick = *rb->current_tick;
long d = (cur_tick - last_tick) / osc_delay; long d = (cur_tick - last_tick) / osc.delay;
bool full_update = false; bool full_update = false;
if (d == 0) /* too early, bail out */ if (d == 0) /* too early, bail out */
@ -181,7 +187,7 @@ void anim_horizontal(int cur_left, int cur_right)
if (cur_x >= LCD_WIDTH) if (cur_x >= LCD_WIDTH)
{ {
if (osc_advance == ADV_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);
@ -207,7 +213,7 @@ void anim_horizontal(int cur_left, int cur_right)
} }
rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_set_drawmode(DRMODE_SOLID);
switch (osc_draw) switch (osc.draw)
{ {
case DRAW_FILLED: case DRAW_FILLED:
left = last_left; left = last_left;
@ -328,7 +334,7 @@ void anim_vertical(int cur_left, int cur_right)
int cur_y, y; int cur_y, y;
int left, right, dl, dr; int left, right, dl, dr;
long cur_tick = *rb->current_tick; long cur_tick = *rb->current_tick;
long d = (cur_tick - last_tick) / osc_delay; long d = (cur_tick - last_tick) / osc.delay;
bool full_update = false; bool full_update = false;
if (d == 0) /* too early, bail out */ if (d == 0) /* too early, bail out */
@ -346,7 +352,7 @@ void anim_vertical(int cur_left, int cur_right)
if (cur_y >= LCD_HEIGHT) if (cur_y >= LCD_HEIGHT)
{ {
if (osc_advance == ADV_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);
@ -372,7 +378,7 @@ void anim_vertical(int cur_left, int cur_right)
} }
rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_set_drawmode(DRMODE_SOLID);
switch (osc_draw) switch (osc.draw)
{ {
case DRAW_FILLED: case DRAW_FILLED:
left = last_left; left = last_left;
@ -524,8 +530,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
xlcd_init(rb); xlcd_init(rb);
configfile_init(rb); configfile_init(rb);
configfile_load(cfg_filename, config, sizeof(config) / sizeof(config[0]), configfile_load(cfg_filename, disk_config,
sizeof(disk_config) / sizeof(disk_config[0]),
CFGFILE_MINVERSION); CFGFILE_MINVERSION);
rb->memcpy(&osc, &osc_disk, sizeof(osc)); /* copy to running config */
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
rb->lcd_set_foreground(GRAPH_COLOR); rb->lcd_set_foreground(GRAPH_COLOR);
@ -544,7 +552,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{ {
int left, right; int left, right;
rb->sleep(MAX(last_tick + osc_delay - *rb->current_tick - 1, 0)); rb->sleep(MAX(last_tick + osc.delay - *rb->current_tick - 1, 0));
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
left = rb->mas_codec_readreg(0xC); left = rb->mas_codec_readreg(0xC);
@ -552,7 +560,7 @@ 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
if (osc_orientation == OSC_HORIZ) if (osc.orientation == OSC_HORIZ)
anim_horizontal(left, right); anim_horizontal(left, right);
else else
anim_vertical(left, right); anim_vertical(left, right);
@ -567,8 +575,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
break; break;
case OSCILLOSCOPE_ADVMODE: case OSCILLOSCOPE_ADVMODE:
if (++osc_advance >= MAX_ADV) if (++osc.advance >= MAX_ADV)
osc_advance = 0; osc.advance = 0;
break; break;
case OSCILLOSCOPE_DRAWMODE: case OSCILLOSCOPE_DRAWMODE:
@ -576,13 +584,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
if (lastbutton != OSCILLOSCOPE_DRAWMODE_PRE) if (lastbutton != OSCILLOSCOPE_DRAWMODE_PRE)
break; break;
#endif #endif
if (++osc_draw >= MAX_DRAW) if (++osc.draw >= MAX_DRAW)
osc_draw = 0; osc.draw = 0;
break; break;
case OSCILLOSCOPE_ORIENTATION: case OSCILLOSCOPE_ORIENTATION:
if (++osc_orientation >= MAX_OSC) if (++osc.orientation >= MAX_OSC)
osc_orientation = 0; osc.orientation = 0;
last_pos = 0; last_pos = 0;
last_tick = 0; last_tick = 0;
displaymsg = false; displaymsg = false;
@ -597,16 +605,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
case OSCILLOSCOPE_SPEED_UP: case OSCILLOSCOPE_SPEED_UP:
case OSCILLOSCOPE_SPEED_UP | BUTTON_REPEAT: case OSCILLOSCOPE_SPEED_UP | BUTTON_REPEAT:
if (osc_delay > 1) if (osc.delay > 1)
{ {
osc_delay--; osc.delay--;
tell_speed = true; tell_speed = true;
} }
break; break;
case OSCILLOSCOPE_SPEED_DOWN: case OSCILLOSCOPE_SPEED_DOWN:
case OSCILLOSCOPE_SPEED_DOWN | BUTTON_REPEAT: case OSCILLOSCOPE_SPEED_DOWN | BUTTON_REPEAT:
osc_delay++; osc.delay++;
tell_speed = true; tell_speed = true;
break; break;
@ -643,13 +651,18 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
if (tell_speed) if (tell_speed)
{ {
rb->snprintf(message, sizeof(message), "Speed: %d", 100 / osc_delay); rb->snprintf(message, sizeof(message), "Speed: %d", 100 / osc.delay);
displaymsg = true; displaymsg = true;
} }
} }
cleanup(NULL); cleanup(NULL);
configfile_save(cfg_filename, config, sizeof(config) / sizeof(config[0]), if (rb->memcmp(&osc, &osc_disk, sizeof(osc))) /* save settings if changed */
{
rb->memcpy(&osc_disk, &osc, sizeof(osc));
configfile_save(cfg_filename, disk_config,
sizeof(disk_config) / sizeof(disk_config[0]),
CFGFILE_VERSION); CFGFILE_VERSION);
}
return PLUGIN_OK; return PLUGIN_OK;
} }
#endif /* HAVE_LCD_BITMAP */ #endif /* HAVE_LCD_BITMAP */