diff options
author | Andrew Hannam <andrewh@inmarket.com.au> | 2012-08-24 23:31:07 -0700 |
---|---|---|
committer | Andrew Hannam <andrewh@inmarket.com.au> | 2012-08-24 23:31:07 -0700 |
commit | fea7f3a67fb5a477b56039a6ad3bc3ae9e2db9a2 (patch) | |
tree | 7d4bd73bf31072d822fff365f6c2cf840979ba9e /src | |
parent | 1176b9738cbea9e3c6ce48f9be1be89f23f2e34e (diff) | |
parent | 8fd1de6ef5a806ccc6e23ba1ba18dfc06b6fbbde (diff) | |
download | uGFX-fea7f3a67fb5a477b56039a6ad3bc3ae9e2db9a2.tar.gz uGFX-fea7f3a67fb5a477b56039a6ad3bc3ae9e2db9a2.tar.bz2 uGFX-fea7f3a67fb5a477b56039a6ad3bc3ae9e2db9a2.zip |
Merge pull request #4 from Tectu/master
Get latest updates
Diffstat (limited to 'src')
-rw-r--r-- | src/console.c | 355 | ||||
-rw-r--r-- | src/gdisp.c | 39 | ||||
-rw-r--r-- | src/touchpad.c | 12 |
3 files changed, 221 insertions, 185 deletions
diff --git a/src/console.c b/src/console.c index e5f2371c..7805ff2e 100644 --- a/src/console.c +++ b/src/console.c @@ -1,175 +1,180 @@ -/*
- ChibiOS/RT - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- This file is part of ChibiOS-LCD-Driver.
-
- ChibiOS-LCD-Driver 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-LCD-Driver 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 <http://www.gnu.org/licenses/>.
-*/
-
-#include "ch.h"
-#include "hal.h"
-
-#include "gdisp.h"
-#include "gdisp_fonts.h"
-#include "console.h"
-
-#if defined(GDISP_NEED_SCROLL)
-
-/*
- * Interface implementation. The interface is write only
- */
-static size_t writes(void *ip, const uint8_t *bp, size_t n) {
- return lcdConsoleWrite((GLCDConsole *)ip, bp, n);
-}
-
-static size_t reads(void *ip, uint8_t *bp, size_t n) {
- (void)ip;
- (void)bp;
- (void)n;
-
- return 0;
-}
-
-static msg_t put(void *ip, uint8_t b) {
- return lcdConsolePut((GLCDConsole *)ip, (char)b);
-}
-
-static msg_t get(void *ip) {
- (void)ip;
-
- return RDY_OK;
-}
-
-static msg_t putt(void *ip, uint8_t b, systime_t timeout) {
- (void)timeout;
-
- /* TODO: handle timeout */
-
- return lcdConsolePut((GLCDConsole *)ip, (char)b);
-}
-
-static msg_t gett(void *ip, systime_t timeout) {
- (void)ip;
- (void)timeout;
-
- return RDY_OK;
-}
-
-static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) {
- (void)time;
-
- return lcdConsoleWrite((GLCDConsole *)ip, bp, n);
-}
-
-static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) {
- (void)ip;
- (void)bp;
- (void)n;
- (void)time;
-
- return 0;
-}
-
-static uint16_t getflags(void *ip) {
- _chn_get_and_clear_flags_impl(ip);
-}
-
-static const struct GLCDConsoleVMT vmt = {
- writes, reads, put, get,
- putt, gett, writet, readt,
- getflags
-};
-
-
-msg_t lcdConsoleInit(GLCDConsole *console, coord_t x0, coord_t y0, coord_t width, coord_t height, font_t font, pixel_t bkcolor, pixel_t color) {
- const uint8_t* ptr;
- uint16_t chi;
- uint16_t x,y;
-
- console->vmt = &vmt;
- /* read font, get height */
- console->fy = font->height;
-
- /* calculate the size of the console as an integer multiple of characters height*/
- console->sx = width;
- console->sy = (((int16_t)(height/console->fy))-1)*console->fy;
-
- console->cx = 0;
- console->cy = 0;
- console->x0 = x0;
- console->y0 = y0;
-
- console->bkcolor = bkcolor;
- console->color = color;
-
- console->font = font;
-
- gdispFillArea(x0, y0, x0 + width, y0 + height, console->bkcolor);
- return RDY_OK;
-}
-
-msg_t lcdConsolePut(GLCDConsole *console, char c) {
- uint8_t width;
-
- if(c == '\n') {
- /* clear the text at the end of the line */
- if(console->cx < console->sx)
- gdispFillArea(console->x0 + console->cx, console->y0 + console->cy,
- console->x0 + console->sx, console->y0 + console->cy + console->fy,
- console->bkcolor);
- console->cx = 0;
- console->cy += console->fy;
- } else if(c == '\r') {
- /* TODO: work backwards through the buffer to the start of the current line */
- //console->cx = 0;
- } else {
- width = _getCharWidth(console->font, c);
- if((console->cx + width) >= console->sx) {
- /* clear the text at the end of the line */
- gdispFillArea(console->x0 + console->cx, console->y0 + console->cy,
- console->x0 + console->cx + width, console->y0 + console->cy + console->fy,
- console->bkcolor);
- console->cx = 0;
- console->cy += console->fy;
- }
-
- if((console->cy > console->sy)) {
- /* scroll the screen */
- gdispVerticalScroll(console->x0, console->y0, console->x0 + console->sx,
- console->y0 + console->sy + console->fy, console->fy, console->bkcolor);
- /* reset the cursor */
- console->cx = 0;
- console->cy = console->sy;
- }
-
- gdispDrawChar(console->x0 + console->cx, console->y0 + console->cy, c,
- console->font, console->color);
-
- /* update cursor */
- console->cx += width;
- }
- return RDY_OK;
-}
-
-msg_t lcdConsoleWrite(GLCDConsole *console, char *bp, size_t n) {
- size_t i;
- for(i = 0; i < n; i++)
- lcdConsolePut(console, bp[i]);
-
- return RDY_OK;
-}
-
-
-#endif /* GDISP_NEED_SCROLL */
+/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu <joel@unormal.org> + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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-LCD-Driver 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 <http://www.gnu.org/licenses/>. +*/ + +#include "ch.h" +#include "hal.h" + +#include "gdisp.h" +#include "console.h" + +/* + * Interface implementation. The interface is write only + */ +static size_t writes(void *ip, const uint8_t *bp, size_t n) { + return lcdConsoleWrite((GLCDConsole *)ip, bp, n); +} + +static size_t reads(void *ip, uint8_t *bp, size_t n) { + (void)ip; + (void)bp; + (void)n; + + return 0; +} + +static msg_t put(void *ip, uint8_t b) { + return lcdConsolePut((GLCDConsole *)ip, (char)b); +} + +static msg_t get(void *ip) { + (void)ip; + + return RDY_OK; +} + +static msg_t putt(void *ip, uint8_t b, systime_t timeout) { + (void)timeout; + + /* TODO: handle timeout */ + + return lcdConsolePut((GLCDConsole *)ip, (char)b); +} + +static msg_t gett(void *ip, systime_t timeout) { + (void)ip; + (void)timeout; + + return RDY_OK; +} + +static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) { + (void)time; + + return lcdConsoleWrite((GLCDConsole *)ip, bp, n); +} + +static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) { + (void)ip; + (void)bp; + (void)n; + (void)time; + + return 0; +} + +static uint16_t getflags(void *ip) { + _chn_get_and_clear_flags_impl(ip); +} + +static const struct GLCDConsoleVMT vmt = { + writes, reads, put, get, + putt, gett, writet, readt, + getflags +}; + + +msg_t lcdConsoleInit(GLCDConsole *console, coord_t x0, coord_t y0, coord_t width, coord_t height, font_t font, pixel_t bkcolor, pixel_t color) { + const uint8_t* ptr; + uint16_t chi; + uint16_t x,y; + + console->vmt = &vmt; + /* read font, get height */ + console->fy = gdispGetFontMetric(font, fontHeight); + + /* calculate the size of the console as an integer multiple of characters height*/ + console->sx = width; + console->sy = (((int16_t)(height/console->fy))-1)*console->fy; + + console->cx = 0; + console->cy = 0; + console->x0 = x0; + console->y0 = y0; + + console->bkcolor = bkcolor; + console->color = color; + + console->font = font; + + gdispFillArea(x0, y0, x0 + width, y0 + height, console->bkcolor); + return RDY_OK; +} + +msg_t lcdConsolePut(GLCDConsole *console, char c) { + uint8_t width; + + if(c == '\n') { + /* clear the text at the end of the line */ + if(console->cx < console->sx) + gdispFillArea(console->x0 + console->cx, console->y0 + console->cy, + console->sx - console->cx, console->fy, + console->bkcolor); + console->cx = 0; + console->cy += console->fy; + } else if(c == '\r') { + /* TODO: work backwards through the buffer to the start of the current line */ + //console->cx = 0; + } else { + width = gdispGetCharWidth(c, console->font) + gdispGetFontMetric(console->font, fontCharPadding); + if((console->cx + width) >= console->sx) { + /* clear the text at the end of the line */ + if (console->cy <= console->sy) + gdispFillArea(console->x0 + console->cx, console->y0 + console->cy, + console->sx - (console->cx + width), console->fy, + console->bkcolor); + console->cx = 0; + console->cy += console->fy; + } + + if((console->cy > console->sy)) { +#if GDISP_NEED_SCROLL + /* scroll the console */ + gdispVerticalScroll(console->x0, console->y0, console->sx, + console->sy + console->fy, console->fy, console->bkcolor); + /* reset the cursor to the start of the line */ + console->cx = 0; + console->cy = console->sy; +#else + /* clear the console */ + gdispFillArea(console->x0, console->y0, + console->sx, console->sy + console->fy, + console->bkcolor); + /* reset the cursor to the top of the console */ + console->cx = 0; + console->cy = 0; +#endif + } + + gdispDrawChar(console->x0 + console->cx, console->y0 + console->cy, c, + console->font, console->color); + + /* update cursor */ + console->cx += width; + } + return RDY_OK; +} + +msg_t lcdConsoleWrite(GLCDConsole *console, char *bp, size_t n) { + size_t i; + for(i = 0; i < n; i++) + lcdConsolePut(console, bp[i]); + + return RDY_OK; +} diff --git a/src/gdisp.c b/src/gdisp.c index ee2b98e4..f5da45b9 100644 --- a/src/gdisp.c +++ b/src/gdisp.c @@ -28,6 +28,7 @@ #include "ch.h"
#include "hal.h"
#include "gdisp.h"
+#include <math.h>
#ifndef _GDISP_C
#define _GDISP_C
@@ -658,6 +659,44 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { }
}
+/*
+ * @brief Draw an arc.
+ * @pre The GDISP must be in powerOn or powerSleep mode.
+ *
+ * @param[in] x0,y0 The center point
+ * @param[in] radius The radius of the arc
+ * @param[in] start The start angle (0 to 360)
+ * @param[in] end The end angle (0 to 360)
+ * @param[in] color The color of the arc
+ *
+ * @api
+ */
+void gdispDrawArc(coord_t x, coord_t y, coord_t radius, uint16_t start, uint16_t end, color_t color) {
+ uint16_t i;
+ float step = 0.01;
+
+ for(i = 0; i <= (int)((abs(end-start)) / step); i++) {
+ gdispDrawPixel( ((float)x + (float)radius * cosf((float)start * M_PI / 180.0f) + (float)i * step * M_PI / 180.0f),
+ ((float)y + (float)radius * sinf((float)start * M_PI / 180.0f) + (float)i * step * M_PI / 180.0f), color);
+ }
+}
+
+/*
+ * @brief Draw a filled arc.
+ * @pre The GDISP must be in powerOn or powerSleep mode.
+ *
+ * @param[in] x0,y0 The center point of the filled arc
+ * @param[in] radius The radius of the filled arc
+ * @param[in] start The start angle (0 to 360)
+ * @param[in] end The end angle (0 to 360)
+ * @param[in] color The color of the filled arc
+ *
+ * @api
+ */
+void gdispFillArc(coord_t x, coord_t y, coord_t radius, uint16_t start, uint16_t end, color_t color) {
+
+}
+
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
* @brief Draw a text string.
diff --git a/src/touchpad.c b/src/touchpad.c index a18930da..44d5f426 100644 --- a/src/touchpad.c +++ b/src/touchpad.c @@ -158,8 +158,7 @@ uint16_t tpReadX(void) { x = cal.xm * _tpReadRealX() + cal.xn; y = cal.ym * _tpReadRealY() + cal.yn; - /* - switch(gdispGetOrientation()) { // implement gdispGetOrientation() + switch(gdispGetOrientation()) { case portrait: return x; case landscape: @@ -169,9 +168,6 @@ uint16_t tpReadX(void) { case landscapeInv: return y; } - */ - - return x; } /** @@ -187,8 +183,7 @@ uint16_t tpReadY(void) { x = cal.xm * _tpReadRealX() + cal.xn; y = cal.ym * _tpReadRealY() + cal.yn; - /* - switch(gdispGetOrientation()) { // implement gdispGetOrientation() + switch(gdispGetOrientation()) { case portrait: return y; case landscape: @@ -198,9 +193,6 @@ uint16_t tpReadY(void) { case landscapeInv: return SCREEN_WIDTH - x; } - */ - - return y; } void tpCalibrate(void) { |