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 - - 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 . -*/ - -/** - * 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 + + 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 . +*/ + +/** + * 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 . */ -/* - * 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 - - 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 . -*/ - -/** - * 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(>1); - gtimerInit(>2); - - /* continious mode - callback1() called without any argument every 250ms */ - gtimerStart(>1, callback1, NULL, TRUE, 250); - - /* single shot mode - callback2() called without any argument once after 1s */ - gtimerStart(>2, callback2, NULL, FALSE, 1000); - - while(TRUE) { - chThdSleepMilliseconds(500); - } - - return 0; -} - +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#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(>1); + gtimerInit(>2); + + /* continious mode - callback1() called without any argument every 250ms */ + gtimerStart(>1, callback1, NULL, TRUE, 250); + + /* single shot mode - callback2() called without any argument once after 1s */ + gtimerStart(>2, 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 - - 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 . -*/ - -/** - * 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 + + 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 . +*/ + +#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 similarity index 100% rename from drivers/gdisp/Nokia6610/GE12.h rename to drivers/gdisp/Nokia6610GE12/GE12.h diff --git a/drivers/gdisp/Nokia6610/gdisp_lld.c b/drivers/gdisp/Nokia6610GE12/gdisp_lld.c similarity index 70% rename from drivers/gdisp/Nokia6610/gdisp_lld.c rename to 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 similarity index 58% rename from drivers/gdisp/Nokia6610/readme.txt rename to 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 similarity index 100% rename from drivers/gdisp/Nokia6610/GE8.h rename to 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 similarity index 74% rename from drivers/gdisp/Nokia6610/gdisp_lld_board_example.h rename to 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 similarity index 94% rename from drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h rename to 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 similarity index 87% rename from drivers/gdisp/Nokia6610/gdisp_lld_config.h rename to 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 +#error "GINPUT Toggle Pal Driver: You need to define your board definitions" - #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 +// The below are example values -#elif !defined(GINPUT_TOGGLE_DECLARE_CONFIG) - // Visible in ginput_lld.h +#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_NUM_PORTS 7 // The total number of toggle inputs - -#else - // Visible in ginput_lld_toggle.c +#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 - 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 +#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 #include -#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 similarity index 83% rename from include/gdisp.h rename to 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__) @@ -65,66 +72,17 @@ #define Pink HTML2COLOR(0xFFC0CB) #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 similarity index 96% rename from include/lld/gdisp/emulation.c rename to 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 similarity index 85% rename from include/lld/gdisp/gdisp_lld.h rename to 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 */ /*===========================================================================*/ @@ -537,10 +437,6 @@ /* Driver types. */ /*===========================================================================*/ -/** - * @brief The type for a coordinate or length on the screen. - */ -typedef int16_t coord_t; /** * @brief The type of a pixel. */ @@ -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 similarity index 94% rename from include/lld/gdisp/gdisp_lld_msgs.h rename to 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 similarity index 82% rename from include/gevent.h rename to 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 . */ /** - * @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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/** - * @file 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 similarity index 81% rename from include/ginput/ginput_dial.h rename to 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 . */ /** - * @file ginput/ginput_dial.h + * @file include/ginput/dial.h * @brief GINPUT GFX User Input subsystem header file. * * @addtogroup GINPUT @@ -27,25 +27,8 @@ #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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * @file 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 similarity index 87% rename from include/ginput/ginput_keyboard.h rename to 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 . */ /** - * @file ginput/ginput_keyboard.h + * @file include/ginput/keyboard.h * @brief GINPUT GFX User Input subsystem header file. * * @addtogroup GINPUT @@ -27,25 +27,8 @@ #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 similarity index 91% rename from include/lld/ginput/mouse.h rename to 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 . */ /** - * @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 similarity index 80% rename from include/lld/ginput/toggle.h rename to 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 . */ /** - * @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 similarity index 93% rename from include/ginput/ginput_mouse.h rename to 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 . */ /** - * @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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 similarity index 87% rename from include/ginput/ginput_toggle.h rename to 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 . */ /** - * @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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file 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 similarity index 65% rename from include/gtimer.h rename to 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 . */ /** - * @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. */ -/*===========================================================================*/ - -#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES - #error "GTIMER: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h" -#endif - /*===========================================================================*/ /* Type definitions */ /*===========================================================================*/ -// A callback function (executed in a thread context) +/** + * @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 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 similarity index 52% rename from demos/applications/console/main.c rename to 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 . */ -/* - * !!! 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 - * - * #define GFX_USE_CONSOLE TRUE - * #define GDISP_NEED_SCROLL TRUE +#ifndef _GTIMER_OPTIONS_H +#define _GTIMER_OPTIONS_H + +/** + * @name GTIMER Functionality to be included + * @{ */ +/** + * @} + * + * @name GTIMER Optional Sizing Parameters + * @{ + */ + /** + * @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 +/** @} */ -#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); - } -} - +#endif /* _GTIMER_OPTIONS_H */ +/** @} */ diff --git a/include/gwin/gwin_button.h b/include/gwin/button.h similarity index 76% rename from include/gwin/gwin_button.h rename to 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 . */ /** - * @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__) /*===========================================================================*/ @@ -50,24 +36,6 @@ #define GW_BUTTON 0x0002 #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 similarity index 71% rename from include/gwin/gwin_console.h rename to 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 . */ /** - * @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__) /*===========================================================================*/ @@ -48,18 +35,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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 similarity index 79% rename from include/gwin.h rename to 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 . */ /** - * @file gwin.h + * @file include/gwin/gwin.h * @brief GWIN Graphic window subsystem header file. * * @addtogroup GWIN @@ -27,39 +27,10 @@ #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 similarity index 89% rename from src/gwin/gwin_internal.h rename to 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 . */ /** - * @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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file 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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file 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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file 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 similarity index 97% rename from src/gdisp_fonts.c rename to 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 similarity index 96% rename from src/gdisp.c rename to 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 similarity index 94% rename from src/gevent.c rename to 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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file src/graph.c - * @brief GRAPH module code. - * - * @addtogroup GRAPH - * @{ - */ -#include -#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 similarity index 93% rename from src/gtimer.c rename to 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 -#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 -#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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file src/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 similarity index 96% rename from src/gwin.c rename to 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 - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file src/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 */ -/** @} */ -