--- a/thermferm/lcd-buffer.c Sat Aug 09 17:24:32 2014 +0200 +++ b/thermferm/lcd-buffer.c Sat Aug 09 21:42:28 2014 +0200 @@ -23,13 +23,15 @@ #include "thermferm.h" #include "lcd-buffer.h" #include "lcd-pcf8574.h" +#include "panel.h" #ifdef HAVE_WIRINGPI_H int current_lines = 0; int current_offset = 0; -int current_second = 0; +int first_time = 1; +int previous_key = KEY_NONE; lcd_rows *my_lcd_rows = NULL; extern int lcdHandle; @@ -89,13 +91,43 @@ /* - * This will be called each second. + * This will be called from the main thread if not in edit mode. */ void lcd_buf_show(void) { - int i = 0, r = 0; + int i = 0, r = 0, key, doit = FALSE; lcd_rows *tmp; + key = keycheck(); + + if ((key == KEY_NONE) && (previous_key == KEY_DOWN)) { + if (current_offset < (current_lines - Config.lcd_rows)) + current_offset = current_offset + Config.lcd_rows; + else + current_offset = 0; + doit = TRUE; + } + if ((key == KEY_NONE) && (previous_key == KEY_UP)) { + if (current_offset > Config.lcd_rows) + current_offset = current_offset - Config.lcd_rows; + else + current_offset = (current_lines - Config.lcd_rows); + doit = TRUE; + } + previous_key = key; + + + /* + * Make sure the display works when the program starts. + */ + if (first_time) { + first_time = 0; + doit = TRUE; + } + + if (! doit) + return; + for (tmp = my_lcd_rows; tmp; tmp = tmp->next) { if (i == current_offset) break; @@ -114,19 +146,6 @@ lcdPosition(lcdHandle, 0, r); mb_lcdPuts(lcdHandle, tmp->row); } - - current_second++; - if (current_second < 5) - return; - - /* - * Wrap display - */ - current_second = 0; - if (current_offset < (current_lines - Config.lcd_rows)) - current_offset = current_offset + Config.lcd_rows; - else - current_offset = 0; }