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.
ugfx_release_2.6
Andrew Hannam 2012-12-06 18:45:54 +10:00
parent e236a0a6b7
commit 07f3483535
94 changed files with 3418 additions and 2087 deletions

View File

@ -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);
}
}

View File

@ -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 */

View File

@ -20,7 +20,7 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
void mandelbrot(float x1, float y1, float x2, float y2) { void mandelbrot(float x1, float y1, float x2, float y2) {
unsigned int i,j, width, height; unsigned int i,j, width, height;
@ -63,7 +63,6 @@ int main(void) {
chSysInit(); chSysInit();
gdispInit(); gdispInit();
gdispSetOrientation(GDISP_ROTATE_270);
/* where to zoom in */ /* where to zoom in */
cx = -0.086f; cx = -0.086f;

View File

@ -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 */

View File

@ -20,8 +20,7 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#include "touchscreen.h"
#define COLOR_SIZE 20 #define COLOR_SIZE 20
#define PEN_SIZE 20 #define PEN_SIZE 20
@ -36,25 +35,9 @@
#define DRAW_AREA(x, y) (x >= PEN_SIZE + OFFSET + 3 && x <= gdispGetWidth() && \ #define DRAW_AREA(x, y) (x >= PEN_SIZE + OFFSET + 3 && x <= gdispGetWidth() && \
y >= COLOR_SIZE + OFFSET + 3 && y <= gdispGetHeight()) 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) { void drawScreen(void) {
char *msg = "ChibiOS/GFX"; char *msg = "ChibiOS/GFX";
gdispSetOrientation(GDISP_ROTATE_90);
gdispClear(White); gdispClear(White);
gdispDrawString(gdispGetWidth()-gdispGetStringWidth(msg, &fontUI2Double)-3, 3, msg, &fontUI2Double, Black); 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); gdispDrawString(OFFSET * 2, DRAW_PEN(5), "5", &fontLargeNumbers, Black);
} }
GEventMouse ev;
int main(void) { int main(void) {
volatile uint16_t x, y;
color_t color = Black; color_t color = Black;
uint16_t pen = 0; uint16_t pen = 0;
@ -83,16 +67,17 @@ int main(void) {
chSysInit(); chSysInit();
gdispInit(); gdispInit();
tsInit(&TOUCHPADD1); ginputGetMouse(0);
drawScreen(); drawScreen();
while (TRUE) { while (TRUE) {
x = tsReadX(); ginputGetMouseStatus(0, &ev);
y = tsReadY(); if (!(ev->current_buttons & GINPUT_MOUSE_BTN_LEFT))
continue;
/* inside color box ? */ /* inside color box ? */
if(y >= OFFSET && y <= COLOR_SIZE) { if(ev->y >= OFFSET && ev->y <= COLOR_SIZE) {
if(GET_COLOR(0)) color = Black; if(GET_COLOR(0)) color = Black;
else if(GET_COLOR(1)) color = Red; else if(GET_COLOR(1)) color = Red;
else if(GET_COLOR(2)) color = Yellow; else if(GET_COLOR(2)) color = Yellow;
@ -101,7 +86,7 @@ int main(void) {
else if(GET_COLOR(5)) color = White; else if(GET_COLOR(5)) color = White;
/* inside pen box ? */ /* 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; if(GET_PEN(1)) pen = 0;
else if(GET_PEN(2)) pen = 1; else if(GET_PEN(2)) pen = 1;
else if(GET_PEN(3)) pen = 2; else if(GET_PEN(3)) pen = 2;
@ -109,11 +94,11 @@ int main(void) {
else if(GET_PEN(5)) pen = 4; else if(GET_PEN(5)) pen = 4;
/* inside drawing area ? */ /* inside drawing area ? */
} else if(DRAW_AREA(x, y)) { } else if(DRAW_AREA(ev->x, ev->y)) {
if(pen == 0) if(pen == 0)
gdispDrawPixel(x, y, color); gdispDrawPixel(ev->x, ev->y, color);
else else
gdispFillCircle(x, y, pen, color); gdispFillCircle(ev->x, ev->y, pen, color);
} }
} }
} }

View File

@ -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 */

View File

@ -1,95 +1,90 @@
/* /*
ChibiOS/GFX - Copyright (C) 2012 ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org> Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX. This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful, ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* Make sure you have the following stuff enabled in your halconf.h: * The following stuff is optional in your gfxconf.h:
* *
* #define GFX_USE_GDISP TRUE * #define GDISP_NEED_SCROLL TRUE (optional but recommended if your GDISP driver supports it)
* #define GFX_USE_GWIN TRUE */
* #define GDISP_NEED_SCROLL TRUE (optional but recommended)
* #define GDISP_NEED_CLIP TRUE (optional but recommended) #include "ch.h"
* #define GWIN_NEED_CONSOLE TRUE #include "hal.h"
*/ #include "chprintf.h"
#include "gfx.h"
#include "ch.h"
#include "hal.h" /* The handles for our three consoles */
#include "chprintf.h" GHandle GW1, GW2, GW3;
#include "gdisp.h"
#include "gwin.h" /* The streams for our three consoles */
BaseSequentialStream *S1, *S2, *S3;
/* The handles for our three consoles */
GHandle GW1, GW2, GW3; int main(void) {
uint8_t i;
/* The streams for our three consoles */
BaseSequentialStream *S1, *S2, *S3; halInit();
chSysInit();
int main(void) {
uint8_t i; /* initialize and clear the display */
gdispInit();
halInit(); gdispClear(Black);
chSysInit();
/* create the three console windows and set a font for each */
/* initialize and clear the display */ GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, &fontUI2Double);
gdispInit(); GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), &fontSmall);
gdispClear(Black); GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), &fontSmall);
/* create the three console windows and set a font for each */ /* Set the fore- and background colors for each console */
GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, &fontUI2Double); gwinSetColor(GW1, Green);
GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), &fontSmall); gwinSetBgColor(GW1, Black);
GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), &fontSmall); gwinSetColor(GW2, White);
gwinSetBgColor(GW2, Blue);
/* Set the fore- and background colors for each console */ gwinSetColor(GW3, Black);
gwinSetColor(GW1, Green); gwinSetBgColor(GW3, Red);
gwinSetBgColor(GW1, Black);
gwinSetColor(GW2, White); /* clear all console windows - to set background */
gwinSetBgColor(GW2, Blue); gwinClear(GW1);
gwinSetColor(GW3, Black); gwinClear(GW2);
gwinSetBgColor(GW3, Red); gwinClear(GW3);
/* clear all console windows - to set background */ /* receive the stream pointers of each console */
gwinClear(GW1); S1 = gwinGetConsoleStream(GW1);
gwinClear(GW2); S2 = gwinGetConsoleStream(GW2);
gwinClear(GW3); S3 = gwinGetConsoleStream(GW3);
/* receive the stream pointers of each console */ /* Output some data on the first console */
S1 = gwinGetConsoleStream(GW1); for(i = 0; i < 10; i++) {
S2 = gwinGetConsoleStream(GW2); chprintf(S1, "Hello ChibiOS/GFX!\r\n");
S3 = gwinGetConsoleStream(GW3); }
/* Output some data on the first console */ /* Output some data on the second console */
for(i = 0; i < 10; i++) { for(i = 0; i < 16; i++) {
chprintf(S1, "Hello ChibiOS/GFX!\r\n"); chprintf(S2, "Message Nr.: %d\r\n", i+1);
} }
/* Output some data on the second console */ /* Output some data on the third console */
for(i = 0; i < 16; i++) { for(i = 0; i < 18; i++) {
chprintf(S2, "Message Nr.: %d\r\n", i+1); chprintf(S3, "Message Nr.: %d\r\n", i+1);
} }
/* Output some data on the third console */ while(TRUE) {
for(i = 0; i < 18; i++) { chThdSleepMilliseconds(500);
chprintf(S3, "Message Nr.: %d\r\n", i+1); }
} }
while(TRUE) {
chThdSleepMilliseconds(500);
}
}

View File

@ -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 */

View File

@ -18,30 +18,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/*
* Make sure you have the following enabled in your halconf.h:
*
* #define GFX_USE_GDISP TRUE
* #define GFX_USE_GINPUT TRUE
* #define GFX_USE_GEVENT TRUE
* #define GFX_USE_GTIMER TRUE
* #define GFX_USE_GWIN TRUE
*
* #define GWIN_NEED_CONSOLE TRUE
* #define GWIN_NEED_BUTTON TRUE
*
* #define GINPUT_NEED_MOUSE TRUE
* #define GINPUT_NEED_TOUCH TRUE
*
* #define GDISP_NEED_CLIP TRUE
*/
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "chprintf.h" #include "chprintf.h"
#include "gdisp.h" #include "gfx.h"
#include "ginput.h"
#include "gwin.h"
static GConsoleObject gc; static GConsoleObject gc;
static GButtonObject gNext; static GButtonObject gNext;

View File

@ -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 */

View File

@ -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);
}
}

View File

@ -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 */

View File

@ -1,65 +1,59 @@
/* /*
ChibiOS/GFX - Copyright (C) 2012 ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org> Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX. This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful, ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** #include "ch.h"
* Make sure you have enabled the GTimer module in your halconf.h: #include "hal.h"
* #include "gfx.h"
* #define GFX_USE_GTIMER TRUE
*/ GTimer GT1, GT2;
#include "ch.h" void callback1(void* arg) {
#include "hal.h" (void)arg;
#include "gtimer.h"
palTogglePad(GPIOD, GPIOD_LED3);
GTimer GT1, GT2; }
void callback1(void* arg) { void callback2(void* arg) {
(void)arg; (void)arg;
palTogglePad(GPIOD, GPIOD_LED3); palSetPad(GPIOD, GPIOD_LED4);
} }
void callback2(void* arg) { int main(void) {
(void)arg; halInit();
chSysInit();
palSetPad(GPIOD, GPIOD_LED4);
} /* initialize the timers */
gtimerInit(&GT1);
int main(void) { gtimerInit(&GT2);
halInit();
chSysInit(); /* continious mode - callback1() called without any argument every 250ms */
gtimerStart(&GT1, callback1, NULL, TRUE, 250);
/* initialize the timers */
gtimerInit(&GT1); /* single shot mode - callback2() called without any argument once after 1s */
gtimerInit(&GT2); gtimerStart(&GT2, callback2, NULL, FALSE, 1000);
/* continious mode - callback1() called without any argument every 250ms */ while(TRUE) {
gtimerStart(&GT1, callback1, NULL, TRUE, 250); chThdSleepMilliseconds(500);
}
/* single shot mode - callback2() called without any argument once after 1s */
gtimerStart(&GT2, callback2, NULL, FALSE, 1000); return 0;
}
while(TRUE) {
chThdSleepMilliseconds(500);
}
return 0;
}

View File

@ -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 */

View File

