]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2006-07-31 03:48:09 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Mon, 31 Jul 2006 03:48:09 +0000 (03:48 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Mon, 31 Jul 2006 03:48:09 +0000 (03:48 +0000)
preparations for scrolling

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@680 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

16 files changed:
Makefile.am
Makefile.in
configure.in
drv.c
drv_generic.c [new file with mode: 0644]
drv_generic.h [new file with mode: 0644]
drv_generic_graphic.c
drv_generic_graphic.h
drv_generic_i2c.c
drv_generic_i2c.h
drv_generic_text.c
drv_generic_text.h
lcd4linux.conf.sample
plugin.c
plugin_string.c
widget_timer.c

index b52d8a502319ea15858d56f476cc5bd3c7625f88..64ce9c5fc9f23b7230d3e04681b4d0cda427ab00 100644 (file)
@@ -18,6 +18,7 @@ lcd4linux.c                   \
 cfg.c         cfg.h           \
 debug.c       debug.h         \
 drv.c         drv.h           \
+drv_generic.c drv_generic.h   \
 evaluator.c   evaluator.h     \
 hash.c        hash.h          \
 layout.c      layout.h        \
@@ -32,7 +33,7 @@ widget.c      widget.h        \
 widget_text.c widget_text.h   \
 widget_bar.c  widget_bar.h    \
 widget_icon.c widget_icon.h   \
-widget_keypad.c widget_keypad.h    \
+widget_keypad.c widget_keypad.h \
 widget_timer.c widget_timer.h \
 widget_gpo.c  widget_gpo.h    \
                               \
index 732947063ebfdb4cda83534b78563182ba805862..d69e22cea123ccf838a6996e01079c305ceae499 100644 (file)
@@ -58,15 +58,16 @@ am__installdirs = "$(DESTDIR)$(bindir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
 am_lcd4linux_OBJECTS = lcd4linux.$(OBJEXT) cfg.$(OBJEXT) \
-       debug.$(OBJEXT) drv.$(OBJEXT) evaluator.$(OBJEXT) \
-       hash.$(OBJEXT) layout.$(OBJEXT) pid.$(OBJEXT) timer.$(OBJEXT) \
-       thread.$(OBJEXT) udelay.$(OBJEXT) qprintf.$(OBJEXT) \
-       rgb.$(OBJEXT) widget.$(OBJEXT) widget_text.$(OBJEXT) \
-       widget_bar.$(OBJEXT) widget_icon.$(OBJEXT) \
-       widget_keypad.$(OBJEXT) widget_timer.$(OBJEXT) \
-       widget_gpo.$(OBJEXT) plugin.$(OBJEXT) plugin_cfg.$(OBJEXT) \
-       plugin_math.$(OBJEXT) plugin_string.$(OBJEXT) \
-       plugin_test.$(OBJEXT) plugin_time.$(OBJEXT)
+       debug.$(OBJEXT) drv.$(OBJEXT) drv_generic.$(OBJEXT) \
+       evaluator.$(OBJEXT) hash.$(OBJEXT) layout.$(OBJEXT) \
+       pid.$(OBJEXT) timer.$(OBJEXT) thread.$(OBJEXT) \
+       udelay.$(OBJEXT) qprintf.$(OBJEXT) rgb.$(OBJEXT) \
+       widget.$(OBJEXT) widget_text.$(OBJEXT) widget_bar.$(OBJEXT) \
+       widget_icon.$(OBJEXT) widget_keypad.$(OBJEXT) \
+       widget_timer.$(OBJEXT) widget_gpo.$(OBJEXT) plugin.$(OBJEXT) \
+       plugin_cfg.$(OBJEXT) plugin_math.$(OBJEXT) \
+       plugin_string.$(OBJEXT) plugin_test.$(OBJEXT) \
+       plugin_time.$(OBJEXT)
 lcd4linux_OBJECTS = $(am_lcd4linux_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -192,6 +193,7 @@ lcd4linux.c                   \
 cfg.c         cfg.h           \
 debug.c       debug.h         \
 drv.c         drv.h           \
+drv_generic.c drv_generic.h   \
 evaluator.c   evaluator.h     \
 hash.c        hash.h          \
 layout.c      layout.h        \
@@ -206,7 +208,7 @@ widget.c      widget.h        \
 widget_text.c widget_text.h   \
 widget_bar.c  widget_bar.h    \
 widget_icon.c widget_icon.h   \
-widget_keypad.c widget_keypad.h    \
+widget_keypad.c widget_keypad.h \
 widget_timer.c widget_timer.h \
 widget_gpo.c  widget_gpo.h    \
                               \
@@ -426,6 +428,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_USBLCD.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_WincorNixdorf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_X11.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_generic.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_generic_gpio.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_generic_graphic.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drv_generic_i2c.Po@am__quote@
index 38f1c1b063280d615ce18d3ebd47154919faaee7..ca233da5bf892564e93e654f73162d938434646f 100644 (file)
@@ -22,7 +22,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-AC_PREREQ(2.59e)
+AC_PREREQ(2.59)
 AC_INIT([LCD4Linux],[0.10.1-CVS],[lcd4linux-users@lists.sourceforge.net])
 AC_CONFIG_SRCDIR([lcd4linux.c])
 AM_INIT_AUTOMAKE([lcd4linux],0.10.1-CVS)
diff --git a/drv.c b/drv.c
index c61bebeb2682eedfb6db5c9e6507d084407eea93..912ae7a2c28bfeecd06dc153f76925ff40bfa095 100644 (file)
--- a/drv.c
+++ b/drv.c
@@ -1,4 +1,4 @@
-/* $Id: drv.c,v 1.40 2006/04/14 20:59:38 harbaum Exp $
+/* $Id: drv.c,v 1.41 2006/07/31 03:48:09 reinelt Exp $
  *
  * new framework for display drivers
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv.c,v $
+ * Revision 1.41  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.40  2006/04/14 20:59:38  harbaum
  * Disable inclusion of Image driver in drv.c if no gd was found.
  *
  * drv_init (char *driver)
  *    initializes the named driver
  *
- * drv_query (int *rows, int *cols, int *xres, int *yres, int *bars, int *gpos)
- *    queries the attributes of the selected driver
- *
- * drv_clear ()
- *    clears the display
- *
- * int drv_put (int row, int col, char *text)
- *    writes text at row, col
- *
- * int drv_bar (int type, int row, int col, int max, int len1, int len2)
- *    draws a specified bar at row, col with len
- *
- * int drv_icon (int num, int seq, int row, int col)
- *    draws icon #num sequence #seq at row, col
- *
- * int drv_gpo (int num, int val)
- *    sets GPO #num to val
- *
- * int drv_flush (void)
- *    flushes the framebuffer to the display
- *
  * int drv_quit (void)
  *    de-initializes the driver
  */
diff --git a/drv_generic.c b/drv_generic.c
new file mode 100644 (file)
index 0000000..d898a85
--- /dev/null
@@ -0,0 +1,119 @@
+/* $Id: drv_generic.c,v 1.4 2006/07/31 03:48:09 reinelt Exp $
+ *
+ * generic driver helper
+ *
+ * Copyright (C) 2006 Michael Reinelt <reinelt@eunet.at>
+ * Copyright (C) 2006 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: drv_generic.c,v $
+ * Revision 1.4  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
+ */
+
+/* 
+ *
+ * exported functions:
+ *
+ * drv_generic_init (void)
+ *   initializes generic stuff and registers plugins
+ *
+ */
+
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "debug.h"
+#include "plugin.h"
+#include "drv_generic.h"
+
+#ifdef WITH_DMALLOC
+#include <dmalloc.h>
+#endif
+
+/* these values are chars (text displays) or pixels (graphic displays) */
+
+int LROWS = 0;                 /* layout size: rows */
+int LCOLS = 0;                 /* layout size: columns */
+
+int DROWS = 4;                 /* display size:  rows */
+int DCOLS = 20;                        /* display size: columns */
+
+int XRES = 6;                  /* pixel widtht of one char */
+int YRES = 8;                  /* pixel height of one char */
+
+
+void (*drv_generic_blit) () = NULL;
+
+
+static void my_drows(RESULT * result)
+{
+    double value = DROWS;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+static void my_dcols(RESULT * result)
+{
+    double value = DCOLS;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+static void my_xres(RESULT * result)
+{
+    double value = XRES;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+static void my_yres(RESULT * result)
+{
+    double value = YRES;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+static void my_lrows(RESULT * result)
+{
+    double value = LROWS;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+static void my_lcols(RESULT * result)
+{
+    double value = LCOLS;
+    SetResult(&result, R_NUMBER, &value);
+}
+
+int drv_generic_init(void)
+{
+
+    AddFunction("LCD::height", 0, my_drows);
+    AddFunction("LCD::width", 0, my_dcols);
+
+    AddFunction("LCD::xres", 0, my_xres);
+    AddFunction("LCD::yres", 0, my_yres);
+
+    AddFunction("Layout::height", 0, my_lrows);
+    AddFunction("Layout::width", 0, my_lcols);
+
+    return 0;
+}
diff --git a/drv_generic.h b/drv_generic.h
new file mode 100644 (file)
index 0000000..e013fbd
--- /dev/null
@@ -0,0 +1,47 @@
+/* $Id: drv_generic.h,v 1.4 2006/07/31 03:48:09 reinelt Exp $
+ *
+ * generic driver helper
+ *
+ * Copyright (C) 2006 Michael Reinelt <reinelt@eunet.at>
+ * Copyright (C) 2006 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: drv_generic.h,v $
+ * Revision 1.4  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
+ */
+
+
+#ifndef _DRV_GENERIC_H_
+#define _DRV_GENERIC_H_
+
+/* these values are chars (text displays) or pixels (graphic displays) */
+
+extern int LROWS, LCOLS;       /* layout size */
+extern int DROWS, DCOLS;       /* display size */
+
+extern int XRES, YRES;         /* pixel width/height of one char */
+
+/* these function must be implemented by the generic driver */
+extern void (*drv_generic_blit) (const int row, const int col, const int height, const int width);
+
+int drv_generic_init(void);
+
+#endif
index bf11a24c9851bfc0f3f6562586088129fa9285b6..197450ca9b21fb151b90453add12765223a851dd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id
+/* $Id: drv_generic_graphic.c,v 1.29 2006/07/31 03:48:09 reinelt Exp $
  *
  * generic driver helper for graphic displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_graphic.c,v $
+ * Revision 1.29  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.28  2006/06/20 08:50:58  reinelt
  * widget_image linker error hopefully finally fixed
  *
 #include "widget_image.h"
 #include "rgb.h"
 #include "drv.h"
+#include "drv_generic.h"
 #include "drv_generic_graphic.h"
 #include "font_6x8.h"
 
 #include <dmalloc.h>
 #endif
 
-int DROWS, DCOLS;              /* display size (pixels!) */
-int XRES, YRES;                        /* pixels of one char cell */
-
 /* pixel colors */
 RGBA FG_COL = { R: 0x00, G: 0x00, B: 0x00, A:0xff };
 RGBA BG_COL = { R: 0xff, G: 0xff, B: 0xff, A:0xff };
@@ -193,10 +194,6 @@ RGBA NO_COL = { R: 0x00, G: 0x00, B: 0x00, A:0x00 };
 static char *Section = NULL;
 static char *Driver = NULL;
 
-/* layout size  (pixels!) */
-static int LROWS = 0;
-static int LCOLS = 0;
-
 /* framebuffer */
 static RGBA *drv_generic_graphic_FB[LAYERS] = { NULL, };
 
@@ -647,6 +644,9 @@ int drv_generic_graphic_init(const char *section, const char *driver)
        }
     }
 
+    /* init generic driver & register plugins */
+    drv_generic_init();
+
     /* set default colors */
     color = cfg_get(Section, "foreground", "000000ff");
     if (color2RGBA(color, &FG_COL) < 0) {
index c51dfdce74f4635ce14114366417967263542408..106ac2af633824c1a22223e41fb55069fffca86e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_graphic.h,v 1.12 2006/02/27 06:14:46 reinelt Exp $
+/* $Id: drv_generic_graphic.h,v 1.13 2006/07/31 03:48:09 reinelt Exp $
  *
  * generic driver helper for graphic displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_graphic.h,v $
+ * Revision 1.13  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.12  2006/02/27 06:14:46  reinelt
  * graphic bug resulting in all black pixels solved
  *
 #ifndef _DRV_GENERIC_GRAPHIC_H_
 #define _DRV_GENERIC_GRAPHIC_H_
 
+#include "drv_generic.h"
 #include "widget.h"
 #include "rgb.h"
 
-extern int DROWS, DCOLS;       /* display size */
-extern int XRES, YRES;         /* pixel width/height of one char  */
-
 extern RGBA FG_COL;            /* foreground color */
 extern RGBA HG_COL;            /* halfground color */
 extern RGBA BG_COL;            /* background color */
index a77d020f059e60bccd080d84033491d249bce2dc..b9ef1b6b19a29d58341c1fa89717cad8d6280756 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_i2c.c,v 1.7 2006/07/30 11:16:27 lfcorreia Exp $
+/* $Id: drv_generic_i2c.c,v 1.8 2006/07/31 03:48:09 reinelt Exp $
  *
  * generic driver helper for i2c displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_i2c.c,v $
+ * Revision 1.8  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.7  2006/07/30 11:16:27  lfcorreia
  * Add back drv_generic_i2c_close function
  *
@@ -142,18 +145,18 @@ int drv_generic_i2c_open(const char *section, const char *driver)
     }
 
     info("%s: initializing I2C slave device 0x%x", Driver, dev);
-    if (i2c_smbus_write_quick(i2c_device, I2C_SMBUS_WRITE) < 0 ){
+    if (i2c_smbus_write_quick(i2c_device, I2C_SMBUS_WRITE) < 0{
        error("%s: error initializing device 0x%x\n", Driver, dev);
        close(i2c_device);
-               }
+    }
 
     return 0;
 
   exit_error:
     free(bus);
     free(device);
-               close(i2c_device);
-               return -1;
+    close(i2c_device);
+    return -1;
 }
 
 int drv_generic_i2c_close(void)
index e30e8f841b02180a48667a7610bf1f592d2ca569..579fcbe7135023e7266ead9ab51eaeb9f4b9eb53 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_i2c.h,v 1.6 2006/02/27 06:15:55 reinelt Exp $\r
+/* $Id: drv_generic_i2c.h,v 1.7 2006/07/31 03:48:09 reinelt Exp $\r
  *\r
  * generic driver helper for i2c displays\r
  *\r
  *\r
  *\r
  * $Log: drv_generic_i2c.h,v $
- * Revision 1.6  2006/02/27 06:15:55  reinelt
- * indent...
- *
- * Revision 1.5  2006/02/25 13:36:33  geronet
- * updated indent.sh, applied coding style
- *
- * Revision 1.4  2005/05/31 21:32:00  lfcorreia
- * fix my email address
+ * Revision 1.7  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *\r
+ * Revision 1.6  2006/02/27 06:15:55  reinelt\r
+ * indent...\r
+ *\r
+ * Revision 1.5  2006/02/25 13:36:33  geronet\r
+ * updated indent.sh, applied coding style\r
+ *\r
+ * Revision 1.4  2005/05/31 21:32:00  lfcorreia\r
+ * fix my email address\r
  *\r
  * Revision 1.3  2005/05/31 20:42:55  lfcorreia\r
  * new file: lcd4linux_i2c.h\r
@@ -82,4 +85,4 @@
 \rvoid drv_generic_i2c_data(const unsigned char data);
 \rvoid drv_generic_i2c_command(const unsigned char command, const unsigned char *data, const unsigned char length);
 \r\r
-#endif                         /* \r */
+#endif /* \r */
index 8be347ce1220963c04d31ea249c6a732eff08c02..4bcbb51c9fea811e3681ad940793a4a953b92bdd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_text.c,v 1.35 2006/03/29 08:57:58 reinelt Exp $
+/* $Id: drv_generic_text.c,v 1.36 2006/07/31 03:48:09 reinelt Exp $
  *
  * generic driver helper for text-based displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_text.c,v $
+ * Revision 1.36  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.35  2006/03/29 08:57:58  reinelt
  * vertical bar patch from Manuel Lausch
  *
  *
  * exported variables:
  *
- * extern int DROWS, DCOLS;    display size
- * extern int XRES,  YRES;     pixel width/height of one char
  * extern int CHARS, CHAR0;    number of user-defineable characters, ASCII of first char
  * extern int ICONS;           number of user-defineable characters reserved for icons
  * extern int GOTO_COST;       number of bytes a goto command requires
 #include "widget_icon.h"
 #include "widget_bar.h"
 #include "drv.h"
+#include "drv_generic.h"
 #include "drv_generic_text.h"
 
 #ifdef WITH_DMALLOC
@@ -260,11 +262,6 @@ typedef struct {
 static char *Section = NULL;
 static char *Driver = NULL;
 
-
-int DROWS = 20;                        /* display size: rows */
-int DCOLS = 4;                 /* display size: columns */
-int XRES = 6;                  /* pixels of one char cell */
-int YRES = 8;                  /* pixels of one char cell */
 int CHARS = 0;                 /* number of user-defineable characters */
 int CHAR0 = 0;                 /* ASCII of first user-defineable char */
 int ICONS = 0;                 /* number of user-defineable characters reserved for icons */
@@ -277,11 +274,9 @@ void (*drv_generic_text_real_write) () = NULL;
 void (*drv_generic_text_real_defchar) () = NULL;
 
 
-static int LROWS = 20;         /* layout size: rows */
-static int LCOLS = 4;          /* layout size: columns */
-
 static char *LayoutFB = NULL;
 static char *DisplayFB = NULL;
+static int *L2D = NULL;
 
 static int Single_Segments = 0;
 
@@ -291,7 +286,6 @@ static SEGMENT Segment[128];
 static BAR *BarFB = NULL;
 
 
-
 /****************************************/
 /*** generic Framebuffer stuff        ***/
 /****************************************/
@@ -299,6 +293,7 @@ static BAR *BarFB = NULL;
 static void drv_generic_text_resizeFB(int rows, int cols)
 {
     char *newFB;
+    int *newL2D;
     BAR *newBar;
     int i, row, col;
 
@@ -313,8 +308,8 @@ static void drv_generic_text_resizeFB(int rows, int cols)
        cols = LCOLS;
 
     /* allocate new Layout FB */
-    newFB = malloc(cols * rows * sizeof(char));
-    memset(newFB, ' ', rows * cols * sizeof(char));
+    newFB = malloc(cols * rows * sizeof(*newFB));
+    memset(newFB, ' ', rows * cols * sizeof(*newFB));
 
     /* transfer contents */
     if (LayoutFB != NULL) {
@@ -327,6 +322,26 @@ static void drv_generic_text_resizeFB(int rows, int cols)
     }
     LayoutFB = newFB;
 
+    /* allocate new transformer */
+    newL2D = malloc(cols * rows * sizeof(*newL2D));
+
+    /* intitialize translator */
+    for (row = 0; row < rows; row++) {
+       for (col = 0; col < cols; col++) {
+           newL2D[row * cols + col] = row * DCOLS + col;
+       }
+    }
+
+    /* transfer transformer */
+    if (L2D != NULL) {
+       for (row = 0; row < LROWS; row++) {
+           for (col = 0; col < LCOLS; col++) {
+               newL2D[row * cols + col] = L2D[row * LCOLS + col];
+           }
+       }
+       free(L2D);
+    }
+    L2D = newL2D;
 
     /* resize Bar buffer */
     if (BarFB) {
@@ -357,6 +372,54 @@ static void drv_generic_text_resizeFB(int rows, int cols)
 }
 
 
+static void drv_generic_text_blit(const int row, const int col, const int height, const int width)
+{
+    int lr, lc;                        /* layout  row/col */
+    int dr, dc;                        /* display row/col */
+    int p1, p2;                        /* start/end positon of changed area */
+    int eq;                    /* counter for equal contents */
+
+    /* loop over layout rows */
+    for (lr = row; lr < LROWS && lr < row + height; lr++) {
+       /* transform layout to display row */
+       dr = lr;
+       /* sanity check */
+       if (dr < 0 || dr >= DROWS)
+           continue;
+       /* loop over layout cols */
+       for (lc = col; lc < LCOLS && lc < col + width; lc++) {
+           /* transform layout to display column */
+           dc = lc;
+           /* sanity check */
+           if (dc < 0 || dc >= DCOLS)
+               continue;
+           /* find start of difference */
+           if (DisplayFB[dr * DCOLS + dc] == LayoutFB[lr * LCOLS + lc])
+               continue;
+           /* find end of difference */
+           for (p1 = dc, p2 = p1, eq = 0, lc++; lc < LCOLS && lc < col + width; lc++) {
+               /* transform layout to display column */
+               dc = lc;
+               /* sanity check */
+               if (dc < 0 || dc >= DCOLS)
+                   continue;
+               if (DisplayFB[dr * DCOLS + dc] == LayoutFB[lr * LCOLS + lc]) {
+                   if (++eq > GOTO_COST)
+                       break;
+               } else {
+                   p2 = dc;
+                   eq = 0;
+               }
+           }
+           /* send to display */
+           memcpy(DisplayFB + dr * DCOLS + p1, LayoutFB + lr * LCOLS + p1, p2 - p1 + 1);
+           if (drv_generic_text_real_write)
+               drv_generic_text_real_write(dr, p1, DisplayFB + dr * DCOLS + p1, p2 - p1 + 1);
+       }
+    }
+}
+
+
 /****************************************/
 /*** generic text handling            ***/
 /****************************************/
@@ -368,21 +431,26 @@ int drv_generic_text_init(const char *section, const char *driver)
     Driver = (char *) driver;
 
     /* init display framebuffer */
-    DisplayFB = (char *) malloc(DCOLS * DROWS * sizeof(char));
-    memset(DisplayFB, ' ', DROWS * DCOLS * sizeof(char));
+    DisplayFB = (char *) malloc(DCOLS * DROWS * sizeof(*DisplayFB));
+    memset(DisplayFB, ' ', DROWS * DCOLS * sizeof(*DisplayFB));
 
     /* init layout framebuffer */
     LROWS = 0;
     LCOLS = 0;
     LayoutFB = NULL;
+    L2D = NULL;
     drv_generic_text_resizeFB(DROWS, DCOLS);
 
     /* sanity check */
-    if (LayoutFB == NULL || DisplayFB == NULL) {
+    if (DisplayFB == NULL || LayoutFB == NULL || L2D == NULL) {
        error("%s: framebuffer could not be allocated: malloc() failed", Driver);
        return -1;
     }
 
+    /* init generic driver & register plugins */
+    drv_generic_blit = drv_generic_text_blit;
+    drv_generic_init();
+
     return 0;
 }
 
@@ -452,46 +520,22 @@ int drv_generic_text_greet(const char *msg1, const char *msg2)
 int drv_generic_text_draw(WIDGET * W)
 {
     WIDGET_TEXT *Text = W->data;
-    char *txt, *fb1, *fb2;
-    int row, col, col0, len, end;
+    char *txt;
+    int row, col, len;
 
     row = W->row;
     col = W->col;
     txt = Text->buffer;
     len = strlen(txt);
-    end = col + len;
 
     /* maybe grow layout framebuffer */
     drv_generic_text_resizeFB(row + 1, col + len);
 
-    fb1 = LayoutFB + row * LCOLS;
-    fb2 = DisplayFB + row * DCOLS;
-
     /* transfer new text into layout buffer */
-    memcpy(fb1 + col, txt, len);
+    memcpy(LayoutFB + row * LCOLS + col, txt, len);
 
-    if (row < DROWS) {
-       for (; col <= end && col < DCOLS; col++) {
-           int pos1, pos2, equal;
-           if (fb1[col] == fb2[col])
-               continue;
-           col0 = col;
-           for (pos1 = col, pos2 = pos1, col++, equal = 0; col <= end && col < DCOLS; col++) {
-               if (fb1[col] == fb2[col]) {
-                   /* If we find just one equal byte, we don't break, because this  */
-                   /* would require a goto, which takes several bytes, too. */
-                   if (GOTO_COST >= 0 && ++equal > GOTO_COST)
-                       break;
-               } else {
-                   pos2 = col;
-                   equal = 0;
-               }
-           }
-           memcpy(fb2 + pos1, fb1 + pos1, pos2 - pos1 + 1);
-           if (drv_generic_text_real_write)
-               drv_generic_text_real_write(row, col0, fb2 + pos1, pos2 - pos1 + 1);
-       }
-    }
+    /* blit it */
+    drv_generic_text_blit(row, col, 1, len);
 
     return 0;
 }
@@ -500,20 +544,26 @@ int drv_generic_text_draw(WIDGET * W)
 int drv_generic_text_quit(void)
 {
 
+    if (DisplayFB) {
+       free(DisplayFB);
+       DisplayFB = NULL;
+    }
+
     if (LayoutFB) {
        free(LayoutFB);
        LayoutFB = NULL;
     }
 
-    if (DisplayFB) {
-       free(DisplayFB);
-       DisplayFB = NULL;
+    if (L2D) {
+       free(L2D);
+       L2D = NULL;
     }
 
     if (BarFB) {
        free(BarFB);
        BarFB = NULL;
     }
+
     widget_unregister();
 
     return (0);
@@ -540,7 +590,6 @@ int drv_generic_text_icon_draw(WIDGET * W)
     static int icon_counter = 0;
     WIDGET_ICON *Icon = W->data;
     int row, col;
-    int l_idx, d_idx;
     int invalidate = 0;
     unsigned char ascii;
 
@@ -576,20 +625,17 @@ int drv_generic_text_icon_draw(WIDGET * W)
     /* use blank if invisible */
     ascii = Icon->visible ? Icon->ascii : ' ';
 
-    /* index into the two framebuffers */
-    l_idx = row * LCOLS + col;
-    d_idx = row * DCOLS + col;
-
     /* transfer icon into layout buffer */
-    LayoutFB[l_idx] = ascii;
+    LayoutFB[row * LCOLS + col] = ascii;
 
-    /* maybe send icon to the display */
-    if (row < DROWS && col < DCOLS && (DisplayFB[d_idx] != ascii || invalidate)) {
-       DisplayFB[d_idx] = ascii;
-       if (drv_generic_text_real_write)
-           drv_generic_text_real_write(row, col, DisplayFB + d_idx, 1);
+    /* ugly invalidation: change display FB to a wrong value so blit() will really send it */
+    if (invalidate) {
+       DisplayFB[row * DCOLS + col] = ~ascii;
     }
 
+    /* blit it */
+    drv_generic_text_blit(row, col, 1, 1);
+
     return 0;
 
 }
@@ -1005,7 +1051,7 @@ static void drv_generic_text_bar_define_chars(void)
 int drv_generic_text_bar_draw(WIDGET * W)
 {
     WIDGET_BAR *Bar = W->data;
-    int row, col, col0, len, res, max, val1, val2;
+    int row, col, len, res, max, val1, val2;
     int c, n, s;
     DIRECTION dir;
     STYLE style;
@@ -1077,34 +1123,15 @@ int drv_generic_text_bar_draw(WIDGET * W)
            /* maybe invalidate display framebuffer */
            if (BarFB[n].invalid) {
                BarFB[n].invalid = 0;
+               /* ugly invalidation: change display FB to a wrong value so blit() will really send it */
                DisplayFB[row * DCOLS + col] = ~LayoutFB[n];
            }
        }
     }
 
-    /* transfer differences to the display */
-    for (row = 0; row < DROWS; row++) {
-       for (col = 0; col < DCOLS; col++) {
-           int pos1, pos2, equal;
-           if (LayoutFB[row * LCOLS + col] == DisplayFB[row * DCOLS + col])
-               continue;
-           col0 = col;
-           for (pos1 = col, pos2 = pos1, col++, equal = 0; col < DCOLS; col++) {
-               if (LayoutFB[row * LCOLS + col] == DisplayFB[row * DCOLS + col]) {
-                   /* If we find just one equal byte, we don't break, because this  */
-                   /* would require a goto, which takes several bytes, too. */
-                   if (++equal > GOTO_COST)
-                       break;
-               } else {
-                   pos2 = col;
-                   equal = 0;
-               }
-           }
-           memcpy(DisplayFB + row * DCOLS + pos1, LayoutFB + row * LCOLS + pos1, pos2 - pos1 + 1);
-           if (drv_generic_text_real_write)
-               drv_generic_text_real_write(row, col0, DisplayFB + row * DCOLS + pos1, pos2 - pos1 + 1);
-       }
-    }
+    /* blit whole layout FB */
+    drv_generic_text_blit(0, 0, LROWS, LCOLS);
+
 
     return 0;
 
index 61e932061c779364a84209070d5955b64b57bbe6..1ba9b1b4ec221ccf18ab96c209559e63a0d46269 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_text.h,v 1.20 2006/01/30 05:47:38 reinelt Exp $
+/* $Id: drv_generic_text.h,v 1.21 2006/07/31 03:48:09 reinelt Exp $
  *
  * generic driver helper for text-based displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_text.h,v $
+ * Revision 1.21  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.20  2006/01/30 05:47:38  reinelt
  * graphic subsystem changed to full-color RGBA
  *
 #define _DRV_GENERIC_TEXT_H_
 
 
-#include <termios.h>
+#include "drv_generic.h"
 #include "widget.h"
 
-
-extern int DROWS, DCOLS;       /* display size */
-extern int XRES, YRES;         /* pixel width/height of one char  */
 extern int CHARS, CHAR0;       /* number of user-defineable characters, ASCII of first char */
 extern int ICONS;              /* number of user-defineable characters reserved for icons */
 extern int GOTO_COST;          /* number of bytes a goto command requires */
index 123a14d577286996f59a6435725164a4e1451d54..884eb8451f91c2ddbca34610bab617743075ce1e 100644 (file)
@@ -474,7 +474,6 @@ Widget BusyBar {
     expression2 proc_stat::cpu('system', 500)
     length 10  
     direction 'E'
-    style 'H'
     update tack
 }
 
@@ -1052,14 +1051,14 @@ Layout testMySQL {
 #Display 'BWCT'
 #Display 'Image'
 #Display 'Trefon'
-#Display 'LCD2USB'
+Display 'LCD2USB'
 #Display 'LPH7508-serdisplib'
-Display 'LPH7508'
+#Display 'LPH7508'
 #Display 'ctinclud'
 
-#Layout 'Default'
+Layout 'Default'
 #Layout 'TestLayer'
-Layout 'TestImage'
+#Layout 'TestImage'
 #Layout 'L8x2'
 #Layout 'L16x1'
 #Layout 'L16x2'
index b2f924bfa24164b1099994636a1be82765b54b06..00f26ee2569e88d02c2a8fe17b663a8e628413e2 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -1,4 +1,4 @@
-/* $Id: plugin.c,v 1.43 2006/07/30 11:29:02 lfcorreia Exp $
+/* $Id: plugin.c,v 1.44 2006/07/31 03:48:09 reinelt Exp $
  *
  * plugin handler for the Evaluator
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: plugin.c,v $
+ * Revision 1.44  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.43  2006/07/30 11:29:02  lfcorreia
  * Make changes suggested by Michael, only one init function is needed
  *
@@ -286,7 +289,6 @@ int plugin_init(void)
     plugin_init_cfg();
     plugin_init_math();
     plugin_init_string();
-    plugin_init_strupper();
     plugin_init_test();
     plugin_init_time();
 
index 7684f678fda807d3d08307ef6dafba940bd31706..1aeb478cb918de25cd2395885c8282365b9817c2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: plugin_string.c,v 1.10 2006/07/30 11:29:02 lfcorreia Exp $
+/* $Id: plugin_string.c,v 1.11 2006/07/31 03:48:09 reinelt Exp $
  *
  * string plugin
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: plugin_string.c,v $
+ * Revision 1.11  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.10  2006/07/30 11:29:02  lfcorreia
  * Make changes suggested by Michael, only one init function is needed
  *
@@ -77,6 +80,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "debug.h"
 #include "plugin.h"
@@ -89,29 +93,17 @@ static void my_strlen(RESULT * result, RESULT * arg1)
 }
 
 /* 'upcase' function (shamelessly stolen from plugin_sample.c)*/
-/* takes one argument, a string */
 /* returns the string in upper case letters */
-
-static void my_upcase(RESULT * result, RESULT * arg1)
+static void my_strupper(RESULT * result, RESULT * arg1)
 {
     char *value, *p;
 
-    /* create a local copy of the argument */
-    /* Do *NOT* try to modify the original string! */
     value = strdup(R2S(arg1));
 
-    /* process the string */
     for (p = value; *p != '\0'; p++)
        *p = toupper(*p);
 
-    /* store result */
-    /* when called with R_STRING, it assumes the */
-    /* next parameter to be a pointer to a string */
-    /* 'value' is already a char*, so use 'value', not '&value' */
     SetResult(&result, R_STRING, value);
-
-    /* free local copy again */
-    /* Note that SetResult() makes its own string copy  */
     free(value);
 }
 
@@ -120,14 +112,11 @@ int plugin_init_string(void)
 
     /* register some basic string functions */
     AddFunction("strlen", 1, my_strlen);
-
-    /* register my UPPERCASE transforming function */
-    AddFunction("strupper", 1, my_upcase);
-
+    AddFunction("strupper", 1, my_strupper);
     return 0;
 }
 
 void plugin_exit_string(void)
 {
     /* empty */
-}
\ No newline at end of file
+}
index 0190acd4ff3c65d017b9e7e50f30a561cc93227a..4c6b05594667196567a727d508c8a53e99a11c61 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: widget_timer.c,v 1.2 2006/02/25 13:36:33 geronet Exp $
+/* $Id: widget_timer.c,v 1.3 2006/07/31 03:48:09 reinelt Exp $
  *
  * timer widget handling
  *
@@ -21,6 +21,9 @@
  *
  *
  * $Log: widget_timer.c,v $
+ * Revision 1.3  2006/07/31 03:48:09  reinelt
+ * preparations for scrolling
+ *
  * Revision 1.2  2006/02/25 13:36:33  geronet
  * updated indent.sh, applied coding style
  *
@@ -109,17 +112,17 @@ int widget_timer_init(WIDGET * Self)
     memset(Timer, 0, sizeof(WIDGET_TIMER));
 
     /* get raw expressions (we evaluate them ourselves) */
-    Timer->expression = cfg_get_raw(section, "axpression", NULL);
+    Timer->expression = cfg_get_raw(section, "expression", NULL);
     Timer->update_expr = cfg_get_raw(section, "update", "100");
     Timer->active_expr = cfg_get_raw(section, "active", "1");
 
     /* sanity checks */
     if (Timer->expression == NULL || *Timer->expression == '\0') {
-       error("Timer %s has no expression, using '1'", Self->name);
+       error("Timer '%s' has no expression, using '1'", Self->name);
        Timer->expression = "1";
     }
     if (Timer->update_expr == NULL || *Timer->update_expr == '\0') {
-       error("Timer %s has no update, using '100'", Self->name);
+       error("Timer '%s' has no update, using '100'", Self->name);
        Timer->update_expr = "100";
     }