From 76db34b59e3b2f1b38ec5d07f42c8c31b4e5affc Mon Sep 17 00:00:00 2001 From: mzuther Date: Sun, 24 Jan 2010 19:45:27 +0000 Subject: picoLCDGraphic: update display regularly using a timer (*much* faster than redrawing the whole display after each changed widget; you may get the old behaviour by setting "Update 0") git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@1094 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- drv_picoLCDGraphic.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'drv_picoLCDGraphic.c') diff --git a/drv_picoLCDGraphic.c b/drv_picoLCDGraphic.c index 5e7e159..afbc61f 100644 --- a/drv_picoLCDGraphic.c +++ b/drv_picoLCDGraphic.c @@ -53,6 +53,7 @@ #include "qprintf.h" #include "udelay.h" #include "plugin.h" +#include "timer.h" #include "widget.h" #include "widget_text.h" #include "widget_icon.h" @@ -85,6 +86,11 @@ #define DEBUG(x) #endif +/* "dirty" marks the display to be redrawn from frame buffer */ +static int dirty = 1; + +/* timer for display redraw (set to zero for "direct updates") */ +static int update = 0; static char Name[] = "picoLCDGraphic"; static unsigned char *pLG_framebuffer; @@ -200,8 +206,14 @@ static void drv_pLG_update_img() unsigned char cs, line; unsigned char pixel; - info("In %s\n", __FUNCTION__); + /* do not redraw display if frame buffer has not changed, unless + "direct updates" have been requested (update is zero) */ + if ((!dirty) && (update > 0)) { + debug("Skipping %s\n", __FUNCTION__); + return; + } + info("In %s\n", __FUNCTION__); for (cs = 0; cs < 4; cs++) { unsigned char chipsel = (cs << 2); //chipselect @@ -259,6 +271,8 @@ static void drv_pLG_update_img() } } + /* mark display as up-to-date */ + dirty = 0; //drv_pLG_clear(); } @@ -286,7 +300,13 @@ static void drv_pLG_blit(const int row, const int col, const int height, const i fprintf(stderr, "\n"); } */ - drv_pLG_update_img(); + + /* display needs to be redrawn from frame buffer */ + dirty = 1; + + /* if "direct updates" have been requested, redraw now */ + if (update <= 0) + drv_pLG_update_img(); } @@ -442,6 +462,9 @@ static int drv_pLG_start(const char *section, const int quiet) int value; char *s; + /* set display redraw interval (set to zero for "direct updates") */ + cfg_number(section, "update", 200, 0, -1, &update); + s = cfg_get(section, "Size", NULL); if (s == NULL || *s == '\0') { error("%s: no '%s.Size' entry from %s", Name, section, cfg_source()); @@ -503,6 +526,11 @@ static int drv_pLG_start(const char *section, const int quiet) } } + /* setup a timer that regularly redraws the display from the frame + buffer (unless "direct updates" have been requested */ + if (update > 0) + timer_add(drv_pLG_update_img, NULL, update, 0); + return 0; } -- cgit v1.2.3