X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Flcd_text.c;h=ff480776a3429ea17528534d436116be868e4eb0;hb=e8b0472be10fba4ca6baa62d8d483db90e28c06e;hp=8e519280fa570055b25f2b6a93bbb076535bfe20;hpb=791e167e053bdd9250d34a9a5ccae6ccde4d6679;p=bertos.git diff --git a/bertos/drv/lcd_text.c b/bertos/drv/lcd_text.c index 8e519280..ff480776 100644 --- a/bertos/drv/lcd_text.c +++ b/bertos/drv/lcd_text.c @@ -27,75 +27,42 @@ * the GNU General Public License. * * Copyright 2005 Develer S.r.l. (http://www.develer.com/) - * + * All Rights Reserved. * --> * * \brief Generic text LCD driver (impl.). * - * \version $Id$ - * \author Bernardo Innocenti + * \author Bernie Innocenti * \author Stefano Fedrigo */ -/*#* - *#* $Log$ - *#* Revision 1.4 2006/09/20 20:02:43 marco - *#* Replaced ISLISTEMPTY with LIST_EMPTY - *#* - *#* Revision 1.3 2006/07/19 12:56:25 bernie - *#* Convert to new Doxygen style. - *#* - *#* Revision 1.2 2006/02/24 00:27:14 bernie - *#* Use new naming convention for list macros. - *#* - *#* Revision 1.1 2005/11/04 18:00:42 bernie - *#* Import into DevLib. - *#* - *#* Revision 1.11 2005/06/14 14:43:43 bernie - *#* Add DevLib headers. - *#* - *#* Revision 1.10 2005/06/06 17:41:57 batt - *#* Add lcd_layerSet function. - *#* - *#* Revision 1.9 2005/06/01 16:40:07 batt - *#* Remove debug string. - *#* - *#* Revision 1.8 2005/06/01 16:38:04 batt - *#* Adapt to changes in mware/list.h. - *#* - *#* Revision 1.7 2005/06/01 10:45:22 batt - *#* lcd_setAddr(): Bugfix boundary condition; Misc cleanup. - *#* - *#* Revision 1.6 2005/06/01 10:36:23 batt - *#* Layer: Rename member variables and Doxygenize. - *#* - *#* Revision 1.5 2005/05/27 11:05:58 batt - *#* Do not write on lcd if layer is hidden. - *#*/ - #include "lcd_text.h" #include "lcd_hd44.h" -#include // timer_delay() -#include // _formatted_write() -#include // LIST_EMPTY() + #include // BV() #include +#include // timer_delay() + +#include // _formatted_write() +#include // LIST_EMPTY() + #include // strlen() /** Maximum number of layers. */ #define LCD_LAYERS 6 -#if CONFIG_KERNEL +#if CONFIG_KERN + #include /** Semaphore to arbitrate access to the display. */ static struct Semaphore lcd_semaphore; #define LOCK_LCD sem_obtain(&lcd_semaphore) #define UNLOCK_LCD sem_release(&lcd_semaphore) -#else /* !CONFIG_KERNEL */ +#else /* !CONFIG_KERN */ #define LOCK_LCD do {} while (0) #define UNLOCK_LCD do {} while (0) -#endif /* !CONFIG_KERNEL */ +#endif /* !CONFIG_KERN */ DECLARE_LIST_TYPE(Layer); @@ -118,13 +85,13 @@ static lcdpos_t lcd_CursorAddr; void lcd_setAddr(Layer *layer, lcdpos_t addr) { /* Sanity check: wrap around to display limits */ - while (addr >= LCD_ROWS * LCD_COLS) - addr -= LCD_ROWS * LCD_COLS; + while (addr >= CONFIG_LCD_ROWS * CONFIG_LCD_COLS) + addr -= CONFIG_LCD_ROWS * CONFIG_LCD_COLS; layer->addr = addr; } -#if CONFIG_KERNEL +#if CONFIG_KERN void lcd_lock(void) { @@ -137,7 +104,7 @@ void lcd_unlock(void) UNLOCK_LCD; } -#endif /* CONFIG_KERNEL */ +#endif /* CONFIG_KERN */ /** @@ -157,7 +124,7 @@ static void lcd_putCharUnlocked(char c, Layer *layer) layer->buf[addr] = c; /* Move to next character */ - if (++layer->addr >= LCD_COLS * LCD_ROWS) + if (++layer->addr >= CONFIG_LCD_COLS * CONFIG_LCD_ROWS) layer->addr = 0; /* Do not write on LCD if layer is hidden. */ @@ -199,7 +166,7 @@ void lcd_layerSet(Layer *layer, char c) LOCK_LCD; lcd_setAddr(layer, 0); - for (i = 0; i < LCD_COLS * LCD_ROWS; i++) + for (i = 0; i < CONFIG_LCD_COLS * CONFIG_LCD_ROWS; i++) lcd_putCharUnlocked(c, layer); UNLOCK_LCD; } @@ -217,7 +184,7 @@ void lcd_clearLine(Layer *layer, int y) LOCK_LCD; lcd_setAddr(layer, LCD_POS(0, y)); - for (i = 0; i < LCD_COLS; i++) + for (i = 0; i < CONFIG_LCD_COLS; i++) lcd_putCharUnlocked(0, layer); UNLOCK_LCD; } @@ -275,7 +242,7 @@ int lcd_vprintf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, v * NOTE: calculating the string lenght BEFORE it gets * printf()-formatted. Real lenght may differ. */ - pad = (LCD_COLS - strlen(format)) / 2; + pad = (CONFIG_LCD_COLS - strlen(format)) / 2; while (pad--) lcd_putCharUnlocked(' ', layer); } @@ -283,7 +250,7 @@ int lcd_vprintf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, v len = _formatted_write(format, (void (*)(char, void *))lcd_putCharUnlocked, layer, ap); if (mode & (LCD_FILL | LCD_CENTER)) - while (layer->addr % LCD_COLS) + while (layer->addr % CONFIG_LCD_COLS) lcd_putCharUnlocked(' ', layer); /* @@ -354,7 +321,7 @@ Layer *lcd_newLayer(char pri) layer = (Layer *)LIST_HEAD(&lcd_FreeLayers); layer->addr = 0; - memset(layer->buf, 0, LCD_ROWS * LCD_COLS); + memset(layer->buf, 0, CONFIG_LCD_ROWS * CONFIG_LCD_COLS); lcd_enqueueLayer(layer, pri); @@ -372,7 +339,7 @@ static void lcd_refresh(void) lcdpos_t addr; Layer *l; - for (addr = 0; addr < LCD_ROWS * LCD_COLS; ++addr) + for (addr = 0; addr < CONFIG_LCD_ROWS * CONFIG_LCD_COLS; ++addr) { FOREACH_NODE(l, &lcd_Layers) { @@ -422,7 +389,7 @@ void lcd_deleteLayer(Layer *layer) lcdpos_t addr; /* Repair damage on underlaying layers */ - for (addr = 0; addr < LCD_ROWS * LCD_COLS; ++addr) + for (addr = 0; addr < CONFIG_LCD_ROWS * CONFIG_LCD_COLS; ++addr) { /* If location was covered by us */ if (layer->buf[addr]) @@ -470,6 +437,10 @@ static void lcd_setDefLayer(Layer *layer) #include void lcd_init(void) { + #if CONFIG_KERN + sem_init(&lcd_semaphore); + #endif + int i; LIST_INIT(&lcd_Layers); @@ -484,16 +455,4 @@ void lcd_init(void) lcd_setCursor(0); } -#if CONFIG_TEST -void lcd_test(void) -{ - int i; - - for (i = 0; i < LCD_ROWS * LCD_COLS; ++i) - { - lcd_putCharUnlocked('0' + (i % 10), lcd_DefLayer); - timer_delay(100); - } -} -#endif /* CONFIG_TEST */