aboutsummaryrefslogtreecommitdiffstats
path: root/drv_picoLCDGraphic.c
diff options
context:
space:
mode:
authormzuther <mzuther@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2010-01-24 19:45:27 +0000
committermzuther <mzuther@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2010-01-24 19:45:27 +0000
commit76db34b59e3b2f1b38ec5d07f42c8c31b4e5affc (patch)
tree08d34bc1eaba768ac66c2432667553a31913f061 /drv_picoLCDGraphic.c
parentf622ea6ee27135dc7148b981c07dea4ef13dcc90 (diff)
downloadlcd4linux-76db34b59e3b2f1b38ec5d07f42c8c31b4e5affc.tar.gz
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
Diffstat (limited to 'drv_picoLCDGraphic.c')
-rw-r--r--drv_picoLCDGraphic.c32
1 files changed, 30 insertions, 2 deletions
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;
}