diff --git a/apps/settings.c b/apps/settings.c index bbb37db3f1..4bb9adbc81 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -71,7 +71,7 @@ const char rec_base_directory[] = REC_BASE_DIR; -#define CONFIG_BLOCK_VERSION 17 +#define CONFIG_BLOCK_VERSION 18 #define CONFIG_BLOCK_SIZE 512 #define RTC_BLOCK_SIZE 44 @@ -250,7 +250,7 @@ static const struct bit_entry hd_bits[] = #ifdef HAVE_BACKLIGHT {1, S_O(caption_backlight), false, "caption backlight", off_on }, #endif - {5, S_O(scroll_speed), 8, "scroll speed", NULL }, /* 1...25 */ + {4, S_O(scroll_speed), 9, "scroll speed", NULL }, /* 0...15 */ {7, S_O(scroll_step), 6, "scroll step", NULL }, /* 1...112 */ {8, S_O(scroll_delay), 100, "scroll delay", NULL }, /* 0...250 */ {8, S_O(bidir_limit), 50, "bidir limit", NULL }, /* 0...200 */ diff --git a/apps/settings_menu.c b/apps/settings_menu.c index 8877818d43..9ddf4c499b 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c @@ -636,9 +636,9 @@ static bool poweroff_idle_timer(void) static bool scroll_speed(void) { - return set_int(str(LANG_SCROLL), "Hz", UNIT_HERTZ, - &global_settings.scroll_speed, - &lcd_scroll_speed, 1, 1, 25 ); + return set_int(str(LANG_SCROLL), "", UNIT_INT, + &global_settings.scroll_speed, + &lcd_scroll_speed, 1, 0, 15 ); } diff --git a/firmware/drivers/lcd-player.c b/firmware/drivers/lcd-player.c index 01d7cfdb6e..8dd97cac0a 100644 --- a/firmware/drivers/lcd-player.c +++ b/firmware/drivers/lcd-player.c @@ -88,7 +88,7 @@ struct cursorinfo { static void scroll_thread(void); static char scroll_stack[DEFAULT_STACK_SIZE]; static const char scroll_name[] = "scroll"; -static char scroll_speed = 8; /* updates per second */ +static char scroll_ticks = 12; /* # of ticks between updates */ static int scroll_delay = HZ/2; /* delay before starting scroll */ static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */ static char scroll_spacing = 3; /* spaces between end and start of text */ @@ -547,7 +547,7 @@ void lcd_puts_scroll(int x, int y, const unsigned char* string ) s->direction=+1; s->jump_scroll=0; s->jump_scroll_steps=0; - if (jump_scroll && jump_scroll_delay<(HZ/scroll_speed)*(s->textlen-11+x)) { + if (jump_scroll && jump_scroll_delaytextlen-11+x)) { s->jump_scroll_steps=11-x; s->jump_scroll=jump_scroll; } @@ -593,9 +593,15 @@ void lcd_allow_bidirectional_scrolling(bool on) allow_bidirectional_scrolling=on; } +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 +}; + void lcd_scroll_speed(int speed) { - scroll_speed = speed; + scroll_ticks = scroll_tick_table[speed]; } void lcd_scroll_delay(int ms) @@ -723,7 +729,7 @@ static void scroll_thread(void) } } - sleep(HZ/scroll_speed); + sleep(scroll_ticks); } } diff --git a/firmware/drivers/lcd-recorder.c b/firmware/drivers/lcd-recorder.c index a711a8fa6d..8f8e9f9332 100644 --- a/firmware/drivers/lcd-recorder.c +++ b/firmware/drivers/lcd-recorder.c @@ -94,7 +94,7 @@ static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrollin static void scroll_thread(void); static char scroll_stack[DEFAULT_STACK_SIZE]; static const char scroll_name[] = "scroll"; -static char scroll_speed = 8; /* updates per second */ +static char scroll_ticks = 12; /* # of ticks between updates*/ static int scroll_delay = HZ/2; /* ticks delay before start */ static char scroll_step = 6; /* pixels per scroll step */ static int bidir_limit = 50; /* percent */ @@ -856,9 +856,15 @@ void lcd_stop_scroll(void) scrolling_lines=0; } +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 +}; + void lcd_scroll_speed(int speed) { - scroll_speed = speed; + scroll_ticks = scroll_tick_table[speed]; } void lcd_scroll_step(int step) @@ -933,7 +939,7 @@ static void scroll_thread(void) lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); } - sleep(HZ/scroll_speed); + sleep(scroll_ticks); } }