@ -1,72 +1,62 @@
/* /*
ChibiOS/GFX - Copyright (C) 2012 ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org> Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX. This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful, ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** #include "ch.h"
* Make sure you have the following stuff enabled in your halconf.h: #include "hal.h"
* #include "gfx.h"
* #define GFX_USE_GDISP TRUE
* #define GDISP_NEED_SCROLL TRUE /* The handles for our two Windows */
* #define GDISP_NEED_CLIP TRUE (optional but recommended) GHandle GW1, GW2;
*/
int main(void) {
halInit();
#include "ch.h" chSysInit();
#include "hal.h"
#include "gdisp.h" /* Initialize and clear the display */
#include "gwin.h" gdispInit();
gdispClear(Lime);
/* The handles for our two Windows */
GHandle GW1, GW2; /* Create two windows */
GW1 = gwinCreateWindow(NULL, 20, 10, 200, 150);
int main(void) { GW2 = gwinCreateWindow(NULL, 50, 190, 150, 100);
halInit();
chSysInit(); /* Set fore- and background colors for both windows */
gwinSetColor(GW1, Black);
/* Initialize and clear the display */ gwinSetBgColor(GW1, White);
gdispInit(); gwinSetColor(GW2, White);
gdispClear(Lime); gwinSetBgColor(GW2, Blue);
/* Create two windows */ /* Clear both windows - to set background color */
GW1 = gwinCreateWindow(NULL, 20, 10, 200, 150); gwinClear(GW1);
GW2 = gwinCreateWindow(NULL, 50, 190, 150, 100); gwinClear(GW2);
/* Set fore- and background colors for both windows */ /*
gwinSetColor(GW1, Black); * Draw two filled circles at the same coordinate
gwinSetBgColor(GW1, White); * of each window to demonstrate the relative coordinates
gwinSetColor(GW2, White); * of windows
gwinSetBgColor(GW2, Blue); */
gwinFillCircle(GW1, 20, 20, 15);
/* Clear both windows - to set background color */ gwinFillCircle(GW2, 20, 20, 15);
gwinClear(GW1);
gwinClear(GW2); while(TRUE) {
chThdSleepMilliseconds(500);
/* }
* 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);
}
}

View File

@ -28,12 +28,12 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* 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 #if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD
/* Include the user supplied board definitions */ /* Include the user supplied board definitions */
@ -50,9 +50,11 @@
/* This controller is only ever used with a 240 x 320 display */ /* This controller is only ever used with a 240 x 320 display */
#if defined(GDISP_SCREEN_HEIGHT) #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 #undef GDISP_SCREEN_HEIGHT
#endif #endif
#if defined(GDISP_SCREEN_WIDTH) #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 #undef GDISP_SCREEN_WIDTH
#endif #endif

View File

@ -1,5 +0,0 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610

View File

@ -19,8 +19,8 @@
*/ */
/** /**
* @file drivers/gdisp/Nokia6610/gdisp_lld.c * @file drivers/gdisp/Nokia6610GE12/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 display. * @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE12 display.
* *
* @addtogroup GDISP * @addtogroup GDISP
* @{ * @{
@ -28,31 +28,27 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c" #include "gdisp/lld/emulation.c"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/
/* Controller definitions */ /* Controller definitions */
#if defined(GDISP_USE_GE8) #include "GE12.h"
#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
/* This controller is only ever used with a 132 x 132 display */ /* This controller is only ever used with a 132 x 132 display */
#if defined(GDISP_SCREEN_HEIGHT) #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 #undef GDISP_SCREEN_HEIGHT
#endif #endif
#if defined(GDISP_SCREEN_WIDTH) #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 #undef GDISP_SCREEN_WIDTH
#endif #endif
#define GDISP_SCREEN_HEIGHT 132 #define GDISP_SCREEN_HEIGHT 132
@ -130,87 +126,66 @@ bool_t GDISP_LLD(init)(void) {
// Get the bus for the following initialisation commands // Get the bus for the following initialisation commands
acquire_bus(); acquire_bus();
#if defined(GDISP_USE_GE8) // UNTESTED
write_cmd3(DISCTL, 0x00, 0x20, 0x00); // Display control #if 1
// P1: 0x00 = 2 divisions, switching period=8 (default) write_cmd(SLEEPOUT); // Sleep out
// P2: 0x20 = nlines/4 - 1 = 132/4 - 1 = 32) write_cmd(INVON); // Inversion on: seems to be required for this controller
// P3: 0x00 = no inversely highlighted lines write_cmd1(COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel
write_cmd1(COMSCN, 0x01); // COM scan P1: 0x01 = Scan 1->80, 160<-81 write_cmd1(MADCTL, 0xC8); // Memory access controler - 0xC0 = mirror x and y, reverse rgb
write_cmd(OSCON); // Internal oscilator ON write_cmd1(SETCON, GDISP_INITIAL_CONTRAST); // Write contrast
write_cmd(SLPOUT); // Sleep out delayms(20);
write_cmd1(PWRCTR, 0x0F); // Power control - reference voltage regulator on, circuit voltage follower on, BOOST ON write_cmd(DISPON); // Display On
write_cmd3(DATCTL, 0x48, 0x00, 0x02); // Data control #else
// P1: 0x01 = page address inverted, column address normal, address scan in column direction // Alternative
// P2: 0x00 = RGB sequence (default value) write_cmd(SOFTRST); // Software Reset
// P3: 0x02 = Grayscale -> 16 (selects 12-bit color, type A) delayms(20);
write_cmd2(VOLCTR, GDISP_INITIAL_CONTRAST, 0x03); // Voltage control (contrast setting) write_cmd(INITESC); // Initial escape
// P1 = Contrast delayms(20);
// P2 = 3 resistance ratio (only value that works) write_cmd1(REFSET, 0x00); // Refresh set
delayms(100); // allow power supply to stabilize write_cmd(DISPCTRL); // Set Display control - really 7 bytes of data
write_cmd(DISON); // Turn on the display write_data(128); // Set the lenght of one selection term
write_data(128); // Set N inversion -> no N inversion
#elif defined(GDISP_USE_GE12) write_data(134); // Set frame frequence and bias rate -> 2 devision of frequency and 1/8 bias, 1/67 duty, 96x67 size
// UNTESTED write_data(84); // Set duty parameter
#if 1 write_data(69); // Set duty parameter
write_cmd(SLEEPOUT); // Sleep out write_data(82); // Set duty parameter
write_cmd(INVON); // Inversion on: seems to be required for this controller write_data(67); // Set duty parameter
write_cmd1(COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel write_cmd(GRAYSCALE0); // Grey scale 0 position set - really 15 bytes of data
write_cmd1(MADCTL, 0xC8); // Memory access controler - 0xC0 = mirror x and y, reverse rgb write_data(1); // GCP1 - gray lavel to be output when the RAM data is "0001"
write_cmd1(SETCON, GDISP_INITIAL_CONTRAST); // Write contrast write_data(2); // GCP2 - gray lavel to be output when the RAM data is "0010"
delayms(20); write_data(4); // GCP3 - gray lavel to be output when the RAM data is "0011"
write_cmd(DISPON); // Display On write_data(8); // GCP4 - gray lavel to be output when the RAM data is "0100"
#else write_data(16); // GCP5 - gray lavel to be output when the RAM data is "0101"
// Alternative write_data(30); // GCP6 - gray lavel to be output when the RAM data is "0110"
write_cmd(SOFTRST); // Software Reset write_data(40); // GCP7 - gray lavel to be output when the RAM data is "0111"
delayms(20); write_data(50); // GCP8 - gray lavel to be output when the RAM data is "1000"
write_cmd(INITESC); // Initial escape write_data(60); // GCP9 - gray lavel to be output when the RAM data is "1001"
delayms(20); write_data(70); // GCP10 - gray lavel to be output when the RAM data is "1010"
write_cmd1(REFSET, 0x00); // Refresh set write_data(80); // GCP11 - gray lavel to be output when the RAM data is "1011"
write_cmd(DISPCTRL); // Set Display control - really 7 bytes of data write_data(90); // GCP12 - gray lavel to be output when the RAM data is "1100"
write_data(128); // Set the lenght of one selection term write_data(100); // GCP13 - gray lavel to be output when the RAM data is "1101"
write_data(128); // Set N inversion -> no N inversion write_data(110); // GCP14 - gray lavel to be output when the RAM data is "1110"
write_data(134); // Set frame frequence and bias rate -> 2 devision of frequency and 1/8 bias, 1/67 duty, 96x67 size write_data(127); // GCP15 - gray lavel to be output when the RAM data is "1111"
write_data(84); // Set duty parameter write_cmd1(GAMMA, 0x01); // Gamma curve set - select gray scale - GRAYSCALE 0 or GREYSCALE 1 - Select grey scale 0
write_data(69); // Set duty parameter write_cmd1(COMMONDRV, 0x00); // Command driver output - Set COM1-COM41 side come first, normal mod
write_data(82); // Set duty parameter write_cmd(NORMALMODE); // Set Normal mode (my)
write_data(67); // Set duty parameter // write_cmd(INVERSIONOFF); // Inversion off
write_cmd(GRAYSCALE0); // Grey scale 0 position set - really 15 bytes of data write_cmd2(COLADDRSET, 0, 131); // Column address set
write_data(1); // GCP1 - gray lavel to be output when the RAM data is "0001" write_cmd2(PAGEADDRSET, 0, 131); // Page address set
write_data(2); // GCP2 - gray lavel to be output when the RAM data is "0010" write_cmd1(ACCESSCTRL, 0x40); // Memory access controler - 0x40 horizontal
write_data(4); // GCP3 - gray lavel to be output when the RAM data is "0011" // write_data(0x20); // vertical
write_data(8); // GCP4 - gray lavel to be output when the RAM data is "0100" write_cmd1(PWRCTRL, 0x04); // Power control - Internal resistance, V1OUT -> high power mode, oscilator devision rate
write_data(16); // GCP5 - gray lavel to be output when the RAM data is "0101" write_cmd(SLEEPOUT); // Sleep out
write_data(30); // GCP6 - gray lavel to be output when the RAM data is "0110" write_cmd(VOLTCTRL); // Voltage control - voltage control and write contrast define LCD electronic volume
write_data(40); // GCP7 - gray lavel to be output when the RAM data is "0111" // write_data(0x7f); // full voltage control
write_data(50); // GCP8 - gray lavel to be output when the RAM data is "1000" // write_data(0x03); // must be "1"
write_data(60); // GCP9 - gray lavel to be output when the RAM data is "1001" write_cmd1(CONTRAST, GDISP_INITIAL_CONTRAST); // Write contrast
write_data(70); // GCP10 - gray lavel to be output when the RAM data is "1010" delayms(20);
write_data(80); // GCP11 - gray lavel to be output when the RAM data is "1011" write_cmd(TEMPGRADIENT); // Temperature gradient - really 14 bytes of data
write_data(90); // GCP12 - gray lavel to be output when the RAM data is "1100" for(i=0; i<14; i++)
write_data(100); // GCP13 - gray lavel to be output when the RAM data is "1101" write_data(0);
write_data(110); // GCP14 - gray lavel to be output when the RAM data is "1110" write_cmd(BOOSTVON); // Booster voltage ON
write_data(127); // GCP15 - gray lavel to be output when the RAM data is "1111" write_cmd(DISPLAYON); // Finally - Display On
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
#endif #endif
// Release the bus // Release the bus
@ -541,11 +516,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
case GDISP_CONTROL_CONTRAST: case GDISP_CONTROL_CONTRAST:
if ((unsigned)value > 100) value = (void *)100; if ((unsigned)value > 100) value = (void *)100;
acquire_bus(); acquire_bus();
#if defined(GDISP_USE_GE8)
write_cmd2(VOLCTR, (unsigned)value, 0x03);
#elif defined(GDISP_USE_GE12)
write_cmd1(CONTRAST,(unsigned)value); write_cmd1(CONTRAST,(unsigned)value);
#endif
release_bus(); release_bus();
GDISP.Contrast = (unsigned)value; GDISP.Contrast = (unsigned)value;
return; return;

View File

@ -0,0 +1,5 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12

View File

@ -0,0 +1,135 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file drivers/gdisp/Nokia6610GE12/gdisp_lld_board_example.h
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE12 display.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
/**
* @brief Initialise the board for the display.
* @notes Performs the following functions:
* 1. initialise the spi port used by your display
* 2. initialise the reset pin (initial state not-in-reset)
* 3. initialise the chip select pin (initial state not-active)
* 4. initialise the backlight pin (initial state back-light off)
*
* @notapi
*/
static __inline void init_board(void) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for init_board for your board"
}
/**
* @brief Set or clear the lcd reset pin.
*
* @param[in] state TRUE = lcd in reset, FALSE = normal operation
*
* @notapi
*/
static __inline void setpin_reset(bool_t state) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for setpin_reset for your board"
}
/**
* @brief Set the lcd back-light level.
* @note For now 0% turns the backlight off, anything else the backlight is on.
* While the hardware supports PWM backlight control, we are not using it
* yet.
*
* @param[in] percent 0 to 100%
*
* @notapi
*/
static __inline void set_backlight(uint8_t percent) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for set_backlight for your board"
}
/**
* @brief Take exclusive control of the bus
*
* @notapi
*/
static __inline void acquire_bus(void) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for acquire_bus for your board"
}
/**
* @brief Release exclusive control of the bus
*
* @notapi
*/
static __inline void release_bus(void) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for release_bus for your board"
}
/**
* @brief Send an 8 bit command to the lcd.
*
* @param[in] cmd The command to send
*
* @notapi
*/
static __inline void write_cmd(uint16_t cmd) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for write_cmd for your board"
}
/**
* @brief Send an 8 bit data to the lcd.
*
* @param[in] data The data to send
*
* @notapi
*/
static __inline void write_data(uint16_t data) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for write_data for your board"
}
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
/**
* @brief Read data from the lcd.
*
* @return The data from the lcd
* @note The chip select may need to be asserted/de-asserted
* around the actual spi read
*
* @notapi
*/
static __inline uint16_t read_data(void) {
/* Code here */
#error "gdispNokia6610GE12: You must supply a definition for read_data for your board"
}
#endif
#endif /* _GDISP_LLD_BOARD_H */
/** @} */

View File

@ -0,0 +1,196 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file drivers/gdisp/Nokia6610GE12/gdisp_lld_board_olimexsam7ex256.h
* @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
// ******************************************************
// Pointers to AT91SAM7X256 peripheral data structures
// ******************************************************
volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
volatile AT91PS_PIO pPIOB = AT91C_BASE_PIOB;
volatile AT91PS_SPI pSPI = AT91C_BASE_SPI0;
volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;
volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_SPI0;
/**
* @brief Initialise the board for the display.
* @notes Performs the following functions:
* 1. initialise the spi port used by your display
* 2. initialise the reset pin (initial state not-in-reset)
* 3. initialise the chip select pin (initial state not-active)
* 4. initialise the backlight pin (initial state back-light off)
*
* @notapi
*/
static __inline void init_board(void) {
// *********************************************************************************************
// InitSpi( )
//
// Sets up SPI channel 0 for communications to Nokia 6610 LCD Display
//
// I/O ports used: PA2 = LCD Reset (set to low to reset)
// PA12 = LCD chip select (set to low to select the LCD chip)
// PA16 = SPI0_MISO Master In - Slave Out (not used in LCD interface)
// PA17 = SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
// PA18 = SPI0_SPCK Serial Clock (to LCD slave)
// PB20 = backlight control (normally PWM control, 1 = full on)
//
// *********************************************************************************************}
/* This code should really use the ChibiOS driver for these functions */
// Pin for backlight
pPIOB->PIO_CODR = PIOB_LCD_BL_MASK; // Set PB20 to LOW
pPIOB->PIO_OER = PIOB_LCD_BL_MASK; // Configure PB20 as output
// Reset pin
pPIOA->PIO_SODR = PIOA_LCD_RESET_MASK; // Set PA2 to HIGH
pPIOA->PIO_OER = PIOA_LCD_RESET_MASK; // Configure PA2 as output
// CS pin - this seems to be ignored
// pPIOA->PIO_SODR = 1<<12; // Set PA2 to HIGH
// pPIOA->PIO_OER = 1<<12; // Configure PA2 as output
// Init SPI0
// Disable the following pins from PIO control (will be used instead by the SPI0 peripheral)
// BIT12 = PA12 -> SPI0_NPCS0 chip select
// BIT16 = PA16 -> SPI0_MISO Master In - Slave Out (not used in LCD interface)
// BIT17 = PA17 -> SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
// BIT18 = PA18 -> SPI0_SPCK Serial Clock (to LCD slave)
pPIOA->PIO_PDR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
pPIOA->PIO_ASR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
pPIOA->PIO_BSR = 0;
//enable the clock of SPI
pPMC->PMC_PCER = 1 << AT91C_ID_SPI0;
// Fixed mode
pSPI->SPI_CR = 0x81; //SPI Enable, Sowtware reset
pSPI->SPI_CR = 0x01; //SPI Enable
//pSPI->SPI_MR = 0xE0019; //Master mode, fixed select, disable decoder, FDIV=1 (MCK), PCS=1110
pSPI->SPI_MR = 0xE0011; //Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
//pSPI->SPI_CSR[0] = 0x01010C11; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/32*12 = 125kHz
pSPI->SPI_CSR[0] = 0x01010311; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/8 = 6MHz if using commented MR line above
}
/**
* @brief Set or clear the lcd reset pin.
*
* @param[in] state TRUE = lcd in reset, FALSE = normal operation
*
* @notapi
*/
static __inline void setpin_reset(bool_t state) {
if (state)
palClearPad(IOPORT1, PIOA_LCD_RESET);
else
palSetPad(IOPORT1, PIOA_LCD_RESET);
}
/**
* @brief Set the lcd back-light level.
* @note For now 0% turns the backlight off, anything else the backlight is on.
* While the hardware supports PWM backlight control, we are not using it
* yet.
*
* @param[in] percent 0 to 100%
*
* @notapi
*/
static __inline void set_backlight(uint8_t percent) {
if (percent)
palSetPad(IOPORT2, PIOB_LCD_BL);
else
palClearPad(IOPORT2, PIOB_LCD_BL);
}
/**
* @brief Take exclusive control of the bus
*
* @notapi
*/
static __inline void acquire_bus(void) {
/* Nothing to do for this board as the LCD is the only device on the SPI port */
}
/**
* @brief Release exclusive control of the bus
*
* @notapi
*/
static __inline void release_bus(void) {
// Nothing to do for this board as the LCD is the only device on the SPI port
}
/**
* @brief Send an 8 bit command to the lcd.
*
* @param[in] cmd The command to send
*
* @notapi
*/
static __inline void write_cmd(uint16_t cmd) {
// wait for the previous transfer to complete
while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
// send the command
pSPI->SPI_TDR = cmd & 0xFF;
}
/**
* @brief Send an 8 bit data to the lcd.
*
* @param[in] data The data to send
*
* @notapi
*/
static __inline void write_data(uint16_t data) {
// wait for the previous transfer to complete
while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
// send the data
pSPI->SPI_TDR = data | 0x0100;
}
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
/**
* @brief Read data from the lcd.
*
* @return The data from the lcd
*
* @notapi
*/
static __inline uint16_t read_data(void) {
#error "gdispNokia6610GE12: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
return 0;
}
#endif
#endif /* _GDISP_LLD_BOARD_H */
/** @} */

View File

@ -0,0 +1,58 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 GE12 display.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP
/*===========================================================================*/
/* Driver hardware support. */
/*===========================================================================*/
#define GDISP_DRIVER_NAME "Nokia6610GE12"
#define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610GE12
#define GDISP_HARDWARE_FILLS TRUE
#define GDISP_HARDWARE_BITFILLS TRUE
#define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE
#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB444
/* This driver supports both packed and unpacked pixel formats and line formats.
* By default we leave these as FALSE.
*/
#define GDISP_PACKED_PIXELS FALSE
#define GDISP_PACKED_LINES FALSE
#endif /* GFX_USE_GDISP */
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View File

@ -1,16 +1,15 @@
This driver is for the Nokia6610 Philips (GE12) controller
To use this driver: To use this driver:
1. Add in your halconf.h: 1. Add in your halconf.h:
a) #define GFX_USE_GDISP TRUE a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
c) One (only) of: c) If you are not using a known board then create a gdisp_lld_board.h file
#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
and ensure it is on your include path. and ensure it is on your include path.
Use the gdisp_lld_board_example.h file as a basis. Use the gdisp_lld_board_example.h file as a basis.
Currently known boards are: Currently known boards are:
Olimex SAM7-EX256 Olimex SAM7-EX256
2. To your makefile add the following lines: 2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.mk include $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk

View File

