From 71c30356118bd392f7cf97256e8dc834d9acb33b Mon Sep 17 00:00:00 2001 From: ddouthitt Date: Thu, 27 Sep 2001 23:23:42 +0000 Subject: [PATCH] * Changed MatrixOrbital driver to support the traditional -t option (for type: 20x2, 20x4, 20x6) etc. * Fixed bug that appeared when using a size larger than 80 characters (20x4): framebuffer was allocated before size was known! Drivers should NOT look for framebuffer to be allocated before they start - but 80 characters are there anyway (for now). --- server/drivers/MtxOrb.c | 104 ++++++++++++++++++++++++++-------------- server/drivers/lcd.c | 12 +++-- 2 files changed, 76 insertions(+), 40 deletions(-) diff --git a/server/drivers/MtxOrb.c b/server/drivers/MtxOrb.c index 8225b84..3d1eb4b 100644 --- a/server/drivers/MtxOrb.c +++ b/server/drivers/MtxOrb.c @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H # include "config.h" @@ -241,43 +242,74 @@ MtxOrb_init (lcd_logical_driver * driver, char *args) p = argv[i]; //printf("Arg(%i): %s\n", i, argv[i]); - if (strcmp (p, "-d") == 0) { - if (i + 1 > argc) { - fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); - return -1; + if (*p == '-') { + p++; + switch (*p) { + case 'd': + if (i + 1 > argc) { + fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); + return -1; + } + strcpy (device, argv[++i]); + break; + case 'c': + if (i + 1 > argc) { + fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); + return -1; + } + contrast = MtxOrb_set_contrast (argv[++i]); + break; + case 's': + if (i + 1 > argc) { + fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); + return -1; + } + speed = MtxOrb_get_speed (argv[++i]); + break; + case 'h': + MtxOrb_usage(); + return -1; + break; + case 't': + if (i + 1 > argc) { + fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); + return -1; + } + i++; + p = argv[i]; + + if (isdigit((unsigned int) *p) && isdigit((unsigned int) *(p+1))) { + int wid, hgt; + + wid = ((*p - '0') * 10) + (*(p+1) - '0'); + p += 2; + + if (*p != 'x') + break; + + p++; + if (!isdigit((unsigned int) *p)) + break; + + hgt = (*p - '0'); + + MtxOrb->wid = wid; + MtxOrb->hgt = hgt; + } + break; + case 'b': + if (i + 1 > argc) { + fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); + return -1; + } + i++; + MtxOrb_type = MtxOrb_set_type(argv[i]); + break; + default: + printf ("Invalid parameter: %s\n", argv[i]); + break; } - strcpy (device, argv[++i]); - - } else if (strcmp (argv[i], "-c") == 0) { - if (i + 1 > argc) { - fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); - return -1; - } - contrast = MtxOrb_set_contrast (argv[++i]); - - } else if (0 == strcmp (argv[i], "-s") || 0 == strcmp (argv[i], "--speed")) { - if (i + 1 > argc) { - fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); - return -1; - } - speed = MtxOrb_get_speed (argv[++i]); - - } else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) { - MtxOrb_usage(); - return -1; - - } else if (0 == strcmp (argv[i], "-t") || 0 == strcmp (argv[i], "--type")) { - if (i + 1 > argc) { - fprintf (stderr, "MtxOrb_init: %s requires an argument\n", argv[i]); - return -1; - } - i++; - MtxOrb_type = MtxOrb_set_type(argv[i]); - - } else { - printf ("Invalid parameter: %s\n", argv[i]); } - } #endif @@ -331,7 +363,7 @@ MtxOrb_init (lcd_logical_driver * driver, char *args) if (!driver->framebuf) { syslog(LOG_ERR, "no frame buffer! exiting driver init..."); - driver->close (); + MtxOrb_close (); return -1; } diff --git a/server/drivers/lcd.c b/server/drivers/lcd.c index 8f4b184..3fd6106 100644 --- a/server/drivers/lcd.c +++ b/server/drivers/lcd.c @@ -420,7 +420,7 @@ int lcd_add_driver (char *driver, char *args) { int i; - char buf[64]; + char buf[80]; int (*init_driver) (); lcd_logical_driver *ptr = NULL; @@ -445,7 +445,13 @@ lcd_add_driver (char *driver, char *args) // Default settings for the driver... lcd_drv_init(add, NULL); - // Allocate space for a framebuffer... + memset(buf, '\0', sizeof(buf)); + add->framebuf = buf; // *** HACK: makes drivers think framebuffer is allocated! + + i = init_driver (add, args); + + // Allocate space for a framebuffer... *AFTER* the driver + // has a chance to initialize height and width!! if ((add->framebuf = malloc (add->wid * add->hgt)) == NULL) { snprintf (buf, sizeof(buf), "couldn't allocate framebuffer for driver \"%s\"", driver); syslog (LOG_ERR, buf); @@ -454,8 +460,6 @@ lcd_add_driver (char *driver, char *args) } memset (add->framebuf, ' ', (add->wid * add->hgt)); - i = init_driver (add, args); - // Now patch up the returned driver structure // before returning lcd_drv_patch_init (add); // patches drivers that think NULL is okay...