New rotating LCD display

Sun, 13 Jul 2014 21:00:01 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 13 Jul 2014 21:00:01 +0200
changeset 108
50d2187fdb74
parent 107
f2f201b7cb48
child 109
b9a1f5da870a

New rotating LCD display

thermferm/lcd-buffer.c file | annotate | diff | comparison | revisions
thermferm/lcd-buffer.h file | annotate | diff | comparison | revisions
thermferm/thermferm.c file | annotate | diff | comparison | revisions
--- 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;
+}
 
 
 
--- a/thermferm/lcd-buffer.h	Sun Jul 13 17:34:41 2014 +0200
+++ b/thermferm/lcd-buffer.h	Sun Jul 13 21:00:01 2014 +0200
@@ -2,5 +2,13 @@
 #define	LCD_BUFFER_H
 
 
+typedef struct _lcd_rows {
+    struct _lcd_rows	*next;
+    char		row[21 * sizeof(char)];
+} lcd_rows;
+
+
+void lcd_buf_write(int, const char *, ...);
+void lcd_buf_show(void);
 
 #endif
--- a/thermferm/thermferm.c	Sun Jul 13 17:34:41 2014 +0200
+++ b/thermferm/thermferm.c	Sun Jul 13 21:00:01 2014 +0200
@@ -108,9 +108,6 @@
 {
     int		rc, c, i;
     pid_t	frk;
-#ifdef HAVE_WIRINGPI_H
-    char	buf[80];
-#endif
 
     while (1) {
 	int option_index = 0;
@@ -157,17 +154,10 @@
     if (wiringPiSetup () )
 	return 1;
 
-    if ((rc = initLCD (16, 2))) {
+    if ((rc = initLCD (Config.lcd_cols, Config.lcd_rows))) {
 	fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc);
 	return 1;
     }
-
-    lcdPosition(lcdHandle, 0, 0);
-    sprintf(buf, "    Thermferm");
-    mb_lcdPuts(lcdHandle, buf);
-    lcdPosition(lcdHandle, 0, 1);
-    sprintf(buf, "  Version %s", VERSION);
-    mb_lcdPuts(lcdHandle, buf);
 #endif
 
     if (debug) {
@@ -244,8 +234,8 @@
     units_list		*unit;
     int			rc, run = 1, temp, seconds = 0;
 #ifdef HAVE_WIRINGPI_H
-    int			lcdshow = 0;
     struct tm		*tm;
+    int			row;
 #else
     long		t = 0;
 #endif
@@ -297,6 +287,9 @@
 #endif
     }
 
+    lcd_buf_write(1, (char *)"    ThermFerm   ");
+    lcd_buf_write(2, (char *)" Version %s     ", VERSION);
+
     snprintf(buf, 1023, "tempA,tempB");
     logger((char *)"thermferm.log", buf);
 
@@ -333,38 +326,25 @@
 	    seconds++;
 
 #ifdef HAVE_WIRINGPI_H
-	    if ((seconds % 5) == 0) {
+	    row = 3;
+	    tm = localtime(&now);
+	    lcd_buf_write(row++, "   %02d-%02d-%04d   ", tm->tm_mday, tm->tm_mon + 1, tm->tm_year + 1900);
+	    lcd_buf_write(row++, "    %02d:%02d:%02d    ", tm->tm_hour, tm->tm_min, tm->tm_sec);
 
-		if (lcdshow == 0) {
-			lcdPosition(lcdHandle, 0, 0);
-			snprintf(buf, 17, "    ThermFerm   ");
-			mb_lcdPuts(lcdHandle, buf);
-			lcdPosition(lcdHandle, 0, 1);
-			snprintf(buf, 17, "  Version %s    ", VERSION);
-			mb_lcdPuts(lcdHandle, buf);
-			lcdshow++;
-		} else if (lcdshow == 1) {
-			tm = localtime(&now);
-			lcdPosition(lcdHandle, 0, 0);
-			snprintf(buf, 17, "   %02d-%02d-%04d   ", tm->tm_mday, tm->tm_mon + 1, tm->tm_year + 1900);
-			mb_lcdPuts(lcdHandle, buf);
-			lcdPosition(lcdHandle, 0, 1);
-			snprintf(buf, 17, "    %02d:%02d:%02d    ", tm->tm_hour, tm->tm_min, tm->tm_sec);
-			mb_lcdPuts(lcdHandle, buf);
-			lcdshow++;
-		} else {
-			lcdPosition(lcdHandle, 0, 0);
-			tmp1 = Config.w1therms;
-			snprintf(buf, 17, "%5.2f %cC %s              ", tmp1->lastval / 1000.0, 0xdf, tmp1->alias);
-			mb_lcdPuts(lcdHandle, buf);
-			temp = tmp1->lastval;
-			tmp1 = tmp1->next;
-			lcdPosition(lcdHandle, 0, 1);
-			snprintf(buf, 17, "%5.2f %cC %s              ", tmp1->lastval / 1000.0, 0xdf, tmp1->alias);
-			mb_lcdPuts(lcdHandle, buf);
-			lcdshow = 0;
+	    for (unit = Config.units; unit; unit = unit->next) {
+		if (unit->mode != UNITMODE_OFF) {
+		    lcd_buf_write(row++, "Unit %s              ", unit->name);
+		    lcd_buf_write(row++, "Mode %s              ", UNITMODE[unit->mode]);
+		    if (unit->air_address) {
+		    	lcd_buf_write(row++, " Air %.3f %cC         ", unit->air_temperature / 1000.0, 0xdf);
+		    }
+		    if (unit->beer_address) {
+			lcd_buf_write(row++, "Beer %.3f %cC         ", unit->beer_temperature / 1000.0, 0xdf);
+		    }
 		}
 	    }
+
+	    lcd_buf_show();
 #endif
 
 	    if (seconds == 60) {

mercurial