thermferm/lcd-buffer.c

changeset 108
50d2187fdb74
parent 106
1bd9a16f5061
child 200
a215ddaabbe2
--- a/thermferm/lcd-buffer.c	Sun Jul 13 17:34:41 2014 +0200
+++ b/thermferm/lcd-buffer.c	Sun Jul 13 21:00:01 2014 +0200
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (C) 2008-2014
+ * Copyright (C) 2014
  *   
  * Michiel Broek <mbroek at mbse dot eu>
  *
@@ -22,9 +22,112 @@
 
 #include "thermferm.h"
 #include "lcd-buffer.h"
+#include "lcd-pcf8574.h"
+
 
 #ifdef HAVE_WIRINGPI_H
 
+int			current_lines = 0;
+int			current_offset = 0;
+int			current_second = 0;
+lcd_rows		*my_lcd_rows = NULL;
+
+extern int		lcdHandle;
+extern sys_config	Config;
+
+
+
+/*
+ * Write to buffer array. Allocate more lines if needed.
+ */
+void lcd_buf_write(int row, const char *format, ...)
+{
+    char	buf[21 * sizeof(char)];
+    va_list	va_ptr;
+    lcd_rows	*tmp, *newrow;
+    int		i = 0;
+
+    va_start(va_ptr, format);
+    vsnprintf(buf, 20 * sizeof(char), format, va_ptr);
+    va_end(va_ptr);
+
+    /*
+     * Check if the line in row is allocated. If not, do it
+     * and make sure the chain is valid.
+     */
+    while (row > current_lines) {
+
+	newrow = (lcd_rows *)malloc(sizeof(lcd_rows));
+	newrow->next = NULL;
+	snprintf(newrow->row, 21 * sizeof(char), "                    ");
+
+	if (my_lcd_rows == NULL) {
+	    my_lcd_rows = newrow;
+	} else {
+	    for (tmp = my_lcd_rows; tmp; tmp = tmp->next) {
+		if (tmp->next == NULL) {
+		    tmp->next = newrow;
+		    current_lines++;
+		    break;
+		}
+	    }
+	}
+    }
+
+    /*
+     * Now update the text
+     */
+    for (tmp = my_lcd_rows; tmp; tmp = tmp->next) {
+	i++;
+	if (i == row) {
+	    snprintf(tmp->row, Config.lcd_cols + 1, "%s", buf);
+	    break;
+	}
+    }
+}
+
+
+
+/*
+ * This will be called each second.
+ */
+void lcd_buf_show(void)
+{
+    int		i = 0, r = 0;
+    lcd_rows	*tmp;
+
+    for (tmp = my_lcd_rows; tmp; tmp = tmp->next) {
+	if (i == current_offset)
+	    break;
+	i++;
+    }
+
+    lcdPosition(lcdHandle, 0, r);
+    mb_lcdPuts(lcdHandle, tmp->row);
+
+    r++;
+    if (r < Config.lcd_rows) {
+	if (tmp->next != NULL)
+	    tmp = tmp->next;
+	else
+	    tmp = my_lcd_rows;
+	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