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.
This commit is contained in:
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 "hal.h"
#include "gdisp.h"
#include "gfx.h"
void mandelbrot(float x1, float y1, float x2, float y2) {
unsigned int i,j, width, height;
@ -63,7 +63,6 @@ int main(void) {
chSysInit();
gdispInit();
gdispSetOrientation(GDISP_ROTATE_270);
/* where to zoom in */
cx = -0.086f;

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

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

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/>.
*/
/*
* Make sure you have the following enabled in your halconf.h:
*
* #define GFX_USE_GDISP TRUE
* #define GFX_USE_GINPUT TRUE
* #define GFX_USE_GEVENT TRUE
* #define GFX_USE_GTIMER TRUE
* #define GFX_USE_GWIN TRUE
*
* #define GWIN_NEED_CONSOLE TRUE
* #define GWIN_NEED_BUTTON TRUE
*
* #define GINPUT_NEED_MOUSE TRUE
* #define GINPUT_NEED_TOUCH TRUE
*
* #define GDISP_NEED_CLIP TRUE
*/
#include "ch.h"
#include "hal.h"
#include "chprintf.h"
#include "gdisp.h"
#include "ginput.h"
#include "gwin.h"
#include "gfx.h"
static GConsoleObject gc;
static GButtonObject gNext;

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

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

View File

@ -28,12 +28,12 @@
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c"
#include "gdisp/lld/emulation.c"
#if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD
/* Include the user supplied board definitions */
@ -50,9 +50,11 @@
/* This controller is only ever used with a 240 x 320 display */
#if defined(GDISP_SCREEN_HEIGHT)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif

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

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

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
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 display.
* @file drivers/gdisp/Nokia6610GE8/gdisp_lld_board_example.h
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE8 display.
*
* @addtogroup GDISP
* @{
@ -41,7 +41,7 @@
*/
static __inline void init_board(void) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for init_board for your board"
#error "gdispNokia6610GE8: You must supply a definition for init_board for your board"
}
/**
@ -53,7 +53,7 @@ static __inline void init_board(void) {
*/
static __inline void setpin_reset(bool_t state) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for setpin_reset for your board"
#error "gdispNokia6610GE8: You must supply a definition for setpin_reset for your board"
}
/**
@ -68,7 +68,7 @@ static __inline void setpin_reset(bool_t state) {
*/
static __inline void set_backlight(uint8_t percent) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for set_backlight for your board"
#error "gdispNokia6610GE8: You must supply a definition for set_backlight for your board"
}
/**
@ -77,7 +77,8 @@ static __inline void set_backlight(uint8_t percent) {
* @notapi
*/
static __inline void acquire_bus(void) {
#error "gdispNokia6610: You must supply a definition for acquire_bus for your board"
/* Code here */
#error "gdispNokia6610GE8: You must supply a definition for acquire_bus for your board"
}
/**
@ -86,7 +87,8 @@ static __inline void acquire_bus(void) {
* @notapi
*/
static __inline void release_bus(void) {
#error "gdispNokia6610: You must supply a definition for release_bus for your board"
/* Code here */
#error "gdispNokia6610GE8: You must supply a definition for release_bus for your board"
}
/**
@ -98,7 +100,7 @@ static __inline void release_bus(void) {
*/
static __inline void write_cmd(uint16_t cmd) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for write_cmd for your board"
#error "gdispNokia6610GE8: You must supply a definition for write_cmd for your board"
}
/**
@ -110,7 +112,7 @@ static __inline void write_cmd(uint16_t cmd) {
*/
static __inline void write_data(uint16_t data) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for write_data for your board"
#error "gdispNokia6610GE8: You must supply a definition for write_data for your board"
}
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
@ -125,7 +127,7 @@ static __inline void write_data(uint16_t data) {
*/
static __inline uint16_t read_data(void) {
/* Code here */
#error "gdispNokia6610: You must supply a definition for read_data for your board"
#error "gdispNokia6610GE8: You must supply a definition for read_data for your board"
}
#endif

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.
*
* @addtogroup GDISP
@ -187,7 +187,7 @@ static __inline void write_data(uint16_t data) {
* @notapi
*/
static __inline uint16_t read_data(void) {
#error "gdispNokia6610: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
#error "gdispNokia6610GE8: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
return 0;
}
#endif

View File

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

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 "hal.h"
#include "gdisp.h"
#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c"
#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
#if defined(GDISP_SCREEN_HEIGHT)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GISP_SCREEN_HEIGHT
#endif
#if defined(GDISP_SCREEN_WIDTH)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
#undef GDISP_SCREEN_WIDTH
#endif

View File

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

View File

@ -28,12 +28,19 @@
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c"
#include "gdisp/lld/emulation.c"
#ifndef GDISP_SCREEN_HEIGHT
#define GDISP_SCREEN_HEIGHT 320
#endif
#ifndef GDISP_SCREEN_WIDTH
#define GDISP_SCREEN_WIDTH 240
#endif
/* All the board specific code should go in these include file so the driver
* can be ported to another board just by creating a suitable file.

View File

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

View File

@ -28,14 +28,14 @@
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define GDISP_LLD_NO_STRUCT
/* Include the emulation code for things we don't support */
#include "lld/gdisp/emulation.c"
#include "gdisp/lld/emulation.c"
/*===========================================================================*/
/* Driver local definitions. */
@ -46,6 +46,7 @@
/* Prototypes for lld driver functions */
bool_t GDISP_LLD1(init)(void);
void *GDISP_LLD1(query)(unsigned what);
void GDISP_LLD1(clear)(color_t color);
void GDISP_LLD1(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD1(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@ -79,11 +80,9 @@ void GDISP_LLD1(drawline)(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_
#if GDISP_NEED_CONTROL
void GDISP_LLD1(control)(unsigned what, void *value);
#endif
#if GDISP_NEED_QUERY
void *GDISP_LLD1(query)(unsigned what);
#endif
bool_t GDISP_LLD2(init)(void);
void *GDISP_LLD2(query)(unsigned what);
void GDISP_LLD2(clear)(color_t color);
void GDISP_LLD2(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD2(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@ -117,15 +116,13 @@ void GDISP_LLD2(drawline)(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_
#if GDISP_NEED_CONTROL
void GDISP_LLD2(control)(unsigned what, void *value);
#endif
#if GDISP_NEED_QUERY
void *GDISP_LLD2(query)(unsigned what);
#endif
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/* Our VMT table variables */
void *GDISP_LLD_VMT(query)(unsigned what);
void GDISP_LLD_VMT(clear)(color_t color);
void GDISP_LLD_VMT(drawpixel)(coord_t x, coord_t y, color_t color);
void GDISP_LLD_VMT(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@ -162,10 +159,6 @@ void GDISP_LLD_VMT(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy,
#if GDISP_NEED_CONTROL
void GDISP_LLD_VMT(control)(unsigned what, void *value);
#endif
/* Set driver specific control */
#if GDISP_NEED_QUERY
void *GDISP_LLD_VMT(query)(unsigned what);
#endif
/* Clipping Functions */
#if GDISP_NEED_CLIP
void GDISP_LLD_VMT(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy);
@ -194,6 +187,7 @@ void GDISP_LLD_VMT(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy);
bool_t gdisp_lld_init_VMT(void) {
if (GDISP_VMT_NAME1(gdisp_lld_init_)()) {
gdisp_lld_query_VMT = GDISP_VMT_NAME1(gdisp_lld_query_);
gdisp_lld_clear_VMT = GDISP_VMT_NAME1(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME1(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME1(gdisp_lld_fillarea_);
@ -224,9 +218,6 @@ bool_t gdisp_lld_init_VMT(void) {
#if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME1(gdisp_lld_control_);
#endif
#if GDISP_NEED_QUERY
gdisp_lld_query_VMT = GDISP_VMT_NAME1(gdisp_lld_query_);
#endif
#if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME1(gdisp_lld_setclip_);
#endif
@ -235,6 +226,7 @@ bool_t gdisp_lld_init_VMT(void) {
}
if (GDISP_VMT_NAME2(gdisp_lld_init_)()) {
gdisp_lld_query_VMT = GDISP_VMT_NAME2(gdisp_lld_query_);
gdisp_lld_clear_VMT = GDISP_VMT_NAME2(gdisp_lld_clear_);
gdisp_lld_drawpixel_VMT = GDISP_VMT_NAME2(gdisp_lld_drawpixel_);
gdisp_lld_fillarea_VMT = GDISP_VMT_NAME2(gdisp_lld_fillarea_);
@ -265,9 +257,6 @@ bool_t gdisp_lld_init_VMT(void) {
#if GDISP_NEED_CONTROL
gdisp_lld_control_VMT = GDISP_VMT_NAME2(gdisp_lld_control_);
#endif
#if GDISP_NEED_QUERY
gdisp_lld_query_VMT = GDISP_VMT_NAME2(gdisp_lld_query_);
#endif
#if GDISP_NEED_CLIP
gdisp_lld_setclip_VMT = GDISP_VMT_NAME2(gdisp_lld_setclip_);
#endif

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -31,7 +31,10 @@
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
#if defined(BOARD_OLIMEX_SAM7_EX256)
#if GINPUT_TOGGLE_USE_CUSTOM_BOARD
/* Include the user supplied board definitions */
#include "ginput_lld_toggle_board.h"
#elif defined(BOARD_OLIMEX_SAM7_EX256)
#include "ginput_lld_toggle_board_olimexsam7ex256.h"
#else
/* Include the user supplied board definitions */

View File

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

View File

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

12
gfx.mk
View File

@ -3,15 +3,11 @@ ifeq ($(GFXLIB),)
GFXLIB = $(CHIBIOS)/ext/gfx
endif
GFXSRC += $(GFXLIB)/src/gdisp.c \
$(GFXLIB)/src/gdisp_fonts.c \
$(GFXLIB)/src/gevent.c \
$(GFXLIB)/src/gtimer.c \
$(GFXLIB)/src/gwin.c \
$(GFXLIB)/src/touchscreen.c \
$(GFXLIB)/src/graph.c \
GFXINC += $(GFXLIB)/include
GFXSRC +=
include $(GFXLIB)/src/gdisp/gdisp.mk
include $(GFXLIB)/src/gevent/gevent.mk
include $(GFXLIB)/src/gtimer/gtimer.mk
include $(GFXLIB)/src/gwin/gwin.mk
include $(GFXLIB)/src/ginput/ginput.mk

View File

@ -19,7 +19,7 @@
*/
/**
* @file include/gdisp.h
* @file include/gdisp/gdisp.h
* @brief GDISP Graphic Driver subsystem header file.
*
* @addtogroup GDISP
@ -29,9 +29,16 @@
#ifndef _GDISP_H
#define _GDISP_H
#ifndef GFX_USE_GDISP
#define GFX_USE_GDISP FALSE
#endif
#include "gfx.h"
/* This type definition is defined here as it gets used in other gfx sub-systems even
* if GFX_USE_GDISP is FALSE.
*/
/**
* @brief The type for a coordinate or length on the screen.
*/
typedef int16_t coord_t;
#if GFX_USE_GDISP || defined(__DOXYGEN__)
@ -65,66 +72,17 @@
#define Pink HTML2COLOR(0xFFC0CB)
#define SkyBlue HTML2COLOR(0x87CEEB)
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/**
* @name GDISP more complex functionality to be compiled
* @{
*/
/**
* @brief Do the drawing functions need to be thread-safe.
* @details Defaults to FALSE
* @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
* the gdisp API thread-safe.
* @note This is more efficient than GDISP_NEED_ASYNC as it only
* requires a context switch if something else is already
* drawing.
*/
#ifndef GDISP_NEED_MULTITHREAD
#define GDISP_NEED_MULTITHREAD FALSE
#endif
/**
* @brief Use asynchronous calls (multi-thread safe).
* @details Defaults to FALSE
* @note Both GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC make
* the gdisp API thread-safe.
* @note Turning this on adds two context switches per transaction
* so it can significantly slow graphics drawing.
*/
#ifndef GDISP_NEED_ASYNC
#define GDISP_NEED_ASYNC FALSE
#endif
/** @} */
#if GDISP_NEED_MULTITHREAD && GDISP_NEED_ASYNC
#error "GDISP: Only one of GDISP_NEED_MULTITHREAD and GDISP_NEED_ASYNC should be defined."
#endif
#if GDISP_NEED_ASYNC
/* Messaging API is required for Async Multi-Thread */
#undef GDISP_NEED_MSGAPI
#define GDISP_NEED_MSGAPI TRUE
#endif
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/* Include the low level driver information */
#include "lld/gdisp/gdisp_lld.h"
#include "gdisp/lld/gdisp_lld.h"
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
typedef struct _point_t {
coord_t x;
coord_t y;
} point_t;
/**
* @brief Type for the text justification.
*/
@ -224,9 +182,7 @@ extern "C" {
#endif
/* Query driver specific data */
#if GDISP_NEED_CONTROL
void *gdispQuery(unsigned what);
#endif
#else
@ -286,8 +242,9 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/*
* Macro definitions
*/
/* Now obsolete functions */
#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
/* Macro definitions for common gets and sets */
#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))

View File

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

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.
*
* @addtogroup GDISP
@ -35,106 +35,6 @@
/* Low level driver configuration needs */
/*===========================================================================*/
/**
* @name GDISP low level driver more complex functionality to be compiled
* @{
*/
/**
* @brief Should all operations be clipped to the screen and colors validated.
* @details Defaults to TRUE.
* @note If this is FALSE, any operations that extend beyond the
* edge of the screen will have undefined results. Any
* out-of-range colors will produce undefined results.
* @note If defined then all low level and high level driver routines
* must check the validity of inputs and do something sensible
* if they are out of range. It doesn't have to be efficient,
* just valid.
*/
#ifndef GDISP_NEED_VALIDATION
#define GDISP_NEED_VALIDATION TRUE
#endif
/**
* @brief Are circle functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_CIRCLE
#define GDISP_NEED_CIRCLE TRUE
#endif
/**
* @brief Are ellipse functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_ELLIPSE
#define GDISP_NEED_ELLIPSE TRUE
#endif
/**
* @brief Are arc functions needed.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_ARC
#define GDISP_NEED_ARC FALSE
#endif
/**
* @brief Are text functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_TEXT
#define GDISP_NEED_TEXT TRUE
#endif
/**
* @brief Is scrolling needed.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_SCROLL
#define GDISP_NEED_SCROLL FALSE
#endif
/**
* @brief Is the capability to read pixels back needed.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_PIXELREAD
#define GDISP_NEED_PIXELREAD FALSE
#endif
/**
* @brief Are clipping functions needed.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_CLIP
#define GDISP_NEED_CLIP FALSE
#endif
/**
* @brief Control some aspect of the drivers operation.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_CONTROL
#define GDISP_NEED_CONTROL FALSE
#endif
/**
* @brief Query some aspect of the drivers operation.
* @details Defaults to TRUE
*/
#ifndef GDISP_NEED_QUERY
#define GDISP_NEED_QUERY TRUE
#endif
/**
* @brief Is the messaging api interface required.
* @details Defaults to FALSE
*/
#ifndef GDISP_NEED_MSGAPI
#define GDISP_NEED_MSGAPI FALSE
#endif
/** @} */
/*===========================================================================*/
/* Include the low level driver configuration information */
/*===========================================================================*/
@ -537,10 +437,6 @@
/* Driver types. */
/*===========================================================================*/
/**
* @brief The type for a coordinate or length on the screen.
*/
typedef int16_t coord_t;
/**
* @brief The type of a pixel.
*/
@ -624,9 +520,7 @@ extern "C" {
#endif
/* Query driver specific data */
#if GDISP_NEED_QUERY
extern void *GDISP_LLD_VMT(query)(unsigned what);
#endif
/* Clipping Functions */
#if GDISP_NEED_CLIP

View File

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

208
include/gdisp/options.h Normal file
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/>.
*/
/**
* @file gevent.h
* @file include/gevent/gevent.h
* @brief GEVENT GFX User Event subsystem header file.
*
* @addtogroup GEVENT
@ -27,56 +27,18 @@
#ifndef _GEVENT_H
#define _GEVENT_H
#ifndef GFX_USE_GEVENT
#define GFX_USE_GEVENT FALSE
#endif
#include "gfx.h"
#if GFX_USE_GEVENT || defined(__DOXYGEN__)
/**
* @name GEVENT macros and more complex functionality to be compiled
* @{
* @brief Data part of a static GListener initializer.
*/
/**
* @brief Data part of a static GListener initializer.
*/
#define _GLISTENER_DATA(name) { _SEMAPHORE_DATA(name.waitqueue, 0), _BSEMAPHORE_DATA(name.eventlock, FALSE), 0, 0, {0} }
/**
* @brief Static GListener initializer.
*/
#define GLISTENER_DECL(name) GListener name = _GLISTENER_DATA(name)
/**
* @brief Defines the maximum size of an event status variable.
* @details Defaults to 32 bytes
*/
#ifndef GEVENT_MAXIMUM_STATUS_SIZE
#define GEVENT_MAXIMUM_STATUS_SIZE 32
#endif
/**
* @brief Should routines assert() if they run out of resources.
* @details Defaults to FALSE.
* @details If FALSE the application must be prepared to handle these
* failures.
*/
#ifndef GEVENT_ASSERT_NO_RESOURCE
#define GEVENT_ASSERT_NO_RESOURCE FALSE
#endif
/**
* @brief Defines the maximum Source/Listener pairs in the system.
* @details Defaults to 32
*/
#ifndef MAX_SOURCE_LISTENERS
#define MAX_SOURCE_LISTENERS 32
#endif
/** @} */
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
#error "GEVENT: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
#endif
#define _GLISTENER_DATA(name) { _SEMAPHORE_DATA(name.waitqueue, 0), _BSEMAPHORE_DATA(name.eventlock, FALSE), 0, 0, {0} }
/**
* @brief Static GListener initializer.
*/
#define GLISTENER_DECL(name) GListener name = _GLISTENER_DATA(name)
/*===========================================================================*/
/* Type definitions */
@ -93,11 +55,11 @@ typedef uint16_t GEventType;
// This object can be typecast to any GEventXxxxx type to allow any sub-system (or the application) to create events.
// The prerequisite is that the new status structure type starts with a field named 'type' of type 'GEventType'.
// The total status structure also must not exceed GEVENT_MAXIMUM_STATUS_SIZE bytes.
// The total status structure also must not exceed GEVENT_MAXIMUM_SIZE bytes.
// For example, this is used by GWIN button events, GINPUT data streams etc.
typedef union GEvent_u {
GEventType type; // The type of this event
char pad[GEVENT_MAXIMUM_STATUS_SIZE]; // This is here to allow static initialisation of GEventObject's in the application.
GEventType type; // The type of this event
char pad[GEVENT_MAXIMUM_SIZE]; // This is here to allow static initialisation of GEventObject's in the application.
} GEvent;
// A special callback function

68
include/gevent/options.h Normal file
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 Normal file
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 Normal file
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 */
/** @} */

74
include/gfxconf.example.h Normal file
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/>.
*/
/**
* @file ginput/ginput_dial.h
* @file include/ginput/dial.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@ -27,25 +27,8 @@
#ifndef _GINPUT_DIAL_H
#define _GINPUT_DIAL_H
/**
* @name GINPUT more complex functionality to be compiled
* @{
*/
/**
* @brief Should analog dial functions be included.
* @details Defaults to FALSE
*/
#ifndef GINPUT_NEED_DIAL
#define GINPUT_NEED_DIAL FALSE
#endif
/** @} */
#if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/

55
include/ginput/ginput.h Normal file
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/>.
*/
/**
* @file ginput/ginput_keyboard.h
* @file include/ginput/keyboard.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@ -27,25 +27,8 @@
#ifndef _GINPUT_KEYBOARD_H
#define _GINPUT_KEYBOARD_H
/**
* @name GINPUT more complex functionality to be compiled
* @{
*/
/**
* @brief Should keyboard functions be included.
* @details Defaults to FALSE
*/
#ifndef GINPUT_NEED_KEYBOARD
#define GINPUT_NEED_KEYBOARD FALSE
#endif
/** @} */
#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/

View File

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

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file lld/ginput/toggle.h
* @file include/ginput/lld/toggle.h
* @brief GINPUT header file for toggle drivers.
*
* @addtogroup GINPUT_TOGGLE
@ -27,14 +27,7 @@
#ifndef _LLD_GINPUT_TOGGLE_H
#define _LLD_GINPUT_TOGGLE_H
#ifndef GFX_USE_GINPUT
#define GFX_USE_GINPUT FALSE
#endif
#ifndef GINPUT_NEED_TOGGLE
#define GINPUT_NEED_TOGGLE FALSE
#endif
#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) || defined(__DOXYGEN__)
#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
// Describes how the toggle bits are obtained
typedef struct GToggleConfig_t {
@ -44,14 +37,6 @@ typedef struct GToggleConfig_t {
iomode_t mode;
} GToggleConfig;
// This must be included after the above type definition
#include "ginput.h"
// n - Millisecs between poll's
#ifndef GINPUT_TOGGLE_POLL_PERIOD
#define GINPUT_TOGGLE_POLL_PERIOD 200
#endif
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/

View File

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

127
include/ginput/options.h Normal file
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/>.
*/
/**
* @file ginput/ginput_toggle.h
* @file include/ginput/toggle.h
* @brief GINPUT GFX User Input subsystem header file.
*
* @addtogroup GINPUT
@ -27,25 +27,15 @@
#ifndef _GINPUT_TOGGLE_H
#define _GINPUT_TOGGLE_H
/**
* @name GINPUT more complex functionality to be compiled
* @{
*/
/**
* @brief Should hardware toggle/switch/button (pio) functions be included.
* @details Defaults to FALSE
*/
#ifndef GINPUT_NEED_TOGGLE
#define GINPUT_NEED_TOGGLE FALSE
#endif
/** @} */
#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
// Get the hardware definitions - Number of instances etc.
#include "ginput_lld_toggle_config.h"
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
@ -53,9 +43,6 @@
// Event types for various ginput sources
#define GEVENT_TOGGLE (GEVENT_GINPUT_FIRST+3)
// Get the hardware definitions - Number of instances etc.
#include "ginput_lld_toggle_config.h"
typedef struct GEventToggle_t {
GEventType type; // The type of this event (GEVENT_TOGGLE)
uint16_t instance; // The toggle instance

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/>.
*/
/**
* @file gtimer.h
* @file include/gtimer/gtimer.h
* @brief GTIMER GFX User Timer subsystem header file.
*
* @addtogroup GTIMER
@ -27,46 +27,27 @@
#ifndef _GTIMER_H
#define _GTIMER_H
#ifndef GFX_USE_GTIMER
#define GFX_USE_GTIMER FALSE
#endif
#include "gfx.h"
#if GFX_USE_GTIMER || defined(__DOXYGEN__)
/**
* @name GTIMER macros and more complex functionality to be compiled
* @{
*/
/**
* @brief Data part of a static GTimer initializer.
*/
#define _GTIMER_DATA() {0,0,0,0,0,0,0}
/**
* @brief Static GTimer initializer.
*/
#define GTIMER_DECL(name) GTimer name = _GTIMER_DATA()
/**
* @brief Defines the size of the timer threads work area (stack+structures).
* @details Defaults to 512 bytes
*/
#ifndef GTIMER_THREAD_STACK_SIZE
#define GTIMER_THREAD_STACK_SIZE 512
#endif
/** @} */
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#if !CH_USE_MUTEXES || !CH_USE_SEMAPHORES
#error "GTIMER: CH_USE_MUTEXES and CH_USE_SEMAPHORES must be defined in chconf.h"
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
// A callback function (executed in a thread context)
/**
* @brief Data part of a static GTimer initializer.
*/
#define _GTIMER_DATA() {0,0,0,0,0,0,0}
/**
* @brief Static GTimer initializer.
*/
#define GTIMER_DECL(name) GTimer name = _GTIMER_DATA()
/**
* @brief A callback function (executed in a thread context).
*/
typedef void (*GTimerFunction)(void *param);
/**

View File

@ -18,42 +18,35 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* !!! IMPORTANT !!!
/**
* @file include/gtimer/options.h
* @brief GTIMER sub-system options header file.
*
* This example dosen't compile yet, there's a problem in the console source.
* This issue will be fixed soon.
* @addtogroup GTIMER
* @{
*/
/*
* Please add the following to your halconf.h
*
* #define GFX_USE_CONSOLE TRUE
* #define GDISP_NEED_SCROLL TRUE
#ifndef _GTIMER_OPTIONS_H
#define _GTIMER_OPTIONS_H
/**
* @name GTIMER Functionality to be included
* @{
*/
/**
* @}
*
* @name GTIMER Optional Sizing Parameters
* @{
*/
/**
* @brief Defines the size of the timer threads work area (stack+structures).
* @details Defaults to 512 bytes
*/
#ifndef GTIMER_THREAD_WORKAREA_SIZE
#define GTIMER_THREAD_WORKAREA_SIZE 512
#endif
/** @} */
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "chprintf.h"
#include "console.h"
static GConsole CON1;
int main(void) {
halInit();
chSysInit();
gdispInit();
gdispClear(Lime);
gfxConsoleInit(&CON1, 0, 0, gdispGetWidth(), gdispGetHeight(), &fontLarger, Black, White);
chprintf((BaseSequentialStream *)&CON1, "Hello the time is %d\nGoodbye.", chTimeNow());
while (TRUE) {
chThdSleepMilliseconds(100);
}
}
#endif /* _GTIMER_OPTIONS_H */
/** @} */

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file gwin/gwin_button.h
* @file include/gwin/button.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@ -27,20 +27,6 @@
#ifndef _GWIN_BUTTON_H
#define _GWIN_BUTTON_H
/**
* @name GWIN more complex functionality to be compiled
* @{
*/
/**
* @brief Should button functions be included.
* @details Defaults to FALSE
*/
#ifndef GWIN_NEED_BUTTON
#define GWIN_NEED_BUTTON FALSE
#endif
/** @} */
#if GWIN_NEED_BUTTON || defined(__DOXYGEN__)
/*===========================================================================*/
@ -50,24 +36,6 @@
#define GW_BUTTON 0x0002
#define GEVENT_GWIN_BUTTON (GEVENT_GWIN_FIRST+0)
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#if !GDISP_NEED_TEXT
#error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_BUTTON is defined."
#endif
#if !defined(GFX_USE_GEVENT) || !GFX_USE_GEVENT
#error "GWIN Buttons require GFX_USE_GEVENT"
#endif
#include "gevent.h"
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/

View File

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file gwin/gwin_console.h
* @file include/gwin/console.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@ -27,19 +27,6 @@
#ifndef _GWIN_CONSOLE_H
#define _GWIN_CONSOLE_H
/**
* @name GWIN more complex functionality to be compiled
* @{
*/
/**
* @brief Should console functions be included.
* @details Defaults to FALSE
*/
#ifndef GWIN_NEED_CONSOLE
#define GWIN_NEED_CONSOLE FALSE
#endif
/** @} */
#if GWIN_NEED_CONSOLE || defined(__DOXYGEN__)
/*===========================================================================*/
@ -48,18 +35,6 @@
#define GW_CONSOLE 0x0001
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#if GWIN_NEED_CONSOLE && !GDISP_NEED_TEXT
#error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_CONSOLE is defined."
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/

156
include/gwin/graph.h Normal file
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/>.
*/
/**
* @file gwin.h
* @file include/gwin/gwin.h
* @brief GWIN Graphic window subsystem header file.
*
* @addtogroup GWIN
@ -27,39 +27,10 @@
#ifndef _GWIN_H
#define _GWIN_H
#ifndef GFX_USE_GWIN
#define GFX_USE_GWIN FALSE
#endif
#include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/**
* @name GWIN more complex functionality to be compiled
* @{
*/
/** @} */
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
#if !defined(GFX_USE_GDISP) || !GFX_USE_GDISP
#error "GWIN: GFX_USE_GDISP must also be defined"
#endif
#include "gdisp.h"
#if !GDISP_NEED_CLIP
#warning "GWIN: Drawing can occur outside the defined window as GDISP_NEED_CLIP is FALSE"
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
@ -145,7 +116,7 @@ void gwinDestroyWindow(GHandle gh);
/* Set up for text */
#if GDISP_NEED_TEXT
void gwinSetFont(GHandle gh, font_t font);
void gwinSetFont(GHandle gh, font_t font);
#endif
/* Drawing Functions */
@ -194,8 +165,9 @@ void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coor
#endif
/* Include extra window types */
#include "gwin/gwin_console.h"
#include "gwin/gwin_button.h"
#include "gwin/console.h"
#include "gwin/button.h"
#include "gwin/graph.h"
#endif /* GFX_USE_GWIN */

View File

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

71
include/gwin/options.h Normal file
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 ***
FEATURE: Added three point calibration
FIX: Touchpad renamed into Touchscreen
FIX: tsIRQ() renamed into tsPressed()
FEATURE: Touchscreen support added to gdisp Win32 driver
FIX: gdisp Win32 driver fixes
DEPRECATE: console deprecated - replaced with gwin functionality
FEATURE: ILI9320 GDISP driver
FEATURE: gdisp Win32 driver - full orientation support
FEATURE: GEVENT - for passing event structures from Sources to Listeners
FEATURE: GTIMER - thread context based once-off and periodic timers.
FEATURE: GINPUT - extensible, multiple device-type, input sub-system.
FEATURE: GWIN - full button, console and graph support
FEATURE: Numerous touch calibration improvements
FEATURE: Win32 driver - now support gdisp & ginput mouse/touch/toggle
FEATURE: Win32 driver - full gdisp orientation support
FEATURE: ILI9320 GDISP driver
FEATURE: Nokia6610 GDISP driver split in to GE8 and GE12 variants
FEATURE: Many GDISP drivers changed to use a board interface definition
FEATURE: GFX source restructure with new gfx.h include file.
DEPRECATE: console deprecated - replaced with gwin functionality
DEPRECATE: graph deprecated - replaced with gwin functionality
DEPRECATE: touchscreen deprecated - replaced with ginput functionality
FEATURE: Numerous documentation improvements
FEATURE: Added a number of module demo and test programs
*** changes after 1.3 ***
FIX: Nokia 6610 fix

View File

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

View File

@ -27,7 +27,7 @@
*/
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "gfx.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
@ -731,7 +731,7 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
}
#endif
#if (GDISP_NEED_QUERY && (GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC)) || defined(__DOXYGEN__)
#if (GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC) || defined(__DOXYGEN__)
/**
* @brief Query a property of the display.
* @pre The GDISP unit must have been initialised using @p gdispInit().
@ -1266,4 +1266,3 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#endif /* GFX_USE_GDISP */
/** @} */

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

1
src/gevent/gevent.mk Normal file
View File

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

View File

@ -27,9 +27,9 @@
*/
#include "ch.h"
#include "hal.h"
#include "ginput.h"
#include "gfx.h"
#if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
#if (GFX_USE_GINPUT && GINPUT_NEED_DIAL) || defined(__DOXYGEN__)
#error "GINPUT: GINPUT_NEED_DIAL - Not Implemented Yet"
#endif /* GINPUT_NEED_DIAL */
#endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
/** @} */

View File

@ -27,9 +27,9 @@
*/
#include "ch.h"
#include "hal.h"
#include "ginput.h"
#include "gfx.h"
#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__)
#if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || defined(__DOXYGEN__)
#error "GINPUT: GINPUT_NEED_KEYBOARD - Not Implemented Yet"
#endif /* GINPUT_NEED_KEYBOARD */
#endif /* GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD */
/** @} */

View File

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

View File

@ -27,12 +27,11 @@
*/
#include "ch.h"
#include "hal.h"
#include "gtimer.h"
#include "ginput.h"
#include "gfx.h"
#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__)
#if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) || defined(__DOXYGEN__)
#include "lld/ginput/toggle.h"
#include "ginput/lld/toggle.h"
#define GINPUT_TOGGLE_ISON 0x01
#define GINPUT_TOGGLE_INVERT 0x02
@ -163,5 +162,5 @@ void ginputToggleWakeupI(void) {
gtimerJabI(&ToggleTimer);
}
#endif /* GINPUT_NEED_TOGGLE */
#endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */
/** @} */

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

1
src/gtimer/gtimer.mk Normal file
View File

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

View File

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

View File

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

425
src/gwin/graph.c Normal file
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
* @brief GWIN Driver code.
* @file src/gwin/gwin.c
* @brief GWIN sub-system code.
*
* @addtogroup GWIN
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gwin.h"
#include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__)
#include "gwin/gwin_internal.h"
#include "gwin/internal.h"
// Internal routine for use by GWIN components only
// Initialise a window creating it dynamicly if required.

View File

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

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