From 1985906bea97a015d6e035ebb3f91b6e4f94aff1 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Sat, 19 Jan 2013 03:00:05 +1000 Subject: TDISP cleanup Seperate High level and low level code better Implement tdispControl Cleanup --- src/tdisp/tdisp.c | 202 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/tdisp/tdisp.c b/src/tdisp/tdisp.c index 3556e031..8ef7e5c4 100644 --- a/src/tdisp/tdisp.c +++ b/src/tdisp/tdisp.c @@ -1,85 +1,117 @@ -/* - ChibiOS/GFX - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX 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 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX 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, see . -*/ - -/** - * @file src/tdisp/tdisp.c - * @brief TDISP Driver code. - * - * @addtogroup TDISP - * @{ - */ -#include "ch.h" -#include "hal.h" -#include "gfx.h" - -#if GFX_USE_TDISP || defined(__DOXYGEN__) - -static uint8_t _displaycontrol; - -bool_t tdispInit(void) { - bool_t ret; - - ret = tdisp_lld_init(); - - return ret; -} - -void tdispControl(uint16_t what, void *value) { - tdisp_lld_control(what, value); -} - -void tdispClear(void) { - tdisp_lld_clear(); -} - -void tdispHome(void) { - tdisp_lld_home(); -} - -void tdispCreateChar(uint8_t address, char *charmap) { - tdisp_lld_create_char(address, charmap); -} - -void tdispSetCursor(coord_t col, coord_t row) { - tdisp_lld_set_cursor(col, row); -} - -void tdispDrawChar(char c) { - tdisp_lld_write_data(c); -} - -void tdispDrawString(char *s) { - while(*s) - tdispDrawChar(*s++); -} - -void tdispDrawCharLocation(coord_t col, coord_t row, char c) { - tdispSetCursor(col, row); - tdispDrawChar(c); -} - -void tdispDrawStringLocation(coord_t col, coord_t row, char *s) { - tdispSetCursor(col, row); - tdispDrawString(s); -} - -#endif /* GFX_USE_TDISP */ -/** @} */ - +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX 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, see . +*/ + +/** + * @file src/tdisp/tdisp.c + * @brief TDISP Driver code. + * + * @addtogroup TDISP + * @{ + */ +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if GFX_USE_TDISP || defined(__DOXYGEN__) + +#include "tdisp/lld/tdisp_lld.h" + +#if TDISP_NEED_MULTITHREAD + #if !CH_USE_MUTEXES + #error "TDISP: CH_USE_MUTEXES must be defined in chconf.h because TDISP_NEED_MULTITHREAD is defined" + #endif + + static Mutex tdispMutex; + + #define MUTEX_INIT() chMtxInit(&tdispMutex) + #define MUTEX_ENTER() chMtxLock(&tdispMutex) + #define MUTEX_LEAVE() chMtxUnlock() + +#else + + #define MUTEX_INIT() + #define MUTEX_ENTER() + #define MUTEX_LEAVE() + +#endif + +bool_t tdispInit(void) { + bool_t res; + + MUTEX_INIT(); + + MUTEX_ENTER(); + res = tdisp_lld_init(); + MUTEX_LEAVE(); + + return res; +} + +void tdispClear(void) { + MUTEX_ENTER(); + tdisp_lld_clear(); + MUTEX_LEAVE(); +} + +void tdispHome(void) { + MUTEX_ENTER(); + tdisp_lld_set_cursor(0, 0); + MUTEX_LEAVE(); +} + +void tdispSetCursor(coord_t col, coord_t row) { + /* Keep the input range valid */ + if (row >= TDISP.rows) + row = TDISP.rows - 1; + MUTEX_ENTER(); + tdisp_lld_set_cursor(col, row); + MUTEX_LEAVE(); +} + +void tdispCreateChar(uint8_t address, uint8_t *charmap) { + /* make sure we don't write somewhere we're not supposed to */ + if (address < TDISP.maxCustomChars) { + MUTEX_ENTER(); + tdisp_lld_create_char(address, charmap); + MUTEX_LEAVE(); + } +} + +void tdispDrawChar(char c) { + MUTEX_ENTER(); + tdisp_lld_draw_char(c); + MUTEX_LEAVE(); +} + +void tdispDrawString(char *s) { + MUTEX_ENTER(); + while(*s) + tdisp_lld_draw_char(*s++); + MUTEX_LEAVE(); +} + +void tdispControl(uint16_t what, void *value) { + MUTEX_ENTER(); + tdisp_lld_control(what, value); + MUTEX_LEAVE(); +} + +#endif /* GFX_USE_TDISP */ +/** @} */ -- cgit v1.2.3