From 07f34835358ef65de310934ae726b66c7ca46f68 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 6 Dec 2012 18:45:54 +1000 Subject: [PATCH 1/9] Restructure Create global include file called gfx.h which knows about sub-system dependancies. Deprecate Touchscreen (GINPUT touch is now working properly) Merge Graph into GWIN Change directory structure to reflect sub-system structure Many small bugs fixed Split Nokia6610 gdisp driver into GE8 and GE12 controller versions Fixed broken demos. GFX sub-systems are now clearly defined and new ones should be much easier to add. --- demos/applications/graph/main.c | 51 -- demos/applications/mandelbrot/gfxconf.h | 69 +++ demos/applications/mandelbrot/main.c | 3 +- demos/applications/notepad/gfxconf.h | 69 +++ demos/applications/notepad/main.c | 39 +- demos/modules/console/gfxconf.h | 69 +++ demos/modules/console/main.c | 185 ++++--- .../ginput_touch_driver_test/gfxconf.h | 69 +++ demos/modules/ginput_touch_driver_test/main.c | 22 +- demos/modules/graph/gfxconf.h | 69 +++ demos/modules/graph/main.c | 54 ++ demos/modules/gtimer/gfxconf.h | 69 +++ demos/modules/gtimer/main.c | 124 +++-- demos/modules/window/gfxconf.h | 69 +++ demos/modules/window/main.c | 134 +++-- drivers/gdisp/ILI9320/gdisp_lld.c | 6 +- drivers/gdisp/Nokia6610/gdisp_lld.mk | 5 - .../gdisp/{Nokia6610 => Nokia6610GE12}/GE12.h | 0 .../{Nokia6610 => Nokia6610GE12}/gdisp_lld.c | 163 +++--- drivers/gdisp/Nokia6610GE12/gdisp_lld.mk | 5 + .../Nokia6610GE12/gdisp_lld_board_example.h | 135 +++++ .../gdisp_lld_board_olimexsam7ex256.h | 196 +++++++ .../gdisp/Nokia6610GE12/gdisp_lld_config.h | 58 +++ .../{Nokia6610 => Nokia6610GE12}/readme.txt | 9 +- .../gdisp/{Nokia6610 => Nokia6610GE8}/GE8.h | 0 drivers/gdisp/Nokia6610GE8/gdisp_lld.c | 483 ++++++++++++++++++ drivers/gdisp/Nokia6610GE8/gdisp_lld.mk | 5 + .../gdisp_lld_board_example.h | 22 +- .../gdisp_lld_board_olimexsam7ex256.h | 4 +- .../gdisp_lld_config.h | 8 +- drivers/gdisp/Nokia6610GE8/readme.txt | 15 + drivers/gdisp/S6D1121/gdisp_lld.c | 6 +- drivers/gdisp/SSD1289/gdisp_lld.c | 4 +- drivers/gdisp/SSD1963/gdisp_lld.c | 11 +- drivers/gdisp/TestStub/gdisp_lld.c | 15 +- drivers/gdisp/VMT/gdisp_lld.c | 25 +- drivers/gdisp/VMT/gdisp_lld_driver1.c | 2 +- drivers/gdisp/VMT/gdisp_lld_driver2.c | 2 +- drivers/ginput/toggle/Pal/ginput_lld_toggle.c | 6 +- .../Pal/ginput_lld_toggle_board_example.h | 49 +- .../ginput_lld_toggle_board_olimexsam7ex256.h | 26 +- .../toggle/Pal/ginput_lld_toggle_config.h | 5 +- .../ginput_lld_mouse_board_olimex_stm32_lcd.h | 10 +- drivers/multiple/Win32/gdisp_lld.c | 21 +- gfx.mk | 12 +- include/{ => gdisp}/gdisp.h | 71 +-- include/{lld/gdisp => gdisp/lld}/emulation.c | 4 +- include/{lld/gdisp => gdisp/lld}/gdisp_lld.h | 108 +--- .../{lld/gdisp => gdisp/lld}/gdisp_lld_msgs.h | 6 +- include/gdisp/options.h | 208 ++++++++ include/{ => gevent}/gevent.h | 60 +-- include/gevent/options.h | 68 +++ include/gfx.h | 114 +++++ include/gfx_rules.h | 113 ++++ include/gfxconf.example.h | 74 +++ include/ginput.h | 98 ---- include/ginput/{ginput_dial.h => dial.h} | 19 +- include/ginput/ginput.h | 55 ++ .../ginput/{ginput_keyboard.h => keyboard.h} | 19 +- include/{lld/ginput => ginput/lld}/mouse.h | 11 +- include/{lld/ginput => ginput/lld}/toggle.h | 19 +- include/ginput/{ginput_mouse.h => mouse.h} | 17 +- include/ginput/options.h | 127 +++++ include/ginput/{ginput_toggle.h => toggle.h} | 21 +- include/graph.h | 84 --- include/{ => gtimer}/gtimer.h | 49 +- .../main.c => include/gtimer/options.h | 61 +-- include/gwin/{gwin_button.h => button.h} | 34 +- include/gwin/{gwin_console.h => console.h} | 27 +- include/gwin/graph.h | 156 ++++++ include/{ => gwin}/gwin.h | 40 +- .../gwin/internal.h | 6 +- include/gwin/options.h | 71 +++ include/lld/touchscreen/touchscreen_lld.h | 130 ----- include/touchscreen.h | 93 ---- releases.txt | 22 +- src/{gdisp_fonts.c => gdisp/fonts.c} | 11 +- src/{ => gdisp}/gdisp.c | 5 +- src/gdisp/gdisp.mk | 2 + src/{ => gevent}/gevent.c | 10 +- src/gevent/gevent.mk | 1 + src/ginput/dial.c | 6 +- src/ginput/keyboard.c | 6 +- src/ginput/mouse.c | 9 +- src/ginput/toggle.c | 9 +- src/graph.c | 216 -------- src/{ => gtimer}/gtimer.c | 12 +- src/gtimer/gtimer.mk | 1 + src/gwin/button.c | 14 +- src/gwin/console.c | 6 +- src/gwin/graph.c | 425 +++++++++++++++ src/{ => gwin}/gwin.c | 8 +- src/gwin/gwin.mk | 7 +- src/touchscreen.c | 369 ------------- 94 files changed, 3418 insertions(+), 2087 deletions(-) delete mode 100644 demos/applications/graph/main.c create mode 100644 demos/applications/mandelbrot/gfxconf.h create mode 100644 demos/applications/notepad/gfxconf.h create mode 100644 demos/modules/console/gfxconf.h create mode 100644 demos/modules/ginput_touch_driver_test/gfxconf.h create mode 100644 demos/modules/graph/gfxconf.h create mode 100644 demos/modules/graph/main.c create mode 100644 demos/modules/gtimer/gfxconf.h create mode 100644 demos/modules/window/gfxconf.h delete mode 100644 drivers/gdisp/Nokia6610/gdisp_lld.mk rename drivers/gdisp/{Nokia6610 => Nokia6610GE12}/GE12.h (100%) rename drivers/gdisp/{Nokia6610 => Nokia6610GE12}/gdisp_lld.c (70%) create mode 100644 drivers/gdisp/Nokia6610GE12/gdisp_lld.mk create mode 100644 drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h create mode 100644 drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h create mode 100644 drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h rename drivers/gdisp/{Nokia6610 => Nokia6610GE12}/readme.txt (58%) rename drivers/gdisp/{Nokia6610 => Nokia6610GE8}/GE8.h (100%) create mode 100644 drivers/gdisp/Nokia6610GE8/gdisp_lld.c create mode 100644 drivers/gdisp/Nokia6610GE8/gdisp_lld.mk rename drivers/gdisp/{Nokia6610 => Nokia6610GE8}/gdisp_lld_board_example.h (74%) rename drivers/gdisp/{Nokia6610 => Nokia6610GE8}/gdisp_lld_board_olimexsam7ex256.h (94%) rename drivers/gdisp/{Nokia6610 => Nokia6610GE8}/gdisp_lld_config.h (87%) create mode 100644 drivers/gdisp/Nokia6610GE8/readme.txt rename include/{ => gdisp}/gdisp.h (83%) rename include/{lld/gdisp => gdisp/lld}/emulation.c (96%) rename include/{lld/gdisp => gdisp/lld}/gdisp_lld.h (85%) rename include/{lld/gdisp => gdisp/lld}/gdisp_lld_msgs.h (94%) create mode 100644 include/gdisp/options.h rename include/{ => gevent}/gevent.h (82%) create mode 100644 include/gevent/options.h create mode 100644 include/gfx.h create mode 100644 include/gfx_rules.h create mode 100644 include/gfxconf.example.h delete mode 100644 include/ginput.h rename include/ginput/{ginput_dial.h => dial.h} (81%) create mode 100644 include/ginput/ginput.h rename include/ginput/{ginput_keyboard.h => keyboard.h} (87%) rename include/{lld/ginput => ginput/lld}/mouse.h (91%) rename include/{lld/ginput => ginput/lld}/toggle.h (80%) rename include/ginput/{ginput_mouse.h => mouse.h} (93%) create mode 100644 include/ginput/options.h rename include/ginput/{ginput_toggle.h => toggle.h} (87%) delete mode 100644 include/graph.h rename include/{ => gtimer}/gtimer.h (65%) rename demos/applications/console/main.c => include/gtimer/options.h (52%) rename include/gwin/{gwin_button.h => button.h} (76%) rename include/gwin/{gwin_console.h => console.h} (71%) create mode 100644 include/gwin/graph.h rename include/{ => gwin}/gwin.h (79%) rename src/gwin/gwin_internal.h => include/gwin/internal.h (89%) create mode 100644 include/gwin/options.h delete mode 100644 include/lld/touchscreen/touchscreen_lld.h delete mode 100644 include/touchscreen.h rename src/{gdisp_fonts.c => gdisp/fonts.c} (97%) rename src/{ => gdisp}/gdisp.c (96%) create mode 100644 src/gdisp/gdisp.mk rename src/{ => gevent}/gevent.c (94%) create mode 100644 src/gevent/gevent.mk delete mode 100644 src/graph.c rename src/{ => gtimer}/gtimer.c (93%) create mode 100644 src/gtimer/gtimer.mk create mode 100644 src/gwin/graph.c rename src/{ => gwin}/gwin.c (96%) delete mode 100644 src/touchscreen.c 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 */ -/** @} */ - From ec89b8e82d890066f60c48349da062add76db6cd Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 6 Dec 2012 22:24:28 +1000 Subject: [PATCH 2/9] Fixes to GWIN graph and demo --- demos/modules/graph/main.c | 25 ++++++++++++++++++------- src/gwin/graph.c | 3 ++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/demos/modules/graph/main.c b/demos/modules/graph/main.c index bd2da2f6..40267522 100644 --- a/demos/modules/graph/main.c +++ b/demos/modules/graph/main.c @@ -13,9 +13,19 @@ int data[5][2] = { GGraphObject g; +GGraphStyle GraphStyle1 = { + { GGRAPH_POINT_DOT, 0, Blue }, // point + { GGRAPH_LINE_NONE, 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 +}; + GGraphStyle GraphStyle2 = { { GGRAPH_POINT_DOT, 0, Green }, // point - { GGRAPH_LINE_DOT, 2, Gray }, // line + { GGRAPH_LINE_NONE, 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 @@ -33,19 +43,20 @@ int main(void) { gdispInit(); gdispClear(Black); - gh = gwinCreateGraph(0, 0, gdispGetWidth(), gdispGetHeight()); + gh = gwinCreateGraph(&g, 0, 0, gdispGetWidth(), gdispGetHeight()); - gwinGraphSetOrigin(gh, 150, 150); + gwinGraphSetOrigin(gh, gwinGetWidth(gh)/2, gwinGetHeight(gh)/2); + gwinGraphSetStyle(gh, &GraphStyle1); gwinGraphDrawAxis(gh); - for(i = 0; i < 2500; i++) - gwinGraphDrawPoint(gh, i-170, 80*sin(2*0.2*M_PI*i/180)); + for(i = 0; i < gwinGetWidth(gh); i++) + gwinGraphDrawPoint(gh, i-gwinGetWidth(gh)/2, 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)); + for(i = 0; i < gwinGetWidth(gh)*5; i++) + gwinGraphDrawPoint(gh, i/5-gwinGetWidth(gh)/2, 95*sin(2*0.2*M_PI*i/180)); while(TRUE) { chThdSleepMilliseconds(100); diff --git a/src/gwin/graph.c b/src/gwin/graph.c index e950f623..581001ad 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -88,7 +88,7 @@ static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t 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; + y1 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y1; if (style->size <= 0) { // Use the driver to draw a solid line @@ -235,6 +235,7 @@ void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) { gg->style.ygrid.size = pstyle->ygrid.size; gg->style.ygrid.color = pstyle->ygrid.color; gg->style.ygrid.spacing = pstyle->ygrid.spacing; + gg->style.flags = pstyle->flags; #undef gg } From 5873d87ca2185e825f1187eca3bc7f0de7437e69 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Fri, 7 Dec 2012 00:52:01 +1000 Subject: [PATCH 3/9] Add GDISP font routines. Fix demo bugs Add GDISP font routines to Open and Close a font by name. Allows wildcard searching for fonts. Old global font variables are now only optionally included (soon to be deprecated). More demo fixing --- demos/applications/mandelbrot/gfxconf.h | 8 + demos/applications/notepad/gfxconf.h | 10 +- demos/applications/notepad/main.c | 35 ++- demos/modules/console/gfxconf.h | 8 + demos/modules/console/main.c | 9 +- .../ginput_touch_driver_test/gfxconf.h | 8 + demos/modules/ginput_touch_driver_test/main.c | 12 +- demos/modules/graph/gfxconf.h | 8 + demos/modules/gtimer/gfxconf.h | 8 + demos/modules/window/gfxconf.h | 10 +- .../multiple/Win32/ginput_lld_mouse_config.h | 2 +- .../gfxconf.example.h => gfxconf.example.h | 8 + include/gdisp/fonts.h | 11 +- include/gdisp/gdisp.h | 51 ++-- include/gdisp/options.h | 33 +++ src/gdisp/fonts.c | 264 +++++++++++++----- src/ginput/mouse.c | 16 +- 17 files changed, 374 insertions(+), 127 deletions(-) rename include/gfxconf.example.h => gfxconf.example.h (85%) diff --git a/demos/applications/mandelbrot/gfxconf.h b/demos/applications/mandelbrot/gfxconf.h index 726847cd..da8baefb 100644 --- a/demos/applications/mandelbrot/gfxconf.h +++ b/demos/applications/mandelbrot/gfxconf.h @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/demos/applications/notepad/gfxconf.h b/demos/applications/notepad/gfxconf.h index cbdb7b95..c4cf0325 100644 --- a/demos/applications/notepad/gfxconf.h +++ b/demos/applications/notepad/gfxconf.h @@ -26,10 +26,18 @@ #define GDISP_NEED_SCROLL FALSE #define GDISP_NEED_PIXELREAD FALSE #define GDISP_NEED_CONTROL FALSE -#define GDISP_NEED_MULTITHREAD FALSE +#define GDISP_NEED_MULTITHREAD TRUE #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/demos/applications/notepad/main.c b/demos/applications/notepad/main.c index e1b0e333..71978488 100644 --- a/demos/applications/notepad/main.c +++ b/demos/applications/notepad/main.c @@ -26,8 +26,8 @@ #define PEN_SIZE 20 #define OFFSET 3 -#define COLOR_BOX(a) (x >= a && x <= a + COLOR_SIZE) -#define PEN_BOX(a) (y >= a && y <= a + COLOR_SIZE) +#define COLOR_BOX(a) (ev.x >= a && ev.x <= a + COLOR_SIZE) +#define PEN_BOX(a) (ev.y >= a && ev.y <= a + COLOR_SIZE) #define GET_COLOR(a) (COLOR_BOX(a * COLOR_SIZE + OFFSET)) #define GET_PEN(a) (PEN_BOX(a * 2 * PEN_SIZE + OFFSET)) #define DRAW_COLOR(a) (a * COLOR_SIZE + OFFSET) @@ -37,9 +37,13 @@ void drawScreen(void) { char *msg = "ChibiOS/GFX"; + font_t font1, font2; + + font1 = gdispOpenFont("UI2 Double"); + font2 = gdispOpenFont("LargeNumbers"); gdispClear(White); - gdispDrawString(gdispGetWidth()-gdispGetStringWidth(msg, &fontUI2Double)-3, 3, msg, &fontUI2Double, Black); + gdispDrawString(gdispGetWidth()-gdispGetStringWidth(msg, font1)-3, 3, msg, font1, Black); /* colors */ gdispFillArea(0 * COLOR_SIZE + 3, 3, COLOR_SIZE, COLOR_SIZE, Black); /* Black */ @@ -50,11 +54,14 @@ void drawScreen(void) { gdispDrawBox (5 * COLOR_SIZE + 3, 3, COLOR_SIZE, COLOR_SIZE, Black); /* White */ /* pens */ - gdispDrawString(OFFSET * 2, DRAW_PEN(1), "1", &fontLargeNumbers, Black); - gdispDrawString(OFFSET * 2, DRAW_PEN(2), "2", &fontLargeNumbers, Black); - gdispDrawString(OFFSET * 2, DRAW_PEN(3), "3", &fontLargeNumbers, Black); - gdispDrawString(OFFSET * 2, DRAW_PEN(4), "4", &fontLargeNumbers, Black); - gdispDrawString(OFFSET * 2, DRAW_PEN(5), "5", &fontLargeNumbers, Black); + gdispDrawString(OFFSET * 2, DRAW_PEN(1), "1", font2, Black); + gdispDrawString(OFFSET * 2, DRAW_PEN(2), "2", font2, Black); + gdispDrawString(OFFSET * 2, DRAW_PEN(3), "3", font2, Black); + gdispDrawString(OFFSET * 2, DRAW_PEN(4), "4", font2, Black); + gdispDrawString(OFFSET * 2, DRAW_PEN(5), "5", font2, Black); + + gdispCloseFont(font1); + gdispCloseFont(font2); } GEventMouse ev; @@ -73,11 +80,11 @@ int main(void) { while (TRUE) { ginputGetMouseStatus(0, &ev); - if (!(ev->current_buttons & GINPUT_MOUSE_BTN_LEFT)) + if (!(ev.current_buttons & GINPUT_MOUSE_BTN_LEFT)) continue; /* inside color box ? */ - if(ev->y >= OFFSET && ev->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; @@ -86,7 +93,7 @@ int main(void) { else if(GET_COLOR(5)) color = White; /* inside pen box ? */ - } else if(ev->x >= OFFSET && ev->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; @@ -94,11 +101,11 @@ int main(void) { else if(GET_PEN(5)) pen = 4; /* inside drawing area ? */ - } else if(DRAW_AREA(ev->x, ev->y)) { + } else if(DRAW_AREA(ev.x, ev.y)) { if(pen == 0) - gdispDrawPixel(ev->x, ev->y, color); + gdispDrawPixel(ev.x, ev.y, color); else - gdispFillCircle(ev->x, ev->y, pen, color); + gdispFillCircle(ev.x, ev.y, pen, color); } } } diff --git a/demos/modules/console/gfxconf.h b/demos/modules/console/gfxconf.h index d3e99de4..bbea4a23 100644 --- a/demos/modules/console/gfxconf.h +++ b/demos/modules/console/gfxconf.h @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL TRUE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE TRUE diff --git a/demos/modules/console/main.c b/demos/modules/console/main.c index 830c9d00..1227e89a 100644 --- a/demos/modules/console/main.c +++ b/demos/modules/console/main.c @@ -37,6 +37,7 @@ BaseSequentialStream *S1, *S2, *S3; int main(void) { uint8_t i; + font_t font1, font2; halInit(); chSysInit(); @@ -44,11 +45,13 @@ int main(void) { /* initialize and clear the display */ gdispInit(); gdispClear(Black); + font1 = gdispOpenFont("UI2 Double"); + font2 = gdispOpenFont("Small"); /* 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); + GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, font1); + GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), font2); + GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), font2); /* Set the fore- and background colors for each console */ gwinSetColor(GW1, Green); diff --git a/demos/modules/ginput_touch_driver_test/gfxconf.h b/demos/modules/ginput_touch_driver_test/gfxconf.h index a6d40f06..7be662b5 100644 --- a/demos/modules/ginput_touch_driver_test/gfxconf.h +++ b/demos/modules/ginput_touch_driver_test/gfxconf.h @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON TRUE #define GWIN_NEED_CONSOLE TRUE diff --git a/demos/modules/ginput_touch_driver_test/main.c b/demos/modules/ginput_touch_driver_test/main.c index d8fe1739..a77e0b3f 100644 --- a/demos/modules/ginput_touch_driver_test/main.c +++ b/demos/modules/ginput_touch_driver_test/main.c @@ -40,6 +40,7 @@ int main(void) { GHandle ghc, ghNext, ghPrev; BaseSequentialStream *gp; GEventType deviceType; + font_t font; halInit(); // Initialise the Hardware chSysInit(); // Initialize the OS @@ -51,10 +52,11 @@ int main(void) { ghNext = ghPrev = 0; // Create our title - gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", &fontUI2, Red, White, justifyLeft); + font = gdispOpenFont("UI2"); + gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Red, White, justifyLeft); // Create our main display window - ghc = gwinCreateConsole(&gc, 0, 20, swidth, sheight-20, &fontUI2); + ghc = gwinCreateConsole(&gc, 0, 20, swidth, sheight-20, font); gwinClear(ghc); gp = gwinGetConsoleStream(ghc); @@ -195,13 +197,13 @@ StepCalibrate: /* From now on we can use Next and Previous Buttons */ if (!ghNext) { - ghNext = gwinCreateButton(&gNext, swidth-50, 0, 50, 20, &fontUI2, GBTN_NORMAL); + ghNext = gwinCreateButton(&gNext, swidth-50, 0, 50, 20, font, GBTN_NORMAL); gwinSetButtonText(ghNext, "Next", FALSE); gsNext = gwinGetButtonSource(ghNext); geventAttachSource(&gl, gsNext, 0); gwinAttachButtonMouseSource(ghNext, gs); - ghPrev = gwinCreateButton(&gPrev, swidth-100, 0, 50, 20, &fontUI2, GBTN_NORMAL); + ghPrev = gwinCreateButton(&gPrev, swidth-100, 0, 50, 20, font, GBTN_NORMAL); gwinSetButtonText(ghPrev, "Back", FALSE); gsPrev = gwinGetButtonSource(ghPrev); geventAttachSource(&gl, gsPrev, 0); @@ -226,7 +228,7 @@ StepCalibrate: } // Calibration used the whole screen - re-establish our title - gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", &fontUI2, Green, White, justifyLeft); + gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Green, White, justifyLeft); gwinButtonDraw(ghNext); gwinButtonDraw(ghPrev); diff --git a/demos/modules/graph/gfxconf.h b/demos/modules/graph/gfxconf.h index 23a675b9..002f1492 100644 --- a/demos/modules/graph/gfxconf.h +++ b/demos/modules/graph/gfxconf.h @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/demos/modules/gtimer/gfxconf.h b/demos/modules/gtimer/gfxconf.h index c0f24a7a..e06d50d7 100644 --- a/demos/modules/gtimer/gfxconf.h +++ b/demos/modules/gtimer/gfxconf.h @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/demos/modules/window/gfxconf.h b/demos/modules/window/gfxconf.h index 80c4b327..3c6eb0a3 100644 --- a/demos/modules/window/gfxconf.h +++ b/demos/modules/window/gfxconf.h @@ -19,7 +19,7 @@ /* Features for the GDISP sub-system. */ #define GDISP_NEED_VALIDATION TRUE #define GDISP_NEED_CLIP TRUE -#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_TEXT FALSE #define GDISP_NEED_CIRCLE TRUE #define GDISP_NEED_ELLIPSE FALSE #define GDISP_NEED_ARC FALSE @@ -30,6 +30,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/drivers/multiple/Win32/ginput_lld_mouse_config.h b/drivers/multiple/Win32/ginput_lld_mouse_config.h index e4c2eb82..2e740af8 100644 --- a/drivers/multiple/Win32/ginput_lld_mouse_config.h +++ b/drivers/multiple/Win32/ginput_lld_mouse_config.h @@ -30,7 +30,7 @@ // This driver supports being both a mouse or a touch device (we don't actually know which it really is) // When operating in mouse mode a long left button click does not generate a context click. // When operating in touch mode we allow sloppier clicks etc -#if GINPUT_NEED_MOUSE +#if 1 #define GINPUT_MOUSE_EVENT_TYPE GEVENT_MOUSE #define GINPUT_MOUSE_CLICK_TIME TIME_INFINITE // Long click != Context Click #define GINPUT_MOUSE_NEED_CALIBRATION FALSE diff --git a/include/gfxconf.example.h b/gfxconf.example.h similarity index 85% rename from include/gfxconf.example.h rename to gfxconf.example.h index 94413237..8cbaea05 100644 --- a/include/gfxconf.example.h +++ b/gfxconf.example.h @@ -35,6 +35,14 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE +/* Builtin Fonts */ +#define GDISP_OLD_FONT_DEFINITIONS FALSE +#define GDISP_INCLUDE_FONT_SMALL TRUE +#define GDISP_INCLUDE_FONT_LARGER TRUE +#define GDISP_INCLUDE_FONT_UI1 TRUE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE + /* Features for the GWIN sub-system. */ #define GWIN_NEED_BUTTON FALSE #define GWIN_NEED_CONSOLE FALSE diff --git a/include/gdisp/fonts.h b/include/gdisp/fonts.h index e0c7f7de..34a5b89d 100644 --- a/include/gdisp/fonts.h +++ b/include/gdisp/fonts.h @@ -33,16 +33,6 @@ /* Don't test against GFX_USE_GDISP as we may want to use this in other non-GDISP utilities. */ -/** - * @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. - */ -#ifndef GDISP_MAX_FONT_HEIGHT - #define GDISP_MAX_FONT_HEIGHT 16 -#endif - /** * @brief The type of a font column. * @note Set by defining @p GDISP_MAX_FNT_HEIGHT appropriately. @@ -65,6 +55,7 @@ * to allow the tables to work across many different compilers. */ struct font { + const char * name; uint8_t height; uint8_t charPadding; uint8_t lineSpacing; diff --git a/include/gdisp/gdisp.h b/include/gdisp/gdisp.h index b9434d3f..117f865a 100644 --- a/include/gdisp/gdisp.h +++ b/include/gdisp/gdisp.h @@ -96,25 +96,35 @@ typedef enum fontmetric {fontHeight, fontDescendersHeight, fontLineSpacing, font /* External declarations. */ /*===========================================================================*/ -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief Predefined fonts. - */ -extern const struct font fontSmall; -extern const struct font fontSmallDouble; -extern const struct font fontSmallNarrow; -extern const struct font fontLarger; -extern const struct font fontLargerDouble; -extern const struct font fontLargerNarrow; -extern const struct font fontUI1; -extern const struct font fontUI1Double; -extern const struct font fontUI1Narrow; -extern const struct font fontUI2; -extern const struct font fontUI2Double; -extern const struct font fontUI2Narrow; -extern const struct font fontLargeNumbers; -extern const struct font fontLargeNumbersDouble; -extern const struct font fontLargeNumbersNarrow; +#if (GDISP_NEED_TEXT && GDISP_OLD_FONT_DEFINITIONS) || defined(__DOXYGEN__) + /** + * @brief Predefined fonts. + */ + #if GDISP_INCLUDE_FONT_SMALL + extern const struct font fontSmall; + extern const struct font fontSmallDouble; + extern const struct font fontSmallNarrow; + #endif + #if GDISP_INCLUDE_FONT_LARGER + extern const struct font fontLarger; + extern const struct font fontLargerDouble; + extern const struct font fontLargerNarrow; + #endif + #if GDISP_INCLUDE_FONT_UI1 + extern const struct font fontUI1; + extern const struct font fontUI1Double; + extern const struct font fontUI1Narrow; + #endif + #if GDISP_INCLUDE_FONT_UI2 + extern const struct font fontUI2; + extern const struct font fontUI2Double; + extern const struct font fontUI2Narrow; + #endif + #if GDISP_INCLUDE_FONT_LARGENUMBERS + extern const struct font fontLargeNumbers; + extern const struct font fontLargeNumbersDouble; + extern const struct font fontLargeNumbersNarrow; + #endif #endif #ifdef __cplusplus @@ -226,6 +236,9 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); coord_t gdispGetFontMetric(font_t font, fontmetric_t metric); coord_t gdispGetCharWidth(char c, font_t font); coord_t gdispGetStringWidth(const char* str, font_t font); + font_t gdispOpenFont(const char *name); + void gdispCloseFont(font_t font); + const char *gdispGetFontName(font_t font); #endif /* Extra Arc Functions */ diff --git a/include/gdisp/options.h b/include/gdisp/options.h index c2163631..b53138ca 100644 --- a/include/gdisp/options.h +++ b/include/gdisp/options.h @@ -149,6 +149,39 @@ #ifndef GDISP_NEED_ASYNC #define GDISP_NEED_ASYNC FALSE #endif +/** + * @} + * + * @name GDISP Fonts + * @{ + */ + /** + * @brief Include the old global font variable definitions + * @details Defaults to FALSE + */ + #ifndef GDISP_OLD_FONT_DEFINITIONS + #define GDISP_OLD_FONT_DEFINITIONS FALSE + #endif + /** + * @brief Predefined built in fonts. + * @note Turning off the ones you are not using can save program size. + */ + #ifndef GDISP_INCLUDE_FONT_SMALL + #define GDISP_INCLUDE_FONT_SMALL TRUE + #endif + #ifndef GDISP_INCLUDE_FONT_LARGER + #define GDISP_INCLUDE_FONT_LARGER TRUE + #endif + #ifndef GDISP_INCLUDE_FONT_UI1 + #define GDISP_INCLUDE_FONT_UI1 TRUE + #endif + #ifndef GDISP_INCLUDE_FONT_UI2 + #define GDISP_INCLUDE_FONT_UI2 TRUE + #endif + #ifndef GDISP_INCLUDE_FONT_LARGENUMBERS + #define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE + #endif + /** * @} * diff --git a/src/gdisp/fonts.c b/src/gdisp/fonts.c index fda963dd..e02dc3bd 100644 --- a/src/gdisp/fonts.c +++ b/src/gdisp/fonts.c @@ -18,9 +18,14 @@ along with this program. If not, see . */ -/* - Font tables included into gdisp.c -*/ +/** + * @file src/gdisp/fonts.c + * @brief GDISP Font Handling. + * + * @addtogroup GDISP + * @{ + */ + #include "ch.h" #include "hal.h" #include "gfx.h" @@ -29,26 +34,37 @@ #include "gdisp/fonts.h" +#if GDISP_OLD_FONT_DEFINITIONS + #define FONT_DECL +#else + #define FONT_DECL static +#endif /* fontSmall - for side buttons */ -#if 1 +#if GDISP_INCLUDE_FONT_SMALL /* Forward Declarations of internal arrays */ static const uint8_t fontSmall_Widths[]; static const uint16_t fontSmall_Offsets[]; static const fontcolumn_t fontSmall_Data[]; - const struct font fontSmall = { 11, 0, 14, 2, 2, 12, ' ', '~', 1, 1, - fontSmall_Widths, - fontSmall_Offsets, - fontSmall_Data}; - const struct font fontSmallDouble = { 11, 0, 14, 2, 2, 12, ' ', '~', 2, 2, - fontSmall_Widths, - fontSmall_Offsets, - fontSmall_Data}; - const struct font fontSmallNarrow = { 11, 0, 14, 2, 2, 12, ' ', '~', 1, 2, - fontSmall_Widths, - fontSmall_Offsets, - fontSmall_Data}; + FONT_DECL const struct font fontSmall = { + "Small", + 11, 0, 14, 2, 2, 12, ' ', '~', 1, 1, + fontSmall_Widths, + fontSmall_Offsets, + fontSmall_Data}; + FONT_DECL const struct font fontSmallDouble = { + "Small Double", + 11, 0, 14, 2, 2, 12, ' ', '~', 2, 2, + fontSmall_Widths, + fontSmall_Offsets, + fontSmall_Data}; + FONT_DECL const struct font fontSmallNarrow = { + "Small Narrow", + 11, 0, 14, 2, 2, 12, ' ', '~', 1, 2, + fontSmall_Widths, + fontSmall_Offsets, + fontSmall_Data}; static const uint8_t fontSmall_Widths[] = { 2, 3, 6, 8, 7, 9, 7, 3, 4, 4, 5, 7, 4, 4, 3, 6, @@ -172,24 +188,30 @@ #endif /* fontLarger - Tahoma, 11, Bold */ -#if 1 +#if GDISP_INCLUDE_FONT_LARGER /* Forward Declarations of internal arrays */ static const uint8_t fontLarger_Widths[]; static const uint16_t fontLarger_Offsets[]; static const fontcolumn_t fontLarger_Data[]; - const struct font fontLarger = { 12, 1, 13, 2, 2, 13, ' ', '~', 1, 1, - fontLarger_Widths, - fontLarger_Offsets, - fontLarger_Data}; - const struct font fontLargerDouble = { 12, 1, 13, 2, 2, 13, ' ', '~', 2, 2, - fontLarger_Widths, - fontLarger_Offsets, - fontLarger_Data}; - const struct font fontLargerNarrow = { 12, 1, 13, 2, 2, 13, ' ', '~', 1, 2, - fontLarger_Widths, - fontLarger_Offsets, - fontLarger_Data}; + FONT_DECL const struct font fontLarger = { + "Larger", + 12, 1, 13, 2, 2, 13, ' ', '~', 1, 1, + fontLarger_Widths, + fontLarger_Offsets, + fontLarger_Data}; + FONT_DECL const struct font fontLargerDouble = { + "Larger Double", + 12, 1, 13, 2, 2, 13, ' ', '~', 2, 2, + fontLarger_Widths, + fontLarger_Offsets, + fontLarger_Data}; + FONT_DECL const struct font fontLargerNarrow = { + "Larger Narrow", + 12, 1, 13, 2, 2, 13, ' ', '~', 1, 2, + fontLarger_Widths, + fontLarger_Offsets, + fontLarger_Data}; static const uint8_t fontLarger_Widths[] = { 2, 3, 5, 8, 7, 13, 8, 2, 4, 4, 7, 8, 3, 4, 3, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 9, 8, 9, 6, @@ -313,24 +335,30 @@ #endif /* fontUI1 - UI Font 1 Medium Bold */ -#if 1 +#if GDISP_INCLUDE_FONT_UI1 /* Forward Declarations of internal arrays */ static const uint8_t fontUI1_Widths[]; static const uint16_t fontUI1_Offsets[]; static const fontcolumn_t fontUI1_Data[]; - const struct font fontUI1 = { 13, 0, 15, 2, 3, 13, ' ', '~', 1, 1, - fontUI1_Widths, - fontUI1_Offsets, - fontUI1_Data}; - const struct font fontUI1Double = { 13, 0, 15, 2, 3, 13, ' ', '~', 2, 2, - fontUI1_Widths, - fontUI1_Offsets, - fontUI1_Data}; - const struct font fontUI1Narrow = { 13, 0, 15, 2, 3, 13, ' ', '~', 1, 2, - fontUI1_Widths, - fontUI1_Offsets, - fontUI1_Data}; + FONT_DECL const struct font fontUI1 = { + "UI1", + 13, 0, 15, 2, 3, 13, ' ', '~', 1, 1, + fontUI1_Widths, + fontUI1_Offsets, + fontUI1_Data}; + FONT_DECL const struct font fontUI1Double = { + "UI1 Double", + 13, 0, 15, 2, 3, 13, ' ', '~', 2, 2, + fontUI1_Widths, + fontUI1_Offsets, + fontUI1_Data}; + FONT_DECL const struct font fontUI1Narrow = { + "UI1 Narrow", + 13, 0, 15, 2, 3, 13, ' ', '~', 1, 2, + fontUI1_Widths, + fontUI1_Offsets, + fontUI1_Data}; static const uint8_t fontUI1_Widths[] = { 3, 3, 6, 8, 7, 13, 9, 3, 5, 5, 6, 8, 3, 5, 3, 7, @@ -455,24 +483,30 @@ #endif /* fontUI1 - UI Font 2 Medium Bold */ -#if 1 +#if GDISP_INCLUDE_FONT_UI2 /* Forward Declarations of internal arrays */ static const uint8_t fontUI2_Widths[]; static const uint16_t fontUI2_Offsets[]; static const fontcolumn_t fontUI2_Data[]; - const struct font fontUI2 = { 11, 1, 13, 2, 2, 12, ' ', '~', 1, 1, - fontUI2_Widths, - fontUI2_Offsets, - fontUI2_Data}; - const struct font fontUI2Double = { 11, 1, 13, 2, 2, 12, ' ', '~', 2, 2, - fontUI2_Widths, - fontUI2_Offsets, - fontUI2_Data}; - const struct font fontUI2Narrow = { 11, 1, 13, 2, 2, 12, ' ', '~', 1, 2, - fontUI2_Widths, - fontUI2_Offsets, - fontUI2_Data}; + FONT_DECL const struct font fontUI2 = { + "UI2", + 11, 1, 13, 2, 2, 12, ' ', '~', 1, 1, + fontUI2_Widths, + fontUI2_Offsets, + fontUI2_Data}; + FONT_DECL const struct font fontUI2Double = { + "UI2 Double", + 11, 1, 13, 2, 2, 12, ' ', '~', 2, 2, + fontUI2_Widths, + fontUI2_Offsets, + fontUI2_Data}; + FONT_DECL const struct font fontUI2Narrow = { + "UI2 Narrow", + 11, 1, 13, 2, 2, 12, ' ', '~', 1, 2, + fontUI2_Widths, + fontUI2_Offsets, + fontUI2_Data}; static const uint8_t fontUI2_Widths[] = { 2, 2, 5, 8, 6, 12, 8, 2, 4, 4, 6, 8, 2, 4, 2, 5, @@ -600,24 +634,29 @@ Large numbers font, height = 16 (including the decenders) Characters include: 0 - 9, -, +, ., %, :, Space, Comma */ -#if 1 +#if GDISP_INCLUDE_FONT_LARGENUMBERS /* Forward Declarations of internal arrays */ static const uint8_t fontLargeNumbers_Widths[]; static const uint16_t fontLargeNumbers_Offsets[]; static const fontcolumn_t fontLargeNumbers_Data[]; - const struct font fontLargeNumbers = { 16, 2, 21, 1, 3, 15, '%', ':', 1, 1, - fontLargeNumbers_Widths, - fontLargeNumbers_Offsets, - fontLargeNumbers_Data}; - const struct font fontLargeNumbersDouble = { 16, 2, 21, 1, 3, 15, '%', ':', 2, 2, - fontLargeNumbers_Widths, - fontLargeNumbers_Offsets, - fontLargeNumbers_Data}; - const struct font fontLargeNumbersNarrow = { 16, 2, 21, 1, 3, 15, '%', ':', 1, 2, - fontLargeNumbers_Widths, - fontLargeNumbers_Offsets, - fontLargeNumbers_Data}; + FONT_DECL const struct font fontLargeNumbers = { + "LargeNumbers", + 16, 2, 21, 1, 3, 15, '%', ':', 1, 1, + fontLargeNumbers_Widths, + fontLargeNumbers_Offsets, + fontLargeNumbers_Data}; + FONT_DECL const struct font fontLargeNumbersDouble = { + "LargeNumbers Double", + 16, 2, 21, 1, 3, 15, '%', ':', 2, 2, + fontLargeNumbers_Widths, + fontLargeNumbers_Offsets, + fontLargeNumbers_Data}; + FONT_DECL const struct font fontLargeNumbersNarrow = { + "LargeNumbers Narrow", 16, 2, 21, 1, 3, 15, '%', ':', 1, 2, + fontLargeNumbers_Widths, + fontLargeNumbers_Offsets, + fontLargeNumbers_Data}; static const uint8_t fontLargeNumbers_Widths[] = { 15, 0, 0, 0, 0, 0, 11, 3, 6, 3, 0, 10, 10, 10, 10, 10, @@ -649,4 +688,93 @@ }; #endif +static const struct font *BuiltinFontTable[] = { + #if GDISP_INCLUDE_FONT_SMALL + &fontSmall, &fontSmallDouble, &fontSmallNarrow, + #endif + #if GDISP_INCLUDE_FONT_LARGER + &fontLarger, &fontLargerDouble, &fontLargerNarrow, + #endif + #if GDISP_INCLUDE_FONT_UI1 + &fontUI1, &fontUI1Double, &fontUI1Narrow, + #endif + #if GDISP_INCLUDE_FONT_UI2 + &fontUI2, &fontUI2Double, &fontUI2Narrow, + #endif + #if GDISP_INCLUDE_FONT_LARGENUMBERS + &fontLargeNumbers, &fontLargeNumbersDouble, &fontLargeNumbersNarrow, + #endif + }; + +/** + * Match a pattern against the font name. + */ +static bool_t matchfont(const char *pattern, const char *name) { + while(1) { + switch (pattern[0]) { + case '*': + if (name[0] == 0) + return pattern[1] == 0; + if (pattern[1] == name[0]) + pattern++; + else + name++; + break; + case 0: + return name[0] == 0; + default: + if (name[0] != pattern[0]) + return FALSE; + pattern++; + name++; + break; + } + } +} + +/** + * @brief Find a font and return it. + * @details The supplied name is matched against the font name. A '*' will replace 0 or more characters. + * @return Returns a font or NULL if no matching font could be found. + * + * @params[in] name The font name to find. + * + * @note Wildcard matching will match the shortest possible match. + * + * @api + */ +font_t gdispOpenFont(const char *name) { + const struct font **p; + + for(p = BuiltinFontTable; p < BuiltinFontTable+sizeof(BuiltinFontTable)/sizeof(BuiltinFontTable[0]); p++) { + if (matchfont(name, p[0]->name)) + return p[0]; + } + return 0; +} + +/** + * @brief Release a font after use. + * + * @params[in] font The font to release. + * + * @api + */ +void gdispCloseFont(font_t font) { + (void) font; +} + +/** + * @brief Get the name of the specified font. + * @returns The name of the font. + * + * @params[in] font The font to get the name for. + * + * @api + */ +const char *gdispGetFontName(font_t font) { + return font->name; +} + #endif /* GFX_USE_GDISP && GDISP_NEED_TEXT */ +/** @} */ diff --git a/src/ginput/mouse.c b/src/ginput/mouse.c index 67ee5667..5e762ef9 100644 --- a/src/ginput/mouse.c +++ b/src/ginput/mouse.c @@ -38,8 +38,8 @@ #error "GINPUT: GFX_USE_GDISP must be defined when mouse or touch calibration is required" #endif - #define GINPUT_MOUSE_CALIBRATION_FONT &fontUI2Double - #define GINPUT_MOUSE_CALIBRATION_FONT2 &fontUI2Narrow + #define GINPUT_MOUSE_CALIBRATION_FONT "* Double" + #define GINPUT_MOUSE_CALIBRATION_FONT2 "* Narrow" #define GINPUT_MOUSE_CALIBRATION_TEXT "Calibration" #define GINPUT_MOUSE_CALIBRATION_ERROR_TEXT "Failed - Please try again!" #define GINPUT_MOUSE_CALIBRATION_SAME_TEXT "Error: Same Reading - Check Driver!" @@ -422,6 +422,7 @@ bool_t ginputCalibrateMouse(uint16_t instance) { MousePoint *pt; int32_t px, py; unsigned i, j; + font_t font1, font2; #if GINPUT_MOUSE_MAX_CALIBRATION_ERROR >= 0 unsigned err; #endif @@ -429,6 +430,9 @@ bool_t ginputCalibrateMouse(uint16_t instance) { if (instance || (MouseConfig.flags & FLG_IN_CAL)) return FALSE; + font1 = gdispOpenFont(GINPUT_MOUSE_CALIBRATION_FONT); + font2 = gdispOpenFont(GINPUT_MOUSE_CALIBRATION_FONT2); + MouseConfig.flags |= FLG_IN_CAL; gtimerStop(&MouseTimer); MouseConfig.flags &= ~(FLG_CAL_OK|FLG_CAL_SAVED); @@ -446,7 +450,7 @@ bool_t ginputCalibrateMouse(uint16_t instance) { #endif gdispClear(Blue); - gdispFillStringBox(0, 5, width, 30, GINPUT_MOUSE_CALIBRATION_TEXT, GINPUT_MOUSE_CALIBRATION_FONT, White, Blue, justifyCenter); + gdispFillStringBox(0, 5, width, 30, GINPUT_MOUSE_CALIBRATION_TEXT, font1, White, Blue, justifyCenter); for(i = 0, pt = points, pc = cross; i < GINPUT_MOUSE_CALIBRATION_POINTS; i++, pt++, pc++) { _tsDrawCross(pc); @@ -475,7 +479,7 @@ bool_t ginputCalibrateMouse(uint16_t instance) { _tsClearCross(pc); if (i >= 1 && pt->x == (pt-1)->x && pt->y == (pt-1)->y) { - gdispFillStringBox(0, 35, width, 40, GINPUT_MOUSE_CALIBRATION_SAME_TEXT, GINPUT_MOUSE_CALIBRATION_FONT2, Red, Yellow, justifyCenter); + gdispFillStringBox(0, 35, width, 40, GINPUT_MOUSE_CALIBRATION_SAME_TEXT, font2, Red, Yellow, justifyCenter); chThdSleepMilliseconds(5000); gdispFillArea(0, 35, width, 40, Blue); } @@ -503,12 +507,14 @@ bool_t ginputCalibrateMouse(uint16_t instance) { if (err <= GINPUT_MOUSE_MAX_CALIBRATION_ERROR * GINPUT_MOUSE_MAX_CALIBRATION_ERROR) break; - gdispFillStringBox(0, 35, width, 40, GINPUT_MOUSE_CALIBRATION_ERROR_TEXT, GINPUT_MOUSE_CALIBRATION_FONT2, Red, Yellow, justifyCenter); + gdispFillStringBox(0, 35, width, 40, GINPUT_MOUSE_CALIBRATION_ERROR_TEXT, font2, Red, Yellow, justifyCenter); chThdSleepMilliseconds(5000); } #endif // Restart everything + gdispCloseFont(font1); + gdispCloseFont(font2); MouseConfig.flags |= FLG_CAL_OK; MouseConfig.last_buttons = 0; get_calibrated_reading(&MouseConfig.t); From a88e0903ec9c54a36bfe94e74691c7a063277f0b Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Fri, 7 Dec 2012 01:05:58 +1000 Subject: [PATCH 4/9] Simplify demo gfxconf.h files --- demos/applications/mandelbrot/gfxconf.h | 44 -------------- demos/applications/notepad/gfxconf.h | 34 ----------- demos/modules/console/gfxconf.h | 34 ----------- .../ginput_touch_driver_test/gfxconf.h | 30 ---------- demos/modules/graph/gfxconf.h | 41 ------------- demos/modules/gtimer/gfxconf.h | 58 ------------------- demos/modules/window/gfxconf.h | 44 -------------- 7 files changed, 285 deletions(-) diff --git a/demos/applications/mandelbrot/gfxconf.h b/demos/applications/mandelbrot/gfxconf.h index da8baefb..7eaacc50 100644 --- a/demos/applications/mandelbrot/gfxconf.h +++ b/demos/applications/mandelbrot/gfxconf.h @@ -30,48 +30,4 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE -/* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE -#define GDISP_INCLUDE_FONT_SMALL FALSE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 FALSE -#define GDISP_INCLUDE_FONT_LARGENUMBERS 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/notepad/gfxconf.h b/demos/applications/notepad/gfxconf.h index c4cf0325..64334447 100644 --- a/demos/applications/notepad/gfxconf.h +++ b/demos/applications/notepad/gfxconf.h @@ -31,47 +31,13 @@ #define GDISP_NEED_MSGAPI FALSE /* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE #define GDISP_INCLUDE_FONT_SMALL FALSE #define GDISP_INCLUDE_FONT_LARGER FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE #define GDISP_INCLUDE_FONT_UI2 TRUE #define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE -/* 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/modules/console/gfxconf.h b/demos/modules/console/gfxconf.h index bbea4a23..254bf181 100644 --- a/demos/modules/console/gfxconf.h +++ b/demos/modules/console/gfxconf.h @@ -31,7 +31,6 @@ #define GDISP_NEED_MSGAPI FALSE /* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE #define GDISP_INCLUDE_FONT_SMALL TRUE #define GDISP_INCLUDE_FONT_LARGER FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE @@ -39,39 +38,6 @@ #define GDISP_INCLUDE_FONT_LARGENUMBERS 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/ginput_touch_driver_test/gfxconf.h b/demos/modules/ginput_touch_driver_test/gfxconf.h index 7be662b5..05f685dd 100644 --- a/demos/modules/ginput_touch_driver_test/gfxconf.h +++ b/demos/modules/ginput_touch_driver_test/gfxconf.h @@ -31,7 +31,6 @@ #define GDISP_NEED_MSGAPI FALSE /* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE #define GDISP_INCLUDE_FONT_SMALL FALSE #define GDISP_INCLUDE_FONT_LARGER FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE @@ -41,37 +40,8 @@ /* 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/graph/gfxconf.h b/demos/modules/graph/gfxconf.h index 002f1492..4f4258ed 100644 --- a/demos/modules/graph/gfxconf.h +++ b/demos/modules/graph/gfxconf.h @@ -30,48 +30,7 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE -/* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE -#define GDISP_INCLUDE_FONT_SMALL FALSE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 FALSE -#define GDISP_INCLUDE_FONT_LARGENUMBERS 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/gtimer/gfxconf.h b/demos/modules/gtimer/gfxconf.h index e06d50d7..e814bd18 100644 --- a/demos/modules/gtimer/gfxconf.h +++ b/demos/modules/gtimer/gfxconf.h @@ -16,62 +16,4 @@ #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 - -/* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE -#define GDISP_INCLUDE_FONT_SMALL FALSE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 FALSE -#define GDISP_INCLUDE_FONT_LARGENUMBERS 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/gfxconf.h b/demos/modules/window/gfxconf.h index 3c6eb0a3..c8080075 100644 --- a/demos/modules/window/gfxconf.h +++ b/demos/modules/window/gfxconf.h @@ -30,48 +30,4 @@ #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE -/* Builtin Fonts */ -#define GDISP_OLD_FONT_DEFINITIONS FALSE -#define GDISP_INCLUDE_FONT_SMALL FALSE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 FALSE -#define GDISP_INCLUDE_FONT_LARGENUMBERS 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 */ From c0f68cd7483b13b76470c03efb389f916394dce2 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Sat, 8 Dec 2012 13:09:56 +1000 Subject: [PATCH 5/9] Fix header files for ginput touch drivers --- drivers/ginput/touch/ADS7843/ginput_lld_mouse.c | 6 ++---- drivers/ginput/touch/MCU/ginput_lld_mouse.c | 6 ++---- drivers/ginput/touch/XPT2046/ginput_lld_mouse.c | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/ginput/touch/ADS7843/ginput_lld_mouse.c b/drivers/ginput/touch/ADS7843/ginput_lld_mouse.c index 9c1a582b..a308c0dc 100644 --- a/drivers/ginput/touch/ADS7843/ginput_lld_mouse.c +++ b/drivers/ginput/touch/ADS7843/ginput_lld_mouse.c @@ -28,13 +28,11 @@ #include "ch.h" #include "hal.h" +#include "gfx.h" #if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) /*|| defined(__DOXYGEN__)*/ -#include "gdisp.h" /* for coord_t */ -#include "gevent.h" -#include "ginput/ginput_mouse.h" /* for GINPUT_TOUCH_PRESSED */ -#include "lld/ginput/mouse.h" +#include "ginput/lld/mouse.h" #if defined(GINPUT_MOUSE_USE_CUSTOM_BOARD) && GINPUT_MOUSE_USE_CUSTOM_BOARD #include "ginput_lld_mouse_board.h" diff --git a/drivers/ginput/touch/MCU/ginput_lld_mouse.c b/drivers/ginput/touch/MCU/ginput_lld_mouse.c index d0a3c42e..61b512cd 100644 --- a/drivers/ginput/touch/MCU/ginput_lld_mouse.c +++ b/drivers/ginput/touch/MCU/ginput_lld_mouse.c @@ -28,13 +28,11 @@ #include "ch.h" #include "hal.h" +#include "gfx.h" #if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) /*|| defined(__DOXYGEN__)*/ -#include "gdisp.h" /* for coord_t */ -#include "gevent.h" -#include "ginput/ginput_mouse.h" /* for GINPUT_TOUCH_PRESSED */ -#include "lld/ginput/mouse.h" +#include "ginput/lld/mouse.h" #if defined(GINPUT_MOUSE_USE_CUSTOM_BOARD) && GINPUT_MOUSE_USE_CUSTOM_BOARD #include "ginput_lld_mouse_board.h" diff --git a/drivers/ginput/touch/XPT2046/ginput_lld_mouse.c b/drivers/ginput/touch/XPT2046/ginput_lld_mouse.c index 1e60611d..9fb35c9b 100644 --- a/drivers/ginput/touch/XPT2046/ginput_lld_mouse.c +++ b/drivers/ginput/touch/XPT2046/ginput_lld_mouse.c @@ -28,13 +28,11 @@ #include "ch.h" #include "hal.h" +#include "gfx.h" #if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) /*|| defined(__DOXYGEN__)*/ -#include "gdisp.h" /* for coord_t */ -#include "gevent.h" -#include "ginput/ginput_mouse.h" /* for GINPUT_TOUCH_PRESSED */ -#include "lld/ginput/mouse.h" +#include "ginput/lld/mouse.h" #if defined(GINPUT_MOUSE_USE_CUSTOM_BOARD) && GINPUT_MOUSE_USE_CUSTOM_BOARD #include "ginput_lld_mouse_board.h" From d503f3a4ac81198d3e9fb41179a20382d76cfcb8 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Sat, 8 Dec 2012 13:44:11 +1000 Subject: [PATCH 6/9] Header fix for Toggle driver --- include/ginput/toggle.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/ginput/toggle.h b/include/ginput/toggle.h index 2dce9726..f0bbf203 100644 --- a/include/ginput/toggle.h +++ b/include/ginput/toggle.h @@ -36,6 +36,10 @@ // Get the hardware definitions - Number of instances etc. #include "ginput_lld_toggle_config.h" +#ifndef GINPUT_TOGGLE_POLL_PERIOD + #define GINPUT_TOGGLE_POLL_PERIOD 200 +#endif + /*===========================================================================*/ /* Type definitions */ /*===========================================================================*/ From 311c0e71684462269afb15264b7134a0f16064bc Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 13 Dec 2012 22:33:05 +1000 Subject: [PATCH 7/9] Add grids to graph demo and update graph arrows Add grid lines to graph demo. Update graph arrows to allow seperate control of positive and negative axis arrowheads. --- demos/modules/graph/main.c | 12 ++++++------ include/gwin/graph.h | 11 +++++++++-- src/gwin/graph.c | 8 ++++++-- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/demos/modules/graph/main.c b/demos/modules/graph/main.c index 40267522..04d0b9b8 100644 --- a/demos/modules/graph/main.c +++ b/demos/modules/graph/main.c @@ -18,9 +18,9 @@ GGraphStyle GraphStyle1 = { { GGRAPH_LINE_NONE, 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 + { GGRAPH_LINE_DASH, 5, Gray, 50 }, // x grid + { GGRAPH_LINE_DOT, 7, Yellow, 50 }, // y grid + GWIN_GRAPH_STYLE_POSITIVE_AXIS_ARROWS // flags }; GGraphStyle GraphStyle2 = { @@ -28,9 +28,9 @@ GGraphStyle GraphStyle2 = { { GGRAPH_LINE_NONE, 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 + { GGRAPH_LINE_DASH, 5, Gray, 50 }, // x grid + { GGRAPH_LINE_DOT, 7, Yellow, 50 }, // y grid + GWIN_GRAPH_STYLE_POSITIVE_AXIS_ARROWS // flags }; int main(void) { diff --git a/include/gwin/graph.h b/include/gwin/graph.h index 752460cb..58c5fdee 100644 --- a/include/gwin/graph.h +++ b/include/gwin/graph.h @@ -80,8 +80,15 @@ typedef struct GGraphStyle_t { GGraphGridStyle xgrid; GGraphGridStyle ygrid; uint16_t flags; - #define GWIN_GRAPH_STYLE_XAXIS_ARROWS 0x0001 - #define GWIN_GRAPH_STYLE_YAXIS_ARROWS 0x0002 + #define GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS 0x0001 + #define GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS 0x0002 + #define GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS 0x0004 + #define GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS 0x0008 + #define GWIN_GRAPH_STYLE_POSITIVE_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS) + #define GWIN_GRAPH_STYLE_NEGATIVE_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS) + #define GWIN_GRAPH_STYLE_XAXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS) + #define GWIN_GRAPH_STYLE_YAXIS_ARROWS (GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS) + #define GWIN_GRAPH_STYLE_ALL_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS) } GGraphStyle; // A graph window diff --git a/src/gwin/graph.c b/src/gwin/graph.c index 581001ad..cc457d7d 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -299,11 +299,13 @@ void gwinGraphDrawAxis(GHandle gh) { // x axis lineto(gg, xmin, 0, xmax, 0, &gg->style.xaxis); - if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_ARROWS)) { + if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_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 ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS)) { 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); @@ -312,11 +314,13 @@ void gwinGraphDrawAxis(GHandle gh) { // y axis lineto(gg, 0, ymin, 0, ymax, &gg->style.yaxis); - if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_ARROWS)) { + if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_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 ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS)) { 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); From 512c7fa4f69b22047baac03783116e633b2af6af Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 13 Dec 2012 22:40:27 +1000 Subject: [PATCH 8/9] Added graph result picture Added a picture to the graph demo directory to show the result of running the demo. --- demos/modules/graph/result-640x480.gif | Bin 0 -> 10823 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/modules/graph/result-640x480.gif diff --git a/demos/modules/graph/result-640x480.gif b/demos/modules/graph/result-640x480.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d5152f516e780ba52b64c9bba115ab1ff15bfe0 GIT binary patch literal 10823 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 literal 0 HcmV?d00001 From f31a1f7f4aeb09bc09d49944daaf2f38fddd94e7 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 13 Dec 2012 23:05:49 +1000 Subject: [PATCH 9/9] Updated graph demo to show more Added extra line segment graphing to the graph demo --- demos/modules/graph/main.c | 24 +++++++++++++++--------- demos/modules/graph/result-640x480.gif | Bin 10823 -> 11300 bytes 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/demos/modules/graph/main.c b/demos/modules/graph/main.c index 04d0b9b8..544d4c2b 100644 --- a/demos/modules/graph/main.c +++ b/demos/modules/graph/main.c @@ -3,12 +3,12 @@ #include "gfx.h" #include "math.h" -int data[5][2] = { - { 0, 0 }, - { 10, 10 }, - { 20, 20 }, - { 30, 30 }, - { 40, 40 } +const GGraphPoint data[5] = { + { -40, -40 }, + { 70, 40 }, + { 140, 60 }, + { 210, 60 }, + { 280, 200 } }; GGraphObject g; @@ -24,8 +24,8 @@ GGraphStyle GraphStyle1 = { }; GGraphStyle GraphStyle2 = { - { GGRAPH_POINT_DOT, 0, Green }, // point - { GGRAPH_LINE_NONE, 2, Gray }, // line + { GGRAPH_POINT_SQUARE, 5, Red }, // point + { GGRAPH_LINE_DOT, 2, Pink }, // line { GGRAPH_LINE_SOLID, 0, White }, // x axis { GGRAPH_LINE_SOLID, 0, White }, // y axis { GGRAPH_LINE_DASH, 5, Gray, 50 }, // x grid @@ -53,11 +53,17 @@ int main(void) { gwinGraphDrawPoint(gh, i-gwinGetWidth(gh)/2, 80*sin(2*0.2*M_PI*i/180)); gwinGraphStartSet(gh); - gwinGraphSetStyle(gh, &GraphStyle2); + GraphStyle1.point.color = Green; + gwinGraphSetStyle(gh, &GraphStyle1); for(i = 0; i < gwinGetWidth(gh)*5; i++) gwinGraphDrawPoint(gh, i/5-gwinGetWidth(gh)/2, 95*sin(2*0.2*M_PI*i/180)); + gwinGraphStartSet(gh); + gwinGraphSetStyle(gh, &GraphStyle2); + + gwinGraphDrawPoints(gh, data, sizeof(data)/sizeof(data[0])); + while(TRUE) { chThdSleepMilliseconds(100); } diff --git a/demos/modules/graph/result-640x480.gif b/demos/modules/graph/result-640x480.gif index 5d5152f516e780ba52b64c9bba115ab1ff15bfe0..d96c7c5aee8c7281759bc7bc43456729ceaee1c9 100644 GIT binary patch delta 9976 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 C|K^+k delta 9495 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