@ -0,0 +1,483 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file drivers/gdisp/Nokia6610GE8/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE8 display.
*
* @addtogroup GDISP
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
#include "GE8.h"
/* This controller is only ever used with a 132 x 132 display */
#if defined(GDISP_SCREEN_HEIGHT)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif
#define GDISP_SCREEN_HEIGHT 132
#define GDISP_SCREEN_WIDTH 132
#define GDISP_INITIAL_CONTRAST 38
#define GDISP_INITIAL_BACKLIGHT 100
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
#if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD
/* Include the user supplied board definitions */
#include "gdisp_lld_board.h"
#elif defined(BOARD_OLIMEX_SAM7_EX256)
#include "gdisp_lld_board_olimexsam7ex256.h"
#else
/* Include the user supplied board definitions */
#include "gdisp_lld_board.h"
#endif
// Some macros just to make reading the code easier
#define delayms(ms) chThdSleepMilliseconds(ms)
#define write_data2(d1, d2) { write_data(d1); write_data(d2); }
#define write_data3(d1, d2, d3) { write_data(d1); write_data(d2); write_data(d3); }
#define write_cmd1(cmd, d1) { write_cmd(cmd); write_data(d1); }
#define write_cmd2(cmd, d1, d2) { write_cmd(cmd); write_data2(d1, d2); }
#define write_cmd3(cmd, d1, d2, d3) { write_cmd(cmd); write_data3(d1, d2, d3); }
// A very common thing to do.
// An inline function has been used here incase the parameters have side effects with the internal calculations.
static __inline void setviewport(coord_t x, coord_t y, coord_t cx, coord_t cy) {
write_cmd2(CASET, x, x+cx-1); // Column address set
write_cmd2(PASET, y, y+cy-1); // Page address set
}
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/* ---- Required Routines ---- */
/*
The following 2 routines are required.
All other routines are optional.
*/
/**
* @brief Low level GDISP driver initialization.
*
* @notapi
*/
bool_t GDISP_LLD(init)(void) {
/* Initialise your display */
init_board();
// Hardware reset
setpin_reset(TRUE);
delayms(20);
setpin_reset(FALSE);
delayms(20);
// Get the bus for the following initialisation commands
acquire_bus();
write_cmd3(DISCTL, 0x00, 0x20, 0x00); // Display control
// P1: 0x00 = 2 divisions, switching period=8 (default)
// P2: 0x20 = nlines/4 - 1 = 132/4 - 1 = 32)
// P3: 0x00 = no inversely highlighted lines
write_cmd1(COMSCN, 0x01); // COM scan P1: 0x01 = Scan 1->80, 160<-81
write_cmd(OSCON); // Internal oscilator ON
write_cmd(SLPOUT); // Sleep out
write_cmd1(PWRCTR, 0x0F); // Power control - reference voltage regulator on, circuit voltage follower on, BOOST ON
write_cmd3(DATCTL, 0x48, 0x00, 0x02); // Data control
// P1: 0x01 = page address inverted, column address normal, address scan in column direction
// P2: 0x00 = RGB sequence (default value)
// P3: 0x02 = Grayscale -> 16 (selects 12-bit color, type A)
write_cmd2(VOLCTR, GDISP_INITIAL_CONTRAST, 0x03); // Voltage control (contrast setting)
// P1 = Contrast
// P2 = 3 resistance ratio (only value that works)
delayms(100); // allow power supply to stabilize
write_cmd(DISON); // Turn on the display
// Release the bus
release_bus();
/* Turn on the back-light */
set_backlight(GDISP_INITIAL_BACKLIGHT);
/* Initialise the GDISP structure to match */
GDISP.Width = GDISP_SCREEN_WIDTH;
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Orientation = GDISP_ROTATE_0;
GDISP.Powermode = powerOn;
GDISP.Backlight = GDISP_INITIAL_BACKLIGHT;
GDISP.Contrast = GDISP_INITIAL_CONTRAST;
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
GDISP.clipx0 = 0;
GDISP.clipy0 = 0;
GDISP.clipx1 = GDISP.Width;
GDISP.clipy1 = GDISP.Height;
#endif
return TRUE;
}
/**
* @brief Draws a pixel on the display.
*
* @param[in] x X location of the pixel
* @param[in] y Y location of the pixel
* @param[in] color The color of the pixel
*
* @notapi
*/
void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0 || y < GDISP.clipy0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
#endif
acquire_bus();
setviewport(x, y, 1, 1);
write_cmd3(RAMWR, 0, (color>>8) & 0x0F, color & 0xFF);
release_bus();
}
/* ---- Optional Routines ---- */
#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
/**
* @brief Fill an area with a color.
*
* @param[in] x, y The start filled area
* @param[in] cx, cy The width and height to be filled
* @param[in] color The color of the fill
*
* @notapi
*/
void GDISP_LLD(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
unsigned i, tuples;
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; }
if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; }
if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
tuples = (cx*cy+1)/2; // With an odd sized area we over-print by one pixel.
// This extra pixel is ignored by the controller.
acquire_bus();
setviewport(x, y, cx, cy);
write_cmd(RAMWR);
for(i=0; i < tuples; i++)
write_data3(((color >> 4) & 0xFF), (((color << 4) & 0xF0)|((color >> 8) & 0x0F)), (color & 0xFF));
release_bus();
}
#endif
#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
/**
* @brief Fill an area with a bitmap.
*
* @param[in] x, y The start filled area
* @param[in] cx, cy The width and height to be filled
* @param[in] srcx, srcy The bitmap position to start the fill from
* @param[in] srccx The width of a line in the bitmap.
* @param[in] buffer The pixels to use to fill the area.
*
* @notapi
*/
void GDISP_LLD(blitareaex)(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer) {
coord_t endx, endy, lg;
color_t c1, c2;
#if GDISP_PACKED_PIXELS
coord_t pos;
const uint8_t *p;
#endif
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; srcx += GDISP.clipx0 - x; x = GDISP.clipx0; }
if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; srcy += GDISP.clipy0 - y; y = GDISP.clipy0; }
if (srcx+cx > srccx) cx = srccx - srcx;
if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
/* What are our end points */
endx = srcx + cx;
endy = y + cy;
acquire_bus();
setviewport(x, y, cx, cy);
write_cmd(RAMWR);
#if !GDISP_PACKED_PIXELS
// Although this controller uses packed pixels we support unpacked pixel
// formats in this blit by packing the data as we feed it to the controller.
lg = srccx - cx;
buffer += srcy * srccx + srcx;
x = srcx;
while (1) {
/* Get a pixel */
c1 = *buffer++;
if (++x >= endx) {
if (++y >= endy) {
/* Odd pixel at end */
write_data3(0, ((c1 >> 8) & 0x0F), (c1 & 0xFF));
break;
}
x = srcx;
buffer += lg;
}
/* Get the next pixel */
c2 = *buffer++;
write_data3(((c1 >> 4) & 0xFF), (((c1 << 4) & 0xF0)|((c2 >> 8) & 0x0F)), (c2 & 0xFF));
if (++x >= endx) {
if (++y >= endy)
break;
x = srcx;
buffer += lg;
}
}
#else
// Although this controller uses packed pixels, we may have to feed it into
// the controller with different packing to the source bitmap
#if !GDISP_PACKED_LINES
srccx = (srccx + 1) & ~1;
#endif
pos = srcy*srccx;
lg = (srccx - cx)/2*3;
p = ((const uint8_t *)buffer) + ((pos+srcx)/2 * 3);
x = srcx;
while (1) {
/* Get a pixel */
switch((pos+x)&1) {
case 0: c1 = (((color_t)p[0]) << 4)|(((color_t)p[1])>>4); break;
case 1: c1 = (((color_t)p[1]&0x0F) << 8)|((color_t)p[1]); break;
}
if (++x >= endx) {
if (++y >= endy) {
/* Odd pixel at end */
write_data3(0, ((c1 >> 8) & 0x0F), (c1 & 0xFF));
break;
}
x = srcx;
p += lg;
pos += srccx;
}
/* Get the next pixel */
switch((pos+x)&1) {
case 0: c2 = (((color_t)p[0]) << 4)|(((color_t)p[1])>>4); break;
case 1: c2 = (((color_t)p[1]&0x0F) << 8)|((color_t)p[1]); break;
}
write_data3(((c1 >> 4) & 0xFF), (((c1 << 4) & 0xF0)|((c2 >> 8) & 0x0F)), (c2 & 0xFF));
if (++x >= endx) {
if (++y >= endy)
break;
x = srcx;
p += lg;
pos += srccx;
}
}
#endif
release_bus();
}
#endif
#if (GDISP_NEED_PIXELREAD && GDISP_HARDWARE_PIXELREAD)
/**
* @brief Get the color of a particular pixel.
* @note If x,y is off the screen, the result is undefined.
*
* @param[in] x, y The start of the text
*
* @notapi
*/
color_t GDISP_LLD(getpixelcolor)(coord_t x, coord_t y) {
/* NOT IMPLEMENTED */
/* Some board hardware might support this in the future.
* The Olimex board doesn't.
*/
}
#endif
#if (GDISP_NEED_SCROLL && GDISP_HARDWARE_SCROLL)
/**
* @brief Scroll vertically a section of the screen.
* @note If x,y + cx,cy is off the screen, the result is undefined.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
*
* @param[in] x, y The start of the area to be scrolled
* @param[in] cx, cy The size of the area to be scrolled
* @param[in] lines The number of lines to scroll (Can be positive or negative)
* @param[in] bgcolor The color to fill the newly exposed area.
*
* @notapi
*/
void GDISP_LLD(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
/* NOT IMPLEMENTED */
/* The hardware seems capable of doing this.
* It is just really complex so we leave it out for now.
*/
}
#endif
#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t
* GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t
* GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver
* that only supports off/on anything other
* than zero is on.
* GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100.
* GDISP_CONTROL_LLD - Low level driver control constants start at
* this value.
*
* @param[in] what What to do.
* @param[in] value The value to use (always cast to a void *).
*
* @notapi
*/
void GDISP_LLD(control)(unsigned what, void *value) {
/* The hardware is capable of supporting...
* GDISP_CONTROL_POWER - not implemented yet
* GDISP_CONTROL_ORIENTATION - not implemented yet
* GDISP_CONTROL_BACKLIGHT - supported (the OlimexSAM7EX256 board.h currently only implements off/on although PWM is supported by the hardware)
* GDISP_CONTROL_CONTRAST - supported
*/
switch(what) {
#if 0
// NOT IMPLEMENTED YET
case GDISP_CONTROL_POWER:
if (GDISP.Powermode == (gdisp_powermode_t)value)
return;
switch((gdisp_powermode_t)value) {
case powerOff:
// Code here
break;
case powerOn:
// Code here
/* You may need this ---
* if (GDISP.Powermode != powerSleep)
* GDISP_LLD(init)();
*/
break;
case powerSleep:
/* Code here */
break;
default:
return;
}
GDISP.Powermode = (gdisp_powermode_t)value;
return;
#endif
#if 0
// NOT IMPLEMENTED YET
case GDISP_CONTROL_ORIENTATION:
if (GDISP.Orientation == (gdisp_orientation_t)value)
return;
// WriteSpiData(0x48); // no mirror Y (temporary to satisfy Olimex bmptoarray utility)
// WriteSpiData(0xC8); // restore to (mirror x and y, reverse rgb)
switch((gdisp_orientation_t)value) {
case GDISP_ROTATE_0:
// Code here
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_90:
// Code here
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
case GDISP_ROTATE_180:
// Code here
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_270:
// Code here
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
default:
return;
}
#if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION
GDISP.clipx0 = 0;
GDISP.clipy0 = 0;
GDISP.clipx1 = GDISP.Width;
GDISP.clipy1 = GDISP.Height;
#endif
GDISP.Orientation = (gdisp_orientation_t)value;
return;
#endif
case GDISP_CONTROL_BACKLIGHT:
if ((unsigned)value > 100) value = (void *)100;
set_backlight((unsigned)value);
GDISP.Backlight = (unsigned)value;
return;
case GDISP_CONTROL_CONTRAST:
if ((unsigned)value > 100) value = (void *)100;
acquire_bus();
write_cmd2(VOLCTR, (unsigned)value, 0x03);
release_bus();
GDISP.Contrast = (unsigned)value;
return;
}
}
#endif
#endif /* GFX_USE_GDISP */
/** @} */

View File

@ -0,0 +1,5 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE8/gdisp_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE8

View File

