--- 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; +}