From 58fc279d2674b5d56fed6772f82cdf1e431088f1 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sat, 28 Jul 2007 08:12:05 +0000 Subject: Scroll on main and remote with a single thread. Change the way system messages are defined before running out is an issue (which requires a full update of rockbox on the player). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14035 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-16bit.c | 213 +++++++++++---------------------- firmware/drivers/lcd-1bit-vert.c | 177 +++++++++------------------ firmware/drivers/lcd-2bit-horz.c | 176 +++++++++------------------ firmware/drivers/lcd-2bit-vert.c | 176 +++++++++------------------ firmware/drivers/lcd-charcell.c | 184 ++++++++++------------------ firmware/drivers/lcd-remote-1bit-v.c | 216 +++++++++------------------------ firmware/drivers/lcd-remote-2bit-vi.c | 219 +++++++++------------------------- 7 files changed, 414 insertions(+), 947 deletions(-) (limited to 'firmware/drivers') diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index 96711248ff..bd5d09368c 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c @@ -33,8 +33,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -#define SCROLLABLE_LINES ((LCD_HEIGHT+4)/5 < 32 ? (LCD_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" enum fill_opt { OPT_NONE = 0, @@ -62,23 +61,6 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines = 0; /* Bitpattern of which lines are scrolling */ -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "scroll"; -static void scroll_thread(void); -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - /* LCD init */ void lcd_init(void) { @@ -86,12 +68,7 @@ void lcd_init(void) /* Call device specific init */ lcd_init_device(); - - - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name - IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /*** parameter handling ***/ @@ -243,7 +220,8 @@ void lcd_clear_display(void) else memcpy(dst, lcd_backdrop, sizeof(lcd_framebuffer)); } - scrolling_lines = 0; + + lcd_scroll_info.lines = 0; } /* Set a single pixel */ @@ -819,7 +797,7 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style, int oldbgcolor = bg_pattern; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -845,46 +823,6 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style, } /*** scrolling ***/ - -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -906,11 +844,11 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; + if(y>=LCD_SCROLLABLE_LINES) return; + + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -931,9 +869,9 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -951,95 +889,84 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x * s->width / s->len; s->backward = false; - s->line_colour = (style&STYLE_COLORED)? + s->line_color = (style&STYLE_COLORED)? (style&STYLE_COLOR_MASK): -1; - scrolling_lines |= (1<start_tick)) continue; - } - old_fgcolour = lcd_get_foreground(); - old_bgcolour = lcd_get_background(); - for ( index = 0; index < SCROLLABLE_LINES; index++ ) { - /* really scroll? */ - if ( !(scrolling_lines&(1<start_tick)) - continue; - if (s->line_colour >= 0) - { - if (s->invert) - { - lcd_set_foreground(old_fgcolour); - lcd_set_background(s->line_colour); - } - else - { - lcd_set_foreground(s->line_colour); - lcd_set_background(old_bgcolour); - } - } - - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + + if (s->line_color >= 0) { + if (s->invert) { + fg_pattern = old_fgcolor; + bg_pattern = s->line_color; } else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + fg_pattern = s->line_color; + bg_pattern = old_bgcolor; } + } - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + if (s->backward) + s->offset -= lcd_scroll_info.step; + else + s->offset += lcd_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; + } + if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; + } + } + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } - lcd_set_foreground(old_fgcolour); - lcd_set_background(old_bgcolour); - sleep(scroll_ticks); + + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } + + fg_pattern = old_fgcolor; + bg_pattern = old_bgcolor; } diff --git a/firmware/drivers/lcd-1bit-vert.c b/firmware/drivers/lcd-1bit-vert.c index b54238d085..ac50eff95c 100644 --- a/firmware/drivers/lcd-1bit-vert.c +++ b/firmware/drivers/lcd-1bit-vert.c @@ -29,10 +29,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -/*** definitions ***/ - -#define SCROLLABLE_LINES ((LCD_HEIGHT+4)/5 < 32 ? (LCD_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -43,32 +40,13 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static char scroll_stack[DEFAULT_STACK_SIZE]; -static const char scroll_name[] = "scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - /* LCD init */ void lcd_init(void) { lcd_clear_display(); /* Call device specific init */ lcd_init_device(); - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /*** parameter handling ***/ @@ -104,6 +82,11 @@ void lcd_setfont(int newfont) curfont = newfont; } +int lcd_getfont(void) +{ + return curfont; +} + int lcd_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -212,7 +195,7 @@ void lcd_clear_display(void) unsigned bits = (drawmode & DRMODE_INVERSEVID) ? 0xFFu : 0; memset(lcd_framebuffer, bits, sizeof lcd_framebuffer); - scrolling_lines = 0; + lcd_scroll_info.lines = 0; } /* Set a single pixel */ @@ -664,7 +647,7 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -682,46 +665,6 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, } /*** scrolling ***/ - -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -744,11 +687,11 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -771,9 +714,9 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -791,14 +734,14 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x * s->width / s->len;; s->backward = false; - scrolling_lines |= (1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_scroll_info.step; + else + s->offset += lcd_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + } + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } - sleep(scroll_ticks); + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } } - diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c index d3d086a9d2..48fd22f703 100644 --- a/firmware/drivers/lcd-2bit-horz.c +++ b/firmware/drivers/lcd-2bit-horz.c @@ -33,8 +33,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -#define SCROLLABLE_LINES (((LCD_HEIGHT+4)/5 < 32) ? (LCD_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -54,33 +53,13 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - - /* LCD init */ void lcd_init(void) { lcd_clear_display(); /* Call device specific init */ lcd_init_device(); - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /*** parameter handling ***/ @@ -143,6 +122,11 @@ void lcd_setfont(int newfont) curfont = newfont; } +int lcd_getfont(void) +{ + return curfont; +} + int lcd_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -377,7 +361,8 @@ void lcd_clear_display(void) else memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); } - scrolling_lines = 0; + + lcd_scroll_info.lines = 0; } /* Set a single pixel */ @@ -862,7 +847,7 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -880,46 +865,6 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, } /*** scrolling ***/ - -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -941,11 +886,11 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -968,9 +913,9 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -988,14 +933,14 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x * s->width / s->len;; s->backward = false; - scrolling_lines |= (1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_scroll_info.step; + else + s->offset += lcd_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + } + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } - sleep(scroll_ticks); + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } } diff --git a/firmware/drivers/lcd-2bit-vert.c b/firmware/drivers/lcd-2bit-vert.c index 37abf0496f..751d2a2ad9 100644 --- a/firmware/drivers/lcd-2bit-vert.c +++ b/firmware/drivers/lcd-2bit-vert.c @@ -30,10 +30,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -/*** definitions ***/ - -#define SCROLLABLE_LINES ((LCD_HEIGHT+4)/5 < 32 ? (LCD_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -58,32 +55,13 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - /* LCD init */ void lcd_init(void) { lcd_clear_display(); /* Call device specific init */ lcd_init_device(); - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /*** parameter handling ***/ @@ -146,6 +124,11 @@ void lcd_setfont(int newfont) curfont = newfont; } +int lcd_getfont(void) +{ + return curfont; +} + int lcd_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -380,7 +363,8 @@ void lcd_clear_display(void) else memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer); } - scrolling_lines = 0; + + lcd_scroll_info.lines = 0; } /* Set a single pixel */ @@ -998,7 +982,7 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -1017,45 +1001,6 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, /*** scrolling ***/ -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -1077,11 +1022,11 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -1104,9 +1049,9 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -1124,14 +1069,14 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x * s->width / s->len; s->backward = false; - scrolling_lines |= (1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_scroll_info.step; + else + s->offset += lcd_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + } + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } - sleep(scroll_ticks); + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } } diff --git a/firmware/drivers/lcd-charcell.c b/firmware/drivers/lcd-charcell.c index efc9aa5b1f..0fd41481c5 100644 --- a/firmware/drivers/lcd-charcell.c +++ b/firmware/drivers/lcd-charcell.c @@ -29,10 +29,10 @@ #include "system.h" #include "lcd-charcell.h" #include "rbunicode.h" +#include "scroll_engine.h" /** definitions **/ -#define SCROLLABLE_LINES LCD_HEIGHT #define VARIABLE_XCHARS 16 /* number of software user-definable characters */ /* There must be mappings for this many characters in the 0xe000 unicode range * in lcd-charset-.c */ @@ -55,24 +55,6 @@ static int xspace; /* stores xhcar id of ' ' - often needed */ static int xmargin = 0; static int ymargin = 0; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static char scroll_stack[DEFAULT_STACK_SIZE]; -static const char scroll_name[] = "scroll"; -static int scroll_ticks = 12; /* # of ticks between updates */ -static int scroll_delay = HZ/2; /* delay before starting scroll */ -static int bidir_limit = 50; /* percent */ -static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */ -static int jump_scroll = 0; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - /* LCD init */ void lcd_init (void) { @@ -81,11 +63,7 @@ void lcd_init (void) memset(lcd_patterns, 0, sizeof(lcd_patterns)); xspace = find_xchar(' '); memset(lcd_charbuffer, xchar_info[xspace].hw_char, sizeof(lcd_charbuffer)); - - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name - IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); + scroll_init(); } /** parameter handling **/ @@ -336,7 +314,7 @@ void lcd_put_cursor(int x, int y, unsigned long cursor_ucs) lcd_cursor.x = x; lcd_cursor.y = y; lcd_cursor.downcount = 0; - lcd_cursor.divider = MAX((HZ/2) / scroll_ticks, 1); + lcd_cursor.divider = MAX((HZ/2) / lcd_scroll_info.ticks, 1); } /* Remove the cursor */ @@ -398,7 +376,7 @@ void lcd_puts_offset(int x, int y, const unsigned char *str, int offset) return; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_scroll_info.lines &= ~(1 << y); x = lcd_putsxyofs(x, y, offset, str); while (x < LCD_WIDTH) @@ -406,37 +384,6 @@ void lcd_puts_offset(int x, int y, const unsigned char *str, int offset) } /** scrolling **/ - -void lcd_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - -void lcd_jump_scroll(int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */ -{ - jump_scroll = mode; -} - -void lcd_jump_scroll_delay(int ms) -{ - jump_scroll_delay = ms / (HZ / 10); -} - void lcd_puts_scroll(int x, int y, const unsigned char *string) { lcd_puts_scroll_offset(x, y, string, 0); @@ -448,11 +395,11 @@ void lcd_puts_scroll_offset(int x, int y, const unsigned char *string, struct scrollinfo* s; int len; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_scroll_info.delay; lcd_puts_offset(x, y, string, offset); len = utf8length(string); @@ -469,9 +416,10 @@ void lcd_puts_scroll_offset(int x, int y, const unsigned char *string, s->len = utf8length(s->line); /* scroll bidirectional or forward only depending on the string width */ - if (bidir_limit) + if (lcd_scroll_info.bidir_limit) { - s->bidir = s->len < (LCD_WIDTH - xmargin) * (100 + bidir_limit) / 100; + s->bidir = s->len < (LCD_WIDTH - xmargin) * + (100 + lcd_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -489,83 +437,77 @@ void lcd_puts_scroll_offset(int x, int y, const unsigned char *string, s->offset = offset; s->startx = xmargin + x; s->backward = false; - scrolling_lines |= (1<start_tick)) + continue; + + if (s->backward) + s->offset--; + else + s->offset++; + + xpos = s->startx; + ypos = ymargin + index; + + if (s->bidir) /* scroll bidirectional */ { - /* really scroll? */ - if (!(scrolling_lines&(1<start_tick)) - continue; - - if (s->backward) - s->offset--; - else - s->offset++; - - xpos = s->startx; - ypos = ymargin + index; - - if (s->bidir) /* scroll bidirectional */ - { - if (s->offset <= 0) - { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->len - (LCD_WIDTH - xpos)) - { - /* at end of line */ - s->offset = s->len - (LCD_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - else /* scroll forward the whole time */ - { - if (s->offset >= s->len) - s->offset -= s->len; + if (s->offset >= s->len - (LCD_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->len - (LCD_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_scroll_info.delay * 2; } - lcd_putsxyofs(xpos, ypos, s->offset, s->line); - update = true; } - if (lcd_cursor.enabled) + else /* scroll forward the whole time */ { - if (--lcd_cursor.downcount <= 0) - { - lcd_cursor.downcount = lcd_cursor.divider; - lcd_cursor.visible = !lcd_cursor.visible; - update = true; - } + if (s->offset >= s->len) + s->offset -= s->len; } - if (update) - lcd_update(); - sleep(scroll_ticks); + lcd_putsxyofs(xpos, ypos, s->offset, s->line); + update = true; + } + + if (lcd_cursor.enabled) + { + if (--lcd_cursor.downcount <= 0) + { + lcd_cursor.downcount = lcd_cursor.divider; + lcd_cursor.visible = !lcd_cursor.visible; + update = true; + } } + + if (update) + lcd_update(); } + diff --git a/firmware/drivers/lcd-remote-1bit-v.c b/firmware/drivers/lcd-remote-1bit-v.c index 6b5b1fb42f..1ddd8e5071 100644 --- a/firmware/drivers/lcd-remote-1bit-v.c +++ b/firmware/drivers/lcd-remote-1bit-v.c @@ -31,8 +31,7 @@ #include "font.h" #include "rbunicode.h" #include "bidi.h" - -#define SCROLLABLE_LINES (((LCD_REMOTE_HEIGHT+4)/5 < 32) ? (LCD_REMOTE_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -44,28 +43,6 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "remote_scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - -/* remote hotplug */ -#ifndef SIMULATOR -struct event_queue remote_scroll_queue; -#endif - /*** parameter handling ***/ void lcd_remote_set_drawmode(int mode) @@ -94,12 +71,16 @@ int lcd_remote_getymargin(void) return ymargin; } - void lcd_remote_setfont(int newfont) { curfont = newfont; } +int lcd_remote_getfont(void) +{ + return curfont; +} + int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -208,7 +189,7 @@ void lcd_remote_clear_display(void) unsigned bits = (drawmode & DRMODE_INVERSEVID) ? 0xFFu : 0; memset(lcd_remote_framebuffer, bits, sizeof lcd_remote_framebuffer); - scrolling_lines = 0; + lcd_remote_scroll_info.lines = 0; } /* Set a single pixel */ @@ -599,7 +580,7 @@ void lcd_remote_bitmap(const unsigned char *src, int x, int y, int width, } /* put a string at a given pixel position, skipping first ofs pixel columns */ -static void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str) +void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str) { unsigned short ch; unsigned short *ucs; @@ -664,7 +645,7 @@ void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_remote_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -683,45 +664,6 @@ void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, /*** scrolling ***/ -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_remote_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_remote_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_remote_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_remote_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_remote_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_remote_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_remote_puts_scroll(int x, int y, const unsigned char *string) { lcd_remote_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -743,11 +685,11 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_REMOTE_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_remote_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_remote_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -770,9 +712,9 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_remote_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_REMOTE_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_remote_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -790,110 +732,67 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri s->offset = offset; s->startx = xmargin + x * s->width / s->len;; s->backward = false; - scrolling_lines |= (1<= 0) + for ( index = 0; index < LCD_REMOTE_SCROLLABLE_LINES; index++ ) { + /* really scroll? */ + if ((lcd_remote_scroll_info.lines & (1 << index)) == 0) continue; -#endif - for ( index = 0; index < SCROLLABLE_LINES; index++ ) { - /* really scroll? */ - if ( !(scrolling_lines&(1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_remote_scroll_info.step; + else + s->offset += lcd_remote_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_remote_scroll_info.delay*2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_remote_scroll_info.delay*2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); } - - next_tick += scroll_ticks; - delay = next_tick - current_tick - 1; - if (delay < 0) - { - next_tick = current_tick + 1; - delay = 0; + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } + + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); } } @@ -903,10 +802,5 @@ void lcd_remote_init(void) #ifndef SIMULATOR /* Call device specific init */ lcd_remote_init_device(); - /* private queue */ - queue_init(&remote_scroll_queue, false); #endif - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); } diff --git a/firmware/drivers/lcd-remote-2bit-vi.c b/firmware/drivers/lcd-remote-2bit-vi.c index 65704f0bd3..21e3ee4aa0 100644 --- a/firmware/drivers/lcd-remote-2bit-vi.c +++ b/firmware/drivers/lcd-remote-2bit-vi.c @@ -34,8 +34,7 @@ #include "rbunicode.h" #include "bidi.h" #include "lcd-remote-target.h" - -#define SCROLLABLE_LINES (((LCD_REMOTE_HEIGHT+4)/5 < 32) ? (LCD_REMOTE_HEIGHT+4)/5 : 32) +#include "scroll_engine.h" /*** globals ***/ @@ -54,28 +53,6 @@ static int xmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; -/* scrolling */ -static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */ -static void scroll_thread(void); -static long scroll_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -static const char scroll_name[] = "remote_scroll"; -static int scroll_ticks = 12; /* # of ticks between updates*/ -static int scroll_delay = HZ/2; /* ticks delay before start */ -static int scroll_step = 6; /* pixels per scroll step */ -static int bidir_limit = 50; /* percent */ -static struct scrollinfo scroll[SCROLLABLE_LINES]; - -static const char scroll_tick_table[16] = { - /* Hz values: - 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */ - 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3 -}; - -/* remote hotplug */ -#ifndef SIMULATOR -struct event_queue remote_scroll_queue; -#endif - /*** parameter handling ***/ unsigned lcd_remote_color_to_native(unsigned color) { @@ -149,6 +126,11 @@ void lcd_remote_setfont(int newfont) curfont = newfont; } +int lcd_remote_getfont(void) +{ + return curfont; +} + int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h) { return font_getstringsize(str, w, h, curfont); @@ -388,7 +370,8 @@ void lcd_remote_clear_display(void) memset(lcd_remote_framebuffer, bg_pattern, sizeof lcd_remote_framebuffer); } - scrolling_lines = 0; + + lcd_remote_scroll_info.lines = 0; } /* Set a single pixel */ @@ -935,7 +918,7 @@ void lcd_remote_bitmap(const fb_remote_data *src, int x, int y, int width, } /* put a string at a given pixel position, skipping first ofs pixel columns */ -static void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str) +void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str) { unsigned short ch; unsigned short *ucs; @@ -1000,7 +983,7 @@ void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ - scrolling_lines &= ~(1 << y); + lcd_remote_scroll_info.lines &= ~(1 << y); if(!str || !str[0]) return; @@ -1018,46 +1001,6 @@ void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, } /*** scrolling ***/ - -/* Reverse the invert setting of the scrolling line (if any) at given char - position. Setting will go into affect next time line scrolls. */ -void lcd_remote_invertscroll(int x, int y) -{ - struct scrollinfo* s; - - (void)x; - - if(y>=SCROLLABLE_LINES) return; - - s = &scroll[y]; - s->invert = !s->invert; -} - -void lcd_remote_stop_scroll(void) -{ - scrolling_lines=0; -} - -void lcd_remote_scroll_speed(int speed) -{ - scroll_ticks = scroll_tick_table[speed]; -} - -void lcd_remote_scroll_step(int step) -{ - scroll_step = step; -} - -void lcd_remote_scroll_delay(int ms) -{ - scroll_delay = ms / (HZ / 10); -} - -void lcd_remote_bidir_scroll(int percent) -{ - bidir_limit = percent; -} - void lcd_remote_puts_scroll(int x, int y, const unsigned char *string) { lcd_remote_puts_scroll_style(x, y, string, STYLE_DEFAULT); @@ -1079,11 +1022,11 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri struct scrollinfo* s; int w, h; - if(y>=SCROLLABLE_LINES) return; + if(y>=LCD_REMOTE_SCROLLABLE_LINES) return; - s = &scroll[y]; + s = &lcd_remote_scroll_info.scroll[y]; - s->start_tick = current_tick + scroll_delay; + s->start_tick = current_tick + lcd_remote_scroll_info.delay; s->invert = false; if (style & STYLE_INVERT) { s->invert = true; @@ -1106,9 +1049,9 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri /* scroll bidirectional or forward only depending on the string width */ - if ( bidir_limit ) { + if ( lcd_remote_scroll_info.bidir_limit ) { s->bidir = s->width < (LCD_REMOTE_WIDTH - xmargin) * - (100 + bidir_limit) / 100; + (100 + lcd_remote_scroll_info.bidir_limit) / 100; } else s->bidir = false; @@ -1126,112 +1069,67 @@ void lcd_remote_puts_scroll_style_offset(int x, int y, const unsigned char *stri s->offset = offset; s->startx = xmargin + x * s->width / s->len;; s->backward = false; - scrolling_lines |= (1<= 0) + for ( index = 0; index < LCD_REMOTE_SCROLLABLE_LINES; index++ ) { + /* really scroll? */ + if ((lcd_remote_scroll_info.lines & (1 << index)) == 0) continue; -#endif - for ( index = 0; index < SCROLLABLE_LINES; index++ ) { - /* really scroll? */ - if ( !(scrolling_lines&(1<start_tick)) - continue; + /* check pause */ + if (TIME_BEFORE(current_tick, s->start_tick)) + continue; - if (s->backward) - s->offset -= scroll_step; - else - s->offset += scroll_step; - - pf = font_get(curfont); - xpos = s->startx; - ypos = ymargin + index * pf->height; - - if (s->bidir) { /* scroll bidirectional */ - if (s->offset <= 0) { - /* at beginning of line */ - s->offset = 0; - s->backward = false; - s->start_tick = current_tick + scroll_delay * 2; - } - if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { - /* at end of line */ - s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); - s->backward = true; - s->start_tick = current_tick + scroll_delay * 2; - } + if (s->backward) + s->offset -= lcd_remote_scroll_info.step; + else + s->offset += lcd_remote_scroll_info.step; + + pf = font_get(curfont); + xpos = s->startx; + ypos = ymargin + index * pf->height; + + if (s->bidir) { /* scroll bidirectional */ + if (s->offset <= 0) { + /* at beginning of line */ + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + lcd_remote_scroll_info.delay*2; } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; + if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { + /* at end of line */ + s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); + s->backward = true; + s->start_tick = current_tick + lcd_remote_scroll_info.delay*2; } - - lastmode = drawmode; - drawmode = s->invert ? - (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); - drawmode = lastmode; - lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); } - - - next_tick += scroll_ticks; - delay = next_tick - current_tick - 1; - if (delay < 0) - { - next_tick = current_tick + 1; - delay = 0; + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } + + lastmode = drawmode; + drawmode = s->invert ? + (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; + lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); + drawmode = lastmode; + lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); } } @@ -1241,10 +1139,5 @@ void lcd_remote_init(void) #ifndef SIMULATOR /* Call device specific init */ lcd_remote_init_device(); - /* private queue */ - queue_init(&remote_scroll_queue, false); #endif - create_thread(scroll_thread, scroll_stack, - sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE) - IF_COP(, CPU, false)); } -- cgit v1.2.3