diff options
author | mrwastl <mrwastl@users.sourceforge.net> | 2010-02-25 21:14:35 +0100 |
---|---|---|
committer | mrwastl <mrwastl@users.sourceforge.net> | 2010-02-25 21:14:35 +0100 |
commit | 0613fcc321f97f9a80dfb1caf5ed5eea1443d9f0 (patch) | |
tree | dce145b7e6dec4e8c199ebaf96c3721c76331a59 | |
parent | 10ab31fa86dbf9875b5f6baa6ac59fefaaf86be3 (diff) | |
download | graphlcd-base-0613fcc321f97f9a80dfb1caf5ed5eea1443d9f0.tar.gz graphlcd-base-0613fcc321f97f9a80dfb1caf5ed5eea1443d9f0.tar.bz2 |
added support for option BRIGHTNESS (for graphlcd-dimming support); added correct intialisation for self-emitting displays (eg. OLEDs); added missing check for ancient serdisplib-version
-rw-r--r-- | glcddrivers/serdisp.c | 57 | ||||
-rw-r--r-- | glcddrivers/serdisp.h | 4 |
2 files changed, 49 insertions, 12 deletions
diff --git a/glcddrivers/serdisp.c b/glcddrivers/serdisp.c index d1bf6f1..7521105 100644 --- a/glcddrivers/serdisp.c +++ b/glcddrivers/serdisp.c @@ -7,7 +7,7 @@ * This file is released under the GNU General Public License. Refer * to the COPYING file distributed with this package. * - * (c) 2003-2005 Wolfgang Astleitner <mrwastl AT users.sourceforge.net> + * (c) 2003-2010 Wolfgang Astleitner <mrwastl AT users.sourceforge.net> */ #include <stdio.h> @@ -30,6 +30,7 @@ #define FEATURE_ROTATE 0x04 #define SD_COL_BLACK 0xFF000000 +#define SD_COL_WHITE 0xFFFFFFFF namespace GLCD { @@ -50,6 +51,8 @@ cDriverSerDisp::~cDriverSerDisp(void) int cDriverSerDisp::Init(void) { char* errmsg; // error message returned by dlerror() + int bg_forced = 0; /* bg-colour set through graphlcd option 'BGColour' */ + int fg_forced = 0; /* fg-colour set through graphlcd option 'FGColour' */ std::string controller; std::string optionstring = ""; @@ -161,6 +164,12 @@ int cDriverSerDisp::Init(void) config->name.c_str(), "serdisp_setoption", errmsg); return -1; } + fp_serdisp_getoption = (long int (*)(void*, const char*, int*)) dlsym(sdhnd, "serdisp_getoption"); + if ( (errmsg = dlerror()) != NULL ) { // should not happen + syslog(LOG_ERR, "%s: error: cannot load symbol %s. Err:%s (cDriver::Init)\n", + config->name.c_str(), "serdisp_getoption", errmsg); + return -1; + } } /* >= 1.96 */ } @@ -223,7 +232,6 @@ int cDriverSerDisp::Init(void) // done loading all required symbols - // setting up the display width = 0; height = 0; @@ -239,9 +247,11 @@ int cDriverSerDisp::Init(void) } else if (config->options[i].name == "FGColour") { fg_colour = strtoul(config->options[i].value.c_str(), (char **)NULL, 0); fg_colour |= 0xFF000000L; /* force alpha to 0xFF */ + fg_forced = 1; } else if (config->options[i].name == "BGColour") { bg_colour = strtoul(config->options[i].value.c_str(), (char **)NULL, 0); bg_colour |= 0xFF000000L; /* force alpha to 0xFF */ + bg_forced = 1; } } @@ -309,6 +319,14 @@ int cDriverSerDisp::Init(void) return -1; } + // self-emitting displays (like OLEDs): default background colour => black + if ( supports_options && fp_serdisp_isoption(dd, "SELFEMITTING") && (fp_serdisp_getoption(dd, "SELFEMITTING", 0)) ) { + if (!bg_forced) + bg_colour = SD_COL_BLACK; /* set background colour to black */ + if (!fg_forced) + fg_colour = SD_COL_WHITE; /* set foreground colour to white */ + } + width = config->width; if (width <= 0) width = fp_serdisp_getwidth(dd); @@ -343,6 +361,8 @@ int cDriverSerDisp::Init(void) *oldConfig = *config; + // set initial brightness + SetBrightness(config->brightness); // clear display Clear(); @@ -406,16 +426,25 @@ int cDriverSerDisp::CheckSetup() update = true; } + if (config->brightness != oldConfig->brightness) + { + oldConfig->brightness = config->brightness; + SetBrightness(config->brightness); + update = true; + } + /* driver dependend options */ - for (unsigned int i = 0; i < config->options.size(); i++) { - std::string optionname = config->options[i].name; - if (optionname != "UpsideDown" && optionname != "Contrast" && - optionname != "Backlight" && optionname != "Invert") { - - if ( fp_serdisp_isoption(dd, optionname.c_str()) == 1 ) /* if == 1: option is existing AND r/w */ - fp_serdisp_setoption(dd, optionname.c_str(), strtol(config->options[i].value.c_str(), NULL, 0)); - oldConfig->options[i] = config->options[i]; - update = true; + if ( supports_options ) { + for (unsigned int i = 0; i < config->options.size(); i++) { + std::string optionname = config->options[i].name; + if (optionname != "UpsideDown" && optionname != "Contrast" && + optionname != "Backlight" && optionname != "Invert") { + + if ( fp_serdisp_isoption(dd, optionname.c_str()) == 1 ) /* if == 1: option is existing AND r/w */ + fp_serdisp_setoption(dd, optionname.c_str(), strtol(config->options[i].value.c_str(), NULL, 0)); + oldConfig->options[i] = config->options[i]; + update = true; + } } } @@ -464,4 +493,10 @@ void cDriverSerDisp::Refresh(bool refreshAll) fp_serdisp_update(dd); } +void cDriverSerDisp::SetBrightness(unsigned int percent) +{ + if ( supports_options && (fp_serdisp_isoption(dd, "BRIGHTNESS") == 1) ) /* if == 1: option is existing AND r/w */ + fp_serdisp_setoption(dd, "BRIGHTNESS", (long)percent); +} + } // end of namespace diff --git a/glcddrivers/serdisp.h b/glcddrivers/serdisp.h index ddd7827..c84874e 100644 --- a/glcddrivers/serdisp.h +++ b/glcddrivers/serdisp.h @@ -7,7 +7,7 @@ * This file is released under the GNU General Public License. Refer * to the COPYING file distributed with this package. * - * (c) 2003-2005 Wolfgang Astleitner <mrwastl AT users.sourceforge.net> + * (c) 2003-2010 Wolfgang Astleitner <mrwastl AT users.sourceforge.net> */ #ifndef _GLCDDRIVERS_SERDISP_H_ @@ -53,6 +53,7 @@ private: int (*fp_serdisp_feature) (void* dd, int feature, int value); int (*fp_serdisp_isoption) (void* dd, const char* optionname); void (*fp_serdisp_setoption) (void* dd, const char* optionname, long value); + long (*fp_serdisp_getoption) (void* dd, const char* optionname, int* typesize); int (*fp_serdisp_getwidth) (void* dd); int (*fp_serdisp_getheight) (void* dd); void (*fp_serdisp_quit) (void* dd); @@ -71,6 +72,7 @@ public: virtual void Clear(); virtual void Set8Pixels(int x, int y, unsigned char data); virtual void Refresh(bool refreshAll = false); + virtual void SetBrightness(unsigned int percent); }; #endif |