@ -19,8 +19,8 @@
*/ */
/** /**
* @file drivers/gdisp/Nokia6610/gdisp_lld_board_example.h * @file drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 display. * @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE8 display.
* *
* @addtogroup GDISP * @addtogroup GDISP
* @{ * @{
@ -41,7 +41,7 @@
*/ */
static __inline void init_board(void) { static __inline void init_board(void) {
/* Code here */ /* 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) { static __inline void setpin_reset(bool_t state) {
/* Code here */ /* 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) { static __inline void set_backlight(uint8_t percent) {
/* Code here */ /* 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 * @notapi
*/ */
static __inline void acquire_bus(void) { 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 * @notapi
*/ */
static __inline void release_bus(void) { 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) { static __inline void write_cmd(uint16_t cmd) {
/* Code here */ /* 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) { static __inline void write_data(uint16_t data) {
/* Code here */ /* 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__) #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) { static __inline uint16_t read_data(void) {
/* Code here */ /* 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 #endif

View File

@ -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. * @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
* *
* @addtogroup GDISP * @addtogroup GDISP
@ -187,7 +187,7 @@ static __inline void write_data(uint16_t data) {
* @notapi * @notapi
*/ */
static __inline uint16_t read_data(void) { 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; return 0;
} }
#endif #endif

View File

@ -19,8 +19,8 @@
*/ */
/** /**
* @file drivers/gdisp/Nokia6610/gdisp_lld_config.h * @file drivers/gdisp/Nokia6610GE8/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 display. * @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 GE8 display.
* *
* @addtogroup GDISP * @addtogroup GDISP
* @{ * @{
@ -35,8 +35,8 @@
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_DRIVER_NAME "Nokia6610" #define GDISP_DRIVER_NAME "Nokia6610GE8"
#define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610 #define GDISP_LLD(x) gdisp_lld_##x##_Nokia6610GE8
#define GDISP_HARDWARE_FILLS TRUE #define GDISP_HARDWARE_FILLS TRUE
#define GDISP_HARDWARE_BITFILLS TRUE #define GDISP_HARDWARE_BITFILLS TRUE

View File

@ -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

View File

@ -28,21 +28,23 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c" #include "gdisp/lld/emulation.c"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/
#if defined(GDISP_SCREEN_HEIGHT) #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 #undef GISP_SCREEN_HEIGHT
#endif #endif
#if defined(GDISP_SCREEN_WIDTH) #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 #undef GDISP_SCREEN_WIDTH
#endif #endif

View File

@ -28,12 +28,12 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c" #include "gdisp/lld/emulation.c"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */

View File

@ -28,12 +28,19 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* 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 /* 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. * can be ported to another board just by creating a suitable file.

View File

@ -28,12 +28,19 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */ /* 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 ---- */ /* ---- Required Routines ---- */
/* /*
@ -48,8 +55,8 @@
*/ */
bool_t GDISP_LLD(init)(void) { bool_t GDISP_LLD(init)(void) {
/* Initialise the GDISP structure */ /* Initialise the GDISP structure */
GDISP.Width = 128; GDISP.Width = GDISP_SCREEN_WIDTH;
GDISP.Height = 128; GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Orientation = GDISP_ROTATE_0; GDISP.Orientation = GDISP_ROTATE_0;
GDISP.Powermode = powerOff; GDISP.Powermode = powerOff;
GDISP.Backlight = 100; GDISP.Backlight = 100;

View File

@ -28,14 +28,14 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define GDISP_LLD_NO_STRUCT #define GDISP_LLD_NO_STRUCT
/* Include the emulation code for things we don't support */ /* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c" #include "gdisp/lld/emulation.c"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
@ -46,6 +46,7 @@
/* Prototypes for lld driver functions */ /* Prototypes for lld driver functions */
bool_t GDISP_LLD1(init)(void); bool_t GDISP_LLD1(init)(void);
void *GDISP_LLD1(query)(unsigned what);
void GDISP_LLD1(clear)(color_t color); void GDISP_LLD1(clear)(color_t color);
void GDISP_LLD1(drawpixel)(coord_t x, coord_t y, 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); 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 #if GDISP_NEED_CONTROL
void GDISP_LLD1(control)(unsigned what, void *value); void GDISP_LLD1(control)(unsigned what, void *value);
#endif #endif
#if GDISP_NEED_QUERY
void *GDISP_LLD1(query)(unsigned what);
#endif
bool_t GDISP_LLD2(init)(void); bool_t GDISP_LLD2(init)(void);
void *GDISP_LLD2(query)(unsigned what);
void GDISP_LLD2(clear)(color_t color); void GDISP_LLD2(clear)(color_t color);
void GDISP_LLD2(drawpixel)(coord_t x, coord_t y, 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); 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 #if GDISP_NEED_CONTROL
void GDISP_LLD2(control)(unsigned what, void *value); void GDISP_LLD2(control)(unsigned what, void *value);
#endif #endif
#if GDISP_NEED_QUERY
void *GDISP_LLD2(query)(unsigned what);
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported variables. */ /* Driver exported variables. */
/*===========================================================================*/ /*===========================================================================*/
/* Our VMT table variables */ /* Our VMT table variables */
void *GDISP_LLD_VMT(query)(unsigned what);
void GDISP_LLD_VMT(clear)(color_t color); 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(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); 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 #if GDISP_NEED_CONTROL
void GDISP_LLD_VMT(control)(unsigned what, void *value); void GDISP_LLD_VMT(control)(unsigned what, void *value);
#endif #endif
/* Set driver specific control */
#if GDISP_NEED_QUERY
void *GDISP_LLD_VMT(query)(unsigned what);
#endif
/* Clipping Functions */ /* Clipping Functions */
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
void GDISP_LLD_VMT(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy); 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) { bool_t gdisp_lld_init_VMT(void) {
if (GDISP_VMT_NAME1(gdisp_lld_init_)()) { 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_clear_VMT = GDISP_VMT_NAME1(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME1(gdisp_lld_drawpixel_); gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME1(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME1(gdisp_lld_fillarea_); 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 #if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME1(gdisp_lld_control_); gdisp_lld_control_VMT = GDISP_VMT_NAME1(gdisp_lld_control_);
#endif #endif
#if GDISP_NEED_QUERY
gdisp_lld_query_VMT = GDISP_VMT_NAME1(gdisp_lld_query_);
#endif
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME1(gdisp_lld_setclip_); gdisp_lld_setclip_VMT = GDISP_VMT_NAME1(gdisp_lld_setclip_);
#endif #endif
@ -235,6 +226,7 @@ bool_t gdisp_lld_init_VMT(void) {
} }
if (GDISP_VMT_NAME2(gdisp_lld_init_)()) { 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_clear_VMT = GDISP_VMT_NAME2(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME2(gdisp_lld_drawpixel_); gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME2(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME2(gdisp_lld_fillarea_); 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 #if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME2(gdisp_lld_control_); gdisp_lld_control_VMT = GDISP_VMT_NAME2(gdisp_lld_control_);
#endif #endif
#if GDISP_NEED_QUERY
gdisp_lld_query_VMT = GDISP_VMT_NAME2(gdisp_lld_query_);
#endif
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME2(gdisp_lld_setclip_); gdisp_lld_setclip_VMT = GDISP_VMT_NAME2(gdisp_lld_setclip_);
#endif #endif

View File

@ -42,7 +42,7 @@
#include CONFIGFILE() #include CONFIGFILE()
/* Bring in our API */ /* Bring in our API */
#include "gdisp.h" #include "gfx.h"
/* Add the low level driver */ /* Add the low level driver */
#include DRIVERFILE() #include DRIVERFILE()

View File

@ -42,7 +42,7 @@
#include CONFIGFILE() #include CONFIGFILE()
/* Bring in our API */ /* Bring in our API */
#include "gdisp.h" #include "gfx.h"
/* Add the low level driver */ /* Add the low level driver */
#include DRIVERFILE() #include DRIVERFILE()

View File

@ -28,13 +28,13 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gfx.h"
#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) /*|| defined(__DOXYGEN__)*/ #if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) /*|| defined(__DOXYGEN__)*/
// Declare the static members in the following include file #include "ginput/lld/toggle.h"
#define GINPUT_TOGGLE_DECLARE_CONFIG
#include "lld/ginput/toggle.h" GINPUT_TOGGLE_DECLARE_STRUCTURE();
/** /**
* @brief Initialise the port. * @brief Initialise the port.

View File

@ -29,37 +29,32 @@
#ifndef _GDISP_LLD_TOGGLE_BOARD_H #ifndef _GDISP_LLD_TOGGLE_BOARD_H
#define _GDISP_LLD_TOGGLE_BOARD_H #define _GDISP_LLD_TOGGLE_BOARD_H
#ifndef _GINPUT_LLD_TOGGLE_CONFIG_H #error "GINPUT Toggle Pal Driver: You need to define your board definitions"
// Visible in ginput.h
#define GINPUT_TOGGLE_SW1 0 // Switch 1 // The below are example values
#define GINPUT_TOGGLE_SW2 1 // Switch 2
#define GINPUT_TOGGLE_UP 2 // Joystick Up
#define GINPUT_TOGGLE_DOWN 3 // Joystick Down
#define GINPUT_TOGGLE_LEFT 4 // Joystick Left
#define GINPUT_TOGGLE_RIGHT 5 // Joystick Right
#define GINPUT_TOGGLE_CENTER 6 // Joystick Center
#elif !defined(GINPUT_TOGGLE_DECLARE_CONFIG) #define GINPUT_TOGGLE_NUM_PORTS 7 // The total number of toggle inputs
// Visible in ginput_lld.h #define GINPUT_TOGGLE_CONFIG_ENTRIES 2 // The total number of GToggleConfig entries
#define GINPUT_TOGGLE_NUM_PORTS 7 // The total number of toggle inputs #define GINPUT_TOGGLE_SW1 0 // Switch 1
#define GINPUT_TOGGLE_SW2 1 // Switch 2
#else #define GINPUT_TOGGLE_UP 2 // Joystick Up
// Visible in ginput_lld_toggle.c #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[] = { #define GINPUT_TOGGLE_DECLARE_STRUCTURE() \
{AT91C_BASE_PIOB, // Switch 1 and Switch 2 const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { \
PIOB_SW1_MASK|PIOB_SW2_MASK, {AT91C_BASE_PIOB, /* Switch 1 and Switch 2 */ \
PIOB_SW1_MASK|PIOB_SW2_MASK, PIOB_SW1_MASK|PIOB_SW2_MASK, \
PAL_MODE_INPUT}, PIOB_SW1_MASK|PIOB_SW2_MASK, \
{AT91C_BASE_PIOA, // B1..4 Joystick PAL_MODE_INPUT}, \
PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, {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}, PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
}; PAL_MODE_INPUT}, \
}
#endif
#endif /* _GDISP_LLD_TOGGLE_BOARD_H */ #endif /* _GDISP_LLD_TOGGLE_BOARD_H */
/** @} */ /** @} */

View File

@ -40,21 +40,17 @@
#define GINPUT_TOGGLE_RIGHT 5 // Joystick Right #define GINPUT_TOGGLE_RIGHT 5 // Joystick Right
#define GINPUT_TOGGLE_CENTER 6 // Joystick Center #define GINPUT_TOGGLE_CENTER 6 // Joystick Center
#ifdef GINPUT_TOGGLE_DECLARE_CONFIG #define GINPUT_TOGGLE_DECLARE_STRUCTURE() \
// Visible in ginput_lld_toggle.c const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { \
{AT91C_BASE_PIOB, /* Switch 1 and Switch 2 */ \
const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { PIOB_SW1_MASK|PIOB_SW2_MASK, \
{AT91C_BASE_PIOB, // Switch 1 and Switch 2 PIOB_SW1_MASK|PIOB_SW2_MASK, \
PIOB_SW1_MASK|PIOB_SW2_MASK, PAL_MODE_INPUT}, \
PIOB_SW1_MASK|PIOB_SW2_MASK, {AT91C_BASE_PIOA, /* B1..4 Joystick */ \
PAL_MODE_INPUT}, PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, \
{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}, \
PIOA_B1_MASK|PIOA_B2_MASK|PIOA_B3_MASK|PIOA_B4_MASK|PIOA_B5_MASK, }
PAL_MODE_INPUT},
};
#endif
#endif /* _GDISP_LLD_TOGGLE_BOARD_H */ #endif /* _GDISP_LLD_TOGGLE_BOARD_H */
/** @} */ /** @} */

View File

@ -31,7 +31,10 @@
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE #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" #include "ginput_lld_toggle_board_olimexsam7ex256.h"
#else #else
/* Include the user supplied board definitions */ /* Include the user supplied board definitions */

View File

@ -105,7 +105,7 @@ static __inline void release_bus(void) {
* *
* @notapi * @notapi
*/ */
static uint16_t read_x_value(void) { static __inline uint16_t read_x_value(void) {
uint16_t val1, val2; uint16_t val1, val2;
adcsample_t samples[ADC_NUM_CHANNELS * ADC_BUF_DEPTH]; 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, 1, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOC, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 2, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 3, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOC, 2); palSetPad(GPIOC, 2);
palClearPad(GPIOC, 3); palClearPad(GPIOC, 3);
chThdSleepMilliseconds(1); chThdSleepMilliseconds(1);
@ -135,7 +135,7 @@ static uint16_t read_x_value(void) {
* *
* @notapi * @notapi
*/ */
static uint16_t read_y_value(void) { static __inline uint16_t read_y_value(void) {
uint16_t val1, val2; uint16_t val1, val2;
adcsample_t samples[ADC_NUM_CHANNELS * ADC_BUF_DEPTH]; 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, 3, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOC, 1); palSetPad(GPIOC, 1);
palClearPad(GPIOC, 0); palClearPad(GPIOC, 0);
chThdSleepMilliseconds(1); chThdSleepMilliseconds(1);
adcConvert(&ADCD1, &adc_y_config, samples, ADC_BUF_DEPTH); adcConvert(&ADCD1, &adc_y_config, samples, ADC_BUF_DEPTH);

View File

@ -28,7 +28,7 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
@ -39,16 +39,16 @@
#include <wingdi.h> #include <wingdi.h>
#include <assert.h> #include <assert.h>
#ifndef GINPUT_NEED_TOGGLE #ifndef GDISP_SCREEN_WIDTH
#define GINPUT_NEED_TOGGLE FALSE #define GDISP_SCREEN_WIDTH 640
#endif #endif
#ifndef GINPUT_NEED_MOUSE #ifndef GDISP_SCREEN_HEIGHT
#define GINPUT_NEED_MOUSE FALSE #define GDISP_SCREEN_HEIGHT 480
#endif #endif
#if GINPUT_NEED_TOGGLE #if GINPUT_NEED_TOGGLE
/* Include toggle support code */ /* Include toggle support code */
#include "lld/ginput/toggle.h" #include "ginput/lld/toggle.h"
const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = { const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES] = {
{0, 0xFF, 0x00, PAL_MODE_INPUT}, {0, 0xFF, 0x00, PAL_MODE_INPUT},
@ -57,12 +57,11 @@
#if GINPUT_NEED_MOUSE #if GINPUT_NEED_MOUSE
/* Include mouse support code */ /* Include mouse support code */
#include "ginput.h" #include "ginput/lld/mouse.h"
#include "lld/ginput/mouse.h"
#endif #endif
/* Include the emulation code for things we don't support */ /* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c" #include "gdisp/lld/emulation.c"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local routines . */ /* Driver local routines . */
@ -621,7 +620,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
} }
#endif #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) { 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 *dstbuf;
pixel_t *dst; pixel_t *dst;
@ -667,7 +666,9 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
} }
return dstbuf; return dstbuf;
} }
#endif
#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
/** /**
* @brief Fill an area with a bitmap. * @brief Fill an area with a bitmap.
* @note Optional - The high level driver can emulate using software. * @note Optional - The high level driver can emulate using software.

12
gfx.mk
View File

@ -3,15 +3,11 @@ ifeq ($(GFXLIB),)
GFXLIB = $(CHIBIOS)/ext/gfx GFXLIB = $(CHIBIOS)/ext/gfx
endif 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 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/gwin/gwin.mk
include $(GFXLIB)/src/ginput/ginput.mk include $(GFXLIB)/src/ginput/ginput.mk

View File

@ -19,7 +19,7 @@
*/ */
/** /**
* @file include/gdisp.h * @file include/gdisp/gdisp.h
* @brief GDISP Graphic Driver subsystem header file. * @brief GDISP Graphic Driver subsystem header file.
* *
* @addtogroup GDISP * @addtogroup GDISP
@ -29,9 +29,16 @@
#ifndef _GDISP_H #ifndef _GDISP_H
#define _GDISP_H #define _GDISP_H
#ifndef GFX_USE_GDISP #include "gfx.h"
#define GFX_USE_GDISP FALSE
#endif /* 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__) #if GFX_USE_GDISP || defined(__DOXYGEN__)
@ -65,66 +72,17 @@
#define Pink HTML2COLOR(0xFFC0CB) #define Pink HTML2COLOR(0xFFC0CB)
#define SkyBlue HTML2COLOR(0x87CEEB) #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. */ /* Low Level Driver details and error checks. */
/*===========================================================================*/ /*===========================================================================*/
/* Include the low level driver information */ /* Include the low level driver information */
#include "lld/gdisp/gdisp_lld.h" #include "gdisp/lld/gdisp_lld.h"
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/
typedef struct _point_t {
coord_t x;
coord_t y;
} point_t;
/** /**
* @brief Type for the text justification. * @brief Type for the text justification.
*/ */
@ -224,9 +182,7 @@ extern "C" {
#endif #endif
/* Query driver specific data */ /* Query driver specific data */
#if GDISP_NEED_CONTROL
void *gdispQuery(unsigned what); void *gdispQuery(unsigned what);
#endif
#else #else
@ -286,8 +242,9 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/* /*
* Macro definitions * Macro definitions
*/ */
/* Now obsolete functions */ /* 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 */ /* Macro definitions for common gets and sets */
#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode)) #define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))

View File

@ -667,7 +667,7 @@
} }
#endif #endif
#if GDISP_NEED_QUERY && !GDISP_HARDWARE_QUERY #if !GDISP_HARDWARE_QUERY
void *GDISP_LLD(query)(unsigned what) { void *GDISP_LLD(query)(unsigned what) {
switch(what) { switch(what) {
case GDISP_QUERY_WIDTH: return (void *)(unsigned)GDISP.Width; 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); GDISP_LLD(control)(msg->control.what, msg->control.value);
break; break;
#endif #endif
#if GDISP_NEED_QUERY
case GDISP_LLD_MSG_QUERY: case GDISP_LLD_MSG_QUERY:
msg->query.result = GDISP_LLD(query)(msg->query.what); msg->query.result = GDISP_LLD(query)(msg->query.what);
break; break;
#endif
} }
} }
#endif #endif

View File

@ -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. * @brief GDISP Graphic Driver subsystem low level driver header.
* *
* @addtogroup GDISP * @addtogroup GDISP
@ -35,106 +35,6 @@
/* Low level driver configuration needs */ /* 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 */ /* Include the low level driver configuration information */
/*===========================================================================*/ /*===========================================================================*/
@ -537,10 +437,6 @@
/* Driver types. */ /* Driver types. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @brief The type for a coordinate or length on the screen.
*/
typedef int16_t coord_t;
/** /**
* @brief The type of a pixel. * @brief The type of a pixel.
*/ */
@ -624,9 +520,7 @@ extern "C" {
#endif #endif
/* Query driver specific data */ /* Query driver specific data */
#if GDISP_NEED_QUERY
extern void *GDISP_LLD_VMT(query)(unsigned what); extern void *GDISP_LLD_VMT(query)(unsigned what);
#endif
/* Clipping Functions */ /* Clipping Functions */
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP

View File

@ -68,9 +68,7 @@ typedef enum gdisp_msgaction {
#if GDISP_NEED_CONTROL #if GDISP_NEED_CONTROL
GDISP_LLD_MSG_CONTROL, GDISP_LLD_MSG_CONTROL,
#endif #endif
#if GDISP_NEED_QUERY GDISP_LLD_MSG_QUERY,
GDISP_LLD_MSG_QUERY,
#endif
} gdisp_msgaction_t; } gdisp_msgaction_t;
typedef union gdisp_lld_msg { typedef union gdisp_lld_msg {
@ -189,7 +187,7 @@ typedef union gdisp_lld_msg {
} query; } query;
} gdisp_lld_msg_t; } gdisp_lld_msg_t;
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP && GDISP_NEED_MSGAPI */
#endif /* _GDISP_LLD_MSGS_H */ #endif /* _GDISP_LLD_MSGS_H */
/** @} */ /** @} */

View File

@ -0,0 +1,208 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gdisp/options.h
* @brief GDISP sub-system options header file.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_OPTIONS_H
#define _GDISP_OPTIONS_H
/**
* @name GDISP Functionality to be included
* @{
*/
/**
* @brief Should all operations be clipped to the screen and colors validated.
* @details Defaults to TRUE.
* @note If this is FALSE, any operations that extend beyond the
* edge of the screen will have undefined results. Any
* out-of-range colors will produce undefined results.
* @note If defined then all low level and high level GDISP driver routines
* must check the validity of inputs and do something sensible
* if they are out of range. It doesn't have to be efficient,
* just valid.
*/
#ifndef GDISP_NEED_VALIDATION
#define GDISP_NEED_VALIDATION TRUE
#endif
/**
* @brief Are clipping functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_CLIP
#define GDISP_NEED_CLIP TRUE
#endif
/**
* @brief Are text functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_TEXT
#define GDISP_NEED_TEXT TRUE
#endif
/**
* @brief Are circle functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_CIRCLE
#define GDISP_NEED_CIRCLE TRUE
#endif
/**
* @brief Are ellipse functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_ELLIPSE
#define GDISP_NEED_ELLIPSE TRUE
#endif
/**
* @brief Are arc functions needed.
* @details Defaults to FALSE
* @note Requires the maths library to be included in the link. ie -lm
*/
#ifndef GDISP_NEED_ARC
#define GDISP_NEED_ARC FALSE
#endif
/**
* @brief Are scrolling functions needed.
* @details Defaults to FALSE
* @note This function must be supported by the low level GDISP driver
* you have included in your project. If it isn't, defining this
* option will cause a compile error.
*/
#ifndef GDISP_NEED_SCROLL
#define GDISP_NEED_SCROLL FALSE
#endif
/**
* @brief Is the capability to read pixels back needed.
* @details Defaults to FALSE
* @note This function must be supported by the low level GDISP driver
* you have included in your project. If it isn't, defining this
* option will cause a compile error.
*/
#ifndef GDISP_NEED_PIXELREAD
#define GDISP_NEED_PIXELREAD FALSE
#endif
/**
* @brief Control some aspect of the hardware operation.
* @details Defaults to FALSE
* @note This allows control of hardware specific features such as
* screen rotation, backlight levels, contrast etc
*/
#ifndef GDISP_NEED_CONTROL
#define GDISP_NEED_CONTROL FALSE
#endif
/**
* @brief Is the messaging api interface required.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_MSGAPI
#define GDISP_NEED_MSGAPI FALSE
#endif
/**
* @}
*
* @name GDISP Multi-Threading Options
* @{
*/
/**
* @brief Do the drawing functions need to be thread-safe.
* @details Defaults to FALSE
* @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
* the gdisp API thread-safe.
* @note This is more efficient than GDISP_NEED_ASYNC as it only
* requires a context switch if something else is already
* drawing.
*/
#ifndef GDISP_NEED_MULTITHREAD
#define GDISP_NEED_MULTITHREAD FALSE
#endif
/**
* @brief Use asynchronous calls (multi-thread safe).
* @details Defaults to FALSE
* @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
* the gdisp API thread-safe.
* @note Turning this on adds two context switches per transaction
* so it can significantly slow graphics drawing but it allows
* drawing operations to continue in the background.
*/
#ifndef GDISP_NEED_ASYNC
#define GDISP_NEED_ASYNC FALSE
#endif
/**
* @}
*
* @name GDISP Optional Sizing Parameters
* @{
*/
/**
* @brief The maximum height of a font.
* @details Either 16 or 32. Defaults to 16
* @note Setting this to 32 causes the font tables to take
* twice the internal program memory. Don't do it unless
* you realy must define an unscaled font larger than 16 bits high.
*/
#ifndef GDISP_MAX_FONT_HEIGHT
#define GDISP_MAX_FONT_HEIGHT 16
#endif
/**
* @}
*
* @name GDISP Optional Low Level Driver Defines
* @{
*/
/**
* @brief Use a custom board definition even if a board definition exists.
* @details Defaults to FALSE
* @details If TRUE, add gdisp_lld_board.h to your project directory and customise it.
* @note Not all GDISP low level drivers currently use board definition files.
*/
#ifndef GDISP_USE_CUSTOM_BOARD
#define GDISP_USE_CUSTOM_BOARD FALSE
#endif
/**
* @brief Set the screen height and width.
* @note Ignored by some low level GDISP drivers, optional for others.
* @note Where these values are allowed, a default is always provided be the low level driver.
* @note The list of GDISP low level drivers that allow these to be set are...
* WIN32, SSD1289, SSD1963, TestStub
*/
/* #define GDISP_SCREEN_WIDTH nnnn */
/* #define GDISP_SCREEN_HEIGHT nnnn */
/**
* @brief Define which bus interface to use.
* @details Only required by the SSD1963 driver.
* @note This will be replaced eventually by board definition files
*/
/* #define GDISP_USE_FSMC */
/* #define GDISP_USE_GPIO */
/**
* @brief Define which two drivers will be used by the VMT layer.
* @details Only required by the VMT driver.
*/
/* #define GDISP_VMT_NAME1(x) x##YourDriver1 */
/* #define GDISP_VMT_NAME2(x) x##YourDriver2 */
/** @} */
#endif /* _GDISP_OPTIONS_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gevent.h * @file include/gevent/gevent.h
* @brief GEVENT GFX User Event subsystem header file. * @brief GEVENT GFX User Event subsystem header file.
* *
* @addtogroup GEVENT * @addtogroup GEVENT
@ -27,56 +27,18 @@
#ifndef _GEVENT_H #ifndef _GEVENT_H
#define _GEVENT_H #define _GEVENT_H
#ifndef GFX_USE_GEVENT #include "gfx.h"
#define GFX_USE_GEVENT FALSE
#endif
#if GFX_USE_GEVENT || defined(__DOXYGEN__) #if GFX_USE_GEVENT || defined(__DOXYGEN__)
/** /**
* @name GEVENT macros and more complex functionality to be compiled * @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 Data part of a static GListener initializer. /**
*/ * @brief Static GListener initializer.
#define _GLISTENER_DATA(name) { _SEMAPHORE_DATA(name.waitqueue, 0), _BSEMAPHORE_DATA(name.eventlock, FALSE), 0, 0, {0} } */
/** #define GLISTENER_DECL(name) GListener name = _GLISTENER_DATA(name)
* @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
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* 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. // 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 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. // For example, this is used by GWIN button events, GINPUT data streams etc.
typedef union GEvent_u { typedef union GEvent_u {
GEventType type; // The type of this event 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. char pad[GEVENT_MAXIMUM_SIZE]; // This is here to allow static initialisation of GEventObject's in the application.
} GEvent; } GEvent;
// A special callback function // A special callback function

View File

@ -0,0 +1,68 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gevent/options.h
* @brief GEVENT sub-system options header file.
*
* @addtogroup GEVENT
* @{
*/
#ifndef _GEVENT_OPTIONS_H
#define _GEVENT_OPTIONS_H
/**
* @name GEVENT Functionality to be included
* @{
*/
/**
* @brief Should routines assert() if they run out of resources.
* @details Defaults to FALSE.
* @details If FALSE the application must be prepared to handle these
* failures.
*/
#ifndef GEVENT_ASSERT_NO_RESOURCE
#define GEVENT_ASSERT_NO_RESOURCE FALSE
#endif
/**
* @}
*
* @name GEVENT Optional Sizing Parameters
* @{
*/
/**
* @brief Defines the maximum size of an event status variable.
* @details Defaults to 32 bytes
*/
#ifndef GEVENT_MAXIMUM_SIZE
#define GEVENT_MAXIMUM_SIZE 32
#endif
/**
* @brief Defines the maximum Source/Listener pairs in the system.
* @details Defaults to 32
*/
#ifndef GEVENT_MAX_SOURCE_LISTENERS
#define GEVENT_MAX_SOURCE_LISTENERS 32
#endif
/** @} */
#endif /* _GEVENT_OPTIONS_H */
/** @} */

114
include/gfx.h 100644
View File

@ -0,0 +1,114 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gfx.h
* @brief GFX system header file.
*
* @addtogroup GFX
* @{
*/
#ifndef _GFX_H
#define _GFX_H
/* gfxconf.h is the user's project configuration for the GFX system. */
#include "gfxconf.h"
/**
* @name GFX sub-systems that can be turned on
* @{
*/
/**
* @brief GFX Graphics Display Basic API
* @details Defaults to FALSE
* @note Also add the specific hardware driver to your makefile.
* Eg. include $(GFXLIB)/drivers/gdisp/Nokia6610/gdisp_lld.mk
*/
#ifndef GFX_USE_GDISP
#define GFX_USE_GDISP FALSE
#endif
/**
* @brief GFX Graphics Windowing API
* @details Defaults to FALSE
* @details Extends the GDISP API to add the concept of graphic windows.
* @note Also supports high-level "window" objects such as console windows,
* buttons, graphing etc
*/
#ifndef GFX_USE_GWIN
#define GFX_USE_GWIN FALSE
#endif
/**
* @brief GFX Event API
* @details Defaults to FALSE
* @details Defines the concept of a "Source" that can send "Events" to "Listeners".
*/
#ifndef GFX_USE_GEVENT
#define GFX_USE_GEVENT FALSE
#endif
/**
* @brief GFX Timer API
* @details Defaults to FALSE
* @details Provides thread context timers - both one-shot and periodic.
*/
#ifndef GFX_USE_GTIMER
#define GFX_USE_GTIMER FALSE
#endif
/**
* @brief GFX Input Device API
* @details Defaults to FALSE
* @note Also add the specific hardware drivers to your makefile.
* Eg.
* include $(GFXLIB)/drivers/ginput/toggle/Pal/ginput_lld.mk
* and...
* include $(GFXLIB)/drivers/ginput/touch/MCU/ginput_lld.mk
*/
#ifndef GFX_USE_GINPUT
#define GFX_USE_GINPUT FALSE
#endif
/** @} */
/**
* Get all the options for each sub-system.
*
*/
#include "gevent/options.h"
#include "gtimer/options.h"
#include "gdisp/options.h"
#include "gwin/options.h"
#include "ginput/options.h"
/**
* Inter-dependancy safety checks on the sub-systems.
*
*/
#include "gfx_rules.h"
/**
* Include the sub-system header files
*/
#include "gevent/gevent.h"
#include "gtimer/gtimer.h"
#include "gdisp/gdisp.h"
#include "gwin/gwin.h"
#include "ginput/ginput.h"
#endif /* _GFX_H */
/** @} */

113
include/gfx_rules.h 100644
View File

@ -0,0 +1,113 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gfx_rules.h
* @brief GFX system safety rules header file.
*
* @addtogroup GFX
* @{
*/
#ifndef _GFX_RULES_H
#define _GFX_RULES_H
/**
* Safety checks on all the defines.
*
* These are defined in the order of their inter-dependancies.
*/
#if GFX_USE_GWIN
#if !GFX_USE_GDISP
#error "GWIN: GFX_USE_GDISP must be TRUE when using GWIN"
#endif
#if !GDISP_NEED_CLIP
#warning "GWIN: Drawing can occur outside the defined windows as GDISP_NEED_CLIP is FALSE"
#endif
#if GWIN_NEED_BUTTON
#if !GDISP_NEED_TEXT
#error "GWIN: GDISP_NEED_TEXT is required if GWIN_NEED_BUTTON is TRUE."
#endif
#if !GFX_USE_GEVENT
#warning "GWIN: GFX_USE_GEVENT is required if GWIN_NEED_BUTTON is TRUE. It has been turned on for you."
#undef GFX_USE_GEVENT
#define GFX_USE_GEVENT TRUE
#endif
#if !GFX_USE_GINPUT || !(GINPUT_NEED_MOUSE || GINPUT_NEED_TOGGLE)
#warning "GWIN: You have set GWIN_NEED_BUTTON to TRUE but no supported GINPUT (mouse/toggle) devices have been included"
#endif
#if !GDISP_NEED_MULTITHREAD && !GDISP_NEED_ASYNC
#warning "GWIN: Either GDISP_NEED_MULTITHREAD or GDISP_NEED_ASYNC is required if GWIN_NEED_BUTTON is TRUE."
#warning "GWIN: GDISP_NEED_MULTITHREAD has been turned on for you."
#undef GDISP_NEED_MULTITHREAD
#define GDISP_NEED_MULTITHREAD TRUE
#endif
#endif
#if GWIN_NEED_CONSOLE
#if !GDISP_NEED_TEXT
#error "GWIN: GDISP_NEED_TEXT is required if GWIN_NEED_CONSOLE is TRUE."
#endif
#endif
#if GWIN_NEED_GRAPH
#endif
#endif
#if GFX_USE_GINPUT
#if !GFX_USE_GEVENT
#warning "GINPUT: GFX_USE_GEVENT is required if GFX_USE_GINPUT is TRUE. It has been turned on for you."
#undef GFX_USE_GEVENT
#define GFX_USE_GEVENT TRUE
#endif
#if !GFX_USE_GTIMER
#warning "GINPUT: GFX_USE_GTIMER is required if GFX_USE_GINPUT is TRUE. It has been turned on for you."
#undef GFX_USE_GTIMER
#define GFX_USE_GTIMER TRUE
#endif
#endif
#if GFX_USE_GDISP
#if GDISP_NEED_MULTITHREAD && GDISP_NEED_ASYNC
#error "GDISP: Only one of GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC should be defined."
#endif
#if GDISP_NEED_ASYNC
#if !GDISP_NEED_MSGAPI
#warning "GDISP: Messaging API is required for Async Multi-Thread. It has been turned on for you."
#undef GDISP_NEED_MSGAPI
#define GDISP_NEED_MSGAPI TRUE
#endif
#endif
#endif
#if GFX_USE_GEVENT
#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
#error "GEVENT: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
#endif
#endif
#if GFX_USE_GTIMER
#if GFX_USE_GDISP && !GDISP_NEED_MULTITHREAD && !GDISP_NEED_ASYNC
#warning "GTIMER: Neither GDISP_NEED_MULTITHREAD nor GDISP_NEED_ASYNC has been specified."
#warning "GTIMER: Make sure you are not performing any GDISP/GWIN drawing operations in the timer callback!"
#endif
#endif
#endif /* _GFX_H */
/** @} */

View File

@ -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 */

View File

@ -1,98 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file ginput.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
* @{
*/
#ifndef _GINPUT_H
#define _GINPUT_H
#ifndef GFX_USE_GINPUT
#define GFX_USE_GINPUT FALSE
#endif
#if GFX_USE_GINPUT || defined(__DOXYGEN__)
/**
* @name GINPUT more complex functionality to be compiled
* @{
*/
/** @} */
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#ifndef GFX_USE_GDISP
#define GFX_USE_GDISP FALSE
#endif
#if GFX_USE_GDISP
#include "gdisp.h"
#else
// We require some basic type definitions normally kept in gdisp.h
typedef int16_t coord_t;
#endif
#ifndef GFX_USE_GEVENT
#define GFX_USE_GEVENT TRUE
#elif !GFX_USE_GEVENT
#error "GINPUT: GFX_USE_GEVENT must be defined"
#endif
#include "gevent.h"
#ifndef GFX_USE_GTIMER
#define GFX_USE_GTIMER TRUE
#elif !GFX_USE_GTIMER
#error "GINPUT: GFX_USE_GTIMER must be defined"
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
/* How to use...
1. Get source handles for all the inputs you are interested in.
- Attempting to get a handle for one instance of an input more than once will return the same handle
2. Create a listener
3. Assign inputs to your listener.
- Inputs can be assigned or released from a listener at any time.
- An input can be assigned to more than one listener.
4. Loop on getting listener events
5. When complete destroy the listener
*/
// Include various ginput types
#include "ginput/ginput_mouse.h"
#include "ginput/ginput_keyboard.h"
#include "ginput/ginput_toggle.h"
#include "ginput/ginput_dial.h"
#endif /* GFX_USE_GINPUT */
#endif /* _GINPUT_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file ginput/ginput_dial.h * @file include/ginput/dial.h
* @brief GINPUT GFX User Input subsystem header file. * @brief GINPUT GFX User Input subsystem header file.
* *
* @addtogroup GINPUT * @addtogroup GINPUT
@ -27,25 +27,8 @@
#ifndef _GINPUT_DIAL_H #ifndef _GINPUT_DIAL_H
#define _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__) #if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -0,0 +1,55 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/ginput/ginput.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
* @{
*/
#ifndef _GINPUT_H
#define _GINPUT_H
#include "gfx.h"
#if GFX_USE_GINPUT || defined(__DOXYGEN__)
/* How to use...
1. Get source handles for all the inputs you are interested in.
- Attempting to get a handle for one instance of an input more than once will return the same handle
2. Create a listener
3. Assign inputs to your listener.
- Inputs can be assigned or released from a listener at any time.
- An input can be assigned to more than one listener.
4. Loop on getting listener events
5. When complete destroy the listener
*/
// Include various ginput types
#include "ginput/mouse.h"
#include "ginput/keyboard.h"
#include "ginput/toggle.h"
#include "ginput/dial.h"
#endif /* GFX_USE_GINPUT */
#endif /* _GINPUT_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file ginput/ginput_keyboard.h * @file include/ginput/keyboard.h
* @brief GINPUT GFX User Input subsystem header file. * @brief GINPUT GFX User Input subsystem header file.
* *
* @addtogroup GINPUT * @addtogroup GINPUT
@ -27,25 +27,8 @@
#ifndef _GINPUT_KEYBOARD_H #ifndef _GINPUT_KEYBOARD_H
#define _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__) #if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file lld/ginput/mouse.h * @file include/ginput/lld/mouse.h
* @brief GINPUT LLD header file for mouse/touch drivers. * @brief GINPUT LLD header file for mouse/touch drivers.
* *
* @addtogroup GINPUT_MOUSE * @addtogroup GINPUT_MOUSE
@ -27,14 +27,7 @@
#ifndef _LLD_GINPUT_MOUSE_H #ifndef _LLD_GINPUT_MOUSE_H
#define _LLD_GINPUT_MOUSE_H #define _LLD_GINPUT_MOUSE_H
#ifndef GINPUT_NEED_MOUSE #if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
#define GINPUT_NEED_MOUSE FALSE
#endif
#ifndef GINPUT_NEED_TOUCH
#define GINPUT_NEED_TOUCH FALSE
#endif
#if GINPUT_NEED_MOUSE || GINPUT_NEED_TOUCH
#include "ginput_lld_mouse_config.h" #include "ginput_lld_mouse_config.h"

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file lld/ginput/toggle.h * @file include/ginput/lld/toggle.h
* @brief GINPUT header file for toggle drivers. * @brief GINPUT header file for toggle drivers.
* *
* @addtogroup GINPUT_TOGGLE * @addtogroup GINPUT_TOGGLE
@ -27,14 +27,7 @@
#ifndef _LLD_GINPUT_TOGGLE_H #ifndef _LLD_GINPUT_TOGGLE_H
#define _LLD_GINPUT_TOGGLE_H #define _LLD_GINPUT_TOGGLE_H
#ifndef GFX_USE_GINPUT #if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
#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__)
// Describes how the toggle bits are obtained // Describes how the toggle bits are obtained
typedef struct GToggleConfig_t { typedef struct GToggleConfig_t {
@ -44,14 +37,6 @@ typedef struct GToggleConfig_t {
iomode_t mode; iomode_t mode;
} GToggleConfig; } 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. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file ginput/ginput_mouse.h * @file include/ginput/mouse.h
* @brief GINPUT GFX User Input subsystem header file for mouse and touch. * @brief GINPUT GFX User Input subsystem header file for mouse and touch.
* *
* @addtogroup GINPUT * @addtogroup GINPUT
@ -27,25 +27,12 @@
#ifndef _GINPUT_MOUSE_H #ifndef _GINPUT_MOUSE_H
#define _GINPUT_MOUSE_H #define _GINPUT_MOUSE_H
/** #if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
* @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
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/
#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__)
/* This type definition is also used by touch */ /* This type definition is also used by touch */
typedef struct GEventMouse_t { typedef struct GEventMouse_t {
GEventType type; // The type of this event (GEVENT_MOUSE or GEVENT_TOUCH) GEventType type; // The type of this event (GEVENT_MOUSE or GEVENT_TOUCH)

View File

@ -0,0 +1,127 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/ginput/options.h
* @brief GINPUT sub-system options header file.
*
* @addtogroup GINPUT
* @{
*/
#ifndef _GINPUT_OPTIONS_H
#define _GINPUT_OPTIONS_H
/**
* @name GINPUT Functionality to be included
* @{
*/
/**
* @brief Should mouse/touch functions be included.
* @details Defaults to FALSE
* @note Also add the a mouse/touch hardware driver to your makefile.
* Eg.
* include $(GFXLIB)/drivers/ginput/touch/MCU/ginput_lld.mk
*/
#ifndef GINPUT_NEED_MOUSE
#define GINPUT_NEED_MOUSE FALSE
#endif
/**
* @brief Should keyboard functions be included.
* @details Defaults to FALSE
* @note Also add the a keyboard hardware driver to your makefile.
* Eg.
* include $(GFXLIB)/drivers/ginput/keyboard/XXXX/ginput_lld.mk
*/
#ifndef GINPUT_NEED_KEYBOARD
#define GINPUT_NEED_KEYBOARD FALSE
#endif
/**
* @brief Should hardware toggle/switch/button functions be included.
* @details Defaults to FALSE
* @note Also add the a toggle hardware driver to your makefile.
* Eg.
* include $(GFXLIB)/drivers/ginput/toggle/Pal/ginput_lld.mk
*/
#ifndef GINPUT_NEED_TOGGLE
#define GINPUT_NEED_TOGGLE FALSE
#endif
/**
* @brief Should analog dial functions be included.
* @details Defaults to FALSE
* @note Also add the a dial hardware driver to your makefile.
* Eg.
* include $(GFXLIB)/drivers/ginput/dial/analog/ginput_lld.mk
*/
#ifndef GINPUT_NEED_DIAL
#define GINPUT_NEED_DIAL FALSE
#endif
/**
* @}
*
* @name GINPUT Optional Sizing Parameters
* @{
*/
/**
* @}
*
* @name GINPUT Optional Low Level Driver Defines
* @{
*/
/**
* @brief Use a custom board definition for the mouse/touch driver even if a board definition exists.
* @details Defaults to FALSE
* @details If TRUE, add ginput_lld_mouse_board.h to your project directory and customise it.
* @note Not all GINPUT mouse/touch low level drivers use board definition files.
*/
#ifndef GINPUT_MOUSE_USE_CUSTOM_BOARD
#define GINPUT_MOUSE_USE_CUSTOM_BOARD FALSE
#endif
/**
* @brief Use a custom board definition for the keyboard driver even if a board definition exists.
* @details Defaults to FALSE
* @details If TRUE, add ginput_lld_keyboard_board.h to your project directory and customise it.
* @note Not all GINPUT keyboard low level drivers use board definition files.
*/
#ifndef GINPUT_KEYBOARD_USE_CUSTOM_BOARD
#define GINPUT_KEYBOARD_USE_CUSTOM_BOARD FALSE
#endif
/**
* @brief Use a custom board definition for the toggle driver even if a board definition exists.
* @details Defaults to FALSE
* @details If TRUE, add ginput_lld_toggle_board.h to your project directory and customise it.
* @note Not all GINPUT toggle low level drivers use board definition files.
*/
#ifndef GINPUT_TOGGLE_USE_CUSTOM_BOARD
#define GINPUT_TOGGLE_USE_CUSTOM_BOARD FALSE
#endif
/**
* @brief Use a custom board definition for the dial driver even if a board definition exists.
* @details Defaults to FALSE
* @details If TRUE, add ginput_lld_dial_board.h to your project directory and customise it.
* @note Not all GINPUT dial low level drivers use board definition files.
*/
#ifndef GINPUT_DIAL_USE_CUSTOM_BOARD
#define GINPUT_DIAL_USE_CUSTOM_BOARD FALSE
#endif
/** @} */
#endif /* _GINPUT_OPTIONS_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file ginput/ginput_toggle.h * @file include/ginput/toggle.h
* @brief GINPUT GFX User Input subsystem header file. * @brief GINPUT GFX User Input subsystem header file.
* *
* @addtogroup GINPUT * @addtogroup GINPUT
@ -27,25 +27,15 @@
#ifndef _GINPUT_TOGGLE_H #ifndef _GINPUT_TOGGLE_H
#define _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__) #if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
/* Low Level Driver details and error checks. */ /* Low Level Driver details and error checks. */
/*===========================================================================*/ /*===========================================================================*/
// Get the hardware definitions - Number of instances etc.
#include "ginput_lld_toggle_config.h"
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/
@ -53,9 +43,6 @@
// Event types for various ginput sources // Event types for various ginput sources
#define GEVENT_TOGGLE (GEVENT_GINPUT_FIRST+3) #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 { typedef struct GEventToggle_t {
GEventType type; // The type of this event (GEVENT_TOGGLE) GEventType type; // The type of this event (GEVENT_TOGGLE)
uint16_t instance; // The toggle instance uint16_t instance; // The toggle instance

View File

@ -1,84 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/graph.h
* @brief GRAPH module header file.
*
* @addtogroup GRAPH
* @{
*/
#ifndef GRAPH_H
#define GRAPH_H
#ifndef GFX_USE_GRAPH
#define GFX_USE_GRAPH FALSE
#endif
#if GFX_USE_GRAPH || defined(__DOXYGEN__)
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
typedef struct _Graph {
coord_t origin_x;
coord_t origin_y;
coord_t xmin;
coord_t xmax;
coord_t ymin;
coord_t ymax;
uint16_t grid_size;
uint16_t dot_space;
bool_t full_grid;
bool_t arrows;
color_t axis_color;
color_t grid_color;
/* do never modify values below this line manually */
coord_t x0;
coord_t x1;
coord_t y0;
coord_t y1;
} Graph;
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
void graphDrawSystem(Graph *g);
void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color);
void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor);
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_GRAPH */
#endif
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gtimer.h * @file include/gtimer/gtimer.h
* @brief GTIMER GFX User Timer subsystem header file. * @brief GTIMER GFX User Timer subsystem header file.
* *
* @addtogroup GTIMER * @addtogroup GTIMER
@ -27,46 +27,27 @@
#ifndef _GTIMER_H #ifndef _GTIMER_H
#define _GTIMER_H #define _GTIMER_H
#ifndef GFX_USE_GTIMER #include "gfx.h"
#define GFX_USE_GTIMER FALSE
#endif
#if GFX_USE_GTIMER || defined(__DOXYGEN__) #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 */ /* 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); typedef void (*GTimerFunction)(void *param);
/** /**

View File

@ -18,42 +18,35 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* /**
* !!! IMPORTANT !!! * @file include/gtimer/options.h
* @brief GTIMER sub-system options header file.
* *
* This example dosen't compile yet, there's a problem in the console source. * @addtogroup GTIMER
* This issue will be fixed soon. * @{
*/ */
/* #ifndef _GTIMER_OPTIONS_H
* Please add the following to your halconf.h #define _GTIMER_OPTIONS_H
*
* #define GFX_USE_CONSOLE TRUE /**
* #define GDISP_NEED_SCROLL TRUE * @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" #endif /* _GTIMER_OPTIONS_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);
}
}

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gwin/gwin_button.h * @file include/gwin/button.h
* @brief GWIN Graphic window subsystem header file. * @brief GWIN Graphic window subsystem header file.
* *
* @addtogroup GWIN * @addtogroup GWIN
@ -27,20 +27,6 @@
#ifndef _GWIN_BUTTON_H #ifndef _GWIN_BUTTON_H
#define _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__) #if GWIN_NEED_BUTTON || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
@ -50,24 +36,6 @@
#define GW_BUTTON 0x0002 #define GW_BUTTON 0x0002
#define GEVENT_GWIN_BUTTON (GEVENT_GWIN_FIRST+0) #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 */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gwin/gwin_console.h * @file include/gwin/console.h
* @brief GWIN Graphic window subsystem header file. * @brief GWIN Graphic window subsystem header file.
* *
* @addtogroup GWIN * @addtogroup GWIN
@ -27,19 +27,6 @@
#ifndef _GWIN_CONSOLE_H #ifndef _GWIN_CONSOLE_H
#define _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__) #if GWIN_NEED_CONSOLE || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
@ -48,18 +35,6 @@
#define GW_CONSOLE 0x0001 #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 */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -0,0 +1,156 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gwin/graph.h
* @brief GWIN GRAPH module header file.
*
* @addtogroup GWIN_GRAPH
* @{
*/
#ifndef _GWIN_GRAPH_H
#define _GWIN_GRAPH_H
#if GWIN_NEED_GRAPH || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
#define GW_GRAPH 0x0003
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
typedef struct GGraphPoint_t {
coord_t x, y;
} GGraphPoint;
typedef enum GGraphPointType_e {
GGRAPH_POINT_NONE, GGRAPH_POINT_DOT, GGRAPH_POINT_SQUARE, GGRAPH_POINT_CIRCLE
} GGraphPointType;
typedef struct GGraphPointStyle_t {
GGraphPointType type;
coord_t size;
color_t color;
} GGraphPointStyle;
typedef enum GGraphLineType_e {
GGRAPH_LINE_NONE, GGRAPH_LINE_SOLID, GGRAPH_LINE_DOT, GGRAPH_LINE_DASH
} GGraphLineType;
typedef struct GGraphLineStyle_t {
GGraphLineType type;
coord_t size;
color_t color;
} GGraphLineStyle;
typedef struct GGraphGridStyle_t {
GGraphLineType type;
coord_t size;
color_t color;
coord_t spacing;
} GGraphGridStyle;
typedef struct GGraphStyle_t {
GGraphPointStyle point;
GGraphLineStyle line;
GGraphLineStyle xaxis;
GGraphLineStyle yaxis;
GGraphGridStyle xgrid;
GGraphGridStyle ygrid;
uint16_t flags;
#define GWIN_GRAPH_STYLE_XAXIS_ARROWS 0x0001
#define GWIN_GRAPH_STYLE_YAXIS_ARROWS 0x0002
} GGraphStyle;
// A graph window
typedef struct GGraphObject_t {
GWindowObject gwin;
GGraphStyle style;
coord_t xorigin, yorigin;
coord_t lastx, lasty;
} GGraphObject;
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height);
void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle);
void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y);
void gwinGraphDrawAxis(GHandle gh);
void gwinGraphStartSet(GHandle gh);
void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y);
void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count);
#ifdef __cplusplus
}
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
typedef struct _Graph {
coord_t origin_x;
coord_t origin_y;
coord_t xmin;
coord_t xmax;
coord_t ymin;
coord_t ymax;
uint16_t grid_size;
uint16_t dot_space;
bool_t full_grid;
bool_t arrows;
color_t axis_color;
color_t grid_color;
/* do never modify values below this line manually */
coord_t x0;
coord_t x1;
coord_t y0;
coord_t y1;
} Graph;
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
#ifdef __cplusplus
}
#endif
#endif /* GWIN_NEED_GRAPH */
#endif /* _GWIN_GRAPH_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gwin.h * @file include/gwin/gwin.h
* @brief GWIN Graphic window subsystem header file. * @brief GWIN Graphic window subsystem header file.
* *
* @addtogroup GWIN * @addtogroup GWIN
@ -27,39 +27,10 @@
#ifndef _GWIN_H #ifndef _GWIN_H
#define _GWIN_H #define _GWIN_H
#ifndef GFX_USE_GWIN #include "gfx.h"
#define GFX_USE_GWIN FALSE
#endif
#if GFX_USE_GWIN || defined(__DOXYGEN__) #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 */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/
@ -145,7 +116,7 @@ void gwinDestroyWindow(GHandle gh);
/* Set up for text */ /* Set up for text */
#if GDISP_NEED_TEXT #if GDISP_NEED_TEXT
void gwinSetFont(GHandle gh, font_t font); void gwinSetFont(GHandle gh, font_t font);
#endif #endif
/* Drawing Functions */ /* Drawing Functions */
@ -194,8 +165,9 @@ void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coor
#endif #endif
/* Include extra window types */ /* Include extra window types */
#include "gwin/gwin_console.h" #include "gwin/console.h"
#include "gwin/gwin_button.h" #include "gwin/button.h"
#include "gwin/graph.h"
#endif /* GFX_USE_GWIN */ #endif /* GFX_USE_GWIN */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file gwin_internal.h * @file include/gwin/internal.h
* @brief GWIN Graphic window subsystem header file. * @brief GWIN Graphic window subsystem header file.
* *
* @addtogroup GWIN * @addtogroup GWIN
@ -34,8 +34,8 @@
/*===========================================================================*/ /*===========================================================================*/
#define GWIN_FLG_DYNAMIC 0x0001 #define GWIN_FLG_DYNAMIC 0x0001
#define GWIN_FIRST_CONTROL_FLAG 0x0002 #define GBTN_FLG_ALLOCTXT 0x0002
#define GBTN_FLG_ALLOCTXT (GWIN_FIRST_CONTROL_FLAG<<0) #define GWIN_FIRST_CONTROL_FLAG 0x0004
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -0,0 +1,71 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/gwin_options.h
* @brief GWIN sub-system options header file.
*
* @addtogroup GWIN
* @{
*/
#ifndef _GWIN_OPTIONS_H
#define _GWIN_OPTIONS_H
/**
* @name GWIN Functionality to be included
* @{
*/
/**
* @brief Should button functions be included.
* @details Defaults to FALSE
*/
#ifndef GWIN_NEED_BUTTON
#define GWIN_NEED_BUTTON FALSE
#endif
/**
* @brief Should console functions be included.
* @details Defaults to FALSE
* @note To use chprintf() for printing in a console window you need to
* include in your application source file...
* #include "chprintf.h"
* Also in your makefile, as part of your list of C source files, include
* ${CHIBIOS}/os/various/chprintf.c
*/
#ifndef GWIN_NEED_CONSOLE
#define GWIN_NEED_CONSOLE FALSE
#endif
/**
* @brief Should graph functions be included.
* @details Defaults to FALSE
*/
#ifndef GWIN_NEED_GRAPH
#define GWIN_NEED_GRAPH FALSE
#endif
/**
* @}
*
* @name GWIN Optional Sizing Parameters
* @{
*/
/** @} */
#endif /* _GWIN_OPTIONS_H */
/** @} */

View File

@ -1,130 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/lld/touchscreen/touchscreen_lld.h
* @brief TOUCHSCREEN Driver subsystem low level driver header.
*
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef TOUCHSCREEN_LLD_H
#define TOUCHSCREEN_LLD_H
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
/*===========================================================================*/
/* Include the low level driver configuration information */
/*===========================================================================*/
#include "touchscreen_lld_config.h"
/*===========================================================================*/
/* Error checks. */
/*===========================================================================*/
#ifndef TOUCHSCREEN_NEED_MULTITHREAD
#define TOUCHSCREEN_NEED_MULTITHREAD FALSE
#endif
#ifndef TOUCHSCREEN_XY_INVERTED
#define TOUCHSCREEN_XY_INVERTED FALSE
#endif
#ifndef TOUCHSCREEN_HAS_PRESSED
#define TOUCHSCREEN_HAS_PRESSED FALSE
#endif
#ifndef TOUCHSCREEN_HAS_PRESSURE
#define TOUCHSCREEN_HAS_PRESSURE FALSE
#endif
#ifndef TOUCHSCREEN_SPI_PROLOGUE
#define TOUCHSCREEN_SPI_PROLOGUE()
#endif
#ifndef TOUCHSCREEN_SPI_EPILOGUE
#define TOUCHSCREEN_SPI_EPILOGUE()
#endif
#ifndef TOUCHSCREEN_STORE_CALIBRATION
#define TOUCHSCREEN_STORE_CALIBRATION FALSE
#endif
#ifndef TOUCHSCREEN_VERIFY_CALIBRATION
#define TOUCHSCREEN_VERIFY_CALIBRATION FALSE
#endif
#ifndef TOUCHSCREEN_CONVERSIONS
#define TOUCHSCREEN_CONVERSIONS 3
#endif
/*===========================================================================*/
/* Driver types. */
/*===========================================================================*/
/**
* @brief Structure representing a touchscreen driver. Hardware dependant.
*/
typedef struct TouchscreenDriver TouchscreenDriver;
// Forward declaration
struct cal_t;
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
/* Core functions */
void ts_lld_init(const TouchscreenDriver *ts);
uint16_t ts_lld_read_value(uint8_t cmd);
uint16_t ts_lld_read_x(void);
uint16_t ts_lld_read_y(void);
#if TOUCHSCREEN_HAS_PRESSED
uint8_t ts_lld_pressed(void);
#endif
#if TOUCHSCREEN_HAS_PRESSURE
uint16_t ts_lld_read_z(void);
#endif
#if TOUCHSCREEN_STORE_CALIBRATION
// These may be defined by the low level driver or by the application
void ts_store_calibration_lld(struct cal_t *cal);
struct cal_t *ts_restore_calibration_lld(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* _TOUCHSCREEN_LLD_H */
/** @} */

View File

@ -1,93 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/touchscreen.h
* @brief TOUCHSCREEN Touchscreen driver subsystem header file.
*
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef TOUCHSCREEN_H
#define TOUCHSCREEN_H
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/* Include the low level driver information */
#include "lld/touchscreen/touchscreen_lld.h"
/* For definitions of coord_t, we require gdisp.h */
#include "gdisp.h"
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
/**
* @brief Struct used for calibration
*/
typedef struct cal_t {
float ax;
float bx;
float cx;
float ay;
float by;
float cy;
} cal_t;
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void tsInit(const TouchscreenDriver *ts);
coord_t tsReadX(void);
coord_t tsReadY(void);
void tsCalibrate(void);
#if TOUCHSCREEN_HAS_PRESSED
bool_t tsPressed(void);
#endif
#if TOUCHSCREEN_HAS_PRESSURE
uint16_t tsReadZ(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* TOUCHSCREEN_H */
/** @} */

View File

@ -6,18 +6,22 @@ current stable: 1.4
*** changes after 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: GEVENT - for passing event structures from Sources to Listeners
FEATURE: GTIMER - thread context based once-off and periodic timers. FEATURE: GTIMER - thread context based once-off and periodic timers.
FEATURE: GINPUT - extensible, multiple device-type, input sub-system. 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 *** *** changes after 1.3 ***
FIX: Nokia 6610 fix FIX: Nokia 6610 fix

View File

@ -23,11 +23,9 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__) #if (GFX_USE_GDISP && GDISP_NEED_TEXT) || defined(__DOXYGEN__)
#if GDISP_NEED_TEXT
#include "gdisp/fonts.h" #include "gdisp/fonts.h"
@ -651,7 +649,4 @@
}; };
#endif #endif
#endif /* GDISP_NEED_TEXT */ #endif /* GFX_USE_GDISP && GDISP_NEED_TEXT */
#endif /* GFX_USE_GDISP */

View File

@ -27,7 +27,7 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gdisp.h" #include "gfx.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__) #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 #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. * @brief Query a property of the display.
* @pre The GDISP unit must have been initialised using @p gdispInit(). * @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 */ #endif /* GFX_USE_GDISP */
/** @} */ /** @} */

View File

@ -0,0 +1,2 @@
GFXSRC += $(GFXLIB)/src/gdisp/gdisp.c \
$(GFXLIB)/src/gdisp/fonts.c

View File

@ -27,7 +27,7 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gevent.h" #include "gfx.h"
#if GFX_USE_GEVENT || defined(__DOXYGEN__) #if GFX_USE_GEVENT || defined(__DOXYGEN__)
@ -41,14 +41,14 @@
static MUTEX_DECL(geventMutex); static MUTEX_DECL(geventMutex);
/* Our table of listener/source pairs */ /* 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. */ /* Loop through the assignment table deleting this listener/source pair. */
/* Null is treated as a wildcard. */ /* Null is treated as a wildcard. */
static void deleteAssignments(GListener *pl, GSourceHandle gsh) { static void deleteAssignments(GListener *pl, GSourceHandle gsh) {
GSourceListener *psl; 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 ((!pl || psl->pListener == pl) && (!gsh || psl->pSource == gsh)) {
if (chSemGetCounterI(&psl->pListener->waitqueue) < 0) { if (chSemGetCounterI(&psl->pListener->waitqueue) < 0) {
chBSemWait(&psl->pListener->eventlock); // Obtain the buffer lock 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) // Check if this pair is already in the table (scan for a free slot at the same time)
pslfree = 0; 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) { if (pl == psl->pListener && gsh == psl->pSource) {
// Just update the flags // Just update the flags
@ -228,7 +228,7 @@ GSourceListener *geventGetSourceListener(GSourceHandle gsh, GSourceListener *las
chBSemSignal(&lastlr->pListener->eventlock); chBSemSignal(&lastlr->pListener->eventlock);
// Loop through the table looking for attachments to this source // 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) { if (gsh == psl->pSource) {
chBSemWait(&psl->pListener->eventlock); // Obtain a lock on the listener event buffer chBSemWait(&psl->pListener->eventlock); // Obtain a lock on the listener event buffer
chMtxUnlock(); chMtxUnlock();

View File

@ -0,0 +1 @@
GFXSRC += $(GFXLIB)/src/gevent/gevent.c

View File

@ -27,9 +27,9 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.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" #error "GINPUT: GINPUT_NEED_DIAL - Not Implemented Yet"
#endif /* GINPUT_NEED_DIAL */ #endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
/** @} */ /** @} */

View File

@ -27,9 +27,9 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.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" #error "GINPUT: GINPUT_NEED_KEYBOARD - Not Implemented Yet"
#endif /* GINPUT_NEED_KEYBOARD */ #endif /* GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD */
/** @} */ /** @} */

View File

@ -27,12 +27,11 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gtimer.h" #include "gfx.h"
#include "ginput.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 GINPUT_MOUSE_NEED_CALIBRATION
#if !defined(GFX_USE_GDISP) || !GFX_USE_GDISP #if !defined(GFX_USE_GDISP) || !GFX_USE_GDISP
@ -582,5 +581,5 @@ void ginputMouseWakeupI(void) {
gtimerJabI(&MouseTimer); gtimerJabI(&MouseTimer);
} }
#endif /* GINPUT_NEED_MOUSE */ #endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */
/** @} */ /** @} */

View File

@ -27,12 +27,11 @@
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gtimer.h" #include "gfx.h"
#include "ginput.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_ISON 0x01
#define GINPUT_TOGGLE_INVERT 0x02 #define GINPUT_TOGGLE_INVERT 0x02
@ -163,5 +162,5 @@ void ginputToggleWakeupI(void) {
gtimerJabI(&ToggleTimer); gtimerJabI(&ToggleTimer);
} }
#endif /* GINPUT_NEED_TOGGLE */ #endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */
/** @} */ /** @} */

View File

@ -1,216 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file src/graph.c
* @brief GRAPH module code.
*
* @addtogroup GRAPH
* @{
*/
#include <stdlib.h>
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "graph.h"
#if GFX_USE_GRAPH || defined(__DOXYGEN__)
static void _horizontalDotLine(coord_t x0, coord_t y0, coord_t x1, uint16_t space, color_t color) {
uint16_t offset = x0;
uint16_t count = ((x1 - x0) / space);
do {
gdispDrawPixel(offset, y0, color);
offset += space;
} while(count--);
}
static void _verticalDotLine(coord_t x0, coord_t y0, coord_t y1, uint16_t space, color_t color) {
uint16_t offset = y0;
uint16_t count = ((y1 - y0) / space);
do {
gdispDrawPixel(x0, offset, color);
offset += space;
} while(count--);
}
/**
* @brief Draws a graph system
* @details Draws a graph system with two axis, X and Y.
* Different optinal parameters like grid size, grid color,
* arrow color (if any) etc. are defined in the struct.
*
* @param[in] g A pointer to a Graph struct
*
* @init
*/
void graphDrawSystem(Graph *g) {
uint16_t i;
g->x0 = g->origin_x - abs(g->xmin);
g->x1 = g->origin_x + abs(g->xmax);
g->y0 = g->origin_y + abs(g->ymin);
g->y1 = g->origin_y - abs(g->ymax);
/* X - Axis */
if(g->full_grid) {
for(i = 1; i <= ((g->origin_y - g->y1) / g->grid_size); i++) {
_horizontalDotLine(g->x0, g->origin_y - g->grid_size * i, g->x1, g->dot_space, g->grid_color);
}
for(i = 1; i <= ((g->y0 - g->origin_y) / g->grid_size); i++) {
_horizontalDotLine(g->x0, g->origin_y + g->grid_size * i, g->x1, g->dot_space, g->grid_color);
}
}
gdispDrawLine(g->x0, g->origin_y, g->x1, g->origin_y, g->axis_color);
if(g->arrows) {
gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y+5, g->axis_color);
gdispDrawLine(g->x1, g->origin_y, g->x1-5, g->origin_y-5, g->axis_color);
}
/* Y - Axis */
if(g->full_grid) {
for(i = 1; i <= ((g->origin_x - g->x0) / g->grid_size); i++) {
_verticalDotLine(g->origin_x - g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
}
for(i = 1; i <= ((g->x1 - g->origin_x) / g->grid_size); i++) {
_verticalDotLine(g->origin_x + g->grid_size * i, g->y1, g->y0, g->dot_space, g->grid_color);
}
}
gdispDrawLine(g->origin_x, g->y0, g->origin_x, g->y1, g->axis_color);
if(g->arrows) {
gdispDrawLine(g->origin_x, g->y1, g->origin_x-5, g->y1+5, g->axis_color);
gdispDrawLine(g->origin_x, g->y1, g->origin_x+5, g->y1+5, g->axis_color);
}
}
/**
* @brief Checks if x and y are inside the graph area
*
* @param[in] g The pointer to the graph
* @param[in] x,y The coordinates to be checked
*
* @return 1 if outside the graph area, 0 otherwise
*
* @notapi
*/
static bool_t _boundaryCheck(Graph *g, coord_t x, coord_t y) {
if(g->origin_x + x > g->x1)
return 1;
if(g->origin_x + x < g->x0)
return 1;
if(g->origin_y - y < g->y1)
return 1;
if(g->origin_y - y > g->y0)
return 1;
return 0;
}
/**
* @brief Draws a single dot into the graph
* @note The dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] x,y The coordinates where the data point will be drawn
* @param[in] radius The radius of the dot. One pixel if 0.
* @param[in] color The color of the dot.
*
* @api
*/
void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color) {
if(_boundaryCheck(g, x, y))
return;
if(radius == 0)
gdispDrawPixel(g->origin_x + x, g->origin_y - y, color);
else
gdispFillCircle(g->origin_x + x, g->origin_y - y, radius, color);
}
/**
* @brief Draws multiple dots into the graph
* @note A dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] coord A two dimensional int array containing the dots coordinates.
* @param[in] entries How many dots will be drawn (array index from 0 to entries);
* @param[in] radius The radius of the dots. One pixel if 0.
* @param[in] color The color of the dots.
*
* @api
*/
void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
uint16_t i;
for(i = 0; i < entries; i++) {
if(_boundaryCheck(g, coord[i][0], coord[i][1]))
continue;
if(radius == 0)
gdispDrawPixel(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], color);
else
gdispFillCircle(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], radius, color);
}
}
/**
* @brief Draws multiple dots into the graph and connects them by a line
* @note A dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] coord A two dimensional int array containing the dots coordinates.
* @param[in] entries How many dots will be drawn (array index from 0 to entries);
* @param[in] radius The radius of the dots. One pixel if 0.
* @param[in] lineColor The color of the line.
* @param[in] dotColor The color of the dots.
*
* @api
*/
void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
uint16_t i;
/* draw lines */
for(i = 0; i < entries-1; i++) {
if(_boundaryCheck(g, coord[i][0], coord[i][1]))
continue;
gdispDrawLine(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], coord[i+1][0] + g->origin_x, g->origin_y - coord[i+1][1], lineColor);
}
/* draw dots */
for(i = 0; i < entries; i++) {
if(_boundaryCheck(g, coord[i][0], coord[i][1]))
continue;
if(radius == 0)
gdispDrawPixel(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], dotColor);
else
gdispFillCircle(coord[i][0] + g->origin_x, g->origin_y - coord[i][1], radius, dotColor);
}
}
#endif /* GFX_USE_GRAPH */
/** @} */

View File

@ -19,18 +19,22 @@
*/ */
/** /**
* @file src/gtimer.c * @file src/gtimer/gtimer.c
* @brief GTIMER Driver code. * @brief GTIMER sub-system code.
* *
* @addtogroup GTIMER * @addtogroup GTIMER
* @{ * @{
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gtimer.h" #include "gfx.h"
#if GFX_USE_GTIMER || defined(__DOXYGEN__) #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_PERIODIC 0x0001
#define GTIMER_FLG_INFINITE 0x0002 #define GTIMER_FLG_INFINITE 0x0002
#define GTIMER_FLG_JABBED 0x0004 #define GTIMER_FLG_JABBED 0x0004
@ -44,7 +48,7 @@ static MUTEX_DECL(mutex);
static Thread *pThread = 0; static Thread *pThread = 0;
static GTimer *pTimerHead = 0; static GTimer *pTimerHead = 0;
static BSEMAPHORE_DECL(waitsem, TRUE); static BSEMAPHORE_DECL(waitsem, TRUE);
static WORKING_AREA(waTimerThread, GTIMER_THREAD_STACK_SIZE); static WORKING_AREA(waTimerThread, GTIMER_THREAD_WORKAREA_SIZE);
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */

View File

@ -0,0 +1 @@
GFXSRC += $(GFXLIB)/src/gtimer/gtimer.c

View File

@ -20,24 +20,20 @@
/** /**
* @file src/gwin/button.c * @file src/gwin/button.c
* @brief GWIN Driver code. * @brief GWIN sub-system button code.
* *
* @addtogroup GWIN_BUTTON * @addtogroup GWIN_BUTTON
* @{ * @{
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gwin.h" #include "gfx.h"
#include "ginput.h"
#if (GFX_USE_GWIN && GWIN_NEED_BUTTON) || defined(__DOXYGEN__) #if (GFX_USE_GWIN && GWIN_NEED_BUTTON) || defined(__DOXYGEN__)
#if !GFX_USE_GINPUT
#error "GWIN Buttons require GFX_USE_GINPUT"
#endif
#include <string.h> #include <string.h>
#include "gwin_internal.h"
#include "gwin/internal.h"
static const GButtonStyle GButtonDefaultStyle = { static const GButtonStyle GButtonDefaultStyle = {
GBTN_3D, GBTN_3D,
@ -137,7 +133,7 @@ static void gwinButtonCallback(void *param, GEvent *pe) {
* @brief Create a button window. * @brief Create a button window.
* @return NULL if there is no resultant drawing area, otherwise a window handle. * @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] x,y The screen co-ordinates for the bottom left corner of the window
* @param[in] width The width of the window * @param[in] width The width of the window
* @param[in] height The height of the window * @param[in] height The height of the window

View File

@ -20,20 +20,20 @@
/** /**
* @file src/gwin/console.c * @file src/gwin/console.c
* @brief GWIN Driver code. * @brief GWIN sub-system console code.
* *
* @addtogroup GWIN_CONSOLE * @addtogroup GWIN_CONSOLE
* @{ * @{
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gwin.h" #include "gfx.h"
#if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__) #if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__)
#include <string.h> #include <string.h>
#include "gwin_internal.h"
#include "gwin/internal.h"
#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE #define GWIN_CONSOLE_USE_CLEAR_LINES TRUE
#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE #define GWIN_CONSOLE_USE_FILLED_CHARS FALSE

425
src/gwin/graph.c 100644
View File

@ -0,0 +1,425 @@
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file src/gwin/button.c
* @brief GWIN sub-system button code.
*
* @addtogroup GWIN_BUTTON
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gfx.h"
#if (GFX_USE_GWIN && GWIN_NEED_GRAPH) || defined(__DOXYGEN__)
#include "gwin/internal.h"
#define GGRAPH_FLG_CONNECTPOINTS (GWIN_FIRST_CONTROL_FLAG<<0)
#define GGRAPH_ARROW_SIZE 5
static const GGraphStyle GGraphDefaultStyle = {
{ GGRAPH_POINT_DOT, 0, White }, // point
{ GGRAPH_LINE_DOT, 2, Gray }, // line
{ GGRAPH_LINE_SOLID, 0, White }, // x axis
{ GGRAPH_LINE_SOLID, 0, White }, // y axis
{ GGRAPH_LINE_NONE, 0, White, 0 }, // x grid
{ GGRAPH_LINE_NONE, 0, White, 0 }, // y grid
GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS // flags
};
static void pointto(GGraphObject *gg, coord_t x, coord_t y, const GGraphPointStyle *style) {
if (style->type == GGRAPH_POINT_NONE)
return;
// Convert to device space. Note the y-axis is inverted.
x += gg->gwin.x + gg->xorigin;
y = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y;
if (style->size <= 1) {
gdispDrawPixel(x, y, style->color);
return;
}
switch(style->type) {
case GGRAPH_POINT_SQUARE:
gdispDrawBox(x-style->size, y-style->size, 2*style->size, 2*style->size, style->color);
break;
#if GDISP_NEED_CIRCLE
case GGRAPH_POINT_CIRCLE:
gdispDrawCircle(x, y, style->size, style->color);
break;
#endif
case GGRAPH_POINT_DOT:
default:
gdispDrawPixel(x, y, style->color);
break;
}
}
static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t y1, const GGraphLineStyle *style) {
coord_t dy, dx;
coord_t addx, addy;
coord_t P, diff, i;
coord_t run_on, run_off, run;
if (style->type == GGRAPH_LINE_NONE)
return;
// Convert to device space. Note the y-axis is inverted.
x0 += gg->gwin.x + gg->xorigin;
y0 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y0;
x1 += gg->gwin.x + gg->xorigin;
y1 += gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y1;
if (style->size <= 0) {
// Use the driver to draw a solid line
gdispDrawLine(x0, y0, x1, y1, style->color);
return;
}
switch (style->type) {
case GGRAPH_LINE_DOT:
run_on = 1;
run_off = -style->size;
break;
case GGRAPH_LINE_DASH:
run_on = style->size;
run_off = -style->size;
break;
case GGRAPH_LINE_SOLID:
default:
// Use the driver to draw a solid line
gdispDrawLine(x0, y0, x1, y1, style->color);
return;
}
// Use Bresenham's algorithm modified to draw a stylized line
run = 0;
if (x1 >= x0) {
dx = x1 - x0;
addx = 1;
} else {
dx = x0 - x1;
addx = -1;
}
if (y1 >= y0) {
dy = y1 - y0;
addy = 1;
} else {
dy = y0 - y1;
addy = -1;
}
if (dx >= dy) {
dy *= 2;
P = dy - dx;
diff = P - dx;
for(i=0; i<=dx; ++i) {
if (run++ >= 0) {
if (run >= run_on)
run = run_off;
gdispDrawPixel(x0, y0, style->color);
}
if (P < 0) {
P += dy;
x0 += addx;
} else {
P += diff;
x0 += addx;
y0 += addy;
}
}
} else {
dx *= 2;
P = dx - dy;
diff = P - dy;
for(i=0; i<=dy; ++i) {
if (run++ >= 0) {
if (run >= run_on)
run = run_off;
gdispDrawPixel(x0, y0, style->color);
}
if (P < 0) {
P += dx;
y0 += addy;
} else {
P += diff;
x0 += addx;
y0 += addy;
}
}
}
}
/**
* @brief Create a graph window.
* @return NULL if there is no resultant drawing area, otherwise a window handle.
*
* @param[in] gg The GGraphObject structure to initialise. If this is NULL the structure is dynamically allocated.
* @param[in] x,y The screen co-ordinates for the bottom left corner of the window
* @param[in] width The width of the window
* @param[in] height The height of the window
* @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color)
* @note The coordinate system within the window for graphing operations (but not for any other drawing
* operation) is relative to the bottom left corner and then shifted right and up by the specified
* graphing x and y origin. Note that this system is inverted in the y direction relative to the display.
* This gives the best graphing arrangement ie. increasing y values are closer to the top of the display.
*
* @api
*/
GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height) {
if (!(gg = (GGraphObject *)_gwinInit((GWindowObject *)gg, x, y, width, height, sizeof(GGraphObject))))
return 0;
gg->gwin.type = GW_GRAPH;
gg->xorigin = gg->yorigin = 0;
gg->lastx = gg->lasty = 0;
gwinGraphSetStyle(&gg->gwin, &GGraphDefaultStyle);
return (GHandle)gg;
}
/**
* @brief Set the style of the graphing operations.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] pstyle The graph style to set.
* @note The graph is not automatically redrawn. The new style will apply to any new drawing operations.
*
* @api
*/
void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) {
#define gg ((GGraphObject *)gh)
if (gh->type != GW_GRAPH)
return;
gg->style.point.type = pstyle->point.type;
gg->style.point.size = pstyle->point.size;
gg->style.point.color = pstyle->point.color;
gg->style.line.type = pstyle->line.type;
gg->style.line.size = pstyle->line.size;
gg->style.line.color = pstyle->line.color;
gg->style.xaxis.type = pstyle->xaxis.type;
gg->style.xaxis.size = pstyle->xaxis.size;
gg->style.xaxis.color = pstyle->xaxis.color;
gg->style.yaxis.type = pstyle->yaxis.type;
gg->style.yaxis.size = pstyle->yaxis.size;
gg->style.yaxis.color = pstyle->yaxis.color;
gg->style.xgrid.type = pstyle->xgrid.type;
gg->style.xgrid.size = pstyle->xgrid.size;
gg->style.xgrid.color = pstyle->xgrid.color;
gg->style.xgrid.spacing = pstyle->xgrid.spacing;
gg->style.ygrid.type = pstyle->ygrid.type;
gg->style.ygrid.size = pstyle->ygrid.size;
gg->style.ygrid.color = pstyle->ygrid.color;
gg->style.ygrid.spacing = pstyle->ygrid.spacing;
#undef gg
}
/**
* @brief Set the origin for graphing operations.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] x, y The new origin for the graph (in graph coordinates relative to the bottom left corner).
* @note The graph is not automatically redrawn. The new origin will apply to any new drawing operations.
*
* @api
*/
void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) {
#define gg ((GGraphObject *)gh)
if (gh->type != GW_GRAPH)
return;
gg->xorigin = x;
gg->yorigin = y;
#undef gg
}
/**
* @brief Draw the axis and the background grid.
*
* @param[in] gh The window handle (must be a graph window)
* @note The graph is not automatically cleared. You must do that first by calling gwinClear().
*
* @api
*/
void gwinGraphDrawAxis(GHandle gh) {
#define gg ((GGraphObject *)gh)
coord_t i, xmin, ymin, xmax, ymax;
if (gh->type != GW_GRAPH)
return;
xmin = -gg->xorigin;
xmax = gh->width-gg->xorigin-1;
ymin = -gg->yorigin;
ymax = gh->height-gg->yorigin-1;
// x grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
if (gg->style.xgrid.type != GGRAPH_LINE_NONE && gg->style.xgrid.spacing >= 2) {
for(i = gg->style.xgrid.spacing; i <= xmax; i += gg->style.xgrid.spacing)
lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
for(i = -gg->style.xgrid.spacing; i >= xmin; i -= gg->style.xgrid.spacing)
lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
}
// y grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
if (gg->style.ygrid.type != GGRAPH_LINE_NONE && gg->style.ygrid.spacing >= 2) {
for(i = gg->style.ygrid.spacing; i <= ymax; i += gg->style.ygrid.spacing)
lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
for(i = -gg->style.ygrid.spacing; i >= ymin; i -= gg->style.ygrid.spacing)
lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
}
// x axis
lineto(gg, xmin, 0, xmax, 0, &gg->style.xaxis);
if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_ARROWS)) {
if (xmin > 0 || xmin < -(GGRAPH_ARROW_SIZE+1)) {
lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
}
if (xmax < 0 || xmax > (GGRAPH_ARROW_SIZE+1)) {
lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
}
}
// y axis
lineto(gg, 0, ymin, 0, ymax, &gg->style.yaxis);
if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_ARROWS)) {
if (ymin > 0 || ymin < -(GGRAPH_ARROW_SIZE+1)) {
lineto(gg, 0, ymin, GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
lineto(gg, 0, ymin, -GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
}
if (ymax < 0 || ymax > (GGRAPH_ARROW_SIZE+1)) {
lineto(gg, 0, ymax, GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
lineto(gg, 0, ymax, -GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
}
}
#undef gg
}
/**
* @brief Start a new set of graphing data.
* @details This prevents a line being drawn from the last data point to the next point to be drawn.
*
* @param[in] gh The window handle (must be a graph window)
*
* @api
*/
void gwinGraphStartSet(GHandle gh) {
if (gh->type != GW_GRAPH)
return;
gh->flags &= ~GGRAPH_FLG_CONNECTPOINTS;
}
/**
* @brief Draw a graph point.
* @details A graph point and a line connecting to the previous point will be drawn.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] x, y The new point for the graph.
*
* @api
*/
void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) {
#define gg ((GGraphObject *)gh)
if (gh->type != GW_GRAPH)
return;
if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
// Draw the line
lineto(gg, gg->lastx, gg->lasty, x, y, &gg->style.line);
// Redraw the previous point because the line may have overwritten it
pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
} else
gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
// Save this point for next time.
gg->lastx = x;
gg->lasty = y;
// Draw this point.
pointto(gg, x, y, &gg->style.point);
#undef gg
}
/**
* @brief Draw multiple graph points.
* @details A graph point and a line connecting to each previous point will be drawn.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] points The array of points for the graph.
* @param[in] count The number of points in the array.
* @note This is slightly more efficient than calling gwinGraphDrawPoint() repeatedly.
*
* @api
*/
void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count) {
#define gg ((GGraphObject *)gh)
unsigned i;
const GGraphPoint *p;
if (gh->type != GW_GRAPH)
return;
// Draw the connecting lines
for(p = points, i = 0; i < count; p++, i++) {
if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
// Draw the line
lineto(gg, gg->lastx, gg->lasty, p->x, p->y, &gg->style.line);
// Redraw the previous point because the line may have overwritten it
if (i == 0)
pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
} else
gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
// Save this point for next time.
gg->lastx = p->x;
gg->lasty = p->y;
}
// Draw the points.
for(p = points, i = 0; i < count; p++, i++)
pointto(gg, p->x, p->y, &gg->style.point);
#undef gg
}
#endif /* GFX_USE_GWIN && GWIN_NEED_GRAPH */
/** @} */

