summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-player.c
diff options
context:
space:
mode:
authorKjell Ericson <kjell@haxx.se>2003-01-10 13:22:07 +0000
committerKjell Ericson <kjell@haxx.se>2003-01-10 13:22:07 +0000
commit54c8c71d8529c280f25327b481fbbed6b9eef100 (patch)
treee63632e342290bbe2aec524cce9fcd043436e115 /firmware/drivers/lcd-player.c
parentdc88e23700e93a83aa24e3a483be4177da1860fb (diff)
downloadrockbox-54c8c71d8529c280f25327b481fbbed6b9eef100.tar.gz
rockbox-54c8c71d8529c280f25327b481fbbed6b9eef100.zip
Bidirectional scrolling implemented. The text will go back and forth
when more than 4 characters are outside the LCD. Small texts will wrap as normal. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3063 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/lcd-player.c')
-rw-r--r--firmware/drivers/lcd-player.c72
1 files changed, 45 insertions, 27 deletions
diff --git a/firmware/drivers/lcd-player.c b/firmware/drivers/lcd-player.c
index 6e7fe9d170..c6385a222c 100644
--- a/firmware/drivers/lcd-player.c
+++ b/firmware/drivers/lcd-player.c
@@ -63,13 +63,13 @@ extern unsigned char extended_font_player[NO_EXTENDED_LCD_CHARS][8];
63struct scrollinfo { 63struct scrollinfo {
64 int mode; 64 int mode;
65 char text[MAX_PATH]; 65 char text[MAX_PATH];
66 char line[32];
67 int textlen; 66 int textlen;
68 int offset; 67 int offset;
68 int turn_offset;
69 int startx; 69 int startx;
70 int starty; 70 int starty;
71 int space;
72 long scroll_start_tick; 71 long scroll_start_tick;
72 int direction; /* +1 for right or -1 for left*/
73}; 73};
74 74
75static void scroll_thread(void); 75static void scroll_thread(void);
@@ -444,29 +444,33 @@ void lcd_init (void)
444void lcd_puts_scroll(int x, int y, unsigned char* string ) 444void lcd_puts_scroll(int x, int y, unsigned char* string )
445{ 445{
446 struct scrollinfo* s; 446 struct scrollinfo* s;
447 int i;
447 448
448 DEBUGF("lcd_puts_scroll(%d, %d, %s)\n", x, y, string); 449 DEBUGF("lcd_puts_scroll(%d, %d, %s)\n", x, y, string);
449 450
450 s = &scroll[y]; 451 s = &scroll[y];
451 452
452 s->space = 11 - x;
453
454 lcd_puts(x,y,string); 453 lcd_puts(x,y,string);
455 s->textlen = strlen(string); 454 s->textlen = strlen(string);
456 455
457 if ( s->textlen > s->space ) { 456 if ( s->textlen > 11-x ) {
458 s->mode = SCROLL_MODE_RUN; 457 s->mode = SCROLL_MODE_RUN;
459 s->scroll_start_tick = current_tick + scroll_delay; 458 s->scroll_start_tick = current_tick + scroll_delay;
460 s->offset=s->space; 459 s->offset=0;
461 s->startx=x; 460 s->startx=x;
462 s->starty=y; 461 s->starty=y;
462 s->direction=+1;
463 strncpy(s->text,string,sizeof s->text); 463 strncpy(s->text,string,sizeof s->text);
464 s->turn_offset=-1;
465 if ( s->textlen + x > 11+4)
466 s->turn_offset=s->textlen-x-11+4;
467
468 for (i=0; i<scroll_spacing && s->textlen<(int)sizeof(s->text); i++) {
469 s->text[s->textlen++]=' ';
470 }
471 if (s->textlen<(int)sizeof(s->text))
472 s->text[s->textlen]=' ';
464 s->text[sizeof s->text - 1] = 0; 473 s->text[sizeof s->text - 1] = 0;
465 memset(s->line, 0, sizeof s->line);
466 strncpy(s->line,string,
467 s->space > (int)sizeof s->line ?
468 (int)sizeof s->line : s->space );
469 s->line[sizeof s->line - 1] = 0;
470 } else 474 } else
471 s->mode = SCROLL_MODE_OFF; 475 s->mode = SCROLL_MODE_OFF;
472} 476}
@@ -564,7 +568,7 @@ static void scroll_thread(void)
564{ 568{
565 struct scrollinfo* s; 569 struct scrollinfo* s;
566 int index; 570 int index;
567 int i; 571 int i, o;
568 bool update; 572 bool update;
569 573
570 /* initialize scroll struct array */ 574 /* initialize scroll struct array */
@@ -577,26 +581,40 @@ static void scroll_thread(void)
577 update = false; 581 update = false;
578 582
579 for ( index = 0; index < SCROLLABLE_LINES; index++ ) { 583 for ( index = 0; index < SCROLLABLE_LINES; index++ ) {
580 s = &scroll[index]; 584 s = &scroll[index];
581 if ( s->mode == SCROLL_MODE_RUN ) { 585 if ( s->mode == SCROLL_MODE_RUN ) {
582 if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) { 586 if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) {
587 char buffer[12];
583 update = true; 588 update = true;
584 589 DEBUGF("offset=%d, turn_offset=%d, len=%d",
585 for ( i = 0; i < s->space - 1; i++ ) 590 s->offset, s->turn_offset, s->textlen);
586 s->line[i] = s->line[i+1]; 591 if ( s->offset < s->textlen-1 ) {
587 592 s->offset+=s->direction;
588 if ( s->offset < s->textlen ) { 593 if (s->offset==0) {
589 s->line[(int)s->space - 1] = s->text[(int)s->offset]; 594 s->direction=+1;
590 s->offset++; 595 s->scroll_start_tick = current_tick + scroll_delay;
596 } else if (s->offset==s->turn_offset) {
597 s->direction=-1;
598 s->scroll_start_tick = current_tick + scroll_delay;
599 }
591 } 600 }
592 else { 601 else {
593 s->line[s->space - 1] = ' ';
594 if ( s->offset < s->textlen + scroll_spacing - 1 )
595 s->offset++;
596 else
597 s->offset = 0; 602 s->offset = 0;
598 } 603 }
599 lcd_puts(s->startx,s->starty,s->line); 604
605 i=0;
606 o=s->offset;
607 while (i<11) {
608 buffer[i++]=s->text[o++];
609 if (o==s->textlen)
610 break;
611 }
612 o=0;
613 while (i<11) {
614 buffer[i++]=s->text[o++];
615 }
616 buffer[11]=0;
617 lcd_puts(s->startx, s->starty, buffer);
600 } 618 }
601 } 619 }
602 620