forked from len0rd/rockbox
Oscilloscope: Added vertical orientation option. Flipped horizontal mode to show left channel on top. Vertical mode prints speed messages. Set default speed to 50 instead of 100.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8986 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
ff862e19cc
commit
78e4f4d1b1
1 changed files with 245 additions and 43 deletions
|
@ -39,6 +39,7 @@ PLUGIN_HEADER
|
||||||
#define OSCILLOSCOPE_QUIT BUTTON_OFF
|
#define OSCILLOSCOPE_QUIT BUTTON_OFF
|
||||||
#define OSCILLOSCOPE_MODE BUTTON_F1
|
#define OSCILLOSCOPE_MODE BUTTON_F1
|
||||||
#define OSCILLOSCOPE_SCROLL BUTTON_F2
|
#define OSCILLOSCOPE_SCROLL BUTTON_F2
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -50,6 +51,7 @@ PLUGIN_HEADER
|
||||||
#define OSCILLOSCOPE_MODE_PRE BUTTON_MENU
|
#define OSCILLOSCOPE_MODE_PRE BUTTON_MENU
|
||||||
#define OSCILLOSCOPE_MODE (BUTTON_MENU | BUTTON_REL)
|
#define OSCILLOSCOPE_MODE (BUTTON_MENU | BUTTON_REL)
|
||||||
#define OSCILLOSCOPE_SCROLL (BUTTON_MENU | BUTTON_RIGHT)
|
#define OSCILLOSCOPE_SCROLL (BUTTON_MENU | BUTTON_RIGHT)
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -60,6 +62,7 @@ PLUGIN_HEADER
|
||||||
#define OSCILLOSCOPE_QUIT BUTTON_OFF
|
#define OSCILLOSCOPE_QUIT BUTTON_OFF
|
||||||
#define OSCILLOSCOPE_MODE BUTTON_SELECT
|
#define OSCILLOSCOPE_MODE BUTTON_SELECT
|
||||||
#define OSCILLOSCOPE_SCROLL BUTTON_MODE
|
#define OSCILLOSCOPE_SCROLL BUTTON_MODE
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -70,6 +73,7 @@ PLUGIN_HEADER
|
||||||
#define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU)
|
#define OSCILLOSCOPE_QUIT (BUTTON_SELECT | BUTTON_MENU)
|
||||||
#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_PLAY)
|
#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_PLAY)
|
||||||
#define OSCILLOSCOPE_SCROLL (BUTTON_SELECT | BUTTON_RIGHT)
|
#define OSCILLOSCOPE_SCROLL (BUTTON_SELECT | BUTTON_RIGHT)
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -79,7 +83,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_MODE BUTTON_SELECT
|
||||||
#define OSCILLOSCOPE_SCROLL BUTTON_MENU
|
#define OSCILLOSCOPE_SCROLL BUTTON_DOWN
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -88,8 +93,10 @@ 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 BUTTON_SELECT
|
#define OSCILLOSCOPE_MODE_PRE BUTTON_SELECT
|
||||||
|
#define OSCILLOSCOPE_MODE (BUTTON_SELECT | BUTTON_REL)
|
||||||
#define OSCILLOSCOPE_SCROLL BUTTON_REC
|
#define OSCILLOSCOPE_SCROLL BUTTON_REC
|
||||||
|
#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
|
||||||
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
|
||||||
|
@ -102,22 +109,33 @@ PLUGIN_HEADER
|
||||||
#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;
|
int osc_mode = OSC_MODE_FILLED;
|
||||||
int osc_delay = 1; /* in ticks */
|
int osc_delay = 2; /* in ticks */
|
||||||
bool osc_scroll = true;
|
bool osc_scroll = true;
|
||||||
long last_tick = 0;
|
void (*anim)(int, int) = anim_horizontal;
|
||||||
|
|
||||||
|
long last_tick = 0; /* time of last drawing */
|
||||||
|
int last_pos = 0; /* last x or y drawing position. Reset for aspect switch. */
|
||||||
|
int last_left; /* last channel values */
|
||||||
|
int last_right;
|
||||||
|
|
||||||
|
unsigned char message[16]; /* message to display */
|
||||||
|
bool displaymsg = false;
|
||||||
|
int font_height = 8;
|
||||||
|
|
||||||
/* implementation */
|
/* implementation */
|
||||||
|
|
||||||
void animate(int cur_left, int cur_right)
|
void anim_horizontal(int cur_left, int cur_right)
|
||||||
{
|
{
|
||||||
static int last_x = 0;
|
|
||||||
static int last_left, last_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;
|
||||||
|
@ -135,7 +153,7 @@ void animate(int cur_left, int cur_right)
|
||||||
last_right = cur_right;
|
last_right = cur_right;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cur_x = last_x + d;
|
cur_x = last_pos + d;
|
||||||
|
|
||||||
if (cur_x >= LCD_WIDTH)
|
if (cur_x >= LCD_WIDTH)
|
||||||
{
|
{
|
||||||
|
@ -145,7 +163,7 @@ void animate(int cur_left, int cur_right)
|
||||||
xlcd_scroll_left(shift);
|
xlcd_scroll_left(shift);
|
||||||
full_update = true;
|
full_update = true;
|
||||||
cur_x -= shift;
|
cur_x -= shift;
|
||||||
last_x -= shift;
|
last_pos -= shift;
|
||||||
}
|
}
|
||||||
else /* wrap */
|
else /* wrap */
|
||||||
{
|
{
|
||||||
|
@ -154,13 +172,13 @@ void animate(int cur_left, int cur_right)
|
||||||
}
|
}
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
||||||
|
|
||||||
if (cur_x > last_x)
|
if (cur_x > last_pos)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(last_x + 1, 0, d + 2, LCD_HEIGHT);
|
rb->lcd_fillrect(last_pos + 1, 0, d + 2, LCD_HEIGHT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(last_x + 1, 0, (LCD_WIDTH-1) - last_x, LCD_HEIGHT);
|
rb->lcd_fillrect(last_pos + 1, 0, (LCD_WIDTH-1) - last_pos, LCD_HEIGHT);
|
||||||
rb->lcd_fillrect(0, 0, cur_x + 2, LCD_HEIGHT);
|
rb->lcd_fillrect(0, 0, cur_x + 2, LCD_HEIGHT);
|
||||||
}
|
}
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
||||||
|
@ -173,7 +191,7 @@ void animate(int cur_left, int cur_right)
|
||||||
dl = (cur_left - left) / d;
|
dl = (cur_left - left) / d;
|
||||||
dr = (cur_right - right) / d;
|
dr = (cur_right - right) / d;
|
||||||
|
|
||||||
for (x = last_x + 1; d > 0; x++, d--)
|
for (x = last_pos + 1; d > 0; x++, d--)
|
||||||
{
|
{
|
||||||
if (x == LCD_WIDTH)
|
if (x == LCD_WIDTH)
|
||||||
x = 0;
|
x = 0;
|
||||||
|
@ -181,47 +199,47 @@ void animate(int cur_left, int cur_right)
|
||||||
left += dl;
|
left += dl;
|
||||||
right += dr;
|
right += dr;
|
||||||
|
|
||||||
rb->lcd_vline(x, LCD_HEIGHT/2+1,
|
|
||||||
LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * left) >> 16));
|
|
||||||
rb->lcd_vline(x, LCD_HEIGHT/2-1,
|
rb->lcd_vline(x, LCD_HEIGHT/2-1,
|
||||||
LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * right) >> 16));
|
LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16));
|
||||||
|
rb->lcd_vline(x, LCD_HEIGHT/2+1,
|
||||||
|
LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_MODE_OUTLINE:
|
case OSC_MODE_OUTLINE:
|
||||||
if (cur_x > last_x)
|
if (cur_x > last_pos)
|
||||||
{
|
{
|
||||||
rb->lcd_drawline(
|
rb->lcd_drawline(
|
||||||
last_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_left) >> 16),
|
last_pos, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_left) >> 16),
|
||||||
cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_left) >> 16)
|
cur_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * cur_left) >> 16)
|
||||||
);
|
);
|
||||||
rb->lcd_drawline(
|
rb->lcd_drawline(
|
||||||
last_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_right) >> 16),
|
last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
left = last_left
|
left = last_left
|
||||||
+ (LCD_WIDTH - last_x) * (last_left - cur_left) / d;
|
+ (LCD_WIDTH - last_pos) * (last_left - cur_left) / d;
|
||||||
right = last_right
|
right = last_right
|
||||||
+ (LCD_WIDTH - last_x) * (last_right - cur_right) / d;
|
+ (LCD_WIDTH - last_pos) * (last_right - cur_right) / d;
|
||||||
|
|
||||||
rb->lcd_drawline(
|
rb->lcd_drawline(
|
||||||
last_x, 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(
|
rb->lcd_drawline(
|
||||||
last_x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * last_right) >> 16),
|
0, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16),
|
||||||
LCD_WIDTH, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * right) >> 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) * left) >> 16),
|
last_pos, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * last_right) >> 16),
|
||||||
cur_x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * cur_left) >> 16)
|
LCD_WIDTH, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 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;
|
||||||
|
@ -232,7 +250,7 @@ void animate(int cur_left, int cur_right)
|
||||||
dl = (cur_left - left) / d;
|
dl = (cur_left - left) / d;
|
||||||
dr = (cur_right - right) / d;
|
dr = (cur_right - right) / d;
|
||||||
|
|
||||||
for (x = last_x + 1; d > 0; x++, d--)
|
for (x = last_pos + 1; d > 0; x++, d--)
|
||||||
{
|
{
|
||||||
if (x == LCD_WIDTH)
|
if (x == LCD_WIDTH)
|
||||||
x = 0;
|
x = 0;
|
||||||
|
@ -240,8 +258,8 @@ void animate(int cur_left, int cur_right)
|
||||||
left += dl;
|
left += dl;
|
||||||
right += dr;
|
right += dr;
|
||||||
|
|
||||||
rb->lcd_drawpixel(x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * left) >> 16));
|
rb->lcd_drawpixel(x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * left) >> 16));
|
||||||
rb->lcd_drawpixel(x, LCD_HEIGHT/2-1 - (((LCD_HEIGHT-2) * right) >> 16));
|
rb->lcd_drawpixel(x, LCD_HEIGHT/2+1 + (((LCD_HEIGHT-2) * right) >> 16));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -255,17 +273,179 @@ void animate(int cur_left, int cur_right)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (cur_x > last_x)
|
if (cur_x > last_pos)
|
||||||
{
|
{
|
||||||
rb->lcd_update_rect(last_x, 0, cur_x - last_x + 2, LCD_HEIGHT);
|
rb->lcd_update_rect(last_pos, 0, cur_x - last_pos + 2, LCD_HEIGHT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rb->lcd_update_rect(last_x, 0, (LCD_WIDTH-1) - last_x, LCD_HEIGHT);
|
rb->lcd_update_rect(last_pos, 0, (LCD_WIDTH-1) - 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_x = cur_x;
|
last_pos = cur_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void anim_vertical(int cur_left, int cur_right)
|
||||||
|
{
|
||||||
|
int cur_y, y;
|
||||||
|
int left, right, dl, dr;
|
||||||
|
long cur_tick = *rb->current_tick;
|
||||||
|
long d = (cur_tick - last_tick) / osc_delay;
|
||||||
|
bool full_update = false;
|
||||||
|
|
||||||
|
if (d == 0) /* too early, bail out */
|
||||||
|
return;
|
||||||
|
|
||||||
|
last_tick = cur_tick;
|
||||||
|
|
||||||
|
if (d > HZ) /* first call or too much delay, (re)start */
|
||||||
|
{
|
||||||
|
last_left = cur_left;
|
||||||
|
last_right = cur_right;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cur_y = last_pos + d;
|
||||||
|
|
||||||
|
if (cur_y >= LCD_HEIGHT)
|
||||||
|
{
|
||||||
|
if (osc_scroll) /* scroll */
|
||||||
|
{
|
||||||
|
int shift = cur_y - (LCD_HEIGHT-1);
|
||||||
|
xlcd_scroll_up(shift);
|
||||||
|
full_update = true;
|
||||||
|
cur_y -= shift;
|
||||||
|
last_pos -= shift;
|
||||||
|
}
|
||||||
|
else /* wrap */
|
||||||
|
{
|
||||||
|
cur_y -= LCD_HEIGHT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
||||||
|
|
||||||
|
if (cur_y > last_pos)
|
||||||
|
{
|
||||||
|
rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, d + 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rb->lcd_fillrect(0, last_pos + 1, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos);
|
||||||
|
rb->lcd_fillrect(0, 0, LCD_WIDTH, cur_y + 2);
|
||||||
|
}
|
||||||
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
||||||
|
|
||||||
|
switch (osc_mode)
|
||||||
|
{
|
||||||
|
case OSC_MODE_FILLED:
|
||||||
|
left = last_left;
|
||||||
|
right = last_right;
|
||||||
|
dl = (cur_left - left) / d;
|
||||||
|
dr = (cur_right - right) / d;
|
||||||
|
|
||||||
|
for (y = last_pos + 1; d > 0; y++, d--)
|
||||||
|
{
|
||||||
|
if (y == LCD_HEIGHT)
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
left += dl;
|
||||||
|
right += dr;
|
||||||
|
|
||||||
|
rb->lcd_hline(LCD_WIDTH/2-1,
|
||||||
|
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), y);
|
||||||
|
rb->lcd_hline(LCD_WIDTH/2+1,
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OSC_MODE_OUTLINE:
|
||||||
|
if (cur_y > last_pos)
|
||||||
|
{
|
||||||
|
rb->lcd_drawline(
|
||||||
|
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos,
|
||||||
|
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * cur_left) >> 16), cur_y
|
||||||
|
);
|
||||||
|
rb->lcd_drawline(
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
left = last_left
|
||||||
|
+ (LCD_HEIGHT - last_pos) * (last_left - cur_left) / d;
|
||||||
|
right = last_right
|
||||||
|
+ (LCD_HEIGHT - last_pos) * (last_right - cur_right) / d;
|
||||||
|
|
||||||
|
rb->lcd_drawline(
|
||||||
|
LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * last_left) >> 16), last_pos,
|
||||||
|
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(
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * last_right) >> 16), last_pos,
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), LCD_HEIGHT
|
||||||
|
);
|
||||||
|
rb->lcd_drawline(
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), 0,
|
||||||
|
LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * cur_right) >> 16), cur_y
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OSC_MODE_PIXEL:
|
||||||
|
left = last_left;
|
||||||
|
right = last_right;
|
||||||
|
dl = (cur_left - left) / d;
|
||||||
|
dr = (cur_right - right) / d;
|
||||||
|
|
||||||
|
for (y = last_pos + 1; d > 0; y++, d--)
|
||||||
|
{
|
||||||
|
if (y == LCD_HEIGHT)
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
left += dl;
|
||||||
|
right += dr;
|
||||||
|
|
||||||
|
rb->lcd_drawpixel(LCD_WIDTH/2-1 - (((LCD_WIDTH-2) * left) >> 16), y);
|
||||||
|
rb->lcd_drawpixel(LCD_WIDTH/2+1 + (((LCD_WIDTH-2) * right) >> 16), y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
last_left = cur_left;
|
||||||
|
last_right = cur_right;
|
||||||
|
|
||||||
|
if (displaymsg)
|
||||||
|
{
|
||||||
|
last_pos -= font_height - 1;
|
||||||
|
if (last_pos < 0)
|
||||||
|
last_pos = LCD_HEIGHT - font_height;
|
||||||
|
|
||||||
|
rb->lcd_putsxy(0, last_pos, message);
|
||||||
|
displaymsg = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (full_update)
|
||||||
|
{
|
||||||
|
rb->lcd_update();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cur_y > last_pos)
|
||||||
|
{
|
||||||
|
rb->lcd_update_rect(0, last_pos, LCD_WIDTH, cur_y - last_pos + 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rb->lcd_update_rect(0, last_pos, LCD_WIDTH, (LCD_HEIGHT-1) - last_pos);
|
||||||
|
rb->lcd_update_rect(0, 0, LCD_WIDTH, cur_y + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last_pos = cur_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup(void *parameter)
|
void cleanup(void *parameter)
|
||||||
|
@ -284,6 +464,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
int lastbutton = BUTTON_NONE;
|
int lastbutton = BUTTON_NONE;
|
||||||
bool exit = false;
|
bool exit = false;
|
||||||
bool paused = false;
|
bool paused = false;
|
||||||
|
bool tell_speed;
|
||||||
|
|
||||||
(void)parameter;
|
(void)parameter;
|
||||||
rb = api;
|
rb = api;
|
||||||
|
@ -297,7 +478,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
rb->lcd_update();
|
rb->lcd_update();
|
||||||
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);
|
||||||
|
|
||||||
while (!exit)
|
while (!exit)
|
||||||
{
|
{
|
||||||
if (!paused)
|
if (!paused)
|
||||||
|
@ -312,9 +494,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
|
||||||
animate(left, right);
|
anim(left, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tell_speed = false;
|
||||||
button = rb->button_get(paused);
|
button = rb->button_get(paused);
|
||||||
switch (button)
|
switch (button)
|
||||||
{
|
{
|
||||||
|
@ -334,6 +517,15 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
if (++osc_mode >= OSC_MODE_COUNT)
|
if (++osc_mode >= OSC_MODE_COUNT)
|
||||||
osc_mode = 0;
|
osc_mode = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OSCILLOSCOPE_ORIENTATION:
|
||||||
|
anim = (anim == anim_horizontal) ? anim_vertical : anim_horizontal;
|
||||||
|
last_pos = 0;
|
||||||
|
last_tick = 0;
|
||||||
|
displaymsg = false;
|
||||||
|
rb->lcd_clear_display();
|
||||||
|
rb->lcd_update();
|
||||||
|
break;
|
||||||
|
|
||||||
case OSCILLOSCOPE_PAUSE:
|
case OSCILLOSCOPE_PAUSE:
|
||||||
paused = !paused;
|
paused = !paused;
|
||||||
|
@ -343,12 +535,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;
|
||||||
|
}
|
||||||
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;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSCILLOSCOPE_VOL_UP:
|
case OSCILLOSCOPE_VOL_UP:
|
||||||
|
@ -381,8 +577,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
}
|
}
|
||||||
if (button != BUTTON_NONE)
|
if (button != BUTTON_NONE)
|
||||||
lastbutton = button;
|
lastbutton = button;
|
||||||
|
|
||||||
|
if (tell_speed)
|
||||||
|
{
|
||||||
|
rb->snprintf(message, sizeof(message), "Speed: %d", 100 / osc_delay);
|
||||||
|
displaymsg = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cleanup(NULL);
|
cleanup(NULL);
|
||||||
return PLUGIN_OK;
|
return PLUGIN_OK;
|
||||||
}
|
}
|
||||||
#endif /* if HAVE_LCD_BITMAP */
|
#endif /* HAVE_LCD_BITMAP */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue