diff options
Diffstat (limited to 'firmware/drivers/lcd-player.c')
-rw-r--r-- | firmware/drivers/lcd-player.c | 72 |
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]; | |||
63 | struct scrollinfo { | 63 | struct 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 | ||
75 | static void scroll_thread(void); | 75 | static void scroll_thread(void); |
@@ -444,29 +444,33 @@ void lcd_init (void) | |||
444 | void lcd_puts_scroll(int x, int y, unsigned char* string ) | 444 | void 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 | ||