aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTectu <joel@unormal.org>2012-12-20 08:41:59 -0800
committerTectu <joel@unormal.org>2012-12-20 08:41:59 -0800
commit65aa1d42d6421a47880d826b2cd8e532b17fc55c (patch)
tree89d346903bcacba72d2d28571cdab69f0b71a15e
parente00f8593e85245a847280dafe10e5a834268557e (diff)
parent2c5d5c51183fbdb01f24afdbb5d29dbf00f4f836 (diff)
downloaduGFX-65aa1d42d6421a47880d826b2cd8e532b17fc55c.tar.gz
uGFX-65aa1d42d6421a47880d826b2cd8e532b17fc55c.tar.bz2
uGFX-65aa1d42d6421a47880d826b2cd8e532b17fc55c.zip
Merge pull request #29 from inmarket/master
New demos, ginput fix, SSD1289 fix
-rw-r--r--demos/modules/gdisp_basics/gfxconf.h33
-rw-r--r--demos/modules/gdisp_basics/main.c51
-rw-r--r--demos/modules/gdisp_circles/gfxconf.h33
-rw-r--r--demos/modules/gdisp_circles/main.c52
-rw-r--r--demos/modules/gdisp_text/gfxconf.h33
-rw-r--r--demos/modules/gdisp_text/main.c71
-rw-r--r--demos/modules/window/main.c5
-rw-r--r--drivers/gdisp/SSD1289/gdisp_lld.c31
-rw-r--r--src/ginput/mouse.c4
-rw-r--r--src/ginput/toggle.c4
10 files changed, 303 insertions, 14 deletions
diff --git a/demos/modules/gdisp_basics/gfxconf.h b/demos/modules/gdisp_basics/gfxconf.h
new file mode 100644
index 00000000..498046b4
--- /dev/null
+++ b/demos/modules/gdisp_basics/gfxconf.h
@@ -0,0 +1,33 @@
+/**
+ * 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 TRUE
+#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
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/gdisp_basics/main.c b/demos/modules/gdisp_basics/main.c
new file mode 100644
index 00000000..e18b0e9e
--- /dev/null
+++ b/demos/modules/gdisp_basics/main.c
@@ -0,0 +1,51 @@
+/*
+ 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"
+
+int main(void) {
+ coord_t width, height;
+ coord_t i, j;
+
+ halInit();
+ chSysInit();
+
+ /* Initialize and clear the display */
+ gdispInit();
+ gdispClear(Black);
+
+ // Get the screen size
+ width = gdispGetWidth();
+ height = gdispGetHeight();
+
+ // Code Here
+ gdispDrawBox(10, 10, width/2, height/2, Yellow);
+ gdispFillArea (width/2, height/2, width/2-10, height/2-10, Blue);
+ gdispDrawLine (5, 30, width-50, height-40, Red);
+ for(i=5, j=0; i < width && j < height; i+=7, j+=i/20)
+ gdispDrawPixel (i, j, White);
+
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+}
+
diff --git a/demos/modules/gdisp_circles/gfxconf.h b/demos/modules/gdisp_circles/gfxconf.h
new file mode 100644
index 00000000..00d88e48
--- /dev/null
+++ b/demos/modules/gdisp_circles/gfxconf.h
@@ -0,0 +1,33 @@
+/**
+ * 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 TRUE
+#define GDISP_NEED_TEXT FALSE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE TRUE
+#define GDISP_NEED_ARC TRUE
+#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
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/gdisp_circles/main.c b/demos/modules/gdisp_circles/main.c
new file mode 100644
index 00000000..d682a6ff
--- /dev/null
+++ b/demos/modules/gdisp_circles/main.c
@@ -0,0 +1,52 @@
+/*
+ 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"
+
+int main(void) {
+ coord_t width, height;
+
+ halInit();
+ chSysInit();
+
+ /* Initialize and clear the display */
+ gdispInit();
+ gdispClear(Black);
+
+ // Get the screen size
+ width = gdispGetWidth();
+ height = gdispGetHeight();
+
+ // Code Here
+ gdispDrawCircle(width/2, height/2, 20, Yellow);
+ gdispFillCircle (width/4, height/4, 50, Blue);
+ gdispFillEllipse (width-100, height-100, 30, 60, Red);
+ gdispDrawEllipse (width-100, height-100, 50, 20, Yellow);
+ gdispDrawArc(width-width/8, height/8, 30, 10, 70, Gray);
+ gdispFillArc(width/8, height/8, 30, 10, 70, Gray);
+
+
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+}
+
diff --git a/demos/modules/gdisp_text/gfxconf.h b/demos/modules/gdisp_text/gfxconf.h
new file mode 100644
index 00000000..a928806b
--- /dev/null
+++ b/demos/modules/gdisp_text/gfxconf.h
@@ -0,0 +1,33 @@
+/**
+ * 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 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
+
+#endif /* _GFXCONF_H */
diff --git a/demos/modules/gdisp_text/main.c b/demos/modules/gdisp_text/main.c
new file mode 100644
index 00000000..907e84be
--- /dev/null
+++ b/demos/modules/gdisp_text/main.c
@@ -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/>.
+*/
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+int main(void) {
+ coord_t width, height;
+ font_t font1, font2, font3, font4;
+ const char *msg;
+
+ halInit();
+ chSysInit();
+
+ /* Initialize and clear the display */
+ gdispInit();
+ gdispClear(Black);
+
+ // Get the screen size
+ width = gdispGetWidth();
+ height = gdispGetHeight();
+
+ // Get the fonts we want to use
+ font1 = gdispOpenFont("UI2");
+ font2 = gdispOpenFont("UI2 Double");
+ font3 = gdispOpenFont("UI2 Narrow");
+ font4 = gdispOpenFont("LargeNumbers");
+
+ // Display large numbers on the right (measuring the string)
+ msg = "123456";
+ gdispDrawString(width-gdispGetStringWidth(msg, font4)-3, 3, msg, font4, Green);
+ // Display the font name under it.
+ msg = gdispGetFontName(font4);
+ gdispDrawString(width-gdispGetStringWidth(msg, font1)-3, 20, msg, font1, Green);
+
+ // Demonstrate our other fonts
+ gdispDrawString(10, 10, "Writing with Font 'UI2'", font1, Yellow);
+ gdispFillString(10, 35, "Writing with Font 'UI2 Double'", font2, Red, White);
+ gdispDrawStringBox(0, 50, width, 40, "Writing with Font 'UI2 Narrow'", font3, Red, justifyCenter);
+ gdispFillStringBox(0, 90, width, 40, "Filled Centered", font3, Pink, Gray, justifyCenter);
+
+ // Clean up the fonts
+ gdispCloseFont(font1);
+ gdispCloseFont(font2);
+ gdispCloseFont(font3);
+ gdispCloseFont(font4);
+
+ // Wait forever
+ while(TRUE) {
+ chThdSleepMilliseconds(500);
+ }
+}
+
diff --git a/demos/modules/window/main.c b/demos/modules/window/main.c
index 88f71be3..e9cf21e0 100644
--- a/demos/modules/window/main.c
+++ b/demos/modules/window/main.c
@@ -28,6 +28,7 @@ GHandle GW1, GW2;
int main(void) {
halInit();
chSysInit();
+ coord_t i, j;
/* Initialize and clear the display */
gdispInit();
@@ -47,6 +48,10 @@ int main(void) {
gwinClear(GW1);
gwinClear(GW2);
+ gwinDrawLine (GW1, 5, 30, 150, 110);
+ for(i=5, j=0; i < 200 && j < 150; i+=3, j+=i/20)
+ gwinDrawPixel (GW1, i, j);
+
/*
* Draw two filled circles at the same coordinate
* of each window to demonstrate the relative coordinates
diff --git a/drivers/gdisp/SSD1289/gdisp_lld.c b/drivers/gdisp/SSD1289/gdisp_lld.c
index 6b7069c9..d8d185cd 100644
--- a/drivers/gdisp/SSD1289/gdisp_lld.c
+++ b/drivers/gdisp/SSD1289/gdisp_lld.c
@@ -95,7 +95,7 @@ static __inline void set_cursor(coord_t x, coord_t y) {
}
}
-void set_viewport(coord_t x, coord_t y, coord_t cx, coord_t cy) {
+static void set_viewport(coord_t x, coord_t y, coord_t cx, coord_t cy) {
set_cursor(x, y);
@@ -134,17 +134,8 @@ void set_viewport(coord_t x, coord_t y, coord_t cx, coord_t cy) {
set_cursor(x, y);
}
-void reset_viewport(void) {
- switch(GDISP.Orientation) {
- case GDISP_ROTATE_0:
- case GDISP_ROTATE_180:
- set_viewport(0, 0, GDISP_SCREEN_WIDTH, GDISP_SCREEN_HEIGHT);
- break;
- case GDISP_ROTATE_90:
- case GDISP_ROTATE_270:
- set_viewport(0, 0, GDISP_SCREEN_HEIGHT, GDISP_SCREEN_WIDTH);
- break;
- }
+static __inline void reset_viewport(void) {
+ set_viewport(0, 0, GDISP.Width, GDISP.Height);
}
/*===========================================================================*/
@@ -499,25 +490,30 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
* @notapi
*/
void GDISP_LLD(control)(unsigned what, void *value) {
- acquire_bus();
switch(what) {
case GDISP_CONTROL_POWER:
if (GDISP.Powermode == (gdisp_powermode_t)value)
return;
switch((gdisp_powermode_t)value) {
case powerOff:
+ acquire_bus();
write_reg(0x0010, 0x0000); // leave sleep mode
write_reg(0x0007, 0x0000); // halt operation
write_reg(0x0000, 0x0000); // turn off oszillator
write_reg(0x0010, 0x0001); // enter sleepmode
+ release_bus();
break;
case powerOn:
+ acquire_bus();
write_reg(0x0010, 0x0000); // leave sleep mode
+ release_bus();
if (GDISP.Powermode != powerSleep)
GDISP_LLD(init)();
break;
case powerSleep:
+ acquire_bus();
write_reg(0x0010, 0x0001); // enter sleep mode
+ release_bus();
break;
default:
return;
@@ -529,30 +525,38 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
return;
switch((gdisp_orientation_t)value) {
case GDISP_ROTATE_0:
+ acquire_bus();
write_reg(0x0001, 0x2B3F);
/* ID = 11 AM = 0 */
write_reg(0x0011, 0x6070);
+ release_bus();
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_90:
+ acquire_bus();
write_reg(0x0001, 0x293F);
/* ID = 11 AM = 1 */
write_reg(0x0011, 0x6078);
+ release_bus();
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
case GDISP_ROTATE_180:
+ acquire_bus();
write_reg(0x0001, 0x2B3F);
/* ID = 01 AM = 0 */
write_reg(0x0011, 0x6040);
+ release_bus();
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_270:
+ acquire_bus();
write_reg(0x0001, 0x293F);
/* ID = 01 AM = 1 */
write_reg(0x0011, 0x6048);
+ release_bus();
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
@@ -572,7 +576,6 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
case GDISP_CONTROL_CONTRAST:
*/
}
- release_bus();
}
#endif
diff --git a/src/ginput/mouse.c b/src/ginput/mouse.c
index 35a55bc5..94734888 100644
--- a/src/ginput/mouse.c
+++ b/src/ginput/mouse.c
@@ -378,6 +378,10 @@ GSourceHandle ginputGetMouse(uint16_t instance) {
}
bool_t ginputGetMouseStatus(uint16_t instance, GEventMouse *pe) {
+ // Win32 threads don't seem to recognise priority and/or pre-emption
+ // so we add a sleep here to prevent 100% polled applications from locking up.
+ chThdSleepMilliseconds(1);
+
if (instance || (MouseConfig.flags & (FLG_INIT_DONE|FLG_IN_CAL)) != FLG_INIT_DONE)
return FALSE;
diff --git a/src/ginput/toggle.c b/src/ginput/toggle.c
index 66021cd0..4401e295 100644
--- a/src/ginput/toggle.c
+++ b/src/ginput/toggle.c
@@ -145,6 +145,10 @@ void ginputInvertToggle(uint16_t instance, bool_t invert) {
* Returns FALSE on error (eg invalid instance)
*/
bool_t ginputGetToggleStatus(uint16_t instance, GEventToggle *ptoggle) {
+ // Win32 threads don't seem to recognise priority and/or pre-emption
+ // so we add a sleep here to prevent 100% polled applications from locking up.
+ chThdSleepMilliseconds(1);
+
if (instance >= GINPUT_TOGGLE_NUM_PORTS)
return FALSE;
ptoggle->type = GEVENT_TOGGLE;