From 9da1afa34ac189c7cc50aedd4df688bd0c9b66d7 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 20 Dec 2012 18:32:33 +1000 Subject: [PATCH 1/3] Using ginput with polling allow thread preemption GINPUT when being exclusively polled by the application, did not allow pre-emption of the main thread and therefore some platforms (Win32) the mouse/toggle stopped working. --- src/ginput/mouse.c | 4 ++++ src/ginput/toggle.c | 4 ++++ 2 files changed, 8 insertions(+) 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; From 5bdab7a8a8f71c913b0966586cba4203457df8b3 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 20 Dec 2012 18:33:43 +1000 Subject: [PATCH 2/3] Fixes for the SSD1289 driver Put aquire_bus() and release_bus() in the right place in the control routine. Simplify reset_viewport(). A couple of other simple tidyups. --- drivers/gdisp/SSD1289/gdisp_lld.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) 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 From 2c5d5c51183fbdb01f24afdbb5d29dbf00f4f836 Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Thu, 20 Dec 2012 18:34:12 +1000 Subject: [PATCH 3/3] New & updated GDISP demo programs --- demos/modules/gdisp_basics/gfxconf.h | 33 +++++++++++++ demos/modules/gdisp_basics/main.c | 51 +++++++++++++++++++ demos/modules/gdisp_circles/gfxconf.h | 33 +++++++++++++ demos/modules/gdisp_circles/main.c | 52 ++++++++++++++++++++ demos/modules/gdisp_text/gfxconf.h | 33 +++++++++++++ demos/modules/gdisp_text/main.c | 71 +++++++++++++++++++++++++++ demos/modules/window/main.c | 5 ++ 7 files changed, 278 insertions(+) create mode 100644 demos/modules/gdisp_basics/gfxconf.h create mode 100644 demos/modules/gdisp_basics/main.c create mode 100644 demos/modules/gdisp_circles/gfxconf.h create mode 100644 demos/modules/gdisp_circles/main.c create mode 100644 demos/modules/gdisp_text/gfxconf.h create mode 100644 demos/modules/gdisp_text/main.c 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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +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 + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +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