aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Hannam <andrewh@inmarket.com.au>2012-12-06 18:45:54 +1000
committerAndrew Hannam <andrewh@inmarket.com.au>2012-12-06 18:45:54 +1000
commit07f34835358ef65de310934ae726b66c7ca46f68 (patch)
tree6b6875cc38f19bc1dd41b3b7edc8ea10ab7dbc84
parente236a0a6b79ccd4446df72256740913392cf12f7 (diff)
downloaduGFX-07f34835358ef65de310934ae726b66c7ca46f68.tar.gz
uGFX-07f34835358ef65de310934ae726b66c7ca46f68.tar.bz2
uGFX-07f34835358ef65de310934ae726b66c7ca46f68.zip
Restructure
Create global include file called gfx.h which knows about sub-system dependancies. Deprecate Touchscreen (GINPUT touch is now working properly) Merge Graph into GWIN Change directory structure to reflect sub-system structure Many small bugs fixed Split Nokia6610 gdisp driver into GE8 and GE12 controller versions Fixed broken demos. GFX sub-systems are now clearly defined and new ones should be much easier to add.
-rw-r--r--demos/applications/graph/main.c51
-rw-r--r--demos/applications/mandelbrot/gfxconf.h69
-rw-r--r--demos/applications/mandelbrot/main.c3
-rw-r--r--demos/applications/notepad/gfxconf.h69
-rw-r--r--demos/applications/notepad/main.c39
-rw-r--r--demos/modules/console/gfxconf.h69
-rw-r--r--demos/modules/console/main.c185
-rw-r--r--demos/modules/ginput_touch_driver_test/gfxconf.h69
-rw-r--r--demos/modules/ginput_touch_driver_test/main.c22
-rw-r--r--demos/modules/graph/gfxconf.h69
-rw-r--r--demos/modules/graph/main.c54
-rw-r--r--demos/modules/gtimer/gfxconf.h69
-rw-r--r--demos/modules/gtimer/main.c124
-rw-r--r--demos/modules/window/gfxconf.h69
-rw-r--r--demos/modules/window/main.c134
-rw-r--r--drivers/gdisp/ILI9320/gdisp_lld.c6
-rw-r--r--drivers/gdisp/Nokia6610/gdisp_lld.mk5
-rw-r--r--drivers/gdisp/Nokia6610GE12/GE12.h (renamed from drivers/gdisp/Nokia6610/GE12.h)0
-rw-r--r--drivers/gdisp/Nokia6610GE12/gdisp_lld.c (renamed from drivers/gdisp/Nokia6610/gdisp_lld.c)163
-rw-r--r--drivers/gdisp/Nokia6610GE12/gdisp_lld.mk5
-rw-r--r--drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h135
-rw-r--r--drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h196
-rw-r--r--drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h58
-rw-r--r--drivers/gdisp/Nokia6610GE12/readme.txt (renamed from drivers/gdisp/Nokia6610/readme.txt)9
-rw-r--r--drivers/gdisp/Nokia6610GE8/GE8.h (renamed from drivers/gdisp/Nokia6610/GE8.h)0
-rw-r--r--drivers/gdisp/Nokia6610GE8/gdisp_lld.c483
-rw-r--r--drivers/gdisp/Nokia6610GE8/gdisp_lld.mk5
-rw-r--r--drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h (renamed from drivers/gdisp/Nokia6610/gdisp_lld_board_example.h)22
-rw-r--r--drivers/gdisp/Nokia6610GE8/gdisp_lld_board_olimexsam7ex256.h (renamed from drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h)4
-rw-r--r--drivers/gdisp/Nokia6610GE8/gdisp_lld_config.h (renamed from drivers/gdisp/Nokia6610/gdisp_lld_config.h)8
-rw-r--r--drivers/gdisp/Nokia6610GE8/readme.txt15
-rw-r--r--drivers/gdisp/S6D1121/gdisp_lld.c6
-rw-r--r--drivers/gdisp/SSD1289/gdisp_lld.c4
-rw-r--r--drivers/gdisp/SSD1963/gdisp_lld.c11
-rw-r--r--drivers/gdisp/TestStub/gdisp_lld.c15
-rw-r--r--drivers/gdisp/VMT/gdisp_lld.c25
-rw-r--r--drivers/gdisp/VMT/gdisp_lld_driver1.c2
-rw-r--r--drivers/gdisp/VMT/gdisp_lld_driver2.c2
-rw-r--r--drivers/ginput/toggle/Pal/ginput_lld_toggle.c6
-rw-r--r--drivers/ginput/toggle/Pal/ginput_lld_toggle_board_example.h57
-rw-r--r--drivers/ginput/toggle/Pal/ginput_lld_toggle_board_olimexsam7ex256.h26
-rw-r--r--drivers/ginput/toggle/Pal/ginput_lld_toggle_config.h5
-rw-r--r--drivers/ginput/touch/MCU/ginput_lld_mouse_board_olimex_stm32_lcd.h10
-rw-r--r--drivers/multiple/Win32/gdisp_lld.c21
-rw-r--r--gfx.mk12
-rw-r--r--include/gdisp/gdisp.h (renamed from include/gdisp.h)71
-rw-r--r--include/gdisp/lld/emulation.c (renamed from include/lld/gdisp/emulation.c)4
-rw-r--r--include/gdisp/lld/gdisp_lld.h (renamed from include/lld/gdisp/gdisp_lld.h)108
-rw-r--r--include/gdisp/lld/gdisp_lld_msgs.h (renamed from include/lld/gdisp/gdisp_lld_msgs.h)6
-rw-r--r--include/gdisp/options.h208
-rw-r--r--include/gevent/gevent.h (renamed from include/gevent.h)60
-rw-r--r--include/gevent/options.h68
-rw-r--r--include/gfx.h114
-rw-r--r--include/gfx_rules.h113
-rw-r--r--include/gfxconf.example.h74
-rw-r--r--include/ginput.h98
-rw-r--r--include/ginput/dial.h (renamed from include/ginput/ginput_dial.h)19
-rw-r--r--include/ginput/ginput.h55
-rw-r--r--include/ginput/keyboard.h (renamed from include/ginput/ginput_keyboard.h)19
-rw-r--r--include/ginput/lld/mouse.h (renamed from include/lld/ginput/mouse.h)11
-rw-r--r--include/ginput/lld/toggle.h (renamed from include/lld/ginput/toggle.h)19
-rw-r--r--include/ginput/mouse.h (renamed from include/ginput/ginput_mouse.h)17
-rw-r--r--include/ginput/options.h127
-rw-r--r--include/ginput/toggle.h (renamed from include/ginput/ginput_toggle.h)21
-rw-r--r--include/graph.h84
-rw-r--r--include/gtimer/gtimer.h (renamed from include/gtimer.h)47
-rw-r--r--include/gtimer/options.h (renamed from demos/applications/console/main.c)61
-rw-r--r--include/gwin/button.h (renamed from include/gwin/gwin_button.h)34
-rw-r--r--include/gwin/console.h (renamed from include/gwin/gwin_console.h)27
-rw-r--r--include/gwin/graph.h156
-rw-r--r--include/gwin/gwin.h (renamed from include/gwin.h)40
-rw-r--r--include/gwin/internal.h (renamed from src/gwin/gwin_internal.h)6
-rw-r--r--include/gwin/options.h71
-rw-r--r--include/lld/touchscreen/touchscreen_lld.h130
-rw-r--r--include/touchscreen.h93
-rw-r--r--releases.txt22
-rw-r--r--src/gdisp/fonts.c (renamed from src/gdisp_fonts.c)11
-rw-r--r--src/gdisp/gdisp.c (renamed from src/gdisp.c)5
-rw-r--r--src/gdisp/gdisp.mk2
-rw-r--r--src/gevent/gevent.c (renamed from src/gevent.c)10
-rw-r--r--src/gevent/gevent.mk1
-rw-r--r--src/ginput/dial.c6
-rw-r--r--src/ginput/keyboard.c6
-rw-r--r--src/ginput/mouse.c9
-rw-r--r--src/ginput/toggle.c9
-rw-r--r--src/graph.c216
-rw-r--r--src/gtimer/gtimer.c (renamed from src/gtimer.c)12
-rw-r--r--src/gtimer/gtimer.mk1
-rw-r--r--src/gwin/button.c14
-rw-r--r--src/gwin/console.c6
-rw-r--r--src/gwin/graph.c425
-rw-r--r--src/gwin/gwin.c (renamed from src/gwin.c)8
-rw-r--r--src/gwin/gwin.mk7
-rw-r--r--src/touchscreen.c369
94 files changed, 3421 insertions, 2090 deletions
diff --git a/demos/applications/graph/main.c b/demos/applications/graph/main.c
deleted file mode 100644
index bd50cf60..00000000
--- a/demos/applications/graph/main.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-#include "graph.h"
-#include "math.h"
-
-int data[5][2] = {
- { 0, 0 },
- { 10, 10 },
- { 20, 20 },
- { 30, 30 },
- { 40, 40 }
-};
-
-int main(void) {
- halInit();
- chSysInit();
-
- gdispInit();
- gdispSetOrientation(GDISP_ROTATE_90);
- gdispClear(Black);
-
- Graph G1 = {
- gdispGetWidth()/2,
- gdispGetHeight()/2,
- -150,
- 150,
- -110,
- 110,
- 21,
- 5,
- TRUE,
- TRUE,
- White,
- Grey,
- };
-
- graphDrawSystem(&G1);
-
- uint16_t i;
- for(i = 0; i < 2500; i++)
- graphDrawDot(&G1, i-170, 80*sin(2*0.2*M_PI*i/180), 1, Blue);
-
- for(i = 0; i < 2500; i++)
- graphDrawDot(&G1, i/5-150, 95*sin(2*0.2*M_PI*i/180), 1, Green);
-
- while(TRUE) {
- chThdSleepMilliseconds(100);
- }
-}
-
diff --git a/demos/applications/mandelbrot/gfxconf.h b/demos/applications/mandelbrot/gfxconf.h
new file mode 100644
index 00000000..726847cd
--- /dev/null
+++ b/demos/applications/mandelbrot/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN FALSE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER FALSE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP FALSE
+#define GDISP_NEED_TEXT FALSE
+#define GDISP_NEED_CIRCLE FALSE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/applications/mandelbrot/main.c b/demos/applications/mandelbrot/main.c
index 6ab19de1..2fe1141d 100644
--- a/demos/applications/mandelbrot/main.c
+++ b/demos/applications/mandelbrot/main.c
@@ -20,7 +20,7 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
void mandelbrot(float x1, float y1, float x2, float y2) {
unsigned int i,j, width, height;
@@ -63,7 +63,6 @@ int main(void) {
chSysInit();
gdispInit();
- gdispSetOrientation(GDISP_ROTATE_270);
/* where to zoom in */
cx = -0.086f;
diff --git a/demos/applications/notepad/gfxconf.h b/demos/applications/notepad/gfxconf.h
new file mode 100644
index 00000000..cbdb7b95
--- /dev/null
+++ b/demos/applications/notepad/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN FALSE
+#define GFX_USE_GEVENT TRUE
+#define GFX_USE_GTIMER TRUE
+#define GFX_USE_GINPUT TRUE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE TRUE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/applications/notepad/main.c b/demos/applications/notepad/main.c
index 7fec864f..e1b0e333 100644
--- a/demos/applications/notepad/main.c
+++ b/demos/applications/notepad/main.c
@@ -20,8 +20,7 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
-#include "touchscreen.h"
+#include "gfx.h"
#define COLOR_SIZE 20
#define PEN_SIZE 20
@@ -36,25 +35,9 @@
#define DRAW_AREA(x, y) (x >= PEN_SIZE + OFFSET + 3 && x <= gdispGetWidth() && \
y >= COLOR_SIZE + OFFSET + 3 && y <= gdispGetHeight())
-static const SPIConfig spicfg = {
- NULL,
- TP_CS_PORT,
- TP_CS,
- /* SPI_CR1_BR_2 | */ SPI_CR1_BR_1 | SPI_CR1_BR_0,
-};
-
-TouchscreenDriver TOUCHPADD1 = {
- &SPID1,
- &spicfg,
- TP_IRQ_PORT,
- TP_IRQ,
- TRUE
-};
-
void drawScreen(void) {
char *msg = "ChibiOS/GFX";
- gdispSetOrientation(GDISP_ROTATE_90);
gdispClear(White);
gdispDrawString(gdispGetWidth()-gdispGetStringWidth(msg, &fontUI2Double)-3, 3, msg, &fontUI2Double, Black);
@@ -74,8 +57,9 @@ void drawScreen(void) {
gdispDrawString(OFFSET * 2, DRAW_PEN(5), "5", &fontLargeNumbers, Black);
}
+GEventMouse ev;
+
int main(void) {
- volatile uint16_t x, y;
color_t color = Black;
uint16_t pen = 0;
@@ -83,16 +67,17 @@ int main(void) {
chSysInit();
gdispInit();
- tsInit(&TOUCHPADD1);
+ ginputGetMouse(0);
drawScreen();
while (TRUE) {
- x = tsReadX();
- y = tsReadY();
+ ginputGetMouseStatus(0, &ev);
+ if (!(ev->current_buttons & GINPUT_MOUSE_BTN_LEFT))
+ continue;
/* inside color box ? */
- if(y >= OFFSET && y <= COLOR_SIZE) {
+ if(ev->y >= OFFSET && ev->y <= COLOR_SIZE) {
if(GET_COLOR(0)) color = Black;
else if(GET_COLOR(1)) color = Red;
else if(GET_COLOR(2)) color = Yellow;
@@ -101,7 +86,7 @@ int main(void) {
else if(GET_COLOR(5)) color = White;
/* inside pen box ? */
- } else if(x >= OFFSET && x <= PEN_SIZE) {
+ } else if(ev->x >= OFFSET && ev->x <= PEN_SIZE) {
if(GET_PEN(1)) pen = 0;
else if(GET_PEN(2)) pen = 1;
else if(GET_PEN(3)) pen = 2;
@@ -109,11 +94,11 @@ int main(void) {
else if(GET_PEN(5)) pen = 4;
/* inside drawing area ? */
- } else if(DRAW_AREA(x, y)) {
+ } else if(DRAW_AREA(ev->x, ev->y)) {
if(pen == 0)
- gdispDrawPixel(x, y, color);
+ gdispDrawPixel(ev->x, ev->y, color);
else
- gdispFillCircle(x, y, pen, color);
+ gdispFillCircle(ev->x, ev->y, pen, color);
}
}
}
diff --git a/demos/modules/console/gfxconf.h b/demos/modules/console/gfxconf.h
new file mode 100644
index 00000000..d3e99de4
--- /dev/null
+++ b/demos/modules/console/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN TRUE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER FALSE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE FALSE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE TRUE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/console/main.c b/demos/modules/console/main.c
index 962969eb..830c9d00 100644
--- a/demos/modules/console/main.c
+++ b/demos/modules/console/main.c
@@ -1,95 +1,90 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * Make sure you have the following stuff enabled in your halconf.h:
- *
- * #define GFX_USE_GDISP TRUE
- * #define GFX_USE_GWIN TRUE
- * #define GDISP_NEED_SCROLL TRUE (optional but recommended)
- * #define GDISP_NEED_CLIP TRUE (optional but recommended)
- * #define GWIN_NEED_CONSOLE TRUE
- */
-
-#include "ch.h"
-#include "hal.h"
-#include "chprintf.h"
-#include "gdisp.h"
-#include "gwin.h"
-
-/* The handles for our three consoles */
-GHandle GW1, GW2, GW3;
-
-/* The streams for our three consoles */
-BaseSequentialStream *S1, *S2, *S3;
-
-int main(void) {
- uint8_t i;
-
- halInit();
- chSysInit();
-
- /* initialize and clear the display */
- gdispInit();
- gdispClear(Black);
-
- /* create the three console windows and set a font for each */
- GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, &fontUI2Double);
- GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), &fontSmall);
- GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), &fontSmall);
-
- /* Set the fore- and background colors for each console */
- gwinSetColor(GW1, Green);
- gwinSetBgColor(GW1, Black);
- gwinSetColor(GW2, White);
- gwinSetBgColor(GW2, Blue);
- gwinSetColor(GW3, Black);
- gwinSetBgColor(GW3, Red);
-
- /* clear all console windows - to set background */
- gwinClear(GW1);
- gwinClear(GW2);
- gwinClear(GW3);
-
- /* receive the stream pointers of each console */
- S1 = gwinGetConsoleStream(GW1);
- S2 = gwinGetConsoleStream(GW2);
- S3 = gwinGetConsoleStream(GW3);
-
- /* Output some data on the first console */
- for(i = 0; i < 10; i++) {
- chprintf(S1, "Hello ChibiOS/GFX!\r\n");
- }
-
- /* Output some data on the second console */
- for(i = 0; i < 16; i++) {
- chprintf(S2, "Message Nr.: %d\r\n", i+1);
- }
-
- /* Output some data on the third console */
- for(i = 0; i < 18; i++) {
- chprintf(S3, "Message Nr.: %d\r\n", i+1);
- }
-
- while(TRUE) {
- chThdSleepMilliseconds(500);
- }
-}
-
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * The following stuff is optional in your gfxconf.h:
+ *
+ * #define GDISP_NEED_SCROLL TRUE (optional but recommended if your GDISP driver supports it)
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "chprintf.h"
+#include "gfx.h"
+
+/* The handles for our three consoles */
+GHandle GW1, GW2, GW3;
+
+/* The streams for our three consoles */
+BaseSequentialStream *S1, *S2, *S3;
+
+int main(void) {
+ uint8_t i;
+
+ halInit();
+ chSysInit();
+
+ /* initialize and clear the display */
+ gdispInit();
+ gdispClear(Black);
+
+ /* create the three console windows and set a font for each */
+ GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, &fontUI2Double);
+ GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), &fontSmall);
+ GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), &fontSmall);
+
+ /* Set the fore- and background colors for each console */
+ gwinSetColor(GW1, Green);
+ gwinSetBgColor(GW1, Black);
+ gwinSetColor(GW2, White);
+ gwinSetBgColor(GW2, Blue);
+ gwinSetColor(GW3, Black);
+ gwinSetBgColor(GW3, Red);
+
+ /* clear all console windows - to set background */
+ gwinClear(GW1);
+ gwinClear(GW2);
+ gwinClear(GW3);
+
+ /* receive the stream pointers of each console */
+ S1 = gwinGetConsoleStream(GW1);
+ S2 = gwinGetConsoleStream(GW2);
+ S3 = gwinGetConsoleStream(GW3);
+
+ /* Output some data on the first console */
+ for(i = 0; i < 10; i++) {
+ chprintf(S1, "Hello ChibiOS/GFX!\r\n");
+ }
+
+ /* Output some data on the second console */
+ for(i = 0; i < 16; i++) {
+ chprintf(S2, "Message Nr.: %d\r\n", i+1);
+ }
+
+ /* Output some data on the third console */
+ for(i = 0; i < 18; i++) {
+ chprintf(S3, "Message Nr.: %d\r\n", i+1);
+ }
+
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+}
+
diff --git a/demos/modules/ginput_touch_driver_test/gfxconf.h b/demos/modules/ginput_touch_driver_test/gfxconf.h
new file mode 100644
index 00000000..a6d40f06
--- /dev/null
+++ b/demos/modules/ginput_touch_driver_test/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN TRUE
+#define GFX_USE_GEVENT TRUE
+#define GFX_USE_GTIMER TRUE
+#define GFX_USE_GINPUT TRUE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE FALSE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD TRUE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON TRUE
+#define GWIN_NEED_CONSOLE TRUE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE TRUE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/ginput_touch_driver_test/main.c b/demos/modules/ginput_touch_driver_test/main.c
index 78f29f86..d8fe1739 100644
--- a/demos/modules/ginput_touch_driver_test/main.c
+++ b/demos/modules/ginput_touch_driver_test/main.c
@@ -18,30 +18,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- * Make sure you have the following enabled in your halconf.h:
- *
- * #define GFX_USE_GDISP TRUE
- * #define GFX_USE_GINPUT TRUE
- * #define GFX_USE_GEVENT TRUE
- * #define GFX_USE_GTIMER TRUE
- * #define GFX_USE_GWIN TRUE
- *
- * #define GWIN_NEED_CONSOLE TRUE
- * #define GWIN_NEED_BUTTON TRUE
- *
- * #define GINPUT_NEED_MOUSE TRUE
- * #define GINPUT_NEED_TOUCH TRUE
- *
- * #define GDISP_NEED_CLIP TRUE
- */
-
#include "ch.h"
#include "hal.h"
#include "chprintf.h"
-#include "gdisp.h"
-#include "ginput.h"
-#include "gwin.h"
+#include "gfx.h"
static GConsoleObject gc;
static GButtonObject gNext;
diff --git a/demos/modules/graph/gfxconf.h b/demos/modules/graph/gfxconf.h
new file mode 100644
index 00000000..23a675b9
--- /dev/null
+++ b/demos/modules/graph/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN TRUE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER FALSE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT FALSE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH TRUE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/graph/main.c b/demos/modules/graph/main.c
new file mode 100644
index 00000000..bd2da2f6
--- /dev/null
+++ b/demos/modules/graph/main.c
@@ -0,0 +1,54 @@
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+#include "math.h"
+
+int data[5][2] = {
+ { 0, 0 },
+ { 10, 10 },
+ { 20, 20 },
+ { 30, 30 },
+ { 40, 40 }
+};
+
+GGraphObject g;
+
+GGraphStyle GraphStyle2 = {
+ { GGRAPH_POINT_DOT, 0, Green }, // point
+ { GGRAPH_LINE_DOT, 2, Gray }, // line
+ { GGRAPH_LINE_SOLID, 0, White }, // x axis
+ { GGRAPH_LINE_SOLID, 0, White }, // y axis
+ { GGRAPH_LINE_NONE, 0, White, 0 }, // x grid
+ { GGRAPH_LINE_NONE, 0, White, 0 }, // y grid
+ GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS // flags
+};
+
+int main(void) {
+ GHandle gh;
+ uint16_t i;
+
+ halInit();
+ chSysInit();
+
+ gdispInit();
+ gdispClear(Black);
+
+ gh = gwinCreateGraph(0, 0, gdispGetWidth(), gdispGetHeight());
+
+ gwinGraphSetOrigin(gh, 150, 150);
+ gwinGraphDrawAxis(gh);
+
+ for(i = 0; i < 2500; i++)
+ gwinGraphDrawPoint(gh, i-170, 80*sin(2*0.2*M_PI*i/180));
+
+ gwinGraphStartSet(gh);
+ gwinGraphSetStyle(gh, &GraphStyle2);
+
+ for(i = 0; i < 2500; i++)
+ gwinGraphDrawPoint(gh, i/5-150, 95*sin(2*0.2*M_PI*i/180));
+
+ while(TRUE) {
+ chThdSleepMilliseconds(100);
+ }
+}
+
diff --git a/demos/modules/gtimer/gfxconf.h b/demos/modules/gtimer/gfxconf.h
new file mode 100644
index 00000000..c0f24a7a
--- /dev/null
+++ b/demos/modules/gtimer/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP FALSE
+#define GFX_USE_GWIN FALSE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER TRUE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE FALSE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/gtimer/main.c b/demos/modules/gtimer/main.c
index bb991edc..ae7c2c92 100644
--- a/demos/modules/gtimer/main.c
+++ b/demos/modules/gtimer/main.c
@@ -1,65 +1,59 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * Make sure you have enabled the GTimer module in your halconf.h:
- *
- * #define GFX_USE_GTIMER TRUE
- */
-
-#include "ch.h"
-#include "hal.h"
-#include "gtimer.h"
-
-GTimer GT1, GT2;
-
-void callback1(void* arg) {
- (void)arg;
-
- palTogglePad(GPIOD, GPIOD_LED3);
-}
-
-void callback2(void* arg) {
- (void)arg;
-
- palSetPad(GPIOD, GPIOD_LED4);
-}
-
-int main(void) {
- halInit();
- chSysInit();
-
- /* initialize the timers */
- gtimerInit(&GT1);
- gtimerInit(&GT2);
-
- /* continious mode - callback1() called without any argument every 250ms */
- gtimerStart(&GT1, callback1, NULL, TRUE, 250);
-
- /* single shot mode - callback2() called without any argument once after 1s */
- gtimerStart(&GT2, callback2, NULL, FALSE, 1000);
-
- while(TRUE) {
- chThdSleepMilliseconds(500);
- }
-
- return 0;
-}
-
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+GTimer GT1, GT2;
+
+void callback1(void* arg) {
+ (void)arg;
+
+ palTogglePad(GPIOD, GPIOD_LED3);
+}
+
+void callback2(void* arg) {
+ (void)arg;
+
+ palSetPad(GPIOD, GPIOD_LED4);
+}
+
+int main(void) {
+ halInit();
+ chSysInit();
+
+ /* initialize the timers */
+ gtimerInit(&GT1);
+ gtimerInit(&GT2);
+
+ /* continious mode - callback1() called without any argument every 250ms */
+ gtimerStart(&GT1, callback1, NULL, TRUE, 250);
+
+ /* single shot mode - callback2() called without any argument once after 1s */
+ gtimerStart(&GT2, callback2, NULL, FALSE, 1000);
+
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+
+ return 0;
+}
+
diff --git a/demos/modules/window/gfxconf.h b/demos/modules/window/gfxconf.h
new file mode 100644
index 00000000..80c4b327
--- /dev/null
+++ b/demos/modules/window/gfxconf.h
@@ -0,0 +1,69 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN TRUE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER FALSE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/window/main.c b/demos/modules/window/main.c
index c70c94db..88f71be3 100644
--- a/demos/modules/window/main.c
+++ b/demos/modules/window/main.c
@@ -1,72 +1,62 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * Make sure you have the following stuff enabled in your halconf.h:
- *
- * #define GFX_USE_GDISP TRUE
- * #define GDISP_NEED_SCROLL TRUE
- * #define GDISP_NEED_CLIP TRUE (optional but recommended)
- */
-
-
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-#include "gwin.h"
-
-/* The handles for our two Windows */
-GHandle GW1, GW2;
-
-int main(void) {
- halInit();
- chSysInit();
-
- /* Initialize and clear the display */
- gdispInit();
- gdispClear(Lime);
-
- /* Create two windows */
- GW1 = gwinCreateWindow(NULL, 20, 10, 200, 150);
- GW2 = gwinCreateWindow(NULL, 50, 190, 150, 100);
-
- /* Set fore- and background colors for both windows */
- gwinSetColor(GW1, Black);
- gwinSetBgColor(GW1, White);
- gwinSetColor(GW2, White);
- gwinSetBgColor(GW2, Blue);
-
- /* Clear both windows - to set background color */
- gwinClear(GW1);
- gwinClear(GW2);
-
- /*
- * Draw two filled circles at the same coordinate
- * of each window to demonstrate the relative coordinates
- * of windows
- */
- gwinFillCircle(GW1, 20, 20, 15);
- gwinFillCircle(GW2, 20, 20, 15);
-
- while(TRUE) {
- chThdSleepMilliseconds(500);
- }
-}
-
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+/* The handles for our two Windows */
+GHandle GW1, GW2;
+
+int main(void) {
+ halInit();
+ chSysInit();
+
+ /* Initialize and clear the display */
+ gdispInit();
+ gdispClear(Lime);
+
+ /* Create two windows */
+ GW1 = gwinCreateWindow(NULL, 20, 10, 200, 150);
+ GW2 = gwinCreateWindow(NULL, 50, 190, 150, 100);
+
+ /* Set fore- and background colors for both windows */
+ gwinSetColor(GW1, Black);
+ gwinSetBgColor(GW1, White);
+ gwinSetColor(GW2, White);
+ gwinSetBgColor(GW2, Blue);
+
+ /* Clear both windows - to set background color */
+ gwinClear(GW1);
+ gwinClear(GW2);
+
+ /*
+ * Draw two filled circles at the same coordinate
+ * of each window to demonstrate the relative coordinates
+ * of windows
+ */
+ gwinFillCircle(GW1, 20, 20, 15);
+ gwinFillCircle(GW2, 20, 20, 15);
+
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+}
+
diff --git a/drivers/gdisp/ILI9320/gdisp_lld.c b/drivers/gdisp/ILI9320/gdisp_lld.c
index ada0f27d..202f06dd 100644
--- a/drivers/gdisp/ILI9320/gdisp_lld.c
+++ b/drivers/gdisp/ILI9320/gdisp_lld.c
@@ -28,12 +28,12 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
#if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD
/* Include the user supplied board definitions */
@@ -50,9 +50,11 @@
/* This controller is only ever used with a 240 x 320 display */
#if defined(GDISP_SCREEN_HEIGHT)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif
diff --git a/drivers/gdisp/Nokia6610/gdisp_lld.mk b/drivers/gdisp/Nokia6610/gdisp_lld.mk
deleted file mode 100644
index f378c02e..00000000
--- a/drivers/gdisp/Nokia6610/gdisp_lld.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List the required driver.
-GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.c
-
-# Required include directories
-GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610
diff --git a/drivers/gdisp/Nokia6610/GE12.h b/drivers/gdisp/Nokia6610GE12/GE12.h
index 6c980e2e..6c980e2e 100644
--- a/drivers/gdisp/Nokia6610/GE12.h
+++ b/drivers/gdisp/Nokia6610GE12/GE12.h
diff --git a/drivers/gdisp/Nokia6610/gdisp_lld.c b/drivers/gdisp/Nokia6610GE12/gdisp_lld.c
index 47df5bb2..7e5e1215 100644
--- a/drivers/gdisp/Nokia6610/gdisp_lld.c
+++ b/drivers/gdisp/Nokia6610GE12/gdisp_lld.c
@@ -19,8 +19,8 @@
*/
/**
- * @file drivers/gdisp/Nokia6610/gdisp_lld.c
- * @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 display.
+ * @file drivers/gdisp/Nokia6610GE12/gdisp_lld.c
+ * @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE12 display.
*
* @addtogroup GDISP
* @{
@@ -28,31 +28,27 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/* Controller definitions */
-#if defined(GDISP_USE_GE8)
- #include "GE8.h"
-#elif defined(GDISP_USE_GE12)
- #include "GE12.h"
-#else
- #error "gdispNokia6610: Either GDISP_USE_GE8 or GDISP_USE_GE12 must be defined depending on your controller"
-#endif
+#include "GE12.h"
/* This controller is only ever used with a 132 x 132 display */
#if defined(GDISP_SCREEN_HEIGHT)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif
#define GDISP_SCREEN_HEIGHT 132
@@ -130,87 +126,66 @@ bool_t GDISP_LLD(init)(void) {
// Get the bus for the following initialisation commands
acquire_bus();
- #if defined(GDISP_USE_GE8)
- write_cmd3(DISCTL, 0x00, 0x20, 0x00); // Display control
- // P1: 0x00 = 2 divisions, switching period=8 (default)
- // P2: 0x20 = nlines/4 - 1 = 132/4 - 1 = 32)
- // P3: 0x00 = no inversely highlighted lines
- write_cmd1(COMSCN, 0x01); // COM scan P1: 0x01 = Scan 1->80, 160<-81
- write_cmd(OSCON); // Internal oscilator ON
- write_cmd(SLPOUT); // Sleep out
- write_cmd1(PWRCTR, 0x0F); // Power control - reference voltage regulator on, circuit voltage follower on, BOOST ON
- write_cmd3(DATCTL, 0x48, 0x00, 0x02); // Data control
- // P1: 0x01 = page address inverted, column address normal, address scan in column direction
- // P2: 0x00 = RGB sequence (default value)
- // P3: 0x02 = Grayscale -> 16 (selects 12-bit color, type A)
- write_cmd2(VOLCTR, GDISP_INITIAL_CONTRAST, 0x03); // Voltage control (contrast setting)
- // P1 = Contrast
- // P2 = 3 resistance ratio (only value that works)
- delayms(100); // allow power supply to stabilize
- write_cmd(DISON); // Turn on the display
-
- #elif defined(GDISP_USE_GE12)
- // UNTESTED
- #if 1
- write_cmd(SLEEPOUT); // Sleep out
- write_cmd(INVON); // Inversion on: seems to be required for this controller
- write_cmd1(COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel
- write_cmd1(MADCTL, 0xC8); // Memory access controler - 0xC0 = mirror x and y, reverse rgb
- write_cmd1(SETCON, GDISP_INITIAL_CONTRAST); // Write contrast
- delayms(20);
- write_cmd(DISPON); // Display On
- #else
- // Alternative
- write_cmd(SOFTRST); // Software Reset
- delayms(20);
- write_cmd(INITESC); // Initial escape
- delayms(20);
- write_cmd1(REFSET, 0x00); // Refresh set
- write_cmd(DISPCTRL); // Set Display control - really 7 bytes of data
- write_data(128); // Set the lenght of one selection term
- write_data(128); // Set N inversion -> no N inversion
- write_data(134); // Set frame frequence and bias rate -> 2 devision of frequency and 1/8 bias, 1/67 duty, 96x67 size
- write_data(84); // Set duty parameter
- write_data(69); // Set duty parameter
- write_data(82); // Set duty parameter
- write_data(67); // Set duty parameter
- write_cmd(GRAYSCALE0); // Grey scale 0 position set - really 15 bytes of data
- write_data(1); // GCP1 - gray lavel to be output when the RAM data is "0001"
- write_data(2); // GCP2 - gray lavel to be output when the RAM data is "0010"
- write_data(4); // GCP3 - gray lavel to be output when the RAM data is "0011"
- write_data(8); // GCP4 - gray lavel to be output when the RAM data is "0100"
- write_data(16); // GCP5 - gray lavel to be output when the RAM data is "0101"
- write_data(30); // GCP6 - gray lavel to be output when the RAM data is "0110"
- write_data(40); // GCP7 - gray lavel to be output when the RAM data is "0111"
- write_data(50); // GCP8 - gray lavel to be output when the RAM data is "1000"
- write_data(60); // GCP9 - gray lavel to be output when the RAM data is "1001"
- write_data(70); // GCP10 - gray lavel to be output when the RAM data is "1010"
- write_data(80); // GCP11 - gray lavel to be output when the RAM data is "1011"
- write_data(90); // GCP12 - gray lavel to be output when the RAM data is "1100"
- write_data(100); // GCP13 - gray lavel to be output when the RAM data is "1101"
- write_data(110); // GCP14 - gray lavel to be output when the RAM data is "1110"
- write_data(127); // GCP15 - gray lavel to be output when the RAM data is "1111"
- write_cmd1(GAMMA, 0x01); // Gamma curve set - select gray scale - GRAYSCALE 0 or GREYSCALE 1 - Select grey scale 0
- write_cmd1(COMMONDRV, 0x00); // Command driver output - Set COM1-COM41 side come first, normal mod
- write_cmd(NORMALMODE); // Set Normal mode (my)
- // write_cmd(INVERSIONOFF); // Inversion off
- write_cmd2(COLADDRSET, 0, 131); // Column address set
- write_cmd2(PAGEADDRSET, 0, 131); // Page address set
- write_cmd1(ACCESSCTRL, 0x40); // Memory access controler - 0x40 horizontal
- // write_data(0x20); // vertical
- write_cmd1(PWRCTRL, 0x04); // Power control - Internal resistance, V1OUT -> high power mode, oscilator devision rate
- write_cmd(SLEEPOUT); // Sleep out
- write_cmd(VOLTCTRL); // Voltage control - voltage control and write contrast define LCD electronic volume
- // write_data(0x7f); // full voltage control
- // write_data(0x03); // must be "1"
- write_cmd1(CONTRAST, GDISP_INITIAL_CONTRAST); // Write contrast
- delayms(20);
- write_cmd(TEMPGRADIENT); // Temperature gradient - really 14 bytes of data
- for(i=0; i<14; i++)
- write_data(0);
- write_cmd(BOOSTVON); // Booster voltage ON
- write_cmd(DISPLAYON); // Finally - Display On
- #endif
+ // UNTESTED
+ #if 1
+ write_cmd(SLEEPOUT); // Sleep out
+ write_cmd(INVON); // Inversion on: seems to be required for this controller
+ write_cmd1(COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel
+ write_cmd1(MADCTL, 0xC8); // Memory access controler - 0xC0 = mirror x and y, reverse rgb
+ write_cmd1(SETCON, GDISP_INITIAL_CONTRAST); // Write contrast
+ delayms(20);
+ write_cmd(DISPON); // Display On
+ #else
+ // Alternative
+ write_cmd(SOFTRST); // Software Reset
+ delayms(20);
+ write_cmd(INITESC); // Initial escape
+ delayms(20);
+ write_cmd1(REFSET, 0x00); // Refresh set
+ write_cmd(DISPCTRL); // Set Display control - really 7 bytes of data
+ write_data(128); // Set the lenght of one selection term
+ write_data(128); // Set N inversion -> no N inversion
+ write_data(134); // Set frame frequence and bias rate -> 2 devision of frequency and 1/8 bias, 1/67 duty, 96x67 size
+ write_data(84); // Set duty parameter
+ write_data(69); // Set duty parameter
+ write_data(82); // Set duty parameter
+ write_data(67); // Set duty parameter
+ write_cmd(GRAYSCALE0); // Grey scale 0 position set - really 15 bytes of data
+ write_data(1); // GCP1 - gray lavel to be output when the RAM data is "0001"
+ write_data(2); // GCP2 - gray lavel to be output when the RAM data is "0010"
+ write_data(4); // GCP3 - gray lavel to be output when the RAM data is "0011"
+ write_data(8); // GCP4 - gray lavel to be output when the RAM data is "0100"
+ write_data(16); // GCP5 - gray lavel to be output when the RAM data is "0101"
+ write_data(30); // GCP6 - gray lavel to be output when the RAM data is "0110"
+ write_data(40); // GCP7 - gray lavel to be output when the RAM data is "0111"
+ write_data(50); // GCP8 - gray lavel to be output when the RAM data is "1000"
+ write_data(60); // GCP9 - gray lavel to be output when the RAM data is "1001"
+ write_data(70); // GCP10 - gray lavel to be output when the RAM data is "1010"
+ write_data(80); // GCP11 - gray lavel to be output when the RAM data is "1011"
+ write_data(90); // GCP12 - gray lavel to be output when the RAM data is "1100"
+ write_data(100); // GCP13 - gray lavel to be output when the RAM data is "1101"
+ write_data(110); // GCP14 - gray lavel to be output when the RAM data is "1110"
+ write_data(127); // GCP15 - gray lavel to be output when the RAM data is "1111"
+ write_cmd1(GAMMA, 0x01); // Gamma curve set - select gray scale - GRAYSCALE 0 or GREYSCALE 1 - Select grey scale 0
+ write_cmd1(COMMONDRV, 0x00); // Command driver output - Set COM1-COM41 side come first, normal mod
+ write_cmd(NORMALMODE); // Set Normal mode (my)
+ // write_cmd(INVERSIONOFF); // Inversion off
+ write_cmd2(COLADDRSET, 0, 131); // Column address set
+ write_cmd2(PAGEADDRSET, 0, 131); // Page address set
+ write_cmd1(ACCESSCTRL, 0x40); // Memory access controler - 0x40 horizontal
+ // write_data(0x20); // vertical
+ write_cmd1(PWRCTRL, 0x04); // Power control - Internal resistance, V1OUT -> high power mode, oscilator devision rate
+ write_cmd(SLEEPOUT); // Sleep out
+ write_cmd(VOLTCTRL); // Voltage control - voltage control and write contrast define LCD electronic volume
+ // write_data(0x7f); // full voltage control
+ // write_data(0x03); // must be "1"
+ write_cmd1(CONTRAST, GDISP_INITIAL_CONTRAST); // Write contrast
+ delayms(20);
+ write_cmd(TEMPGRADIENT); // Temperature gradient - really 14 bytes of data
+ for(i=0; i<14; i++)
+ write_data(0);
+ write_cmd(BOOSTVON); // Booster voltage ON
+ write_cmd(DISPLAYON); // Finally - Display On
#endif
// Release the bus
@@ -541,11 +516,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
case GDISP_CONTROL_CONTRAST:
if ((unsigned)value > 100) value = (void *)100;
acquire_bus();
-#if defined(GDISP_USE_GE8)
- write_cmd2(VOLCTR, (unsigned)value, 0x03);
-#elif defined(GDISP_USE_GE12)
write_cmd1(CONTRAST,(unsigned)value);
-#endif
release_bus();
GDISP.Contrast = (unsigned)value;
return;
diff --git a/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk b/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk
new file mode 100644
index 00000000..575d52a3
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk
@@ -0,0 +1,5 @@
+# List the required driver.
+GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.c
+
+# Required include directories
+GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12
diff --git a/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h b/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h
new file mode 100644
index 00000000..1885f07c
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h
@@ -0,0 +1,135 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h
+ * @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE12 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+/**
+ * @brief Initialise the board for the display.
+ * @notes Performs the following functions:
+ * 1. initialise the spi port used by your display
+ * 2. initialise the reset pin (initial state not-in-reset)
+ * 3. initialise the chip select pin (initial state not-active)
+ * 4. initialise the backlight pin (initial state back-light off)
+ *
+ * @notapi
+ */
+static __inline void init_board(void) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for init_board for your board"
+}
+
+/**
+ * @brief Set or clear the lcd reset pin.
+ *
+ * @param[in] state TRUE = lcd in reset, FALSE = normal operation
+ *
+ * @notapi
+ */
+static __inline void setpin_reset(bool_t state) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for setpin_reset for your board"
+}
+
+/**
+ * @brief Set the lcd back-light level.
+ * @note For now 0% turns the backlight off, anything else the backlight is on.
+ * While the hardware supports PWM backlight control, we are not using it
+ * yet.
+ *
+ * @param[in] percent 0 to 100%
+ *
+ * @notapi
+ */
+static __inline void set_backlight(uint8_t percent) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for set_backlight for your board"
+}
+
+/**
+ * @brief Take exclusive control of the bus
+ *
+ * @notapi
+ */
+static __inline void acquire_bus(void) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for acquire_bus for your board"
+}
+
+/**
+ * @brief Release exclusive control of the bus
+ *
+ * @notapi
+ */
+static __inline void release_bus(void) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for release_bus for your board"
+}
+
+/**
+ * @brief Send an 8 bit command to the lcd.
+ *
+ * @param[in] cmd The command to send
+ *
+ * @notapi
+ */
+static __inline void write_cmd(uint16_t cmd) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for write_cmd for your board"
+}
+
+/**
+ * @brief Send an 8 bit data to the lcd.
+ *
+ * @param[in] data The data to send
+ *
+ * @notapi
+ */
+static __inline void write_data(uint16_t data) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for write_data for your board"
+}
+
+#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
+/**
+ * @brief Read data from the lcd.
+ *
+ * @return The data from the lcd
+ * @note The chip select may need to be asserted/de-asserted
+ * around the actual spi read
+ *
+ * @notapi
+ */
+static __inline uint16_t read_data(void) {
+ /* Code here */
+ #error "gdispNokia6610GE12: You must supply a definition for read_data for your board"
+}
+#endif
+
+#endif /* _GDISP_LLD_BOARD_H */
+/** @} */
diff --git a/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h b/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h
new file mode 100644
index 00000000..c161a9a3
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h
@@ -0,0 +1,196 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h
+ * @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+// ******************************************************
+// Pointers to AT91SAM7X256 peripheral data structures
+// ******************************************************
+volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
+volatile AT91PS_PIO pPIOB = AT91C_BASE_PIOB;
+volatile AT91PS_SPI pSPI = AT91C_BASE_SPI0;
+volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;
+volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_SPI0;
+
+/**
+ * @brief Initialise the board for the display.
+ * @notes Performs the following functions:
+ * 1. initialise the spi port used by your display
+ * 2. initialise the reset pin (initial state not-in-reset)
+ * 3. initialise the chip select pin (initial state not-active)
+ * 4. initialise the backlight pin (initial state back-light off)
+ *
+ * @notapi
+ */
+static __inline void init_board(void) {
+ // *********************************************************************************************
+ // InitSpi( )
+ //
+ // Sets up SPI channel 0 for communications to Nokia 6610 LCD Display
+ //
+ // I/O ports used: PA2 = LCD Reset (set to low to reset)
+ // PA12 = LCD chip select (set to low to select the LCD chip)
+ // PA16 = SPI0_MISO Master In - Slave Out (not used in LCD interface)
+ // PA17 = SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
+ // PA18 = SPI0_SPCK Serial Clock (to LCD slave)
+ // PB20 = backlight control (normally PWM control, 1 = full on)
+ //
+ // *********************************************************************************************}
+
+ /* This code should really use the ChibiOS driver for these functions */
+
+ // Pin for backlight
+ pPIOB->PIO_CODR = PIOB_LCD_BL_MASK; // Set PB20 to LOW
+ pPIOB->PIO_OER = PIOB_LCD_BL_MASK; // Configure PB20 as output
+
+ // Reset pin
+ pPIOA->PIO_SODR = PIOA_LCD_RESET_MASK; // Set PA2 to HIGH
+ pPIOA->PIO_OER = PIOA_LCD_RESET_MASK; // Configure PA2 as output
+
+ // CS pin - this seems to be ignored
+ // pPIOA->PIO_SODR = 1<<12; // Set PA2 to HIGH
+ // pPIOA->PIO_OER = 1<<12; // Configure PA2 as output
+
+ // Init SPI0
+ // Disable the following pins from PIO control (will be used instead by the SPI0 peripheral)
+ // BIT12 = PA12 -> SPI0_NPCS0 chip select
+ // BIT16 = PA16 -> SPI0_MISO Master In - Slave Out (not used in LCD interface)
+ // BIT17 = PA17 -> SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
+ // BIT18 = PA18 -> SPI0_SPCK Serial Clock (to LCD slave)
+ pPIOA->PIO_PDR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
+ pPIOA->PIO_ASR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
+ pPIOA->PIO_BSR = 0;
+
+ //enable the clock of SPI
+ pPMC->PMC_PCER = 1 << AT91C_ID_SPI0;
+
+ // Fixed mode
+ pSPI->SPI_CR = 0x81; //SPI Enable, Sowtware reset
+ pSPI->SPI_CR = 0x01; //SPI Enable
+
+ //pSPI->SPI_MR = 0xE0019; //Master mode, fixed select, disable decoder, FDIV=1 (MCK), PCS=1110
+ pSPI->SPI_MR = 0xE0011; //Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
+
+ //pSPI->SPI_CSR[0] = 0x01010C11; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/32*12 = 125kHz
+ pSPI->SPI_CSR[0] = 0x01010311; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/8 = 6MHz if using commented MR line above
+}
+
+/**
+ * @brief Set or clear the lcd reset pin.
+ *
+ * @param[in] state TRUE = lcd in reset, FALSE = normal operation
+ *
+ * @notapi
+ */
+static __inline void setpin_reset(bool_t state) {
+ if (state)
+ palClearPad(IOPORT1, PIOA_LCD_RESET);
+ else
+ palSetPad(IOPORT1, PIOA_LCD_RESET);
+}
+
+/**
+ * @brief Set the lcd back-light level.
+ * @note For now 0% turns the backlight off, anything else the backlight is on.
+ * While the hardware supports PWM backlight control, we are not using it
+ * yet.
+ *
+ * @param[in] percent 0 to 100%
+ *
+ * @notapi
+ */
+static __inline void set_backlight(uint8_t percent) {
+ if (percent)
+ palSetPad(IOPORT2, PIOB_LCD_BL);
+ else
+ palClearPad(IOPORT2, PIOB_LCD_BL);
+}
+
+/**
+ * @brief Take exclusive control of the bus
+ *
+ * @notapi
+ */
+static __inline void acquire_bus(void) {
+ /* Nothing to do for this board as the LCD is the only device on the SPI port */
+}
+
+/**
+ * @brief Release exclusive control of the bus
+ *
+ * @notapi
+ */
+static __inline void release_bus(void) {
+ // Nothing to do for this board as the LCD is the only device on the SPI port
+}
+
+/**
+ * @brief Send an 8 bit command to the lcd.
+ *
+ * @param[in] cmd The command to send
+ *
+ * @notapi
+ */
+static __inline void write_cmd(uint16_t cmd) {
+ // wait for the previous transfer to complete
+ while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
+ // send the command
+ pSPI->SPI_TDR = cmd & 0xFF;
+}
+
+/**
+ * @brief Send an 8 bit data to the lcd.
+ *
+ * @param[in] data The data to send
+ *
+ * @notapi
+ */
+static __inline void write_data(uint16_t data) {
+ // wait for the previous transfer to complete
+ while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
+ // send the data
+ pSPI->SPI_TDR = data | 0x0100;
+}
+
+#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
+/**
+ * @brief Read data from the lcd.
+ *
+ * @return The data from the lcd
+ *
+ * @notapi
+ */
+static __inline uint16_t read_data(void) {
+ #error "gdispNokia6610GE12: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
+ return 0;
+}
+#endif
+
+#endif /* _GDISP_LLD_BOARD_H */
+/** @} */
diff --git a/drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h b/drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h
new file mode 100644
index 00000000..ab9d35e7
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h
@@ -0,0 +1,58 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h
+ * @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 GE12 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_CONFIG_H
+#define _GDISP_LLD_CONFIG_H
+
+#if GFX_USE_GDISP
+
+/*===========================================================================*/
+/* Driver hardware support. */
+/*===========================================================================*/
+
+#define GDISP_DRIVER_NAME "Nokia6610GE12"
+#define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610GE12
+
+#define GDISP_HARDWARE_FILLS TRUE
+#define GDISP_HARDWARE_BITFILLS TRUE
+#define GDISP_HARDWARE_CONTROL TRUE
+
+#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE
+#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE
+
+#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB444
+/* This driver supports both packed and unpacked pixel formats and line formats.
+ * By default we leave these as FALSE.
+ */
+#define GDISP_PACKED_PIXELS FALSE
+#define GDISP_PACKED_LINES FALSE
+
+#endif /* GFX_USE_GDISP */
+
+#endif /* _GDISP_LLD_CONFIG_H */
+/** @} */
diff --git a/drivers/gdisp/Nokia6610/readme.txt b/drivers/gdisp/Nokia6610GE12/readme.txt
index cd3722fb..54c4570f 100644
--- a/drivers/gdisp/Nokia6610/readme.txt
+++ b/drivers/gdisp/Nokia6610GE12/readme.txt
@@ -1,16 +1,15 @@
+This driver is for the Nokia6610 Philips (GE12) controller
+
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
- c) One (only) of:
- #define GDISP_USE_GE8 /* The Epson controller */
- #define GDISP_USE_GE12 /* The Philips controller */
- d) If you are not using a known board then create a gdisp_lld_board.h file
+ c) If you are not using a known board then create a gdisp_lld_board.h file
and ensure it is on your include path.
Use the gdisp_lld_board_example.h file as a basis.
Currently known boards are:
Olimex SAM7-EX256
2. To your makefile add the following lines:
- include $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.mk
+ include $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk
diff --git a/drivers/gdisp/Nokia6610/GE8.h b/drivers/gdisp/Nokia6610GE8/GE8.h
index 789308a9..789308a9 100644
--- a/drivers/gdisp/Nokia6610/GE8.h
+++ b/drivers/gdisp/Nokia6610GE8/GE8.h
diff --git a/drivers/gdisp/Nokia6610GE8/gdisp_lld.c b/drivers/gdisp/Nokia6610GE8/gdisp_lld.c
new file mode 100644
index 00000000..beba41a9
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE8/gdisp_lld.c
@@ -0,0 +1,483 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file drivers/gdisp/Nokia6610GE8/gdisp_lld.c
+ * @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE8 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
+
+/* Include the emulation code for things we don't support */
+#include "gdisp/lld/emulation.c"
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+#include "GE8.h"
+
+/* This controller is only ever used with a 132 x 132 display */
+#if defined(GDISP_SCREEN_HEIGHT)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
+ #undef GDISP_SCREEN_HEIGHT
+#endif
+#if defined(GDISP_SCREEN_WIDTH)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
+ #undef GDISP_SCREEN_WIDTH
+#endif
+#define GDISP_SCREEN_HEIGHT 132
+#define GDISP_SCREEN_WIDTH 132
+
+#define GDISP_INITIAL_CONTRAST 38
+#define GDISP_INITIAL_BACKLIGHT 100
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+#if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD
+ /* Include the user supplied board definitions */
+ #include "gdisp_lld_board.h"
+#elif defined(BOARD_OLIMEX_SAM7_EX256)
+ #include "gdisp_lld_board_olimexsam7ex256.h"
+#else
+ /* Include the user supplied board definitions */
+ #include "gdisp_lld_board.h"
+#endif
+
+// Some macros just to make reading the code easier
+#define delayms(ms) chThdSleepMilliseconds(ms)
+#define write_data2(d1, d2) { write_data(d1); write_data(d2); }
+#define write_data3(d1, d2, d3) { write_data(d1); write_data(d2); write_data(d3); }
+#define write_cmd1(cmd, d1) { write_cmd(cmd); write_data(d1); }
+#define write_cmd2(cmd, d1, d2) { write_cmd(cmd); write_data2(d1, d2); }
+#define write_cmd3(cmd, d1, d2, d3) { write_cmd(cmd); write_data3(d1, d2, d3); }
+
+// A very common thing to do.
+// An inline function has been used here incase the parameters have side effects with the internal calculations.
+static __inline void setviewport(coord_t x, coord_t y, coord_t cx, coord_t cy) {
+ write_cmd2(CASET, x, x+cx-1); // Column address set
+ write_cmd2(PASET, y, y+cy-1); // Page address set
+}
+
+/*===========================================================================*/
+/* Driver interrupt handlers. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/* ---- Required Routines ---- */
+/*
+ The following 2 routines are required.
+ All other routines are optional.
+*/
+
+/**
+ * @brief Low level GDISP driver initialization.
+ *
+ * @notapi
+ */
+bool_t GDISP_LLD(init)(void) {
+ /* Initialise your display */
+ init_board();
+
+ // Hardware reset
+ setpin_reset(TRUE);
+ delayms(20);
+ setpin_reset(FALSE);
+ delayms(20);
+
+ // Get the bus for the following initialisation commands
+ acquire_bus();
+
+ write_cmd3(DISCTL, 0x00, 0x20, 0x00); // Display control
+ // P1: 0x00 = 2 divisions, switching period=8 (default)
+ // P2: 0x20 = nlines/4 - 1 = 132/4 - 1 = 32)
+ // P3: 0x00 = no inversely highlighted lines
+ write_cmd1(COMSCN, 0x01); // COM scan P1: 0x01 = Scan 1->80, 160<-81
+ write_cmd(OSCON); // Internal oscilator ON
+ write_cmd(SLPOUT); // Sleep out
+ write_cmd1(PWRCTR, 0x0F); // Power control - reference voltage regulator on, circuit voltage follower on, BOOST ON
+ write_cmd3(DATCTL, 0x48, 0x00, 0x02); // Data control
+ // P1: 0x01 = page address inverted, column address normal, address scan in column direction
+ // P2: 0x00 = RGB sequence (default value)
+ // P3: 0x02 = Grayscale -> 16 (selects 12-bit color, type A)
+ write_cmd2(VOLCTR, GDISP_INITIAL_CONTRAST, 0x03); // Voltage control (contrast setting)
+ // P1 = Contrast
+ // P2 = 3 resistance ratio (only value that works)
+ delayms(100); // allow power supply to stabilize
+ write_cmd(DISON); // Turn on the display
+
+ // Release the bus
+ release_bus();
+
+ /* Turn on the back-light */
+ set_backlight(GDISP_INITIAL_BACKLIGHT);
+
+ /* Initialise the GDISP structure to match */
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Orientation = GDISP_ROTATE_0;
+ GDISP.Powermode = powerOn;
+ GDISP.Backlight = GDISP_INITIAL_BACKLIGHT;
+ GDISP.Contrast = GDISP_INITIAL_CONTRAST;
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ GDISP.clipx0 = 0;
+ GDISP.clipy0 = 0;
+ GDISP.clipx1 = GDISP.Width;
+ GDISP.clipy1 = GDISP.Height;
+ #endif
+ return TRUE;
+}
+
+/**
+ * @brief Draws a pixel on the display.
+ *
+ * @param[in] x X location of the pixel
+ * @param[in] y Y location of the pixel
+ * @param[in] color The color of the pixel
+ *
+ * @notapi
+ */
+void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ if (x < GDISP.clipx0 || y < GDISP.clipy0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
+ #endif
+ acquire_bus();
+ setviewport(x, y, 1, 1);
+ write_cmd3(RAMWR, 0, (color>>8) & 0x0F, color & 0xFF);
+ release_bus();
+}
+
+/* ---- Optional Routines ---- */
+
+#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
+ /**
+ * @brief Fill an area with a color.
+ *
+ * @param[in] x, y The start filled area
+ * @param[in] cx, cy The width and height to be filled
+ * @param[in] color The color of the fill
+ *
+ * @notapi
+ */
+ void GDISP_LLD(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
+ unsigned i, tuples;
+
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; }
+ if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; }
+ if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
+ if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
+ if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
+ #endif
+
+ tuples = (cx*cy+1)/2; // With an odd sized area we over-print by one pixel.
+ // This extra pixel is ignored by the controller.
+
+ acquire_bus();
+ setviewport(x, y, cx, cy);
+ write_cmd(RAMWR);
+ for(i=0; i < tuples; i++)
+ write_data3(((color >> 4) & 0xFF), (((color << 4) & 0xF0)|((color >> 8) & 0x0F)), (color & 0xFF));
+ release_bus();
+ }
+#endif
+
+#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
+ /**
+ * @brief Fill an area with a bitmap.
+ *
+ * @param[in] x, y The start filled area
+ * @param[in] cx, cy The width and height to be filled
+ * @param[in] srcx, srcy The bitmap position to start the fill from
+ * @param[in] srccx The width of a line in the bitmap.
+ * @param[in] buffer The pixels to use to fill the area.
+ *
+ * @notapi
+ */
+ void GDISP_LLD(blitareaex)(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer) {
+ coord_t endx, endy, lg;
+ color_t c1, c2;
+ #if GDISP_PACKED_PIXELS
+ coord_t pos;
+ const uint8_t *p;
+ #endif
+
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; srcx += GDISP.clipx0 - x; x = GDISP.clipx0; }
+ if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; srcy += GDISP.clipy0 - y; y = GDISP.clipy0; }
+ if (srcx+cx > srccx) cx = srccx - srcx;
+ if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
+ if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
+ if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
+ #endif
+
+ /* What are our end points */
+ endx = srcx + cx;
+ endy = y + cy;
+
+ acquire_bus();
+ setviewport(x, y, cx, cy);
+ write_cmd(RAMWR);
+
+ #if !GDISP_PACKED_PIXELS
+ // Although this controller uses packed pixels we support unpacked pixel
+ // formats in this blit by packing the data as we feed it to the controller.
+ lg = srccx - cx;
+ buffer += srcy * srccx + srcx;
+ x = srcx;
+ while (1) {
+ /* Get a pixel */
+ c1 = *buffer++;
+ if (++x >= endx) {
+ if (++y >= endy) {
+ /* Odd pixel at end */
+ write_data3(0, ((c1 >> 8) & 0x0F), (c1 & 0xFF));
+ break;
+ }
+ x = srcx;
+ buffer += lg;
+ }
+ /* Get the next pixel */
+ c2 = *buffer++;
+ write_data3(((c1 >> 4) & 0xFF), (((c1 << 4) & 0xF0)|((c2 >> 8) & 0x0F)), (c2 & 0xFF));
+ if (++x >= endx) {
+ if (++y >= endy)
+ break;
+ x = srcx;
+ buffer += lg;
+ }
+ }
+
+ #else
+
+ // Although this controller uses packed pixels, we may have to feed it into
+ // the controller with different packing to the source bitmap
+ #if !GDISP_PACKED_LINES
+ srccx = (srccx + 1) & ~1;
+ #endif
+ pos = srcy*srccx;
+ lg = (srccx - cx)/2*3;
+ p = ((const uint8_t *)buffer) + ((pos+srcx)/2 * 3);
+
+ x = srcx;
+ while (1) {
+ /* Get a pixel */
+ switch((pos+x)&1) {
+ case 0: c1 = (((color_t)p[0]) << 4)|(((color_t)p[1])>>4); break;
+ case 1: c1 = (((color_t)p[1]&0x0F) << 8)|((color_t)p[1]); break;
+ }
+ if (++x >= endx) {
+ if (++y >= endy) {
+ /* Odd pixel at end */
+ write_data3(0, ((c1 >> 8) & 0x0F), (c1 & 0xFF));
+ break;
+ }
+ x = srcx;
+ p += lg;
+ pos += srccx;
+ }
+ /* Get the next pixel */
+ switch((pos+x)&1) {
+ case 0: c2 = (((color_t)p[0]) << 4)|(((color_t)p[1])>>4); break;
+ case 1: c2 = (((color_t)p[1]&0x0F) << 8)|((color_t)p[1]); break;
+ }
+ write_data3(((c1 >> 4) & 0xFF), (((c1 << 4) & 0xF0)|((c2 >> 8) & 0x0F)), (c2 & 0xFF));
+ if (++x >= endx) {
+ if (++y >= endy)
+ break;
+ x = srcx;
+ p += lg;
+ pos += srccx;
+ }
+ }
+ #endif
+ release_bus();
+ }
+#endif
+
+#if (GDISP_NEED_PIXELREAD && GDISP_HARDWARE_PIXELREAD)
+ /**
+ * @brief Get the color of a particular pixel.
+ * @note If x,y is off the screen, the result is undefined.
+ *
+ * @param[in] x, y The start of the text
+ *
+ * @notapi
+ */
+ color_t GDISP_LLD(getpixelcolor)(coord_t x, coord_t y) {
+ /* NOT IMPLEMENTED */
+ /* Some board hardware might support this in the future.
+ * The Olimex board doesn't.
+ */
+ }
+#endif
+
+#if (GDISP_NEED_SCROLL && GDISP_HARDWARE_SCROLL)
+ /**
+ * @brief Scroll vertically a section of the screen.
+ * @note If x,y + cx,cy is off the screen, the result is undefined.
+ * @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
+ *
+ * @param[in] x, y The start of the area to be scrolled
+ * @param[in] cx, cy The size of the area to be scrolled
+ * @param[in] lines The number of lines to scroll (Can be positive or negative)
+ * @param[in] bgcolor The color to fill the newly exposed area.
+ *
+ * @notapi
+ */
+ void GDISP_LLD(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
+ /* NOT IMPLEMENTED */
+ /* The hardware seems capable of doing this.
+ * It is just really complex so we leave it out for now.
+ */
+ }
+#endif
+
+#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__)
+ /**
+ * @brief Driver Control
+ * @details Unsupported control codes are ignored.
+ * @note The value parameter should always be typecast to (void *).
+ * @note There are some predefined and some specific to the low level driver.
+ * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t
+ * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t
+ * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver
+ * that only supports off/on anything other
+ * than zero is on.
+ * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100.
+ * GDISP_CONTROL_LLD - Low level driver control constants start at
+ * this value.
+ *
+ * @param[in] what What to do.
+ * @param[in] value The value to use (always cast to a void *).
+ *
+ * @notapi
+ */
+ void GDISP_LLD(control)(unsigned what, void *value) {
+ /* The hardware is capable of supporting...
+ * GDISP_CONTROL_POWER - not implemented yet
+ * GDISP_CONTROL_ORIENTATION - not implemented yet
+ * GDISP_CONTROL_BACKLIGHT - supported (the OlimexSAM7EX256 board.h currently only implements off/on although PWM is supported by the hardware)
+ * GDISP_CONTROL_CONTRAST - supported
+ */
+ switch(what) {
+#if 0
+ // NOT IMPLEMENTED YET
+ case GDISP_CONTROL_POWER:
+ if (GDISP.Powermode == (gdisp_powermode_t)value)
+ return;
+ switch((gdisp_powermode_t)value) {
+ case powerOff:
+ // Code here
+ break;
+ case powerOn:
+ // Code here
+ /* You may need this ---
+ * if (GDISP.Powermode != powerSleep)
+ * GDISP_LLD(init)();
+ */
+ break;
+ case powerSleep:
+ /* Code here */
+ break;
+ default:
+ return;
+ }
+ GDISP.Powermode = (gdisp_powermode_t)value;
+ return;
+#endif
+#if 0
+ // NOT IMPLEMENTED YET
+ case GDISP_CONTROL_ORIENTATION:
+ if (GDISP.Orientation == (gdisp_orientation_t)value)
+ return;
+ // WriteSpiData(0x48); // no mirror Y (temporary to satisfy Olimex bmptoarray utility)
+ // WriteSpiData(0xC8); // restore to (mirror x and y, reverse rgb)
+ switch((gdisp_orientation_t)value) {
+ case GDISP_ROTATE_0:
+ // Code here
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ break;
+ case GDISP_ROTATE_90:
+ // Code here
+ GDISP.Height = GDISP_SCREEN_WIDTH;
+ GDISP.Width = GDISP_SCREEN_HEIGHT;
+ break;
+ case GDISP_ROTATE_180:
+ // Code here
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ break;
+ case GDISP_ROTATE_270:
+ // Code here
+ GDISP.Height = GDISP_SCREEN_WIDTH;
+ GDISP.Width = GDISP_SCREEN_HEIGHT;
+ break;
+ default:
+ return;
+ }
+ #if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION
+ GDISP.clipx0 = 0;
+ GDISP.clipy0 = 0;
+ GDISP.clipx1 = GDISP.Width;
+ GDISP.clipy1 = GDISP.Height;
+ #endif
+ GDISP.Orientation = (gdisp_orientation_t)value;
+ return;
+#endif
+ case GDISP_CONTROL_BACKLIGHT:
+ if ((unsigned)value > 100) value = (void *)100;
+ set_backlight((unsigned)value);
+ GDISP.Backlight = (unsigned)value;
+ return;
+ case GDISP_CONTROL_CONTRAST:
+ if ((unsigned)value > 100) value = (void *)100;
+ acquire_bus();
+ write_cmd2(VOLCTR, (unsigned)value, 0x03);
+ release_bus();
+ GDISP.Contrast = (unsigned)value;
+ return;
+ }
+ }
+#endif
+
+#endif /* GFX_USE_GDISP */
+/** @} */
diff --git a/drivers/gdisp/Nokia6610GE8/gdisp_lld.mk b/drivers/gdisp/Nokia6610GE8/gdisp_lld.mk
new file mode 100644
index 00000000..3a1adec9
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE8/gdisp_lld.mk
@@ -0,0 +1,5 @@
+# List the required driver.
+GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE8/gdisp_lld.c
+
+# Required include directories
+GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE8
diff --git a/drivers/gdisp/Nokia6610/gdisp_lld_board_example.h b/drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h
index c8528f9e..fd330590 100644
--- a/drivers/gdisp/Nokia6610/gdisp_lld_board_example.h
+++ b/drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h
@@ -19,8 +19,8 @@
*/
/**
- * @file drivers/gdisp/Nokia6610/gdisp_lld_board_example.h
- * @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 display.
+ * @file drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h
+ * @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE8 display.
*
* @addtogroup GDISP
* @{
@@ -41,7 +41,7 @@
*/
static __inline void init_board(void) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for init_board for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for init_board for your board"
}
/**
@@ -53,7 +53,7 @@ static __inline void init_board(void) {
*/
static __inline void setpin_reset(bool_t state) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for setpin_reset for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for setpin_reset for your board"
}
/**
@@ -68,7 +68,7 @@ static __inline void setpin_reset(bool_t state) {
*/
static __inline void set_backlight(uint8_t percent) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for set_backlight for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for set_backlight for your board"
}
/**
@@ -77,7 +77,8 @@ static __inline void set_backlight(uint8_t percent) {
* @notapi
*/
static __inline void acquire_bus(void) {
-#error "gdispNokia6610: You must supply a definition for acquire_bus for your board"
+ /* Code here */
+ #error "gdispNokia6610GE8: You must supply a definition for acquire_bus for your board"
}
/**
@@ -86,7 +87,8 @@ static __inline void acquire_bus(void) {
* @notapi
*/
static __inline void release_bus(void) {
-#error "gdispNokia6610: You must supply a definition for release_bus for your board"
+ /* Code here */
+ #error "gdispNokia6610GE8: You must supply a definition for release_bus for your board"
}
/**
@@ -98,7 +100,7 @@ static __inline void release_bus(void) {
*/
static __inline void write_cmd(uint16_t cmd) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for write_cmd for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for write_cmd for your board"
}
/**
@@ -110,7 +112,7 @@ static __inline void write_cmd(uint16_t cmd) {
*/
static __inline void write_data(uint16_t data) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for write_data for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for write_data for your board"
}
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
@@ -125,7 +127,7 @@ static __inline void write_data(uint16_t data) {
*/
static __inline uint16_t read_data(void) {
/* Code here */
-#error "gdispNokia6610: You must supply a definition for read_data for your board"
+ #error "gdispNokia6610GE8: You must supply a definition for read_data for your board"
}
#endif
diff --git a/drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h b/drivers/gdisp/Nokia6610GE8/gdisp_lld_board_olimexsam7ex256.h
index 0b5756d0..f3b32b3a 100644
--- a/drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h
+++ b/drivers/gdisp/Nokia6610GE8/gdisp_lld_board_olimexsam7ex256.h
@@ -19,7 +19,7 @@
*/
/**
- * @file drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h
+ * @file drivers/gdisp/Nokia6610GE8/gdisp_lld_board_olimexsam7ex256.h
* @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
*
* @addtogroup GDISP
@@ -187,7 +187,7 @@ static __inline void write_data(uint16_t data) {
* @notapi
*/
static __inline uint16_t read_data(void) {
- #error "gdispNokia6610: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
+ #error "gdispNokia6610GE8: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
return 0;
}
#endif
diff --git a/drivers/gdisp/Nokia6610/gdisp_lld_config.h b/drivers/gdisp/Nokia6610GE8/gdisp_lld_config.h
index e7583b54..87bdb824 100644
--- a/drivers/gdisp/Nokia6610/gdisp_lld_config.h
+++ b/drivers/gdisp/Nokia6610GE8/gdisp_lld_config.h
@@ -19,8 +19,8 @@
*/
/**
- * @file drivers/gdisp/Nokia6610/gdisp_lld_config.h
- * @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 display.
+ * @file drivers/gdisp/Nokia6610GE8/gdisp_lld_config.h
+ * @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 GE8 display.
*
* @addtogroup GDISP
* @{
@@ -35,8 +35,8 @@
/* Driver hardware support. */
/*===========================================================================*/
-#define GDISP_DRIVER_NAME "Nokia6610"
-#define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610
+#define GDISP_DRIVER_NAME "Nokia6610GE8"
+#define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610GE8
#define GDISP_HARDWARE_FILLS TRUE
#define GDISP_HARDWARE_BITFILLS TRUE
diff --git a/drivers/gdisp/Nokia6610GE8/readme.txt b/drivers/gdisp/Nokia6610GE8/readme.txt
new file mode 100644
index 00000000..c8ad8faa
--- /dev/null
+++ b/drivers/gdisp/Nokia6610GE8/readme.txt
@@ -0,0 +1,15 @@
+This driver is for the Nokia6610 Epson (GE8) controller
+
+To use this driver:
+
+1. Add in your halconf.h:
+ a) #define GFX_USE_GDISP TRUE
+ b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
+ c) If you are not using a known board then create a gdisp_lld_board.h file
+ and ensure it is on your include path.
+ Use the gdisp_lld_board_example.h file as a basis.
+ Currently known boards are:
+ Olimex SAM7-EX256
+
+2. To your makefile add the following lines:
+ include $(GFXLIB)/drivers/gdisp/Nokia6610GE8/gdisp_lld.mk
diff --git a/drivers/gdisp/S6D1121/gdisp_lld.c b/drivers/gdisp/S6D1121/gdisp_lld.c
index 5fac4b29..e690456a 100644
--- a/drivers/gdisp/S6D1121/gdisp_lld.c
+++ b/drivers/gdisp/S6D1121/gdisp_lld.c
@@ -28,21 +28,23 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
#if defined(GDISP_SCREEN_HEIGHT)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
+ #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif
diff --git a/drivers/gdisp/SSD1289/gdisp_lld.c b/drivers/gdisp/SSD1289/gdisp_lld.c
index abcc4736..49600349 100644
--- a/drivers/gdisp/SSD1289/gdisp_lld.c
+++ b/drivers/gdisp/SSD1289/gdisp_lld.c
@@ -28,12 +28,12 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
diff --git a/drivers/gdisp/SSD1963/gdisp_lld.c b/drivers/gdisp/SSD1963/gdisp_lld.c
index cc8e776e..41cbd969 100644
--- a/drivers/gdisp/SSD1963/gdisp_lld.c
+++ b/drivers/gdisp/SSD1963/gdisp_lld.c
@@ -28,12 +28,19 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
+
+#ifndef GDISP_SCREEN_HEIGHT
+ #define GDISP_SCREEN_HEIGHT 320
+#endif
+#ifndef GDISP_SCREEN_WIDTH
+ #define GDISP_SCREEN_WIDTH 240
+#endif
/* All the board specific code should go in these include file so the driver
* can be ported to another board just by creating a suitable file.
diff --git a/drivers/gdisp/TestStub/gdisp_lld.c b/drivers/gdisp/TestStub/gdisp_lld.c
index 79181036..83049aa2 100644
--- a/drivers/gdisp/TestStub/gdisp_lld.c
+++ b/drivers/gdisp/TestStub/gdisp_lld.c
@@ -28,12 +28,19 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
+
+#ifndef GDISP_SCREEN_HEIGHT
+ #define GDISP_SCREEN_HEIGHT 128
+#endif
+#ifndef GDISP_SCREEN_WIDTH
+ #define GDISP_SCREEN_WIDTH 128
+#endif
/* ---- Required Routines ---- */
/*
@@ -48,8 +55,8 @@
*/
bool_t GDISP_LLD(init)(void) {
/* Initialise the GDISP structure */
- GDISP.Width = 128;
- GDISP.Height = 128;
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Orientation = GDISP_ROTATE_0;
GDISP.Powermode = powerOff;
GDISP.Backlight = 100;
diff --git a/drivers/gdisp/VMT/gdisp_lld.c b/drivers/gdisp/VMT/gdisp_lld.c
index 1bacf1a7..9d9c7382 100644
--- a/drivers/gdisp/VMT/gdisp_lld.c
+++ b/drivers/gdisp/VMT/gdisp_lld.c
@@ -28,14 +28,14 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define GDISP_LLD_NO_STRUCT
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
@@ -46,6 +46,7 @@
/* Prototypes for lld driver functions */
bool_t GDISP_LLD1(init)(void);
+void *GDISP_LLD1(query)(unsigned what);
void GDISP_LLD1(clear)(color_t color);
void GDISP_LLD1(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD1(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@@ -79,11 +80,9 @@ void GDISP_LLD1(drawline)(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_
#if GDISP_NEED_CONTROL
void GDISP_LLD1(control)(unsigned what, void *value);
#endif
-#if GDISP_NEED_QUERY
- void *GDISP_LLD1(query)(unsigned what);
-#endif
bool_t GDISP_LLD2(init)(void);
+void *GDISP_LLD2(query)(unsigned what);
void GDISP_LLD2(clear)(color_t color);
void GDISP_LLD2(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD2(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@@ -117,15 +116,13 @@ void GDISP_LLD2(drawline)(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_
#if GDISP_NEED_CONTROL
void GDISP_LLD2(control)(unsigned what, void *value);
#endif
-#if GDISP_NEED_QUERY
- void *GDISP_LLD2(query)(unsigned what);
-#endif
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/* Our VMT table variables */
+void *GDISP_LLD_VMT(query)(unsigned what);
void GDISP_LLD_VMT(clear)(color_t color);
void GDISP_LLD_VMT(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD_VMT(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@@ -162,10 +159,6 @@ void GDISP_LLD_VMT(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy,
#if GDISP_NEED_CONTROL
void GDISP_LLD_VMT(control)(unsigned what, void *value);
#endif
-/* Set driver specific control */
-#if GDISP_NEED_QUERY
-void *GDISP_LLD_VMT(query)(unsigned what);
-#endif
/* Clipping Functions */
#if GDISP_NEED_CLIP
void GDISP_LLD_VMT(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy);
@@ -194,6 +187,7 @@ void GDISP_LLD_VMT(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy);
bool_t gdisp_lld_init_VMT(void) {
if (GDISP_VMT_NAME1(gdisp_lld_init_)()) {
+ gdisp_lld_query_VMT = GDISP_VMT_NAME1(gdisp_lld_query_);
gdisp_lld_clear_VMT = GDISP_VMT_NAME1(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME1(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME1(gdisp_lld_fillarea_);
@@ -224,9 +218,6 @@ bool_t gdisp_lld_init_VMT(void) {
#if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME1(gdisp_lld_control_);
#endif
- #if GDISP_NEED_QUERY
- gdisp_lld_query_VMT = GDISP_VMT_NAME1(gdisp_lld_query_);
- #endif
#if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME1(gdisp_lld_setclip_);
#endif
@@ -235,6 +226,7 @@ bool_t gdisp_lld_init_VMT(void) {
}
if (GDISP_VMT_NAME2(gdisp_lld_init_)()) {
+ gdisp_lld_query_VMT = GDISP_VMT_NAME2(gdisp_lld_query_);
gdisp_lld_clear_VMT = GDISP_VMT_NAME2(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME2(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME2(gdisp_lld_fillarea_);
@@ -265,9 +257,6 @@ bool_t gdisp_lld_init_VMT(void) {
#if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME2(gdisp_lld_control_);
#endif
- #if GDISP_NEED_QUERY
- gdisp_lld_query_VMT = GDISP_VMT_NAME2(gdisp_lld_query_);
- #endif
#if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME2(gdisp_lld_setclip_);
#endif
diff --git a/drivers/gdisp/VMT/gdisp_lld_driver1.c b/drivers/gdisp/VMT/gdisp_lld_driver1.c
index 06dadc54..01fd4cf0 100644
--- a/drivers/gdisp/VMT/gdisp_lld_driver1.c
+++ b/drivers/gdisp/VMT/gdisp_lld_driver1.c
@@ -42,7 +42,7 @@
#include CONFIGFILE()
/* Bring in our API */
-#include "gdisp.h"
+#include "gfx.h"
/* Add the low level driver */
#include DRIVERFILE()
diff --git a/drivers/gdisp/VMT/gdisp_lld_driver2.c b/drivers/gdisp/VMT/gdisp_lld_driver2.c
index 5dca0b27..ed0e8555 100644
--- a/drivers/gdisp/VMT/gdisp_lld_driver2.c
+++ b/drivers/gdisp/VMT/gdisp_lld_driver2.c
@@ -42,7 +42,7 @@
#include CONFIGFILE()
/* Bring in our API */
-#include "gdisp.h"
+#include "gfx.h"
/* Add the low level driver */
#include DRIVERFILE()
diff --git a/drivers/ginput/toggle/Pal/ginput_lld_toggle.c b/drivers/ginput/toggle/Pal/ginput_lld_toggle.c
index 560d11b9..a3a360d8 100644
--- a/drivers/ginput/toggle/Pal/ginput_lld_toggle.c
+++ b/drivers/ginput/toggle/Pal/ginput_lld_toggle.c
@@ -28,13 +28,13 @@
#include "ch.h"
#include "hal.h"
+#include "gfx.h"
#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) /*|| defined(__DOXYGEN__)*/
-// Declare the static members in the following include file
-#define GINPUT_TOGGLE_DECLARE_CONFIG
+#include "ginput/lld/toggle.h"
-#include "lld/ginput/toggle.h"
+GINPUT_TOGGLE_DECLARE_STRUCTURE();
/**
* @brief Initialise the port.
diff --git a/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_example.h b/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_example.h
index 46d32b47..a96178b0 100644
--- a/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_example.h
+++ b/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_example.h
@@ -29,37 +29,32 @@
#ifndef _GDISP_LLD_TOGGLE_BOARD_H
#define _GDISP_LLD_TOGGLE_BOARD_H
-#ifndef _GINPUT_LLD_TOGGLE_CONFIG_H
- // Visible in ginput.h
-
- #define GINPUT_TOGGLE_SW1 0 // Switch 1
- #define GINPUT_TOGGLE_SW2 1 // Switch 2
- #define GINPUT_TOGGLE_UP 2 // Joystick Up
- #define GINPUT_TOGGLE_DOWN 3 // Joystick Down
- #define GINPUT_TOGGLE_LEFT 4 // Joystick Left
- #define GINPUT_TOGGLE_RIGHT 5 // Joystick Right
- #define GINPUT_TOGGLE_CENTER 6 // Joystick Center
-
-#elif !defined(GINPUT_TOGGLE_DECLARE_CONFIG)
- // Visible in ginput_lld.h
-
- #define GINPUT_TOGGLE_NUM_PORTS 7 // The total number of toggle inputs
-
-#else
- // Visible in ginput_lld_toggle.c
-
- GToggleConfig GInputToggleConfigTable[] = {
- {AT91C_BASE_PIOB, // Switch 1 and Switch 2
- PIOB_SW1_MASK|PIOB_SW2_MASK,
- PIOB_SW1_MASK|PIOB_SW2_MASK,
- PAL_MODE_INPUT},
- {AT91C_BASE_PIOA, // B1..4 Joystick
- PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK,
- PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK,
- PAL_MODE_INPUT},
- };
-
-#endif
+#error "GINPUT Toggle Pal Driver: You need to define your board definitions"
+
+// The below are example values
+
+#define GINPUT_TOGGLE_NUM_PORTS 7 // The total number of toggle inputs
+#define GINPUT_TOGGLE_CONFIG_ENTRIES 2 // The total number of GToggleConfig entries
+
+#define GINPUT_TOGGLE_SW1 0 // Switch 1
+#define GINPUT_TOGGLE_SW2 1 // Switch 2
+#define GINPUT_TOGGLE_UP 2 // Joystick Up
+#define GINPUT_TOGGLE_DOWN 3 // Joystick Down
+#define GINPUT_TOGGLE_LEFT 4 // Joystick Left
+#define GINPUT_TOGGLE_RIGHT 5 // Joystick Right
+#define GINPUT_TOGGLE_CENTER 6 // Joystick Center
+
+#define GINPUT_TOGGLE_DECLARE_STRUCTURE() \
+ const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { \
+ {AT91C_BASE_PIOB, /* Switch 1 and Switch 2 */ \
+ PIOB_SW1_MASK|PIOB_SW2_MASK, \
+ PIOB_SW1_MASK|PIOB_SW2_MASK, \
+ PAL_MODE_INPUT}, \
+ {AT91C_BASE_PIOA, /* B1..4 Joystick */ \
+ PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
+ PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
+ PAL_MODE_INPUT}, \
+ }
#endif /* _GDISP_LLD_TOGGLE_BOARD_H */
/** @} */
diff --git a/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_olimexsam7ex256.h b/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_olimexsam7ex256.h
index b767f32c..3ba5858d 100644
--- a/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_olimexsam7ex256.h
+++ b/drivers/ginput/toggle/Pal/ginput_lld_toggle_board_olimexsam7ex256.h
@@ -40,21 +40,17 @@
#define GINPUT_TOGGLE_RIGHT 5 // Joystick Right
#define GINPUT_TOGGLE_CENTER 6 // Joystick Center
-#ifdef GINPUT_TOGGLE_DECLARE_CONFIG
- // Visible in ginput_lld_toggle.c
-
- const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = {
- {AT91C_BASE_PIOB, // Switch 1 and Switch 2
- PIOB_SW1_MASK|PIOB_SW2_MASK,
- PIOB_SW1_MASK|PIOB_SW2_MASK,
- PAL_MODE_INPUT},
- {AT91C_BASE_PIOA, // B1..4 Joystick
- PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK,
- PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK,
- PAL_MODE_INPUT},
- };
-
-#endif
+#define GINPUT_TOGGLE_DECLARE_STRUCTURE() \
+ const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { \
+ {AT91C_BASE_PIOB, /* Switch 1 and Switch 2 */ \
+ PIOB_SW1_MASK|PIOB_SW2_MASK, \
+ PIOB_SW1_MASK|PIOB_SW2_MASK, \
+ PAL_MODE_INPUT}, \
+ {AT91C_BASE_PIOA, /* B1..4 Joystick */ \
+ PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
+ PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
+ PAL_MODE_INPUT}, \
+ }
#endif /* _GDISP_LLD_TOGGLE_BOARD_H */
/** @} */
diff --git a/drivers/ginput/toggle/Pal/ginput_lld_toggle_config.h b/drivers/ginput/toggle/Pal/ginput_lld_toggle_config.h
index a3fcf22e..774be200 100644
--- a/drivers/ginput/toggle/Pal/ginput_lld_toggle_config.h
+++ b/drivers/ginput/toggle/Pal/ginput_lld_toggle_config.h
@@ -31,7 +31,10 @@
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
-#if defined(BOARD_OLIMEX_SAM7_EX256)
+#if GINPUT_TOGGLE_USE_CUSTOM_BOARD
+ /* Include the user supplied board definitions */
+ #include "ginput_lld_toggle_board.h"
+#elif defined(BOARD_OLIMEX_SAM7_EX256)
#include "ginput_lld_toggle_board_olimexsam7ex256.h"
#else
/* Include the user supplied board definitions */
diff --git a/drivers/ginput/touch/MCU/ginput_lld_mouse_board_olimex_stm32_lcd.h b/drivers/ginput/touch/MCU/ginput_lld_mouse_board_olimex_stm32_lcd.h
index fa3dca7e..2fa6fe44 100644
--- a/drivers/ginput/touch/MCU/ginput_lld_mouse_board_olimex_stm32_lcd.h
+++ b/drivers/ginput/touch/MCU/ginput_lld_mouse_board_olimex_stm32_lcd.h
@@ -105,7 +105,7 @@ static __inline void release_bus(void) {
*
* @notapi
*/
-static uint16_t read_x_value(void) {
+static __inline uint16_t read_x_value(void) {
uint16_t val1, val2;
adcsample_t samples[ADC_NUM_CHANNELS * ADC_BUF_DEPTH];
@@ -113,7 +113,7 @@ static uint16_t read_x_value(void) {
palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOC, 2, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 3, PAL_MODE_OUTPUT_PUSHPULL);
-
+
palSetPad(GPIOC, 2);
palClearPad(GPIOC, 3);
chThdSleepMilliseconds(1);
@@ -135,7 +135,7 @@ static uint16_t read_x_value(void) {
*
* @notapi
*/
-static uint16_t read_y_value(void) {
+static __inline uint16_t read_y_value(void) {
uint16_t val1, val2;
adcsample_t samples[ADC_NUM_CHANNELS * ADC_BUF_DEPTH];
@@ -143,8 +143,8 @@ static uint16_t read_y_value(void) {
palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL);
-
- palSetPad(GPIOC, 1);
+
+ palSetPad(GPIOC, 1);
palClearPad(GPIOC, 0);
chThdSleepMilliseconds(1);
adcConvert(&ADCD1, &adc_y_config, samples, ADC_BUF_DEPTH);
diff --git a/drivers/multiple/Win32/gdisp_lld.c b/drivers/multiple/Win32/gdisp_lld.c
index 5a741038..d44bbfad 100644
--- a/drivers/multiple/Win32/gdisp_lld.c
+++ b/drivers/multiple/Win32/gdisp_lld.c
@@ -28,7 +28,7 @@
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
@@ -39,16 +39,16 @@
#include <wingdi.h>
#include <assert.h>
-#ifndef GINPUT_NEED_TOGGLE
- #define GINPUT_NEED_TOGGLE FALSE
+#ifndef GDISP_SCREEN_WIDTH
+ #define GDISP_SCREEN_WIDTH 640
#endif
-#ifndef GINPUT_NEED_MOUSE
- #define GINPUT_NEED_MOUSE FALSE
+#ifndef GDISP_SCREEN_HEIGHT
+ #define GDISP_SCREEN_HEIGHT 480
#endif
#if GINPUT_NEED_TOGGLE
/* Include toggle support code */
- #include "lld/ginput/toggle.h"
+ #include "ginput/lld/toggle.h"
const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = {
{0, 0xFF, 0x00, PAL_MODE_INPUT},
@@ -57,12 +57,11 @@
#if GINPUT_NEED_MOUSE
/* Include mouse support code */
- #include "ginput.h"
- #include "lld/ginput/mouse.h"
+ #include "ginput/lld/mouse.h"
#endif
/* Include the emulation code for things we don't support */
-#include "lld/gdisp/emulation.c"
+#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local routines . */
@@ -621,7 +620,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
}
#endif
-#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
+#if (GDISP_HARDWARE_BITFILLS && GDISP_NEED_CONTROL) || defined(__DOXYGEN__)
static pixel_t *rotateimg(coord_t cx, coord_t cy, coord_t srcx, coord_t srccx, const pixel_t *buffer) {
pixel_t *dstbuf;
pixel_t *dst;
@@ -667,7 +666,9 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
}
return dstbuf;
}
+#endif
+#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
/**
* @brief Fill an area with a bitmap.
* @note Optional - The high level driver can emulate using software.
diff --git a/gfx.mk b/gfx.mk
index 8b369958..545e3157 100644
--- a/gfx.mk
+++ b/gfx.mk
@@ -3,15 +3,11 @@ ifeq ($(GFXLIB),)
GFXLIB = $(CHIBIOS)/ext/gfx
endif
-GFXSRC += $(GFXLIB)/src/gdisp.c \
- $(GFXLIB)/src/gdisp_fonts.c \
- $(GFXLIB)/src/gevent.c \
- $(GFXLIB)/src/gtimer.c \
- $(GFXLIB)/src/gwin.c \
- $(GFXLIB)/src/touchscreen.c \
- $(GFXLIB)/src/graph.c \
-
GFXINC += $(GFXLIB)/include
+GFXSRC +=
+include $(GFXLIB)/src/gdisp/gdisp.mk
+include $(GFXLIB)/src/gevent/gevent.mk
+include $(GFXLIB)/src/gtimer/gtimer.mk
include $(GFXLIB)/src/gwin/gwin.mk
include $(GFXLIB)/src/ginput/ginput.mk
diff --git a/include/gdisp.h b/include/gdisp/gdisp.h
index 53848e16..b9434d3f 100644
--- a/include/gdisp.h
+++ b/include/gdisp/gdisp.h
@@ -19,7 +19,7 @@
*/
/**
- * @file include/gdisp.h
+ * @file include/gdisp/gdisp.h
* @brief GDISP Graphic Driver subsystem header file.
*
* @addtogroup GDISP
@@ -29,9 +29,16 @@
#ifndef _GDISP_H
#define _GDISP_H
-#ifndef GFX_USE_GDISP
- #define GFX_USE_GDISP FALSE
-#endif
+#include "gfx.h"
+
+/* This type definition is defined here as it gets used in other gfx sub-systems even
+ * if GFX_USE_GDISP is FALSE.
+ */
+
+/**
+ * @brief The type for a coordinate or length on the screen.
+ */
+typedef int16_t coord_t;
#if GFX_USE_GDISP || defined(__DOXYGEN__)
@@ -66,65 +73,16 @@
#define SkyBlue HTML2COLOR(0x87CEEB)
/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name GDISP more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Do the drawing functions need to be thread-safe.
- * @details Defaults to FALSE
- * @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
- * the gdisp API thread-safe.
- * @note This is more efficient than GDISP_NEED_ASYNC as it only
- * requires a context switch if something else is already
- * drawing.
- */
- #ifndef GDISP_NEED_MULTITHREAD
- #define GDISP_NEED_MULTITHREAD FALSE
- #endif
-
- /**
- * @brief Use asynchronous calls (multi-thread safe).
- * @details Defaults to FALSE
- * @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
- * the gdisp API thread-safe.
- * @note Turning this on adds two context switches per transaction
- * so it can significantly slow graphics drawing.
- */
- #ifndef GDISP_NEED_ASYNC
- #define GDISP_NEED_ASYNC FALSE
- #endif
-/** @} */
-
-#if GDISP_NEED_MULTITHREAD && GDISP_NEED_ASYNC
- #error "GDISP: Only one of GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC should be defined."
-#endif
-
-#if GDISP_NEED_ASYNC
- /* Messaging API is required for Async Multi-Thread */
- #undef GDISP_NEED_MSGAPI
- #define GDISP_NEED_MSGAPI TRUE
-#endif
-
-/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/* Include the low level driver information */
-#include "lld/gdisp/gdisp_lld.h"
+#include "gdisp/lld/gdisp_lld.h"
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
-typedef struct _point_t {
- coord_t x;
- coord_t y;
-} point_t;
-
/**
* @brief Type for the text justification.
*/
@@ -224,9 +182,7 @@ extern "C" {
#endif
/* Query driver specific data */
- #if GDISP_NEED_CONTROL
void *gdispQuery(unsigned what);
- #endif
#else
@@ -286,8 +242,9 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/*
* Macro definitions
*/
+
/* Now obsolete functions */
-#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
+#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
/* Macro definitions for common gets and sets */
#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))
diff --git a/include/lld/gdisp/emulation.c b/include/gdisp/lld/emulation.c
index 88a8c42f..04afd630 100644
--- a/include/lld/gdisp/emulation.c
+++ b/include/gdisp/lld/emulation.c
@@ -667,7 +667,7 @@
}
#endif
-#if GDISP_NEED_QUERY && !GDISP_HARDWARE_QUERY
+#if !GDISP_HARDWARE_QUERY
void *GDISP_LLD(query)(unsigned what) {
switch(what) {
case GDISP_QUERY_WIDTH: return (void *)(unsigned)GDISP.Width;
@@ -756,11 +756,9 @@ void *GDISP_LLD(query)(unsigned what) {
GDISP_LLD(control)(msg->control.what, msg->control.value);
break;
#endif
- #if GDISP_NEED_QUERY
case GDISP_LLD_MSG_QUERY:
msg->query.result = GDISP_LLD(query)(msg->query.what);
break;
- #endif
}
}
#endif
diff --git a/include/lld/gdisp/gdisp_lld.h b/include/gdisp/lld/gdisp_lld.h
index 4e29dc48..76b698bc 100644
--- a/include/lld/gdisp/gdisp_lld.h
+++ b/include/gdisp/lld/gdisp_lld.h
@@ -19,7 +19,7 @@
*/
/**
- * @file include/lld/gdisp/gdisp_lld.h
+ * @file include/gdisp/lld/gdisp_lld.h
* @brief GDISP Graphic Driver subsystem low level driver header.
*
* @addtogroup GDISP
@@ -35,106 +35,6 @@
/* Low level driver configuration needs */
/*===========================================================================*/
-/**
- * @name GDISP low level driver more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should all operations be clipped to the screen and colors validated.
- * @details Defaults to TRUE.
- * @note If this is FALSE, any operations that extend beyond the
- * edge of the screen will have undefined results. Any
- * out-of-range colors will produce undefined results.
- * @note If defined then all low level and high level driver routines
- * must check the validity of inputs and do something sensible
- * if they are out of range. It doesn't have to be efficient,
- * just valid.
- */
- #ifndef GDISP_NEED_VALIDATION
- #define GDISP_NEED_VALIDATION TRUE
- #endif
-
- /**
- * @brief Are circle functions needed.
- * @details Defaults to TRUE
- */
- #ifndef GDISP_NEED_CIRCLE
- #define GDISP_NEED_CIRCLE TRUE
- #endif
-
- /**
- * @brief Are ellipse functions needed.
- * @details Defaults to TRUE
- */
- #ifndef GDISP_NEED_ELLIPSE
- #define GDISP_NEED_ELLIPSE TRUE
- #endif
-
- /**
- * @brief Are arc functions needed.
- * @details Defaults to FALSE
- */
- #ifndef GDISP_NEED_ARC
- #define GDISP_NEED_ARC FALSE
- #endif
-
- /**
- * @brief Are text functions needed.
- * @details Defaults to TRUE
- */
- #ifndef GDISP_NEED_TEXT
- #define GDISP_NEED_TEXT TRUE
- #endif
-
- /**
- * @brief Is scrolling needed.
- * @details Defaults to FALSE
- */
- #ifndef GDISP_NEED_SCROLL
- #define GDISP_NEED_SCROLL FALSE
- #endif
-
- /**
- * @brief Is the capability to read pixels back needed.
- * @details Defaults to FALSE
- */
- #ifndef GDISP_NEED_PIXELREAD
- #define GDISP_NEED_PIXELREAD FALSE
- #endif
-
- /**
- * @brief Are clipping functions needed.
- * @details Defaults to TRUE
- */
- #ifndef GDISP_NEED_CLIP
- #define GDISP_NEED_CLIP FALSE
- #endif
-
- /**
- * @brief Control some aspect of the drivers operation.
- * @details Defaults to FALSE
- */
- #ifndef GDISP_NEED_CONTROL
- #define GDISP_NEED_CONTROL FALSE
- #endif
-
- /**
- * @brief Query some aspect of the drivers operation.
- * @details Defaults to TRUE
- */
- #ifndef GDISP_NEED_QUERY
- #define GDISP_NEED_QUERY TRUE
- #endif
-
- /**
- * @brief Is the messaging api interface required.
- * @details Defaults to FALSE
- */
- #ifndef GDISP_NEED_MSGAPI
- #define GDISP_NEED_MSGAPI FALSE
- #endif
-/** @} */
-
/*===========================================================================*/
/* Include the low level driver configuration information */
/*===========================================================================*/
@@ -538,10 +438,6 @@
/*===========================================================================*/
/**
- * @brief The type for a coordinate or length on the screen.
- */
-typedef int16_t coord_t;
-/**
* @brief The type of a pixel.
*/
typedef color_t pixel_t;
@@ -624,9 +520,7 @@ extern "C" {
#endif
/* Query driver specific data */
- #if GDISP_NEED_QUERY
extern void *GDISP_LLD_VMT(query)(unsigned what);
- #endif
/* Clipping Functions */
#if GDISP_NEED_CLIP
diff --git a/include/lld/gdisp/gdisp_lld_msgs.h b/include/gdisp/lld/gdisp_lld_msgs.h
index f5d29ea1..31a82237 100644
--- a/include/lld/gdisp/gdisp_lld_msgs.h
+++ b/include/gdisp/lld/gdisp_lld_msgs.h
@@ -68,9 +68,7 @@ typedef enum gdisp_msgaction {
#if GDISP_NEED_CONTROL
GDISP_LLD_MSG_CONTROL,
#endif
- #if GDISP_NEED_QUERY
- GDISP_LLD_MSG_QUERY,
- #endif
+ GDISP_LLD_MSG_QUERY,
} gdisp_msgaction_t;
typedef union gdisp_lld_msg {
@@ -189,7 +187,7 @@ typedef union gdisp_lld_msg {
} query;
} gdisp_lld_msg_t;
-#endif /* GFX_USE_GDISP */
+#endif /* GFX_USE_GDISP && GDISP_NEED_MSGAPI */
#endif /* _GDISP_LLD_MSGS_H */
/** @} */
diff --git a/include/gdisp/options.h b/include/gdisp/options.h
new file mode 100644
index 00000000..c2163631
--- /dev/null
+++ b/include/gdisp/options.h
@@ -0,0 +1,208 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gdisp/options.h
+ * @brief GDISP sub-system options header file.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_OPTIONS_H
+#define _GDISP_OPTIONS_H
+
+/**
+ * @name GDISP Functionality to be included
+ * @{
+ */
+ /**
+ * @brief Should all operations be clipped to the screen and colors validated.
+ * @details Defaults to TRUE.
+ * @note If this is FALSE, any operations that extend beyond the
+ * edge of the screen will have undefined results. Any
+ * out-of-range colors will produce undefined results.
+ * @note If defined then all low level and high level GDISP driver routines
+ * must check the validity of inputs and do something sensible
+ * if they are out of range. It doesn't have to be efficient,
+ * just valid.
+ */
+ #ifndef GDISP_NEED_VALIDATION
+ #define GDISP_NEED_VALIDATION TRUE
+ #endif
+ /**
+ * @brief Are clipping functions needed.
+ * @details Defaults to TRUE
+ */
+ #ifndef GDISP_NEED_CLIP
+ #define GDISP_NEED_CLIP TRUE
+ #endif
+ /**
+ * @brief Are text functions needed.
+ * @details Defaults to TRUE
+ */
+ #ifndef GDISP_NEED_TEXT
+ #define GDISP_NEED_TEXT TRUE
+ #endif
+ /**
+ * @brief Are circle functions needed.
+ * @details Defaults to TRUE
+ */
+ #ifndef GDISP_NEED_CIRCLE
+ #define GDISP_NEED_CIRCLE TRUE
+ #endif
+ /**
+ * @brief Are ellipse functions needed.
+ * @details Defaults to TRUE
+ */
+ #ifndef GDISP_NEED_ELLIPSE
+ #define GDISP_NEED_ELLIPSE TRUE
+ #endif
+ /**
+ * @brief Are arc functions needed.
+ * @details Defaults to FALSE
+ * @note Requires the maths library to be included in the link. ie -lm
+ */
+ #ifndef GDISP_NEED_ARC
+ #define GDISP_NEED_ARC FALSE
+ #endif
+ /**
+ * @brief Are scrolling functions needed.
+ * @details Defaults to FALSE
+ * @note This function must be supported by the low level GDISP driver
+ * you have included in your project. If it isn't, defining this
+ * option will cause a compile error.
+ */
+ #ifndef GDISP_NEED_SCROLL
+ #define GDISP_NEED_SCROLL FALSE
+ #endif
+ /**
+ * @brief Is the capability to read pixels back needed.
+ * @details Defaults to FALSE
+ * @note This function must be supported by the low level GDISP driver
+ * you have included in your project. If it isn't, defining this
+ * option will cause a compile error.
+ */
+ #ifndef GDISP_NEED_PIXELREAD
+ #define GDISP_NEED_PIXELREAD FALSE
+ #endif
+ /**
+ * @brief Control some aspect of the hardware operation.
+ * @details Defaults to FALSE
+ * @note This allows control of hardware specific features such as
+ * screen rotation, backlight levels, contrast etc
+ */
+ #ifndef GDISP_NEED_CONTROL
+ #define GDISP_NEED_CONTROL FALSE
+ #endif
+ /**
+ * @brief Is the messaging api interface required.
+ * @details Defaults to FALSE
+ */
+ #ifndef GDISP_NEED_MSGAPI
+ #define GDISP_NEED_MSGAPI FALSE
+ #endif
+/**
+ * @}
+ *
+ * @name GDISP Multi-Threading Options
+ * @{
+ */
+ /**
+ * @brief Do the drawing functions need to be thread-safe.
+ * @details Defaults to FALSE
+ * @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
+ * the gdisp API thread-safe.
+ * @note This is more efficient than GDISP_NEED_ASYNC as it only
+ * requires a context switch if something else is already
+ * drawing.
+ */
+ #ifndef GDISP_NEED_MULTITHREAD
+ #define GDISP_NEED_MULTITHREAD FALSE
+ #endif
+ /**
+ * @brief Use asynchronous calls (multi-thread safe).
+ * @details Defaults to FALSE
+ * @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
+ * the gdisp API thread-safe.
+ * @note Turning this on adds two context switches per transaction
+ * so it can significantly slow graphics drawing but it allows
+ * drawing operations to continue in the background.
+ */
+ #ifndef GDISP_NEED_ASYNC
+ #define GDISP_NEED_ASYNC FALSE
+ #endif
+/**
+ * @}
+ *
+ * @name GDISP Optional Sizing Parameters
+ * @{
+ */
+ /**
+ * @brief The maximum height of a font.
+ * @details Either 16 or 32. Defaults to 16
+ * @note Setting this to 32 causes the font tables to take
+ * twice the internal program memory. Don't do it unless
+ * you realy must define an unscaled font larger than 16 bits high.
+ */
+ #ifndef GDISP_MAX_FONT_HEIGHT
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #endif
+/**
+ * @}
+ *
+ * @name GDISP Optional Low Level Driver Defines
+ * @{
+ */
+ /**
+ * @brief Use a custom board definition even if a board definition exists.
+ * @details Defaults to FALSE
+ * @details If TRUE, add gdisp_lld_board.h to your project directory and customise it.
+ * @note Not all GDISP low level drivers currently use board definition files.
+ */
+ #ifndef GDISP_USE_CUSTOM_BOARD
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #endif
+ /**
+ * @brief Set the screen height and width.
+ * @note Ignored by some low level GDISP drivers, optional for others.
+ * @note Where these values are allowed, a default is always provided be the low level driver.
+ * @note The list of GDISP low level drivers that allow these to be set are...
+ * WIN32, SSD1289, SSD1963, TestStub
+ */
+ /* #define GDISP_SCREEN_WIDTH nnnn */
+ /* #define GDISP_SCREEN_HEIGHT nnnn */
+ /**
+ * @brief Define which bus interface to use.
+ * @details Only required by the SSD1963 driver.
+ * @note This will be replaced eventually by board definition files
+ */
+ /* #define GDISP_USE_FSMC */
+ /* #define GDISP_USE_GPIO */
+ /**
+ * @brief Define which two drivers will be used by the VMT layer.
+ * @details Only required by the VMT driver.
+ */
+ /* #define GDISP_VMT_NAME1(x) x##YourDriver1 */
+ /* #define GDISP_VMT_NAME2(x) x##YourDriver2 */
+/** @} */
+
+#endif /* _GDISP_OPTIONS_H */
+/** @} */
diff --git a/include/gevent.h b/include/gevent/gevent.h
index 6467e60d..a68a5fc0 100644
--- a/include/gevent.h
+++ b/include/gevent/gevent.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gevent.h
+ * @file include/gevent/gevent.h
* @brief GEVENT GFX User Event subsystem header file.
*
* @addtogroup GEVENT
@@ -27,56 +27,18 @@
#ifndef _GEVENT_H
#define _GEVENT_H
-#ifndef GFX_USE_GEVENT
- #define GFX_USE_GEVENT FALSE
-#endif
+#include "gfx.h"
#if GFX_USE_GEVENT || defined(__DOXYGEN__)
/**
- * @name GEVENT macros and more complex functionality to be compiled
- * @{
+ * @brief Data part of a static GListener initializer.
*/
- /**
- * @brief Data part of a static GListener initializer.
- */
- #define _GLISTENER_DATA(name) { _SEMAPHORE_DATA(name.waitqueue, 0), _BSEMAPHORE_DATA(name.eventlock, FALSE), 0, 0, {0} }
- /**
- * @brief Static GListener initializer.
- */
- #define GLISTENER_DECL(name) GListener name = _GLISTENER_DATA(name)
- /**
- * @brief Defines the maximum size of an event status variable.
- * @details Defaults to 32 bytes
- */
- #ifndef GEVENT_MAXIMUM_STATUS_SIZE
- #define GEVENT_MAXIMUM_STATUS_SIZE 32
- #endif
- /**
- * @brief Should routines assert() if they run out of resources.
- * @details Defaults to FALSE.
- * @details If FALSE the application must be prepared to handle these
- * failures.
- */
- #ifndef GEVENT_ASSERT_NO_RESOURCE
- #define GEVENT_ASSERT_NO_RESOURCE FALSE
- #endif
- /**
- * @brief Defines the maximum Source/Listener pairs in the system.
- * @details Defaults to 32
- */
- #ifndef MAX_SOURCE_LISTENERS
- #define MAX_SOURCE_LISTENERS 32
- #endif
-/** @} */
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
- #error "GEVENT: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
-#endif
+#define _GLISTENER_DATA(name) { _SEMAPHORE_DATA(name.waitqueue, 0), _BSEMAPHORE_DATA(name.eventlock, FALSE), 0, 0, {0} }
+/**
+ * @brief Static GListener initializer.
+ */
+#define GLISTENER_DECL(name) GListener name = _GLISTENER_DATA(name)
/*===========================================================================*/
/* Type definitions */
@@ -93,11 +55,11 @@ typedef uint16_t GEventType;
// This object can be typecast to any GEventXxxxx type to allow any sub-system (or the application) to create events.
// The prerequisite is that the new status structure type starts with a field named 'type' of type 'GEventType'.
-// The total status structure also must not exceed GEVENT_MAXIMUM_STATUS_SIZE bytes.
+// The total status structure also must not exceed GEVENT_MAXIMUM_SIZE bytes.
// For example, this is used by GWIN button events, GINPUT data streams etc.
typedef union GEvent_u {
- GEventType type; // The type of this event
- char pad[GEVENT_MAXIMUM_STATUS_SIZE]; // This is here to allow static initialisation of GEventObject's in the application.
+ GEventType type; // The type of this event
+ char pad[GEVENT_MAXIMUM_SIZE]; // This is here to allow static initialisation of GEventObject's in the application.
} GEvent;
// A special callback function
diff --git a/include/gevent/options.h b/include/gevent/options.h
new file mode 100644
index 00000000..576233bf
--- /dev/null
+++ b/include/gevent/options.h
@@ -0,0 +1,68 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gevent/options.h
+ * @brief GEVENT sub-system options header file.
+ *
+ * @addtogroup GEVENT
+ * @{
+ */
+
+#ifndef _GEVENT_OPTIONS_H
+#define _GEVENT_OPTIONS_H
+
+/**
+ * @name GEVENT Functionality to be included
+ * @{
+ */
+ /**
+ * @brief Should routines assert() if they run out of resources.
+ * @details Defaults to FALSE.
+ * @details If FALSE the application must be prepared to handle these
+ * failures.
+ */
+ #ifndef GEVENT_ASSERT_NO_RESOURCE
+ #define GEVENT_ASSERT_NO_RESOURCE FALSE
+ #endif
+/**
+ * @}
+ *
+ * @name GEVENT Optional Sizing Parameters
+ * @{
+ */
+ /**
+ * @brief Defines the maximum size of an event status variable.
+ * @details Defaults to 32 bytes
+ */
+ #ifndef GEVENT_MAXIMUM_SIZE
+ #define GEVENT_MAXIMUM_SIZE 32
+ #endif
+ /**
+ * @brief Defines the maximum Source/Listener pairs in the system.
+ * @details Defaults to 32
+ */
+ #ifndef GEVENT_MAX_SOURCE_LISTENERS
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #endif
+/** @} */
+
+#endif /* _GEVENT_OPTIONS_H */
+/** @} */
diff --git a/include/gfx.h b/include/gfx.h
new file mode 100644
index 00000000..9dfe681a
--- /dev/null
+++ b/include/gfx.h
@@ -0,0 +1,114 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gfx.h
+ * @brief GFX system header file.
+ *
+ * @addtogroup GFX
+ * @{
+ */
+
+#ifndef _GFX_H
+#define _GFX_H
+
+/* gfxconf.h is the user's project configuration for the GFX system. */
+#include "gfxconf.h"
+
+/**
+ * @name GFX sub-systems that can be turned on
+ * @{
+ */
+ /**
+ * @brief GFX Graphics Display Basic API
+ * @details Defaults to FALSE
+ * @note Also add the specific hardware driver to your makefile.
+ * Eg. include $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.mk
+ */
+ #ifndef GFX_USE_GDISP
+ #define GFX_USE_GDISP FALSE
+ #endif
+ /**
+ * @brief GFX Graphics Windowing API
+ * @details Defaults to FALSE
+ * @details Extends the GDISP API to add the concept of graphic windows.
+ * @note Also supports high-level "window" objects such as console windows,
+ * buttons, graphing etc
+ */
+ #ifndef GFX_USE_GWIN
+ #define GFX_USE_GWIN FALSE
+ #endif
+ /**
+ * @brief GFX Event API
+ * @details Defaults to FALSE
+ * @details Defines the concept of a "Source" that can send "Events" to "Listeners".
+ */
+ #ifndef GFX_USE_GEVENT
+ #define GFX_USE_GEVENT FALSE
+ #endif
+ /**
+ * @brief GFX Timer API
+ * @details Defaults to FALSE
+ * @details Provides thread context timers - both one-shot and periodic.
+ */
+ #ifndef GFX_USE_GTIMER
+ #define GFX_USE_GTIMER FALSE
+ #endif
+ /**
+ * @brief GFX Input Device API
+ * @details Defaults to FALSE
+ * @note Also add the specific hardware drivers to your makefile.
+ * Eg.
+ * include $(GFXLIB)/drivers/ginput/toggle/Pal/ginput_lld.mk
+ * and...
+ * include $(GFXLIB)/drivers/ginput/touch/MCU/ginput_lld.mk
+ */
+ #ifndef GFX_USE_GINPUT
+ #define GFX_USE_GINPUT FALSE
+ #endif
+/** @} */
+
+/**
+ * Get all the options for each sub-system.
+ *
+ */
+#include "gevent/options.h"
+#include "gtimer/options.h"
+#include "gdisp/options.h"
+#include "gwin/options.h"
+#include "ginput/options.h"
+
+/**
+ * Inter-dependancy safety checks on the sub-systems.
+ *
+ */
+#include "gfx_rules.h"
+
+/**
+ * Include the sub-system header files
+ */
+#include "gevent/gevent.h"
+#include "gtimer/gtimer.h"
+#include "gdisp/gdisp.h"
+#include "gwin/gwin.h"
+#include "ginput/ginput.h"
+
+#endif /* _GFX_H */
+/** @} */
diff --git a/include/gfx_rules.h b/include/gfx_rules.h
new file mode 100644
index 00000000..26c9429c
--- /dev/null
+++ b/include/gfx_rules.h
@@ -0,0 +1,113 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gfx_rules.h
+ * @brief GFX system safety rules header file.
+ *
+ * @addtogroup GFX
+ * @{
+ */
+
+#ifndef _GFX_RULES_H
+#define _GFX_RULES_H
+
+/**
+ * Safety checks on all the defines.
+ *
+ * These are defined in the order of their inter-dependancies.
+ */
+
+#if GFX_USE_GWIN
+ #if !GFX_USE_GDISP
+ #error "GWIN: GFX_USE_GDISP must be TRUE when using GWIN"
+ #endif
+ #if !GDISP_NEED_CLIP
+ #warning "GWIN: Drawing can occur outside the defined windows as GDISP_NEED_CLIP is FALSE"
+ #endif
+ #if GWIN_NEED_BUTTON
+ #if !GDISP_NEED_TEXT
+ #error "GWIN: GDISP_NEED_TEXT is required if GWIN_NEED_BUTTON is TRUE."
+ #endif
+ #if !GFX_USE_GEVENT
+ #warning "GWIN: GFX_USE_GEVENT is required if GWIN_NEED_BUTTON is TRUE. It has been turned on for you."
+ #undef GFX_USE_GEVENT
+ #define GFX_USE_GEVENT TRUE
+ #endif
+ #if !GFX_USE_GINPUT || !(GINPUT_NEED_MOUSE || GINPUT_NEED_TOGGLE)
+ #warning "GWIN: You have set GWIN_NEED_BUTTON to TRUE but no supported GINPUT (mouse/toggle) devices have been included"
+ #endif
+ #if !GDISP_NEED_MULTITHREAD && !GDISP_NEED_ASYNC
+ #warning "GWIN: Either GDISP_NEED_MULTITHREAD or GDISP_NEED_ASYNC is required if GWIN_NEED_BUTTON is TRUE."
+ #warning "GWIN: GDISP_NEED_MULTITHREAD has been turned on for you."
+ #undef GDISP_NEED_MULTITHREAD
+ #define GDISP_NEED_MULTITHREAD TRUE
+ #endif
+ #endif
+ #if GWIN_NEED_CONSOLE
+ #if !GDISP_NEED_TEXT
+ #error "GWIN: GDISP_NEED_TEXT is required if GWIN_NEED_CONSOLE is TRUE."
+ #endif
+ #endif
+ #if GWIN_NEED_GRAPH
+ #endif
+#endif
+
+#if GFX_USE_GINPUT
+ #if !GFX_USE_GEVENT
+ #warning "GINPUT: GFX_USE_GEVENT is required if GFX_USE_GINPUT is TRUE. It has been turned on for you."
+ #undef GFX_USE_GEVENT
+ #define GFX_USE_GEVENT TRUE
+ #endif
+ #if !GFX_USE_GTIMER
+ #warning "GINPUT: GFX_USE_GTIMER is required if GFX_USE_GINPUT is TRUE. It has been turned on for you."
+ #undef GFX_USE_GTIMER
+ #define GFX_USE_GTIMER TRUE
+ #endif
+#endif
+
+#if GFX_USE_GDISP
+ #if GDISP_NEED_MULTITHREAD && GDISP_NEED_ASYNC
+ #error "GDISP: Only one of GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC should be defined."
+ #endif
+ #if GDISP_NEED_ASYNC
+ #if !GDISP_NEED_MSGAPI
+ #warning "GDISP: Messaging API is required for Async Multi-Thread. It has been turned on for you."
+ #undef GDISP_NEED_MSGAPI
+ #define GDISP_NEED_MSGAPI TRUE
+ #endif
+ #endif
+#endif
+
+#if GFX_USE_GEVENT
+ #if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
+ #error "GEVENT: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
+ #endif
+#endif
+
+#if GFX_USE_GTIMER
+ #if GFX_USE_GDISP && !GDISP_NEED_MULTITHREAD && !GDISP_NEED_ASYNC
+ #warning "GTIMER: Neither GDISP_NEED_MULTITHREAD nor GDISP_NEED_ASYNC has been specified."
+ #warning "GTIMER: Make sure you are not performing any GDISP/GWIN drawing operations in the timer callback!"
+ #endif
+#endif
+
+#endif /* _GFX_H */
+/** @} */
diff --git a/include/gfxconf.example.h b/include/gfxconf.example.h
new file mode 100644
index 00000000..94413237
--- /dev/null
+++ b/include/gfxconf.example.h
@@ -0,0 +1,74 @@
+/**
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+/**
+ * Copy this file into your project directory and rename it as gfxconf.h
+ * Edit your copy to turn on the GFX features you want to use.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP FALSE
+#define GFX_USE_GWIN FALSE
+#define GFX_USE_GEVENT FALSE
+#define GFX_USE_GTIMER FALSE
+#define GFX_USE_GINPUT FALSE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE TRUE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL FALSE
+#define GDISP_NEED_MULTITHREAD FALSE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON FALSE
+#define GWIN_NEED_CONSOLE FALSE
+#define GWIN_NEED_GRAPH FALSE
+
+/* Features for the GEVENT sub-system. */
+#define GEVENT_ASSERT_NO_RESOURCE FALSE
+
+/* Features for the GTIMER sub-system. */
+/* NONE */
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE FALSE
+#define GINPUT_NEED_KEYBOARD FALSE
+#define GINPUT_NEED_TOGGLE FALSE
+#define GINPUT_NEED_DIAL FALSE
+
+/* Optional Parameters for various sub-systems */
+/*
+ #define GDISP_MAX_FONT_HEIGHT 16
+ #define GEVENT_MAXIMUM_SIZE 32
+ #define GEVENT_MAX_SOURCE_LISTENERS 32
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+*/
+
+/* Optional Low Level Driver Definitions */
+/*
+ #define GDISP_USE_CUSTOM_BOARD FALSE
+ #define GDISP_SCREEN_WIDTH 320
+ #define GDISP_SCREEN_HEIGHT 240
+ #define GDISP_USE_FSMC
+ #define GDISP_USE_GPIO
+ #define GDISP_VMT_NAME1(x) x##YourDriver1
+ #define GDISP_VMT_NAME2(x) x##YourDriver2
+*/
+
+#endif /* _GFXCONF_H */
diff --git a/include/ginput.h b/include/ginput.h
deleted file mode 100644
index dc472e8e..00000000
--- a/include/ginput.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-/**
- * @file ginput.h
- * @brief GINPUT GFX User Input subsystem header file.
- *
- * @addtogroup GINPUT
- * @{
- */
-#ifndef _GINPUT_H
-#define _GINPUT_H
-
-#ifndef GFX_USE_GINPUT
- #define GFX_USE_GINPUT FALSE
-#endif
-
-#if GFX_USE_GINPUT || defined(__DOXYGEN__)
-
-/**
- * @name GINPUT more complex functionality to be compiled
- * @{
- */
-/** @} */
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-#ifndef GFX_USE_GDISP
- #define GFX_USE_GDISP FALSE
-#endif
-#if GFX_USE_GDISP
- #include "gdisp.h"
-#else
- // We require some basic type definitions normally kept in gdisp.h
- typedef int16_t coord_t;
-#endif
-
-#ifndef GFX_USE_GEVENT
- #define GFX_USE_GEVENT TRUE
-#elif !GFX_USE_GEVENT
- #error "GINPUT: GFX_USE_GEVENT must be defined"
-#endif
-#include "gevent.h"
-
-#ifndef GFX_USE_GTIMER
- #define GFX_USE_GTIMER TRUE
-#elif !GFX_USE_GTIMER
- #error "GINPUT: GFX_USE_GTIMER must be defined"
-#endif
-
-/*===========================================================================*/
-/* Type definitions */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-/* How to use...
-
- 1. Get source handles for all the inputs you are interested in.
- - Attempting to get a handle for one instance of an input more than once will return the same handle
- 2. Create a listener
- 3. Assign inputs to your listener.
- - Inputs can be assigned or released from a listener at any time.
- - An input can be assigned to more than one listener.
- 4. Loop on getting listener events
- 5. When complete destroy the listener
-*/
-
-// Include various ginput types
-#include "ginput/ginput_mouse.h"
-#include "ginput/ginput_keyboard.h"
-#include "ginput/ginput_toggle.h"
-#include "ginput/ginput_dial.h"
-
-#endif /* GFX_USE_GINPUT */
-
-#endif /* _GINPUT_H */
-/** @} */
diff --git a/include/ginput/ginput_dial.h b/include/ginput/dial.h
index 71448c0b..90db94ac 100644
--- a/include/ginput/ginput_dial.h
+++ b/include/ginput/dial.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file ginput/ginput_dial.h
+ * @file include/ginput/dial.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@@ -27,26 +27,9 @@
#ifndef _GINPUT_DIAL_H
#define _GINPUT_DIAL_H
-/**
- * @name GINPUT more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should analog dial functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GINPUT_NEED_DIAL
- #define GINPUT_NEED_DIAL FALSE
- #endif
-/** @} */
-
#if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
diff --git a/include/ginput/ginput.h b/include/ginput/ginput.h
new file mode 100644
index 00000000..ec8acca7
--- /dev/null
+++ b/include/ginput/ginput.h
@@ -0,0 +1,55 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @file include/ginput/ginput.h
+ * @brief GINPUT GFX User Input subsystem header file.
+ *
+ * @addtogroup GINPUT
+ * @{
+ */
+#ifndef _GINPUT_H
+#define _GINPUT_H
+
+#include "gfx.h"
+
+#if GFX_USE_GINPUT || defined(__DOXYGEN__)
+
+/* How to use...
+
+ 1. Get source handles for all the inputs you are interested in.
+ - Attempting to get a handle for one instance of an input more than once will return the same handle
+ 2. Create a listener
+ 3. Assign inputs to your listener.
+ - Inputs can be assigned or released from a listener at any time.
+ - An input can be assigned to more than one listener.
+ 4. Loop on getting listener events
+ 5. When complete destroy the listener
+*/
+
+// Include various ginput types
+#include "ginput/mouse.h"
+#include "ginput/keyboard.h"
+#include "ginput/toggle.h"
+#include "ginput/dial.h"
+
+#endif /* GFX_USE_GINPUT */
+
+#endif /* _GINPUT_H */
+/** @} */
diff --git a/include/ginput/ginput_keyboard.h b/include/ginput/keyboard.h
index 850adf38..cbb11194 100644
--- a/include/ginput/ginput_keyboard.h
+++ b/include/ginput/keyboard.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file ginput/ginput_keyboard.h
+ * @file include/ginput/keyboard.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@@ -27,26 +27,9 @@
#ifndef _GINPUT_KEYBOARD_H
#define _GINPUT_KEYBOARD_H
-/**
- * @name GINPUT more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should keyboard functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GINPUT_NEED_KEYBOARD
- #define GINPUT_NEED_KEYBOARD FALSE
- #endif
-/** @} */
-
#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__)
/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
diff --git a/include/lld/ginput/mouse.h b/include/ginput/lld/mouse.h
index 423a6c3e..09a0fb6a 100644
--- a/include/lld/ginput/mouse.h
+++ b/include/ginput/lld/mouse.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file lld/ginput/mouse.h
+ * @file include/ginput/lld/mouse.h
* @brief GINPUT LLD header file for mouse/touch drivers.
*
* @addtogroup GINPUT_MOUSE
@@ -27,14 +27,7 @@
#ifndef _LLD_GINPUT_MOUSE_H
#define _LLD_GINPUT_MOUSE_H
-#ifndef GINPUT_NEED_MOUSE
- #define GINPUT_NEED_MOUSE FALSE
-#endif
-#ifndef GINPUT_NEED_TOUCH
- #define GINPUT_NEED_TOUCH FALSE
-#endif
-
-#if GINPUT_NEED_MOUSE || GINPUT_NEED_TOUCH
+#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
#include "ginput_lld_mouse_config.h"
diff --git a/include/lld/ginput/toggle.h b/include/ginput/lld/toggle.h
index 72b097f0..2b437ed9 100644
--- a/include/lld/ginput/toggle.h
+++ b/include/ginput/lld/toggle.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file lld/ginput/toggle.h
+ * @file include/ginput/lld/toggle.h
* @brief GINPUT header file for toggle drivers.
*
* @addtogroup GINPUT_TOGGLE
@@ -27,14 +27,7 @@
#ifndef _LLD_GINPUT_TOGGLE_H
#define _LLD_GINPUT_TOGGLE_H
-#ifndef GFX_USE_GINPUT
- #define GFX_USE_GINPUT FALSE
-#endif
-#ifndef GINPUT_NEED_TOGGLE
- #define GINPUT_NEED_TOGGLE FALSE
-#endif
-
-#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) || defined(__DOXYGEN__)
+#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
// Describes how the toggle bits are obtained
typedef struct GToggleConfig_t {
@@ -44,14 +37,6 @@ typedef struct GToggleConfig_t {
iomode_t mode;
} GToggleConfig;
-// This must be included after the above type definition
-#include "ginput.h"
-
-// n - Millisecs between poll's
-#ifndef GINPUT_TOGGLE_POLL_PERIOD
- #define GINPUT_TOGGLE_POLL_PERIOD 200
-#endif
-
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/include/ginput/ginput_mouse.h b/include/ginput/mouse.h
index 1b596ac9..0aaea77b 100644
--- a/include/ginput/ginput_mouse.h
+++ b/include/ginput/mouse.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file ginput/ginput_mouse.h
+ * @file include/ginput/mouse.h
* @brief GINPUT GFX User Input subsystem header file for mouse and touch.
*
* @addtogroup GINPUT
@@ -27,25 +27,12 @@
#ifndef _GINPUT_MOUSE_H
#define _GINPUT_MOUSE_H
-/**
- * @name GINPUT more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should mouse/touch functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GINPUT_NEED_MOUSE
- #define GINPUT_NEED_MOUSE FALSE
- #endif
-/** @} */
+#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
-#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
-
/* This type definition is also used by touch */
typedef struct GEventMouse_t {
GEventType type; // The type of this event (GEVENT_MOUSE or GEVENT_TOUCH)
diff --git a/include/ginput/options.h b/include/ginput/options.h
new file mode 100644
index 00000000..e7635fb5
--- /dev/null
+++ b/include/ginput/options.h
@@ -0,0 +1,127 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/ginput/options.h
+ * @brief GINPUT sub-system options header file.
+ *
+ * @addtogroup GINPUT
+ * @{
+ */
+
+#ifndef _GINPUT_OPTIONS_H
+#define _GINPUT_OPTIONS_H
+
+/**
+ * @name GINPUT Functionality to be included
+ * @{
+ */
+ /**
+ * @brief Should mouse/touch functions be included.
+ * @details Defaults to FALSE
+ * @note Also add the a mouse/touch hardware driver to your makefile.
+ * Eg.
+ * include $(GFXLIB)/drivers/ginput/touch/MCU/ginput_lld.mk
+ */
+ #ifndef GINPUT_NEED_MOUSE
+ #define GINPUT_NEED_MOUSE FALSE
+ #endif
+ /**
+ * @brief Should keyboard functions be included.
+ * @details Defaults to FALSE
+ * @note Also add the a keyboard hardware driver to your makefile.
+ * Eg.
+ * include $(GFXLIB)/drivers/ginput/keyboard/XXXX/ginput_lld.mk
+ */
+ #ifndef GINPUT_NEED_KEYBOARD
+ #define GINPUT_NEED_KEYBOARD FALSE
+ #endif
+ /**
+ * @brief Should hardware toggle/switch/button functions be included.
+ * @details Defaults to FALSE
+ * @note Also add the a toggle hardware driver to your makefile.
+ * Eg.
+ * include $(GFXLIB)/drivers/ginput/toggle/Pal/ginput_lld.mk
+ */
+ #ifndef GINPUT_NEED_TOGGLE
+ #define GINPUT_NEED_TOGGLE FALSE
+ #endif
+ /**
+ * @brief Should analog dial functions be included.
+ * @details Defaults to FALSE
+ * @note Also add the a dial hardware driver to your makefile.
+ * Eg.
+ * include $(GFXLIB)/drivers/ginput/dial/analog/ginput_lld.mk
+ */
+ #ifndef GINPUT_NEED_DIAL
+ #define GINPUT_NEED_DIAL FALSE
+ #endif
+/**
+ * @}
+ *
+ * @name GINPUT Optional Sizing Parameters
+ * @{
+ */
+/**
+ * @}
+ *
+ * @name GINPUT Optional Low Level Driver Defines
+ * @{
+ */
+ /**
+ * @brief Use a custom board definition for the mouse/touch driver even if a board definition exists.
+ * @details Defaults to FALSE
+ * @details If TRUE, add ginput_lld_mouse_board.h to your project directory and customise it.
+ * @note Not all GINPUT mouse/touch low level drivers use board definition files.
+ */
+ #ifndef GINPUT_MOUSE_USE_CUSTOM_BOARD
+ #define GINPUT_MOUSE_USE_CUSTOM_BOARD FALSE
+ #endif
+ /**
+ * @brief Use a custom board definition for the keyboard driver even if a board definition exists.
+ * @details Defaults to FALSE
+ * @details If TRUE, add ginput_lld_keyboard_board.h to your project directory and customise it.
+ * @note Not all GINPUT keyboard low level drivers use board definition files.
+ */
+ #ifndef GINPUT_KEYBOARD_USE_CUSTOM_BOARD
+ #define GINPUT_KEYBOARD_USE_CUSTOM_BOARD FALSE
+ #endif
+ /**
+ * @brief Use a custom board definition for the toggle driver even if a board definition exists.
+ * @details Defaults to FALSE
+ * @details If TRUE, add ginput_lld_toggle_board.h to your project directory and customise it.
+ * @note Not all GINPUT toggle low level drivers use board definition files.
+ */
+ #ifndef GINPUT_TOGGLE_USE_CUSTOM_BOARD
+ #define GINPUT_TOGGLE_USE_CUSTOM_BOARD FALSE
+ #endif
+ /**
+ * @brief Use a custom board definition for the dial driver even if a board definition exists.
+ * @details Defaults to FALSE
+ * @details If TRUE, add ginput_lld_dial_board.h to your project directory and customise it.
+ * @note Not all GINPUT dial low level drivers use board definition files.
+ */
+ #ifndef GINPUT_DIAL_USE_CUSTOM_BOARD
+ #define GINPUT_DIAL_USE_CUSTOM_BOARD FALSE
+ #endif
+/** @} */
+
+#endif /* _GINPUT_OPTIONS_H */
+/** @} */
diff --git a/include/ginput/ginput_toggle.h b/include/ginput/toggle.h
index 10be1da9..2dce9726 100644
--- a/include/ginput/ginput_toggle.h
+++ b/include/ginput/toggle.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file ginput/ginput_toggle.h
+ * @file include/ginput/toggle.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@@ -27,25 +27,15 @@
#ifndef _GINPUT_TOGGLE_H
#define _GINPUT_TOGGLE_H
-/**
- * @name GINPUT more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should hardware toggle/switch/button (pio) functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GINPUT_NEED_TOGGLE
- #define GINPUT_NEED_TOGGLE FALSE
- #endif
-/** @} */
-
#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
+// Get the hardware definitions - Number of instances etc.
+#include "ginput_lld_toggle_config.h"
+
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
@@ -53,9 +43,6 @@
// Event types for various ginput sources
#define GEVENT_TOGGLE (GEVENT_GINPUT_FIRST+3)
-// Get the hardware definitions - Number of instances etc.
-#include "ginput_lld_toggle_config.h"
-
typedef struct GEventToggle_t {
GEventType type; // The type of this event (GEVENT_TOGGLE)
uint16_t instance; // The toggle instance
diff --git a/include/graph.h b/include/graph.h
deleted file mode 100644
index bc0d3d15..00000000
--- a/include/graph.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file include/graph.h
- * @brief GRAPH module header file.
- *
- * @addtogroup GRAPH
- * @{
- */
-
-#ifndef GRAPH_H
-#define GRAPH_H
-
-#ifndef GFX_USE_GRAPH
- #define GFX_USE_GRAPH FALSE
-#endif
-
-#if GFX_USE_GRAPH || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Type definitions */
-/*===========================================================================*/
-
-typedef struct _Graph {
- coord_t origin_x;
- coord_t origin_y;
- coord_t xmin;
- coord_t xmax;
- coord_t ymin;
- coord_t ymax;
- uint16_t grid_size;
- uint16_t dot_space;
- bool_t full_grid;
- bool_t arrows;
- color_t axis_color;
- color_t grid_color;
-
- /* do never modify values below this line manually */
- coord_t x0;
- coord_t x1;
- coord_t y0;
- coord_t y1;
-} Graph;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*===========================================================================*/
-/* Type definitions */
-/*===========================================================================*/
-
-void graphDrawSystem(Graph *g);
-void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color);
-void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
-void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GFX_USE_GRAPH */
-
-#endif
-/** @} */
-
diff --git a/include/gtimer.h b/include/gtimer/gtimer.h
index cf25ac8a..623120dc 100644
--- a/include/gtimer.h
+++ b/include/gtimer/gtimer.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gtimer.h
+ * @file include/gtimer/gtimer.h
* @brief GTIMER GFX User Timer subsystem header file.
*
* @addtogroup GTIMER
@@ -27,46 +27,27 @@
#ifndef _GTIMER_H
#define _GTIMER_H
-#ifndef GFX_USE_GTIMER
- #define GFX_USE_GTIMER FALSE
-#endif
+#include "gfx.h"
#if GFX_USE_GTIMER || defined(__DOXYGEN__)
-/**
- * @name GTIMER macros and more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Data part of a static GTimer initializer.
- */
- #define _GTIMER_DATA() {0,0,0,0,0,0,0}
- /**
- * @brief Static GTimer initializer.
- */
- #define GTIMER_DECL(name) GTimer name = _GTIMER_DATA()
- /**
- * @brief Defines the size of the timer threads work area (stack+structures).
- * @details Defaults to 512 bytes
- */
- #ifndef GTIMER_THREAD_STACK_SIZE
- #define GTIMER_THREAD_STACK_SIZE 512
- #endif
-/** @} */
-
/*===========================================================================*/
-/* Low Level Driver details and error checks. */
+/* Type definitions */
/*===========================================================================*/
-#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
- #error "GTIMER: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
-#endif
+/**
+ * @brief Data part of a static GTimer initializer.
+ */
+#define _GTIMER_DATA() {0,0,0,0,0,0,0}
-/*===========================================================================*/
-/* Type definitions */
-/*===========================================================================*/
+/**
+ * @brief Static GTimer initializer.
+ */
+#define GTIMER_DECL(name) GTimer name = _GTIMER_DATA()
-// A callback function (executed in a thread context)
+/**
+ * @brief A callback function (executed in a thread context).
+ */
typedef void (*GTimerFunction)(void *param);
/**
diff --git a/demos/applications/console/main.c b/include/gtimer/options.h
index b0e0fb7f..e0770627 100644
--- a/demos/applications/console/main.c
+++ b/include/gtimer/options.h
@@ -18,42 +18,35 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- * !!! IMPORTANT !!!
+/**
+ * @file include/gtimer/options.h
+ * @brief GTIMER sub-system options header file.
*
- * This example dosen't compile yet, there's a problem in the console source.
- * This issue will be fixed soon.
+ * @addtogroup GTIMER
+ * @{
*/
-/*
- * Please add the following to your halconf.h
+#ifndef _GTIMER_OPTIONS_H
+#define _GTIMER_OPTIONS_H
+
+/**
+ * @name GTIMER Functionality to be included
+ * @{
+ */
+/**
+ * @}
*
- * #define GFX_USE_CONSOLE TRUE
- * #define GDISP_NEED_SCROLL TRUE
+ * @name GTIMER Optional Sizing Parameters
+ * @{
*/
-
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-#include "chprintf.h"
-#include "console.h"
-
-static GConsole CON1;
-
-int main(void) {
- halInit();
- chSysInit();
-
- gdispInit();
- gdispClear(Lime);
-
- gfxConsoleInit(&CON1, 0, 0, gdispGetWidth(), gdispGetHeight(), &fontLarger, Black, White);
- chprintf((BaseSequentialStream *)&CON1, "Hello the time is %d\nGoodbye.", chTimeNow());
-
-
- while (TRUE) {
-
- chThdSleepMilliseconds(100);
- }
-}
-
+ /**
+ * @brief Defines the size of the timer threads work area (stack+structures).
+ * @details Defaults to 512 bytes
+ */
+ #ifndef GTIMER_THREAD_WORKAREA_SIZE
+ #define GTIMER_THREAD_WORKAREA_SIZE 512
+ #endif
+/** @} */
+
+#endif /* _GTIMER_OPTIONS_H */
+/** @} */
diff --git a/include/gwin/gwin_button.h b/include/gwin/button.h
index e95628e4..6fc564c7 100644
--- a/include/gwin/gwin_button.h
+++ b/include/gwin/button.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gwin/gwin_button.h
+ * @file include/gwin/button.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@@ -27,20 +27,6 @@
#ifndef _GWIN_BUTTON_H
#define _GWIN_BUTTON_H
-/**
- * @name GWIN more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should button functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GWIN_NEED_BUTTON
- #define GWIN_NEED_BUTTON FALSE
- #endif
-
-/** @} */
-
#if GWIN_NEED_BUTTON || defined(__DOXYGEN__)
/*===========================================================================*/
@@ -51,24 +37,6 @@
#define GEVENT_GWIN_BUTTON (GEVENT_GWIN_FIRST+0)
/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-#if !GDISP_NEED_TEXT
- #error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_BUTTON is defined."
-#endif
-
-#if !defined(GFX_USE_GEVENT) || !GFX_USE_GEVENT
- #error "GWIN Buttons require GFX_USE_GEVENT"
-#endif
-#include "gevent.h"
-
-/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
diff --git a/include/gwin/gwin_console.h b/include/gwin/console.h
index 5462ec2b..4e78d747 100644
--- a/include/gwin/gwin_console.h
+++ b/include/gwin/console.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gwin/gwin_console.h
+ * @file include/gwin/console.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@@ -27,19 +27,6 @@
#ifndef _GWIN_CONSOLE_H
#define _GWIN_CONSOLE_H
-/**
- * @name GWIN more complex functionality to be compiled
- * @{
- */
- /**
- * @brief Should console functions be included.
- * @details Defaults to FALSE
- */
- #ifndef GWIN_NEED_CONSOLE
- #define GWIN_NEED_CONSOLE FALSE
- #endif
-/** @} */
-
#if GWIN_NEED_CONSOLE || defined(__DOXYGEN__)
/*===========================================================================*/
@@ -49,18 +36,6 @@
#define GW_CONSOLE 0x0001
/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-#if GWIN_NEED_CONSOLE && !GDISP_NEED_TEXT
- #error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_CONSOLE is defined."
-#endif
-
-/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
diff --git a/include/gwin/graph.h b/include/gwin/graph.h
new file mode 100644
index 00000000..752460cb
--- /dev/null
+++ b/include/gwin/graph.h
@@ -0,0 +1,156 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gwin/graph.h
+ * @brief GWIN GRAPH module header file.
+ *
+ * @addtogroup GWIN_GRAPH
+ * @{
+ */
+
+#ifndef _GWIN_GRAPH_H
+#define _GWIN_GRAPH_H
+
+#if GWIN_NEED_GRAPH || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+#define GW_GRAPH 0x0003
+
+/*===========================================================================*/
+/* Type definitions */
+/*===========================================================================*/
+
+typedef struct GGraphPoint_t {
+ coord_t x, y;
+ } GGraphPoint;
+
+typedef enum GGraphPointType_e {
+ GGRAPH_POINT_NONE, GGRAPH_POINT_DOT, GGRAPH_POINT_SQUARE, GGRAPH_POINT_CIRCLE
+ } GGraphPointType;
+
+typedef struct GGraphPointStyle_t {
+ GGraphPointType type;
+ coord_t size;
+ color_t color;
+ } GGraphPointStyle;
+
+typedef enum GGraphLineType_e {
+ GGRAPH_LINE_NONE, GGRAPH_LINE_SOLID, GGRAPH_LINE_DOT, GGRAPH_LINE_DASH
+ } GGraphLineType;
+
+typedef struct GGraphLineStyle_t {
+ GGraphLineType type;
+ coord_t size;
+ color_t color;
+ } GGraphLineStyle;
+
+typedef struct GGraphGridStyle_t {
+ GGraphLineType type;
+ coord_t size;
+ color_t color;
+ coord_t spacing;
+ } GGraphGridStyle;
+
+typedef struct GGraphStyle_t {
+ GGraphPointStyle point;
+ GGraphLineStyle line;
+ GGraphLineStyle xaxis;
+ GGraphLineStyle yaxis;
+ GGraphGridStyle xgrid;
+ GGraphGridStyle ygrid;
+ uint16_t flags;
+ #define GWIN_GRAPH_STYLE_XAXIS_ARROWS 0x0001
+ #define GWIN_GRAPH_STYLE_YAXIS_ARROWS 0x0002
+} GGraphStyle;
+
+// A graph window
+typedef struct GGraphObject_t {
+ GWindowObject gwin;
+ GGraphStyle style;
+ coord_t xorigin, yorigin;
+ coord_t lastx, lasty;
+ } GGraphObject;
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height);
+ void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle);
+ void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y);
+ void gwinGraphDrawAxis(GHandle gh);
+ void gwinGraphStartSet(GHandle gh);
+ void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y);
+ void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*===========================================================================*/
+/* Type definitions */
+/*===========================================================================*/
+
+typedef struct _Graph {
+ coord_t origin_x;
+ coord_t origin_y;
+ coord_t xmin;
+ coord_t xmax;
+ coord_t ymin;
+ coord_t ymax;
+ uint16_t grid_size;
+ uint16_t dot_space;
+ bool_t full_grid;
+ bool_t arrows;
+ color_t axis_color;
+ color_t grid_color;
+
+ /* do never modify values below this line manually */
+ coord_t x0;
+ coord_t x1;
+ coord_t y0;
+ coord_t y1;
+} Graph;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*===========================================================================*/
+/* Type definitions */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GWIN_NEED_GRAPH */
+
+#endif /* _GWIN_GRAPH_H */
+/** @} */
+
diff --git a/include/gwin.h b/include/gwin/gwin.h
index f54c8d37..cca02d7e 100644
--- a/include/gwin.h
+++ b/include/gwin/gwin.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gwin.h
+ * @file include/gwin/gwin.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@@ -27,40 +27,11 @@
#ifndef _GWIN_H
#define _GWIN_H
-#ifndef GFX_USE_GWIN
- #define GFX_USE_GWIN FALSE
-#endif
+#include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__)
/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name GWIN more complex functionality to be compiled
- * @{
- */
-/** @} */
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-#if !defined(GFX_USE_GDISP) || !GFX_USE_GDISP
- #error "GWIN: GFX_USE_GDISP must also be defined"
-#endif
-#include "gdisp.h"
-
-#if !GDISP_NEED_CLIP
- #warning "GWIN: Drawing can occur outside the defined window as GDISP_NEED_CLIP is FALSE"
-#endif
-
-/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
@@ -145,7 +116,7 @@ void gwinDestroyWindow(GHandle gh);
/* Set up for text */
#if GDISP_NEED_TEXT
-void gwinSetFont(GHandle gh, font_t font);
+ void gwinSetFont(GHandle gh, font_t font);
#endif
/* Drawing Functions */
@@ -194,8 +165,9 @@ void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coor
#endif
/* Include extra window types */
-#include "gwin/gwin_console.h"
-#include "gwin/gwin_button.h"
+#include "gwin/console.h"
+#include "gwin/button.h"
+#include "gwin/graph.h"
#endif /* GFX_USE_GWIN */
diff --git a/src/gwin/gwin_internal.h b/include/gwin/internal.h
index 13401a6f..b47a2229 100644
--- a/src/gwin/gwin_internal.h
+++ b/include/gwin/internal.h
@@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
- * @file gwin_internal.h
+ * @file include/gwin/internal.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@@ -34,8 +34,8 @@
/*===========================================================================*/
#define GWIN_FLG_DYNAMIC 0x0001
-#define GWIN_FIRST_CONTROL_FLAG 0x0002
-#define GBTN_FLG_ALLOCTXT (GWIN_FIRST_CONTROL_FLAG<<0)
+#define GBTN_FLG_ALLOCTXT 0x0002
+#define GWIN_FIRST_CONTROL_FLAG 0x0004
#ifdef __cplusplus
extern "C" {
diff --git a/include/gwin/options.h b/include/gwin/options.h
new file mode 100644
index 00000000..899da5a4
--- /dev/null
+++ b/include/gwin/options.h
@@ -0,0 +1,71 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file include/gwin_options.h
+ * @brief GWIN sub-system options header file.
+ *
+ * @addtogroup GWIN
+ * @{
+ */
+
+#ifndef _GWIN_OPTIONS_H
+#define _GWIN_OPTIONS_H
+
+/**
+ * @name GWIN Functionality to be included
+ * @{
+ */
+ /**
+ * @brief Should button functions be included.
+ * @details Defaults to FALSE
+ */
+ #ifndef GWIN_NEED_BUTTON
+ #define GWIN_NEED_BUTTON FALSE
+ #endif
+ /**
+ * @brief Should console functions be included.
+ * @details Defaults to FALSE
+ * @note To use chprintf() for printing in a console window you need to
+ * include in your application source file...
+ * #include "chprintf.h"
+ * Also in your makefile, as part of your list of C source files, include
+ * ${CHIBIOS}/os/various/chprintf.c
+ */
+ #ifndef GWIN_NEED_CONSOLE
+ #define GWIN_NEED_CONSOLE FALSE
+ #endif
+ /**
+ * @brief Should graph functions be included.
+ * @details Defaults to FALSE
+ */
+ #ifndef GWIN_NEED_GRAPH
+ #define GWIN_NEED_GRAPH FALSE
+ #endif
+/**
+ * @}
+ *
+ * @name GWIN Optional Sizing Parameters
+ * @{
+ */
+/** @} */
+
+#endif /* _GWIN_OPTIONS_H */
+/** @} */
diff --git a/include/lld/touchscreen/touchscreen_lld.h b/include/lld/touchscreen/touchscreen_lld.h
deleted file mode 100644
index 912d2464..00000000
--- a/include/lld/touchscreen/touchscreen_lld.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file include/lld/touchscreen/touchscreen_lld.h
- * @brief TOUCHSCREEN Driver subsystem low level driver header.
- *
- * @addtogroup TOUCHSCREEN
- * @{
- */
-
-#ifndef TOUCHSCREEN_LLD_H
-#define TOUCHSCREEN_LLD_H
-
-#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Include the low level driver configuration information */
-/*===========================================================================*/
-
-#include "touchscreen_lld_config.h"
-
-/*===========================================================================*/
-/* Error checks. */
-/*===========================================================================*/
-
-#ifndef TOUCHSCREEN_NEED_MULTITHREAD
- #define TOUCHSCREEN_NEED_MULTITHREAD FALSE
-#endif
-
-#ifndef TOUCHSCREEN_XY_INVERTED
- #define TOUCHSCREEN_XY_INVERTED FALSE
-#endif
-
-#ifndef TOUCHSCREEN_HAS_PRESSED
- #define TOUCHSCREEN_HAS_PRESSED FALSE
-#endif
-
-#ifndef TOUCHSCREEN_HAS_PRESSURE
- #define TOUCHSCREEN_HAS_PRESSURE FALSE
-#endif
-
-#ifndef TOUCHSCREEN_SPI_PROLOGUE
- #define TOUCHSCREEN_SPI_PROLOGUE()
-#endif
-
-#ifndef TOUCHSCREEN_SPI_EPILOGUE
- #define TOUCHSCREEN_SPI_EPILOGUE()
-#endif
-
-#ifndef TOUCHSCREEN_STORE_CALIBRATION
- #define TOUCHSCREEN_STORE_CALIBRATION FALSE
-#endif
-
-#ifndef TOUCHSCREEN_VERIFY_CALIBRATION
- #define TOUCHSCREEN_VERIFY_CALIBRATION FALSE
-#endif
-
-#ifndef TOUCHSCREEN_CONVERSIONS
- #define TOUCHSCREEN_CONVERSIONS 3
-#endif
-
-/*===========================================================================*/
-/* Driver types. */
-/*===========================================================================*/
-
-/**
- * @brief Structure representing a touchscreen driver. Hardware dependant.
- */
-typedef struct TouchscreenDriver TouchscreenDriver;
-
-// Forward declaration
-struct cal_t;
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /* Core functions */
- void ts_lld_init(const TouchscreenDriver *ts);
-
- uint16_t ts_lld_read_value(uint8_t cmd);
- uint16_t ts_lld_read_x(void);
- uint16_t ts_lld_read_y(void);
-
- #if TOUCHSCREEN_HAS_PRESSED
- uint8_t ts_lld_pressed(void);
- #endif
-
- #if TOUCHSCREEN_HAS_PRESSURE
- uint16_t ts_lld_read_z(void);
- #endif
-
- #if TOUCHSCREEN_STORE_CALIBRATION
- // These may be defined by the low level driver or by the application
- void ts_store_calibration_lld(struct cal_t *cal);
- struct cal_t *ts_restore_calibration_lld(void);
- #endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GFX_USE_TOUCHSCREEN */
-
-#endif /* _TOUCHSCREEN_LLD_H */
-/** @} */
-
diff --git a/include/touchscreen.h b/include/touchscreen.h
deleted file mode 100644
index 5a84afdf..00000000
--- a/include/touchscreen.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file include/touchscreen.h
- * @brief TOUCHSCREEN Touchscreen driver subsystem header file.
- *
- * @addtogroup TOUCHSCREEN
- * @{
- */
-
-#ifndef TOUCHSCREEN_H
-#define TOUCHSCREEN_H
-
-#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Low Level Driver details and error checks. */
-/*===========================================================================*/
-
-/* Include the low level driver information */
-#include "lld/touchscreen/touchscreen_lld.h"
-
-/* For definitions of coord_t, we require gdisp.h */
-#include "gdisp.h"
-
-/*===========================================================================*/
-/* Type definitions */
-/*===========================================================================*/
-
-/**
- * @brief Struct used for calibration
- */
-typedef struct cal_t {
- float ax;
- float bx;
- float cx;
- float ay;
- float by;
- float cy;
-} cal_t;
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void tsInit(const TouchscreenDriver *ts);
-coord_t tsReadX(void);
-coord_t tsReadY(void);
-void tsCalibrate(void);
-
-#if TOUCHSCREEN_HAS_PRESSED
- bool_t tsPressed(void);
-#endif
-
-#if TOUCHSCREEN_HAS_PRESSURE
- uint16_t tsReadZ(void);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GFX_USE_TOUCHSCREEN */
-
-#endif /* TOUCHSCREEN_H */
-/** @} */
-
diff --git a/releases.txt b/releases.txt
index caadade2..20cab579 100644
--- a/releases.txt
+++ b/releases.txt
@@ -6,18 +6,22 @@ current stable: 1.4
*** changes after 1.4 ***
-FEATURE: Added three point calibration
-FIX: Touchpad renamed into Touchscreen
-FIX: tsIRQ() renamed into tsPressed()
-FEATURE: Touchscreen support added to gdisp Win32 driver
-FIX: gdisp Win32 driver fixes
-DEPRECATE: console deprecated - replaced with gwin functionality
-FEATURE: ILI9320 GDISP driver
-FEATURE: gdisp Win32 driver - full orientation support
FEATURE: GEVENT - for passing event structures from Sources to Listeners
FEATURE: GTIMER - thread context based once-off and periodic timers.
FEATURE: GINPUT - extensible, multiple device-type, input sub-system.
-
+FEATURE: GWIN - full button, console and graph support
+FEATURE: Numerous touch calibration improvements
+FEATURE: Win32 driver - now support gdisp & ginput mouse/touch/toggle
+FEATURE: Win32 driver - full gdisp orientation support
+FEATURE: ILI9320 GDISP driver
+FEATURE: Nokia6610 GDISP driver split in to GE8 and GE12 variants
+FEATURE: Many GDISP drivers changed to use a board interface definition
+FEATURE: GFX source restructure with new gfx.h include file.
+DEPRECATE: console deprecated - replaced with gwin functionality
+DEPRECATE: graph deprecated - replaced with gwin functionality
+DEPRECATE: touchscreen deprecated - replaced with ginput functionality
+FEATURE: Numerous documentation improvements
+FEATURE: Added a number of module demo and test programs
*** changes after 1.3 ***
FIX: Nokia 6610 fix
diff --git a/src/gdisp_fonts.c b/src/gdisp/fonts.c
index 6a6cd910..fda963dd 100644
--- a/src/gdisp_fonts.c
+++ b/src/gdisp/fonts.c
@@ -23,11 +23,9 @@
*/
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
-#if GFX_USE_GDISP || defined(__DOXYGEN__)
-
-#if GDISP_NEED_TEXT
+#if (GFX_USE_GDISP && GDISP_NEED_TEXT) || defined(__DOXYGEN__)
#include "gdisp/fonts.h"
@@ -651,7 +649,4 @@
};
#endif
-#endif /* GDISP_NEED_TEXT */
-
-#endif /* GFX_USE_GDISP */
-
+#endif /* GFX_USE_GDISP && GDISP_NEED_TEXT */
diff --git a/src/gdisp.c b/src/gdisp/gdisp.c
index 51a43b49..1f37e107 100644
--- a/src/gdisp.c
+++ b/src/gdisp/gdisp.c
@@ -27,7 +27,7 @@
*/
#include "ch.h"
#include "hal.h"
-#include "gdisp.h"
+#include "gfx.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
@@ -731,7 +731,7 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
}
#endif
-#if (GDISP_NEED_QUERY && (GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC)) || defined(__DOXYGEN__)
+#if (GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC) || defined(__DOXYGEN__)
/**
* @brief Query a property of the display.
* @pre The GDISP unit must have been initialised using @p gdispInit().
@@ -1266,4 +1266,3 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#endif /* GFX_USE_GDISP */
/** @} */
-
diff --git a/src/gdisp/gdisp.mk b/src/gdisp/gdisp.mk
new file mode 100644
index 00000000..426e9e2c
--- /dev/null
+++ b/src/gdisp/gdisp.mk
@@ -0,0 +1,2 @@
+GFXSRC += $(GFXLIB)/src/gdisp/gdisp.c \
+ $(GFXLIB)/src/gdisp/fonts.c
diff --git a/src/gevent.c b/src/gevent/gevent.c
index 0a18eca2..be3ad7df 100644
--- a/src/gevent.c
+++ b/src/gevent/gevent.c
@@ -27,7 +27,7 @@
*/
#include "ch.h"
#include "hal.h"
-#include "gevent.h"
+#include "gfx.h"
#if GFX_USE_GEVENT || defined(__DOXYGEN__)
@@ -41,14 +41,14 @@
static MUTEX_DECL(geventMutex);
/* Our table of listener/source pairs */
-static GSourceListener Assignments[MAX_SOURCE_LISTENERS];
+static GSourceListener Assignments[GEVENT_MAX_SOURCE_LISTENERS];
/* Loop through the assignment table deleting this listener/source pair. */
/* Null is treated as a wildcard. */
static void deleteAssignments(GListener *pl, GSourceHandle gsh) {
GSourceListener *psl;
- for(psl = Assignments; psl < Assignments+MAX_SOURCE_LISTENERS; psl++) {
+ for(psl = Assignments; psl < Assignments+GEVENT_MAX_SOURCE_LISTENERS; psl++) {
if ((!pl || psl->pListener == pl) && (!gsh || psl->pSource == gsh)) {
if (chSemGetCounterI(&psl->pListener->waitqueue) < 0) {
chBSemWait(&psl->pListener->eventlock); // Obtain the buffer lock
@@ -101,7 +101,7 @@ bool_t geventAttachSource(GListener *pl, GSourceHandle gsh, unsigned flags) {
// Check if this pair is already in the table (scan for a free slot at the same time)
pslfree = 0;
- for(psl = Assignments; psl < Assignments+MAX_SOURCE_LISTENERS; psl++) {
+ for(psl = Assignments; psl < Assignments+GEVENT_MAX_SOURCE_LISTENERS; psl++) {
if (pl == psl->pListener && gsh == psl->pSource) {
// Just update the flags
@@ -228,7 +228,7 @@ GSourceListener *geventGetSourceListener(GSourceHandle gsh, GSourceListener *las
chBSemSignal(&lastlr->pListener->eventlock);
// Loop through the table looking for attachments to this source
- for(psl = lastlr ? (lastlr+1) : Assignments; psl < Assignments+MAX_SOURCE_LISTENERS; psl++) {
+ for(psl = lastlr ? (lastlr+1) : Assignments; psl < Assignments+GEVENT_MAX_SOURCE_LISTENERS; psl++) {
if (gsh == psl->pSource) {
chBSemWait(&psl->pListener->eventlock); // Obtain a lock on the listener event buffer
chMtxUnlock();
diff --git a/src/gevent/gevent.mk b/src/gevent/gevent.mk
new file mode 100644
index 00000000..59226318
--- /dev/null
+++ b/src/gevent/gevent.mk
@@ -0,0 +1 @@
+GFXSRC += $(GFXLIB)/src/gevent/gevent.c
diff --git a/src/ginput/dial.c b/src/ginput/dial.c
index cb6799a9..233daa08 100644
--- a/src/ginput/dial.c
+++ b/src/ginput/dial.c
@@ -27,9 +27,9 @@
*/
#include "ch.h"
#include "hal.h"
-#include "ginput.h"
+#include "gfx.h"
-#if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
+#if (GFX_USE_GINPUT && GINPUT_NEED_DIAL) || defined(__DOXYGEN__)
#error "GINPUT: GINPUT_NEED_DIAL - Not Implemented Yet"
-#endif /* GINPUT_NEED_DIAL */
+#endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
/** @} */
diff --git a/src/ginput/keyboard.c b/src/ginput/keyboard.c
index 1c38a408..bd443e77 100644
--- a/src/ginput/keyboard.c
+++ b/src/ginput/keyboard.c
@@ -27,9 +27,9 @@
*/
#include "ch.h"
#include "hal.h"
-#include "ginput.h"
+#include "gfx.h"
-#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__)
+#if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || defined(__DOXYGEN__)
#error "GINPUT: GINPUT_NEED_KEYBOARD - Not Implemented Yet"
-#endif /* GINPUT_NEED_KEYBOARD */
+#endif /* GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD */
/** @} */
diff --git a/src/ginput/mouse.c b/src/ginput/mouse.c
index ac23e9f1..67ee5667 100644
--- a/src/ginput/mouse.c
+++ b/src/ginput/mouse.c
@@ -27,12 +27,11 @@
*/
#include "ch.h"
#include "hal.h"
-#include "gtimer.h"
-#include "ginput.h"
+#include "gfx.h"
-#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
+#if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) || defined(__DOXYGEN__)
-#include "lld/ginput/mouse.h"
+#include "ginput/lld/mouse.h"
#if GINPUT_MOUSE_NEED_CALIBRATION
#if !defined(GFX_USE_GDISP) || !GFX_USE_GDISP
@@ -582,5 +581,5 @@ void ginputMouseWakeupI(void) {
gtimerJabI(&MouseTimer);
}
-#endif /* GINPUT_NEED_MOUSE */
+#endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */
/** @} */
diff --git a/src/ginput/toggle.c b/src/ginput/toggle.c
index 890ac1dc..3b2e98bf 100644
--- a/src/ginput/toggle.c
+++ b/src/ginput/toggle.c
@@ -27,12 +27,11 @@
*/
#include "ch.h"
#include "hal.h"
-#include "gtimer.h"
-#include "ginput.h"
+#include "gfx.h"
-#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
+#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) || defined(__DOXYGEN__)
-#include "lld/ginput/toggle.h"
+#include "ginput/lld/toggle.h"
#define GINPUT_TOGGLE_ISON 0x01
#define GINPUT_TOGGLE_INVERT 0x02
@@ -163,5 +162,5 @@ void ginputToggleWakeupI(void) {
gtimerJabI(&ToggleTimer);
}
-#endif /* GINPUT_NEED_TOGGLE */
+#endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */
/** @} */
diff --git a/src/graph.c b/src/graph.c
deleted file mode 100644
index 89f6fe00..00000000
--- a/src/graph.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file src/graph.c
- * @brief GRAPH module code.
- *
- * @addtogroup GRAPH
- * @{
- */
-#include <stdlib.h>
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-#include "graph.h"
-
-#if GFX_USE_GRAPH || defined(__DOXYGEN__)
-
-static void _horizontalDotLine(coord_t x0, coord_t y0, coord_t x1, uint16_t space, color_t color) {
- uint16_t offset = x0;
- uint16_t count = ((x1 - x0) / space);
-
- do {
- gdispDrawPixel(offset, y0, color);
- offset += space;
- } while(count--);
-}
-
-static void _verticalDotLine(coord_t x0, coord_t y0, coord_t y1, uint16_t space, color_t color) {
- uint16_t offset = y0;
- uint16_t count = ((y1 - y0) / space);
-
- do {
- gdispDrawPixel(x0, offset, color);
- offset += space;
- } while(count--);
-}
-
-/**
- * @brief Draws a graph system
- * @details Draws a graph system with two axis, X and Y.
- * Different optinal parameters like grid size, grid color,
- * arrow color (if any) etc. are defined in the struct.
- *
- * @param[in] g A pointer to a Graph struct
- *
- * @init
- */
-void graphDrawSystem(Graph *g) {
- uint16_t i;
-
- g->x0 = g->origin_x - abs(g->xmin);
- g->x1 = g->origin_x + abs(g->xmax);
- g->y0 = g->origin_y + abs(g->ymin);
- g->y1 = g->origin_y - abs(g->ymax);
-
- /* X - Axis */
- if(g->full_grid) {
- for(i = 1; i <= ((g->origin_y - g->y1) / g->grid_size); i++) {
- _horizontalDotLine(g->x0, g->origin_y - g->grid_size * i, g->x1, g->dot_space, g->grid_color);
- }
- for(i = 1; i <= ((g->y0 - g->origin_y) / g->grid_size); i++) {
- _horizontalDotLine(g->x0, g->origin_y + g->grid_size * i, g->x1, g->dot_space, g->grid_color);
- }
- }
- gdispDrawLine(g->x0, g->origin_y, g->x1, g->origin_y, g->axis_color);
- if(g->arrows) {
- gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y+5, g->axis_color);
- gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y-5, g->axis_color);
- }
-
- /* Y - Axis */
- if(g->full_grid) {
- for(i = 1; i <= ((g->origin_x - g->x0) / g->grid_size); i++) {
- _verticalDotLine(g->origin_x - g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
- }
- for(i = 1; i <= ((g->x1 - g->origin_x) / g->grid_size); i++) {
- _verticalDotLine(g->origin_x + g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
- }
- }
- gdispDrawLine(g->origin_x, g->y0, g->origin_x, g->y1, g->axis_color);
- if(g->arrows) {
- gdispDrawLine(g->origin_x, g->y1, g->origin_x-5, g->y1+5, g->axis_color);
- gdispDrawLine(g->origin_x, g->y1, g->origin_x+5, g->y1+5, g->axis_color);
- }
-}
-
-/**
- * @brief Checks if x and y are inside the graph area
- *
- * @param[in] g The pointer to the graph
- * @param[in] x,y The coordinates to be checked
- *
- * @return 1 if outside the graph area, 0 otherwise
- *
- * @notapi
- */
-static bool_t _boundaryCheck(Graph *g, coord_t x, coord_t y) {
- if(g->origin_x + x > g->x1)
- return 1;
- if(g->origin_x + x < g->x0)
- return 1;
- if(g->origin_y - y < g->y1)
- return 1;
- if(g->origin_y - y > g->y0)
- return 1;
-
- return 0;
-}
-
-/**
- * @brief Draws a single dot into the graph
- * @note The dot won't be drawn if it's outsite the max and min
- * values of the graph.
- *
- * @param[in] g The pointer to the graph
- * @param[in] x,y The coordinates where the data point will be drawn
- * @param[in] radius The radius of the dot. One pixel if 0.
- * @param[in] color The color of the dot.
- *
- * @api
- */
-void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color) {
- if(_boundaryCheck(g, x, y))
- return;
-
- if(radius == 0)
- gdispDrawPixel(g->origin_x + x, g->origin_y - y, color);
- else
- gdispFillCircle(g->origin_x + x, g->origin_y - y, radius, color);
-}
-
-/**
- * @brief Draws multiple dots into the graph
- * @note A dot won't be drawn if it's outsite the max and min
- * values of the graph.
- *
- * @param[in] g The pointer to the graph
- * @param[in] coord A two dimensional int array containing the dots coordinates.
- * @param[in] entries How many dots will be drawn (array index from 0 to entries);
- * @param[in] radius The radius of the dots. One pixel if 0.
- * @param[in] color The color of the dots.
- *
- * @api
- */
-void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
- uint16_t i;
-
- for(i = 0; i < entries; i++) {
- if(_boundaryCheck(g, coord[i][0], coord[i][1]))
- continue;
-
- if(radius == 0)
- gdispDrawPixel(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], color);
- else
- gdispFillCircle(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], radius, color);
- }
-}
-
-/**
- * @brief Draws multiple dots into the graph and connects them by a line
- * @note A dot won't be drawn if it's outsite the max and min
- * values of the graph.
- *
- * @param[in] g The pointer to the graph
- * @param[in] coord A two dimensional int array containing the dots coordinates.
- * @param[in] entries How many dots will be drawn (array index from 0 to entries);
- * @param[in] radius The radius of the dots. One pixel if 0.
- * @param[in] lineColor The color of the line.
- * @param[in] dotColor The color of the dots.
- *
- * @api
- */
-void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
- uint16_t i;
-
- /* draw lines */
- for(i = 0; i < entries-1; i++) {
- if(_boundaryCheck(g, coord[i][0], coord[i][1]))
- continue;
-
- gdispDrawLine(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], coord[i+1][0] + g->origin_x, g->origin_y - coord[i+1][1], lineColor);
- }
-
- /* draw dots */
- for(i = 0; i < entries; i++) {
- if(_boundaryCheck(g, coord[i][0], coord[i][1]))
- continue;
-
- if(radius == 0)
- gdispDrawPixel(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], dotColor);
- else
- gdispFillCircle(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], radius, dotColor);
- }
-}
-
-#endif /* GFX_USE_GRAPH */
-/** @} */
-
diff --git a/src/gtimer.c b/src/gtimer/gtimer.c
index 164822f3..76c527f4 100644
--- a/src/gtimer.c
+++ b/src/gtimer/gtimer.c
@@ -19,18 +19,22 @@
*/
/**
- * @file src/gtimer.c
- * @brief GTIMER Driver code.
+ * @file src/gtimer/gtimer.c
+ * @brief GTIMER sub-system code.
*
* @addtogroup GTIMER
* @{
*/
#include "ch.h"
#include "hal.h"
-#include "gtimer.h"
+#include "gfx.h"
#if GFX_USE_GTIMER || defined(__DOXYGEN__)
+#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
+ #error "GTIMER: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
+#endif
+
#define GTIMER_FLG_PERIODIC 0x0001
#define GTIMER_FLG_INFINITE 0x0002
#define GTIMER_FLG_JABBED 0x0004
@@ -44,7 +48,7 @@ static MUTEX_DECL(mutex);
static Thread *pThread = 0;
static GTimer *pTimerHead = 0;
static BSEMAPHORE_DECL(waitsem, TRUE);
-static WORKING_AREA(waTimerThread, GTIMER_THREAD_STACK_SIZE);
+static WORKING_AREA(waTimerThread, GTIMER_THREAD_WORKAREA_SIZE);
/*===========================================================================*/
/* Driver local functions. */
diff --git a/src/gtimer/gtimer.mk b/src/gtimer/gtimer.mk
new file mode 100644
index 00000000..e6c2b588
--- /dev/null
+++ b/src/gtimer/gtimer.mk
@@ -0,0 +1 @@
+GFXSRC += $(GFXLIB)/src/gtimer/gtimer.c
diff --git a/src/gwin/button.c b/src/gwin/button.c
index 4e1e45f5..0c2c1ab3 100644
--- a/src/gwin/button.c
+++ b/src/gwin/button.c
@@ -20,24 +20,20 @@
/**
* @file src/gwin/button.c
- * @brief GWIN Driver code.
+ * @brief GWIN sub-system button code.
*
* @addtogroup GWIN_BUTTON
* @{
*/
#include "ch.h"
#include "hal.h"
-#include "gwin.h"
-#include "ginput.h"
+#include "gfx.h"
#if (GFX_USE_GWIN && GWIN_NEED_BUTTON) || defined(__DOXYGEN__)
-#if !GFX_USE_GINPUT
- #error "GWIN Buttons require GFX_USE_GINPUT"
-#endif
-
#include <string.h>
-#include "gwin_internal.h"
+
+#include "gwin/internal.h"
static const GButtonStyle GButtonDefaultStyle = {
GBTN_3D,
@@ -137,7 +133,7 @@ static void gwinButtonCallback(void *param, GEvent *pe) {
* @brief Create a button window.
* @return NULL if there is no resultant drawing area, otherwise a window handle.
*
- * @param[in] gb The GConsoleWindow structure to initialise. If this is NULL the structure is dynamically allocated.
+ * @param[in] gb The GButtonObject structure to initialise. If this is NULL the structure is dynamically allocated.
* @param[in] x,y The screen co-ordinates for the bottom left corner of the window
* @param[in] width The width of the window
* @param[in] height The height of the window
diff --git a/src/gwin/console.c b/src/gwin/console.c
index 63960c23..7854b658 100644
--- a/src/gwin/console.c
+++ b/src/gwin/console.c
@@ -20,20 +20,20 @@
/**
* @file src/gwin/console.c
- * @brief GWIN Driver code.
+ * @brief GWIN sub-system console code.
*
* @addtogroup GWIN_CONSOLE
* @{
*/
#include "ch.h"
#include "hal.h"
-#include "gwin.h"
+#include "gfx.h"
#if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__)
#include <string.h>
-#include "gwin_internal.h"
+#include "gwin/internal.h"
#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE
#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE
diff --git a/src/gwin/graph.c b/src/gwin/graph.c
new file mode 100644
index 00000000..e950f623
--- /dev/null
+++ b/src/gwin/graph.c
@@ -0,0 +1,425 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file src/gwin/button.c
+ * @brief GWIN sub-system button code.
+ *
+ * @addtogroup GWIN_BUTTON
+ * @{
+ */
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#if (GFX_USE_GWIN && GWIN_NEED_GRAPH) || defined(__DOXYGEN__)
+
+#include "gwin/internal.h"
+
+#define GGRAPH_FLG_CONNECTPOINTS (GWIN_FIRST_CONTROL_FLAG<<0)
+#define GGRAPH_ARROW_SIZE 5
+
+static const GGraphStyle GGraphDefaultStyle = {
+ { GGRAPH_POINT_DOT, 0, White }, // point
+ { GGRAPH_LINE_DOT, 2, Gray }, // line
+ { GGRAPH_LINE_SOLID, 0, White }, // x axis
+ { GGRAPH_LINE_SOLID, 0, White }, // y axis
+ { GGRAPH_LINE_NONE, 0, White, 0 }, // x grid
+ { GGRAPH_LINE_NONE, 0, White, 0 }, // y grid
+ GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS // flags
+};
+
+static void pointto(GGraphObject *gg, coord_t x, coord_t y, const GGraphPointStyle *style) {
+ if (style->type == GGRAPH_POINT_NONE)
+ return;
+
+ // Convert to device space. Note the y-axis is inverted.
+ x += gg->gwin.x + gg->xorigin;
+ y = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y;
+
+ if (style->size <= 1) {
+ gdispDrawPixel(x, y, style->color);
+ return;
+ }
+
+ switch(style->type) {
+ case GGRAPH_POINT_SQUARE:
+ gdispDrawBox(x-style->size, y-style->size, 2*style->size, 2*style->size, style->color);
+ break;
+#if GDISP_NEED_CIRCLE
+ case GGRAPH_POINT_CIRCLE:
+ gdispDrawCircle(x, y, style->size, style->color);
+ break;
+#endif
+ case GGRAPH_POINT_DOT:
+ default:
+ gdispDrawPixel(x, y, style->color);
+ break;
+ }
+}
+
+static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t y1, const GGraphLineStyle *style) {
+ coord_t dy, dx;
+ coord_t addx, addy;
+ coord_t P, diff, i;
+ coord_t run_on, run_off, run;
+
+ if (style->type == GGRAPH_LINE_NONE)
+ return;
+
+ // Convert to device space. Note the y-axis is inverted.
+ x0 += gg->gwin.x + gg->xorigin;
+ y0 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y0;
+ x1 += gg->gwin.x + gg->xorigin;
+ y1 += gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y1;
+
+ if (style->size <= 0) {
+ // Use the driver to draw a solid line
+ gdispDrawLine(x0, y0, x1, y1, style->color);
+ return;
+ }
+
+ switch (style->type) {
+ case GGRAPH_LINE_DOT:
+ run_on = 1;
+ run_off = -style->size;
+ break;
+
+ case GGRAPH_LINE_DASH:
+ run_on = style->size;
+ run_off = -style->size;
+ break;
+
+ case GGRAPH_LINE_SOLID:
+ default:
+ // Use the driver to draw a solid line
+ gdispDrawLine(x0, y0, x1, y1, style->color);
+ return;
+ }
+
+ // Use Bresenham's algorithm modified to draw a stylized line
+ run = 0;
+ if (x1 >= x0) {
+ dx = x1 - x0;
+ addx = 1;
+ } else {
+ dx = x0 - x1;
+ addx = -1;
+ }
+ if (y1 >= y0) {
+ dy = y1 - y0;
+ addy = 1;
+ } else {
+ dy = y0 - y1;
+ addy = -1;
+ }
+
+ if (dx >= dy) {
+ dy *= 2;
+ P = dy - dx;
+ diff = P - dx;
+
+ for(i=0; i<=dx; ++i) {
+ if (run++ >= 0) {
+ if (run >= run_on)
+ run = run_off;
+ gdispDrawPixel(x0, y0, style->color);
+ }
+ if (P < 0) {
+ P += dy;
+ x0 += addx;
+ } else {
+ P += diff;
+ x0 += addx;
+ y0 += addy;
+ }
+ }
+ } else {
+ dx *= 2;
+ P = dx - dy;
+ diff = P - dy;
+
+ for(i=0; i<=dy; ++i) {
+ if (run++ >= 0) {
+ if (run >= run_on)
+ run = run_off;
+ gdispDrawPixel(x0, y0, style->color);
+ }
+ if (P < 0) {
+ P += dx;
+ y0 += addy;
+ } else {
+ P += diff;
+ x0 += addx;
+ y0 += addy;
+ }
+ }
+ }
+}
+
+/**
+ * @brief Create a graph window.
+ * @return NULL if there is no resultant drawing area, otherwise a window handle.
+ *
+ * @param[in] gg The GGraphObject structure to initialise. If this is NULL the structure is dynamically allocated.
+ * @param[in] x,y The screen co-ordinates for the bottom left corner of the window
+ * @param[in] width The width of the window
+ * @param[in] height The height of the window
+ * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color)
+ * @note The coordinate system within the window for graphing operations (but not for any other drawing
+ * operation) is relative to the bottom left corner and then shifted right and up by the specified
+ * graphing x and y origin. Note that this system is inverted in the y direction relative to the display.
+ * This gives the best graphing arrangement ie. increasing y values are closer to the top of the display.
+ *
+ * @api
+ */
+GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height) {
+ if (!(gg = (GGraphObject *)_gwinInit((GWindowObject *)gg, x, y, width, height, sizeof(GGraphObject))))
+ return 0;
+ gg->gwin.type = GW_GRAPH;
+ gg->xorigin = gg->yorigin = 0;
+ gg->lastx = gg->lasty = 0;
+ gwinGraphSetStyle(&gg->gwin, &GGraphDefaultStyle);
+ return (GHandle)gg;
+}
+
+/**
+ * @brief Set the style of the graphing operations.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ * @param[in] pstyle The graph style to set.
+ * @note The graph is not automatically redrawn. The new style will apply to any new drawing operations.
+ *
+ * @api
+ */
+void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) {
+ #define gg ((GGraphObject *)gh)
+
+ if (gh->type != GW_GRAPH)
+ return;
+
+ gg->style.point.type = pstyle->point.type;
+ gg->style.point.size = pstyle->point.size;
+ gg->style.point.color = pstyle->point.color;
+ gg->style.line.type = pstyle->line.type;
+ gg->style.line.size = pstyle->line.size;
+ gg->style.line.color = pstyle->line.color;
+ gg->style.xaxis.type = pstyle->xaxis.type;
+ gg->style.xaxis.size = pstyle->xaxis.size;
+ gg->style.xaxis.color = pstyle->xaxis.color;
+ gg->style.yaxis.type = pstyle->yaxis.type;
+ gg->style.yaxis.size = pstyle->yaxis.size;
+ gg->style.yaxis.color = pstyle->yaxis.color;
+ gg->style.xgrid.type = pstyle->xgrid.type;
+ gg->style.xgrid.size = pstyle->xgrid.size;
+ gg->style.xgrid.color = pstyle->xgrid.color;
+ gg->style.xgrid.spacing = pstyle->xgrid.spacing;
+ gg->style.ygrid.type = pstyle->ygrid.type;
+ gg->style.ygrid.size = pstyle->ygrid.size;
+ gg->style.ygrid.color = pstyle->ygrid.color;
+ gg->style.ygrid.spacing = pstyle->ygrid.spacing;
+
+ #undef gg
+}
+
+/**
+ * @brief Set the origin for graphing operations.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ * @param[in] x, y The new origin for the graph (in graph coordinates relative to the bottom left corner).
+ * @note The graph is not automatically redrawn. The new origin will apply to any new drawing operations.
+ *
+ * @api
+ */
+void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) {
+ #define gg ((GGraphObject *)gh)
+
+ if (gh->type != GW_GRAPH)
+ return;
+
+ gg->xorigin = x;
+ gg->yorigin = y;
+
+ #undef gg
+}
+
+/**
+ * @brief Draw the axis and the background grid.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ * @note The graph is not automatically cleared. You must do that first by calling gwinClear().
+ *
+ * @api
+ */
+void gwinGraphDrawAxis(GHandle gh) {
+ #define gg ((GGraphObject *)gh)
+ coord_t i, xmin, ymin, xmax, ymax;
+
+ if (gh->type != GW_GRAPH)
+ return;
+
+ xmin = -gg->xorigin;
+ xmax = gh->width-gg->xorigin-1;
+ ymin = -gg->yorigin;
+ ymax = gh->height-gg->yorigin-1;
+
+ // x grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
+ if (gg->style.xgrid.type != GGRAPH_LINE_NONE && gg->style.xgrid.spacing >= 2) {
+ for(i = gg->style.xgrid.spacing; i <= xmax; i += gg->style.xgrid.spacing)
+ lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
+ for(i = -gg->style.xgrid.spacing; i >= xmin; i -= gg->style.xgrid.spacing)
+ lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
+ }
+
+ // y grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
+ if (gg->style.ygrid.type != GGRAPH_LINE_NONE && gg->style.ygrid.spacing >= 2) {
+ for(i = gg->style.ygrid.spacing; i <= ymax; i += gg->style.ygrid.spacing)
+ lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
+ for(i = -gg->style.ygrid.spacing; i >= ymin; i -= gg->style.ygrid.spacing)
+ lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
+ }
+
+ // x axis
+ lineto(gg, xmin, 0, xmax, 0, &gg->style.xaxis);
+ if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_ARROWS)) {
+ if (xmin > 0 || xmin < -(GGRAPH_ARROW_SIZE+1)) {
+ lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
+ lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
+ }
+ if (xmax < 0 || xmax > (GGRAPH_ARROW_SIZE+1)) {
+ lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
+ lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
+ }
+ }
+
+ // y axis
+ lineto(gg, 0, ymin, 0, ymax, &gg->style.yaxis);
+ if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_ARROWS)) {
+ if (ymin > 0 || ymin < -(GGRAPH_ARROW_SIZE+1)) {
+ lineto(gg, 0, ymin, GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
+ lineto(gg, 0, ymin, -GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
+ }
+ if (ymax < 0 || ymax > (GGRAPH_ARROW_SIZE+1)) {
+ lineto(gg, 0, ymax, GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
+ lineto(gg, 0, ymax, -GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
+ }
+ }
+
+ #undef gg
+}
+
+/**
+ * @brief Start a new set of graphing data.
+ * @details This prevents a line being drawn from the last data point to the next point to be drawn.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ *
+ * @api
+ */
+void gwinGraphStartSet(GHandle gh) {
+ if (gh->type != GW_GRAPH)
+ return;
+
+ gh->flags &= ~GGRAPH_FLG_CONNECTPOINTS;
+}
+
+/**
+ * @brief Draw a graph point.
+ * @details A graph point and a line connecting to the previous point will be drawn.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ * @param[in] x, y The new point for the graph.
+ *
+ * @api
+ */
+void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) {
+ #define gg ((GGraphObject *)gh)
+
+ if (gh->type != GW_GRAPH)
+ return;
+
+ if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
+ // Draw the line
+ lineto(gg, gg->lastx, gg->lasty, x, y, &gg->style.line);
+
+ // Redraw the previous point because the line may have overwritten it
+ pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
+
+ } else
+ gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
+
+ // Save this point for next time.
+ gg->lastx = x;
+ gg->lasty = y;
+
+ // Draw this point.
+ pointto(gg, x, y, &gg->style.point);
+
+ #undef gg
+}
+
+/**
+ * @brief Draw multiple graph points.
+ * @details A graph point and a line connecting to each previous point will be drawn.
+ *
+ * @param[in] gh The window handle (must be a graph window)
+ * @param[in] points The array of points for the graph.
+ * @param[in] count The number of points in the array.
+ * @note This is slightly more efficient than calling gwinGraphDrawPoint() repeatedly.
+ *
+ * @api
+ */
+void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count) {
+ #define gg ((GGraphObject *)gh)
+ unsigned i;
+ const GGraphPoint *p;
+
+ if (gh->type != GW_GRAPH)
+ return;
+
+ // Draw the connecting lines
+ for(p = points, i = 0; i < count; p++, i++) {
+ if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
+ // Draw the line
+ lineto(gg, gg->lastx, gg->lasty, p->x, p->y, &gg->style.line);
+
+ // Redraw the previous point because the line may have overwritten it
+ if (i == 0)
+ pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
+
+ } else
+ gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
+
+ // Save this point for next time.
+ gg->lastx = p->x;
+ gg->lasty = p->y;
+ }
+
+
+ // Draw the points.
+ for(p = points, i = 0; i < count; p++, i++)
+ pointto(gg, p->x, p->y, &gg->style.point);
+
+ #undef gg
+}
+
+#endif /* GFX_USE_GWIN && GWIN_NEED_GRAPH */
+/** @} */
+
diff --git a/src/gwin.c b/src/gwin/gwin.c
index e7bbda01..999ea304 100644
--- a/src/gwin.c
+++ b/src/gwin/gwin.c
@@ -19,19 +19,19 @@
*/
/**
- * @file src/gwin.c
- * @brief GWIN Driver code.
+ * @file src/gwin/gwin.c
+ * @brief GWIN sub-system code.
*
* @addtogroup GWIN
* @{
*/
#include "ch.h"
#include "hal.h"
-#include "gwin.h"
+#include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__)
-#include "gwin/gwin_internal.h"
+#include "gwin/internal.h"
// Internal routine for use by GWIN components only
// Initialise a window creating it dynamicly if required.
diff --git a/src/gwin/gwin.mk b/src/gwin/gwin.mk
index cf952580..947d11f3 100644
--- a/src/gwin/gwin.mk
+++ b/src/gwin/gwin.mk
@@ -1,2 +1,5 @@
-GFXSRC += $(GFXLIB)/src/gwin/console.c \
- $(GFXLIB)/src/gwin/button.c
+GFXSRC += $(GFXLIB)/src/gwin/gwin.c \
+ $(GFXLIB)/src/gwin/console.c \
+ $(GFXLIB)/src/gwin/button.c \
+ $(GFXLIB)/src/gwin/graph.c
+ \ No newline at end of file
diff --git a/src/touchscreen.c b/src/touchscreen.c
deleted file mode 100644
index 0fa5402e..00000000
--- a/src/touchscreen.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/* ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file src/touchscreen.c
- * @brief Touchscreen Driver code.
- *
- * @addtogroup TOUCHSCREEN
- * @{
- */
-
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-#include "touchscreen.h"
-
-#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local variables. */
-/*===========================================================================*/
-static struct cal_t *cal;
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static coord_t _tsReadRealX(void) {
- int32_t results = 0;
- int16_t i;
- coord_t x;
-
- for(i = 0; i < TOUCHSCREEN_CONVERSIONS; i++) {
- results += ts_lld_read_x();
- }
-
- /* Take the average of the readings */
- x = results / TOUCHSCREEN_CONVERSIONS;
-
- return x;
-}
-
-static coord_t _tsReadRealY(void) {
- int32_t results = 0;
- int16_t i;
- coord_t y;
-
- for(i = 0; i < TOUCHSCREEN_CONVERSIONS; i++) {
- results += ts_lld_read_y();
- }
-
- /* Take the average of the readings */
- y = results / TOUCHSCREEN_CONVERSIONS;
-
- return y;
-}
-
-static void _tsDrawCross(uint16_t x, uint16_t y) {
- gdispDrawLine(x-15, y, x-2, y, White);
- gdispDrawLine(x+2, y, x+15, y, White);
- gdispDrawLine(x, y-15, x, y-2, White);
- gdispDrawLine(x, y+2, x, y+15, White);
-
- gdispDrawLine(x-15, y+15, x-7, y+15, RGB2COLOR(184,158,131));
- gdispDrawLine(x-15, y+7, x-15, y+15, RGB2COLOR(184,158,131));
-
- gdispDrawLine(x-15, y-15, x-7, y-15, RGB2COLOR(184,158,131));
- gdispDrawLine(x-15, y-7, x-15, y-15, RGB2COLOR(184,158,131));
-
- gdispDrawLine(x+7, y+15, x+15, y+15, RGB2COLOR(184,158,131));
- gdispDrawLine(x+15, y+7, x+15, y+15, RGB2COLOR(184,158,131));
-
- gdispDrawLine(x+7, y-15, x+15, y-15, RGB2COLOR(184,158,131));
- gdispDrawLine(x+15, y-15, x+15, y-7, RGB2COLOR(184,158,131));
-}
-
-static void _tsTransform(coord_t *x, coord_t *y) {
- *x = (coord_t) (cal->ax * (*x) + cal->bx * (*y) + cal->cx);
- *y = (coord_t) (cal->ay * (*x) + cal->by * (*y) + cal->cy);
-}
-
-static void _tsDo3PointCalibration(const coord_t (*cross)[2], coord_t (*points)[2], cal_t *c) {
- float dx, dx0, dx1, dx2, dy0, dy1, dy2;
-
- /* Compute all the required determinants */
- dx = ((float)(points[0][0] - points[2][0])) * ((float)(points[1][1] - points[2][1]))
- - ((float)(points[1][0] - points[2][0])) * ((float)(points[0][1] - points[2][1]));
-
- dx0 = ((float)(cross[0][0] - cross[2][0])) * ((float)(points[1][1] - points[2][1]))
- - ((float)(cross[1][0] - cross[2][0])) * ((float)(points[0][1] - points[2][1]));
-
- dx1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][0] - cross[2][0]))
- - ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][0] - cross[2][0]));
-
- dx2 = cross[0][0] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
- cross[1][0] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
- cross[2][0] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
-
- dy0 = ((float)(cross[0][1] - cross[2][1])) * ((float)(points[1][1] - points[2][1]))
- - ((float)(cross[1][1] - cross[2][1])) * ((float)(points[0][1] - points[2][1]));
-
- dy1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][1] - cross[2][1]))
- - ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][1] - cross[2][1]));
-
- dy2 = cross[0][1] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
- cross[1][1] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
- cross[2][1] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
-
- /* Now, calculate all the required coefficients */
- c->ax = dx0 / dx;
- c->bx = dx1 / dx;
- c->cx = dx2 / dx;
-
- c->ay = dy0 / dx;
- c->by = dy1 / dx;
- c->cy = dy2 / dx;
-}
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Touchscreen Driver initialization.
- * @note Calling this function automatically invokes a tsCalibration()
- *
- * @param[in] ts The touchscreen driver struct
- *
- * @api
- */
-void tsInit(const TouchscreenDriver *ts) {
- /* Initialise Mutex */
- //MUTEX_INIT
-
- /* Initialise driver */
- //MUTEX_ENTER
- ts_lld_init(ts);
- //MUTEX_EXIT
-
- #if TOUCHSCREEN_STORE_CALIBRATION
- cal = ts_restore_calibration_lld();
- if(cal != NULL)
- return; // All done
- #endif
-
- cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
- if(cal == NULL)
- return;
-
- tsCalibrate();
-}
-
-/**
- * @brief Get the X-Coordinate, relative to screen zero point.
- *
- * @return The X position in pixels.
- *
- * @api
- */
-coord_t tsReadX(void) {
- coord_t x, y;
-
-#if TOUCHSCREEN_XY_INVERTED
- x = _tsReadRealY();
- y = _tsReadRealX();
-#else
- x = _tsReadRealX();
- y = _tsReadRealY();
-#endif
-
- _tsTransform(&x, &y);
-
- switch(gdispGetOrientation()) {
- case GDISP_ROTATE_0:
- return x;
- case GDISP_ROTATE_90:
- return y;
- case GDISP_ROTATE_180:
- return gdispGetWidth() - x - 1;
- case GDISP_ROTATE_270:
- return gdispGetWidth() - y - 1;
- }
-
- return 0;
-}
-
-/**
- * @brief Get the X-Coordinate, relative to screen zero point.
- *
- * @return The Y position in pixels.
- *
- * @api
- */
-coord_t tsReadY(void) {
- coord_t x, y;
-
-#if TOUCHSCREEN_XY_INVERTED
- x = _tsReadRealY();
- y = _tsReadRealX();
-#else
- x = _tsReadRealX();
- y = _tsReadRealY();
-#endif
-
- _tsTransform(&x, &y);
-
- switch(gdispGetOrientation()) {
- case GDISP_ROTATE_0:
- return y;
- case GDISP_ROTATE_90:
- return gdispGetHeight() - x - 1;
- case GDISP_ROTATE_180:
- return gdispGetHeight() - y - 1;
- case GDISP_ROTATE_270:
- return x;
- }
-
- return 0;
-}
-
-/**
- * @brief Get the pressure.
- *
- * @return The pressure.
- *
- * @api
- */
-#if TOUCHSCREEN_HAS_PRESSURE || defined(__DOXYGEN__)
- uint16_t tsReadZ(void) {
- /* ToDo */
- return (ts_lld_read_z());
- }
-#endif
-
-/**
- * @brief Returns if touchscreen is pressed or not
- *
- * @return TRUE if pressed, FALSE otherwise
- *
- * @api
- */
-#if TOUCHSCREEN_HAS_PRESSED || defined(__DOXYGEN__)
- bool_t tsPressed(void) {
- return ts_lld_pressed();
- }
-#endif
-
-/* Define maximum no. of times to sample the calibration point */
-#define MAX_CAL_SAMPLES 10
-
-/**
- * @brief Function to calibrate touchscreen
- * @details This function interactively performs calibration of the touchscreen
- * using 3-point calibration algorithm. Optionally, it also verifies
- * the accuracy of the calibration coefficients obtained if the symbol
- * TOUCHSCREEN_VERIFY_CALIBRATION is defined in the configuration.
- *
- * @note You don't have to call this function manually. It gets invoked by tsInit()
- *
- * @api
- */
-void tsCalibrate(void) {
- const uint16_t height = gdispGetHeight();
- const uint16_t width = gdispGetWidth();
- const coord_t cross[][2] = {{(width / 4), (height / 4)},
- {(width - (width / 4)) , (height / 4)},
- {(width - (width / 4)) , (height - (height / 4))},
- {(width / 2), (height / 2)}}; /* Check point */
- coord_t points[4][2];
- int32_t px, py;
- uint8_t i, j;
-
- #if GDISP_NEED_CONTROL
- gdispSetOrientation(GDISP_ROTATE_0);
- #endif
-
- gdispClear(Blue);
-
- gdispFillStringBox(0, 5, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Blue, justifyCenter);
-
-#if TOUCHSCREEN_VERIFY_CALIBRATION
-calibrate:
- for(i = 0; i < 4; i++) {
-#else
- for(i = 0; i < 3; i++) {
-#endif
- _tsDrawCross(cross[i][0], cross[i][1]);
-
- while(!tsPressed())
- chThdSleepMilliseconds(2); /* Be nice to other threads*/
-
- chThdSleepMilliseconds(20); /* Allow screen to settle */
-
- /* Take a little more samples per point and their average
- * for precise calibration */
- px = py = 0;
- j = 0;
-
- while(j < MAX_CAL_SAMPLES) {
- if(tsPressed()) { /* We have valid pointer data */
- #if TOUCHSCREEN_XY_INVERTED
- py += _tsReadRealX();
- px += _tsReadRealY();
- #else
- px += _tsReadRealX();
- py += _tsReadRealY();
- #endif
-
- j++;
- }
- }
-
- points[i][0] = px / j;
- points[i][1] = py / j;
-
- chThdSleepMilliseconds(100);
-
- while(tsPressed())
- chThdSleepMilliseconds(2); /* Be nice to other threads*/
-
- gdispFillArea(cross[i][0] - 15, cross[i][1] - 15, 42, 42, Blue);
- }
-
- /* Apply 3 point calibration algorithm */
- _tsDo3PointCalibration(cross, points, cal);
-
- #if TOUCHSCREEN_VERIFY_CALIBRATION
- /* Verification of correctness of calibration (optional) :
- * See if the 4th point (Middle of the screen) coincides with the calibrated
- * result. If point is with +/- 2 pixel margin, then successful calibration
- * Else, start from the beginning.
- */
-
- /* Transform the co-ordinates */
- _tpTransform(&points[3][0], &points[3][1]);
-
- /* Calculate the delta */
- px = (points[3][0] - cross[3][0]) * (points[3][0] - cross[3][0]) +
- (points[3][1] - cross[3][1]) * (points[3][1] - cross[3][1]);
-
- if(px > 4)
- goto calibrate;
- #endif
-
- /* If enabled, serialize the calibration values for storage */
- #if TOUCHSCREEN_STORE_CALIBRATION
- ts_store_calibration_lld(cal);
- #endif
-}
-
-#endif /* GFX_USE_TOUCHSCREEN */
-/** @} */
-