View File

@ -19,19 +19,19 @@
*/ */
/** /**
* @file src/gwin.c * @file src/gwin/gwin.c
* @brief GWIN Driver code. * @brief GWIN sub-system code.
* *
* @addtogroup GWIN * @addtogroup GWIN
* @{ * @{
*/ */
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "gwin.h" #include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__) #if GFX_USE_GWIN || defined(__DOXYGEN__)
#include "gwin/gwin_internal.h" #include "gwin/internal.h"
// Internal routine for use by GWIN components only // Internal routine for use by GWIN components only
// Initialise a window creating it dynamicly if required. // Initialise a window creating it dynamicly if required.

View File

@ -1,2 +1,5 @@
GFXSRC += $(GFXLIB)/src/gwin/console.c \ GFXSRC += $(GFXLIB)/src/gwin/gwin.c \
$(GFXLIB)/src/gwin/button.c $(GFXLIB)/src/gwin/console.c \
$(GFXLIB)/src/gwin/button.c \
$(GFXLIB)/src/gwin/graph.c

View File

@ -1,369 +0,0 @@
/* ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file src/touchscreen.c
* @brief Touchscreen Driver code.
*
* @addtogroup TOUCHSCREEN
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "touchscreen.h"
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
static struct cal_t *cal;
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
static coord_t _tsReadRealX(void) {
int32_t results = 0;
int16_t i;
coord_t x;
for(i = 0; i < TOUCHSCREEN_CONVERSIONS; i++) {
results += ts_lld_read_x();
}
/* Take the average of the readings */
x = results / TOUCHSCREEN_CONVERSIONS;
return x;
}
static coord_t _tsReadRealY(void) {
int32_t results = 0;
int16_t i;
coord_t y;
for(i = 0; i < TOUCHSCREEN_CONVERSIONS; i++) {
results += ts_lld_read_y();
}
/* Take the average of the readings */
y = results / TOUCHSCREEN_CONVERSIONS;
return y;
}
static void _tsDrawCross(uint16_t x, uint16_t y) {
gdispDrawLine(x-15, y, x-2, y, White);
gdispDrawLine(x+2, y, x+15, y, White);
gdispDrawLine(x, y-15, x, y-2, White);
gdispDrawLine(x, y+2, x, y+15, White);
gdispDrawLine(x-15, y+15, x-7, y+15, RGB2COLOR(184,158,131));
gdispDrawLine(x-15, y+7, x-15, y+15, RGB2COLOR(184,158,131));
gdispDrawLine(x-15, y-15, x-7, y-15, RGB2COLOR(184,158,131));
gdispDrawLine(x-15, y-7, x-15, y-15, RGB2COLOR(184,158,131));
gdispDrawLine(x+7, y+15, x+15, y+15, RGB2COLOR(184,158,131));
gdispDrawLine(x+15, y+7, x+15, y+15, RGB2COLOR(184,158,131));
gdispDrawLine(x+7, y-15, x+15, y-15, RGB2COLOR(184,158,131));
gdispDrawLine(x+15, y-15, x+15, y-7, RGB2COLOR(184,158,131));
}
static void _tsTransform(coord_t *x, coord_t *y) {
*x = (coord_t) (cal->ax * (*x) + cal->bx * (*y) + cal->cx);
*y = (coord_t) (cal->ay * (*x) + cal->by * (*y) + cal->cy);
}
static void _tsDo3PointCalibration(const coord_t (*cross)[2], coord_t (*points)[2], cal_t *c) {
float dx, dx0, dx1, dx2, dy0, dy1, dy2;
/* Compute all the required determinants */
dx = ((float)(points[0][0] - points[2][0])) * ((float)(points[1][1] - points[2][1]))
- ((float)(points[1][0] - points[2][0])) * ((float)(points[0][1] - points[2][1]));
dx0 = ((float)(cross[0][0] - cross[2][0])) * ((float)(points[1][1] - points[2][1]))
- ((float)(cross[1][0] - cross[2][0])) * ((float)(points[0][1] - points[2][1]));
dx1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][0] - cross[2][0]))
- ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][0] - cross[2][0]));
dx2 = cross[0][0] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
cross[1][0] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
cross[2][0] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
dy0 = ((float)(cross[0][1] - cross[2][1])) * ((float)(points[1][1] - points[2][1]))
- ((float)(cross[1][1] - cross[2][1])) * ((float)(points[0][1] - points[2][1]));
dy1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][1] - cross[2][1]))
- ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][1] - cross[2][1]));
dy2 = cross[0][1] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
cross[1][1] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
cross[2][1] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
/* Now, calculate all the required coefficients */
c->ax = dx0 / dx;
c->bx = dx1 / dx;
c->cx = dx2 / dx;
c->ay = dy0 / dx;
c->by = dy1 / dx;
c->cy = dy2 / dx;
}
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Touchscreen Driver initialization.
* @note Calling this function automatically invokes a tsCalibration()
*
* @param[in] ts The touchscreen driver struct
*
* @api
*/
void tsInit(const TouchscreenDriver *ts) {
/* Initialise Mutex */
//MUTEX_INIT
/* Initialise driver */
//MUTEX_ENTER
ts_lld_init(ts);
//MUTEX_EXIT
#if TOUCHSCREEN_STORE_CALIBRATION
cal = ts_restore_calibration_lld();
if(cal != NULL)
return; // All done
#endif
cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
if(cal == NULL)
return;
tsCalibrate();
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The X position in pixels.
*
* @api
*/
coord_t tsReadX(void) {
coord_t x, y;
#if TOUCHSCREEN_XY_INVERTED
x = _tsReadRealY();
y = _tsReadRealX();
#else
x = _tsReadRealX();
y = _tsReadRealY();
#endif
_tsTransform(&x, &y);
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return x;
case GDISP_ROTATE_90:
return y;
case GDISP_ROTATE_180:
return gdispGetWidth() - x - 1;
case GDISP_ROTATE_270:
return gdispGetWidth() - y - 1;
}
return 0;
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The Y position in pixels.
*
* @api
*/
coord_t tsReadY(void) {
coord_t x, y;
#if TOUCHSCREEN_XY_INVERTED
x = _tsReadRealY();
y = _tsReadRealX();
#else
x = _tsReadRealX();
y = _tsReadRealY();
#endif
_tsTransform(&x, &y);
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return y;
case GDISP_ROTATE_90:
return gdispGetHeight() - x - 1;
case GDISP_ROTATE_180:
return gdispGetHeight() - y - 1;
case GDISP_ROTATE_270:
return x;
}
return 0;
}
/**
* @brief Get the pressure.
*
* @return The pressure.
*
* @api
*/
#if TOUCHSCREEN_HAS_PRESSURE || defined(__DOXYGEN__)
uint16_t tsReadZ(void) {
/* ToDo */
return (ts_lld_read_z());
}
#endif
/**
* @brief Returns if touchscreen is pressed or not
*
* @return TRUE if pressed, FALSE otherwise
*
* @api
*/
#if TOUCHSCREEN_HAS_PRESSED || defined(__DOXYGEN__)
bool_t tsPressed(void) {
return ts_lld_pressed();
}
#endif
/* Define maximum no. of times to sample the calibration point */
#define MAX_CAL_SAMPLES 10
/**
* @brief Function to calibrate touchscreen
* @details This function interactively performs calibration of the touchscreen
* using 3-point calibration algorithm. Optionally, it also verifies
* the accuracy of the calibration coefficients obtained if the symbol
* TOUCHSCREEN_VERIFY_CALIBRATION is defined in the configuration.
*
* @note You don't have to call this function manually. It gets invoked by tsInit()
*
* @api
*/
void tsCalibrate(void) {
const uint16_t height = gdispGetHeight();
const uint16_t width = gdispGetWidth();
const coord_t cross[][2] = {{(width / 4), (height / 4)},
{(width - (width / 4)) , (height / 4)},
{(width - (width / 4)) , (height - (height / 4))},
{(width / 2), (height / 2)}}; /* Check point */
coord_t points[4][2];
int32_t px, py;
uint8_t i, j;
#if GDISP_NEED_CONTROL
gdispSetOrientation(GDISP_ROTATE_0);
#endif
gdispClear(Blue);
gdispFillStringBox(0, 5, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Blue, justifyCenter);
#if TOUCHSCREEN_VERIFY_CALIBRATION
calibrate:
for(i = 0; i < 4; i++) {
#else
for(i = 0; i < 3; i++) {
#endif
_tsDrawCross(cross[i][0], cross[i][1]);
while(!tsPressed())
chThdSleepMilliseconds(2); /* Be nice to other threads*/
chThdSleepMilliseconds(20); /* Allow screen to settle */
/* Take a little more samples per point and their average
* for precise calibration */
px = py = 0;
j = 0;
while(j < MAX_CAL_SAMPLES) {
if(tsPressed()) { /* We have valid pointer data */
#if TOUCHSCREEN_XY_INVERTED
py += _tsReadRealX();
px += _tsReadRealY();
#else
px += _tsReadRealX();
py += _tsReadRealY();
#endif
j++;
}
}
points[i][0] = px / j;
points[i][1] = py / j;
chThdSleepMilliseconds(100);
while(tsPressed())
chThdSleepMilliseconds(2); /* Be nice to other threads*/
gdispFillArea(cross[i][0] - 15, cross[i][1] - 15, 42, 42, Blue);
}
/* Apply 3 point calibration algorithm */
_tsDo3PointCalibration(cross, points, cal);
#if TOUCHSCREEN_VERIFY_CALIBRATION
/* Verification of correctness of calibration (optional) :
* See if the 4th point (Middle of the screen) coincides with the calibrated
* result. If point is with +/- 2 pixel margin, then successful calibration
* Else, start from the beginning.
*/
/* Transform the co-ordinates */
_tpTransform(&points[3][0], &points[3][1]);
/* Calculate the delta */
px = (points[3][0] - cross[3][0]) * (points[3][0] - cross[3][0]) +
(points[3][1] - cross[3][1]) * (points[3][1] - cross[3][1]);
if(px > 4)
goto calibrate;
#endif
/* If enabled, serialize the calibration values for storage */
#if TOUCHSCREEN_STORE_CALIBRATION
ts_store_calibration_lld(cal);
#endif
}
#endif /* GFX_USE_TOUCHSCREEN */
/** @} */