diff -Nau ref-20050710/firmware/export/lcd.h jumpback-20050710/firmware/export/lcd.h --- ref-20050710/firmware/export/lcd.h 2005-07-09 04:00:11.000000000 +0000 +++ jumpback-20050710/firmware/export/lcd.h 2005-07-22 11:48:51.522062544 +0000 @@ -195,6 +195,7 @@ bool backward; /* scroll presently forward or backward? */ bool bidir; bool invert; /* invert the scrolled text */ + bool jump_back; long start_tick; }; #else /* !HAVE_LCD_BITMAP */ diff -Nau ref-20050710/firmware/drivers/lcd-recorder.c jumpback-20050710/firmware/drivers/lcd-recorder.c --- ref-20050710/firmware/drivers/lcd-recorder.c 2005-07-09 04:00:11.000000000 +0000 +++ jumpback-20050710/firmware/drivers/lcd-recorder.c 2005-07-22 11:49:12.290905200 +0000 @@ -17,6 +17,7 @@ * ****************************************************************************/ #include "config.h" +#define JUMPBACK #include "lcd.h" #include "kernel.h" @@ -999,6 +1000,8 @@ /* get new width incl. spaces */ s->width = lcd_getstringsize(s->line, &w, &h); } + + s->jump_back = false; end = strchr(s->line, '\0'); strncpy(end, string, LCD_WIDTH/2); @@ -1037,34 +1040,51 @@ 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 = xmargin + s->startx * s->width / s->len; 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; +#ifdef JUMPBACK + if (s->jump_back) + { + /* jump back to beginning of line and delay again */ + s->jump_back = false; + s->offset = 0; + s->backward = false; + s->start_tick = current_tick + scroll_delay * 2; + } + else +#endif + { + if (s->backward) + s->offset -= scroll_step; + else + s->offset += scroll_step; + + 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->start_tick = current_tick + scroll_delay * 2; +#ifdef JUMPBACK + s->jump_back = true; +#else + s->backward = true; +#endif + } } - 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; + else { + /* scroll forward the whole time */ + if (s->offset >= s->width) + s->offset %= s->width; } } - else { - /* scroll forward the whole time */ - if (s->offset >= s->width) - s->offset %= s->width; - } lastmode = drawmode; drawmode = (DRMODE_SOLID|DRMODE_INVERSEVID);