thermferm/lcd-buffer.c

changeset 200
a215ddaabbe2
parent 108
50d2187fdb74
child 204
9a14d6b2de7f
--- 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;
 }
 
 

mercurial