# HG changeset patch # User Michiel Broek # Date 1405278001 -7200 # Node ID 50d2187fdb7494ac106ae76962f8a934f74e3c04 # Parent f2f201b7cb485d3b9d96b537fdf6e8203ba87c43 New rotating LCD display diff -r f2f201b7cb48 -r 50d2187fdb74 thermferm/lcd-buffer.c --- 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 * @@ -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; +} diff -r f2f201b7cb48 -r 50d2187fdb74 thermferm/lcd-buffer.h --- 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 diff -r f2f201b7cb48 -r 50d2187fdb74 thermferm/thermferm.c --- 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) {