From a67cafeaa7fad2c9611647a8c9f71531750e260a Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Sat, 6 Apr 2013 21:53:40 +1000 Subject: [PATCH] Move demos to better locations --- .../touch_driver_test}/gfxconf.h | 94 +-- .../touch_driver_test}/main.c | 698 +++++++++--------- .../modules/{window => gwin/basic}/gfxconf.h | 66 +- demos/modules/{window => gwin/basic}/main.c | 134 ++-- demos/modules/{ => gwin}/console/gfxconf.h | 86 +-- demos/modules/{ => gwin}/console/main.c | 174 ++--- 6 files changed, 626 insertions(+), 626 deletions(-) rename demos/modules/{ginput_touch_driver_test => ginput/touch_driver_test}/gfxconf.h (96%) rename demos/modules/{ginput_touch_driver_test => ginput/touch_driver_test}/main.c (96%) rename demos/modules/{window => gwin/basic}/gfxconf.h (96%) rename demos/modules/{window => gwin/basic}/main.c (96%) rename demos/modules/{ => gwin}/console/gfxconf.h (96%) rename demos/modules/{ => gwin}/console/main.c (96%) diff --git a/demos/modules/ginput_touch_driver_test/gfxconf.h b/demos/modules/ginput/touch_driver_test/gfxconf.h similarity index 96% rename from demos/modules/ginput_touch_driver_test/gfxconf.h rename to demos/modules/ginput/touch_driver_test/gfxconf.h index 05f685dd..e00aaedb 100644 --- a/demos/modules/ginput_touch_driver_test/gfxconf.h +++ b/demos/modules/ginput/touch_driver_test/gfxconf.h @@ -1,47 +1,47 @@ -/** - * 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 - -/* Builtin Fonts */ -#define GDISP_INCLUDE_FONT_SMALL FALSE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 TRUE -#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE - -/* Features for the GWIN sub-system. */ -#define GWIN_NEED_BUTTON TRUE -#define GWIN_NEED_CONSOLE TRUE - -/* Features for the GINPUT sub-system. */ -#define GINPUT_NEED_MOUSE TRUE - -#endif /* _GFXCONF_H */ +/** + * 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 + +/* Builtin Fonts */ +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + +/* Features for the GWIN sub-system. */ +#define GWIN_NEED_BUTTON TRUE +#define GWIN_NEED_CONSOLE TRUE + +/* Features for the GINPUT sub-system. */ +#define GINPUT_NEED_MOUSE TRUE + +#endif /* _GFXCONF_H */ diff --git a/demos/modules/ginput_touch_driver_test/main.c b/demos/modules/ginput/touch_driver_test/main.c similarity index 96% rename from demos/modules/ginput_touch_driver_test/main.c rename to demos/modules/ginput/touch_driver_test/main.c index 306ab631..95d29d28 100644 --- a/demos/modules/ginput_touch_driver_test/main.c +++ b/demos/modules/ginput/touch_driver_test/main.c @@ -1,349 +1,349 @@ -/* - ChibiOS/GFX - Copyright (C) 2012, 2013 - 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 "chprintf.h" -#include "gfx.h" - -static GConsoleObject gc; -static GButtonObject gNext; -static GButtonObject gPrev; -static GListener gl; - -/*------------------------------------------------------------------------* - * GINPUT Touch Driver Calibrator. * - *------------------------------------------------------------------------*/ -int main(void) { - GSourceHandle gs, gsNext, gsPrev; - GEvent *pe; - GEventMouse *pem; - GEventGWinButton *peb; - coord_t swidth, sheight; - GHandle ghc, ghNext, ghPrev; - BaseSequentialStream *gp; - GEventType deviceType; - font_t font; - - halInit(); // Initialise the Hardware - chSysInit(); // Initialize the OS - gdispInit(); // Initialize the display - - // Get the display dimensions - swidth = gdispGetWidth(); - sheight = gdispGetHeight(); - ghNext = ghPrev = 0; - - // Create our title - font = gdispOpenFont("UI2"); - gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Red, White, justifyLeft); - - // Create our main display window - ghc = gwinCreateConsole(&gc, 0, 20, swidth, sheight-20, font); - gwinClear(ghc); - gp = gwinGetConsoleStream(ghc); - - // Initialize the mouse in our special no calibration mode. - geventListenerInit(&gl); - gs = ginputGetMouse(9999); - geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA); - - /* - * Test: Device Type - */ - -StepDeviceType: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n1. DEVICE TYPE\n\n"); - - pem = (GEventMouse *)&gl.event; - ginputGetMouseStatus(0, pem); - deviceType = pem->type; - - gwinSetColor(ghc, White); - chprintf(gp, "This is detected as a %s device\n\n", - deviceType == GEVENT_MOUSE ? "MOUSE" : (pem->type == GEVENT_TOUCH ? "TOUCH" : "UNKNOWN")); - - if (ghNext) - chprintf(gp, "Press Next or Back to continue.\n"); - else if (deviceType == GEVENT_MOUSE) - chprintf(gp, "Click the mouse button to move on to the next test.\n"); - else - chprintf(gp, "Press and release your finger to move on to the next test.\n"); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepClickJitter; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) - break; - } - } - - /* - * Test: Mouse raw reading jitter - */ - -StepRawJitter: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n2. GINPUT_MOUSE_READ_CYCLES\n\n"); - - gwinSetColor(ghc, White); - if (deviceType == GEVENT_MOUSE) - chprintf(gp, "Press and hold the mouse button.\n\n"); - else - chprintf(gp, "Press and hold on the surface.\n\n"); - chprintf(gp, "Numbers will display in this window.\n" - "Ensure that values don't jump around very much when your finger is stationary.\n\n" - "Increasing GINPUT_MOUSE_READ_CYCLES helps reduce jitter but increases CPU usage.\n\n"); - - if (ghNext) - chprintf(gp, "Press Next or Back to continue.\n"); - else if (deviceType == GEVENT_MOUSE) - chprintf(gp, "Release the mouse button to move on to the next test.\n"); - else - chprintf(gp, "Release your finger to move on to the next test.\n"); - - // For this test turn on ALL mouse movement events - geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA|GLISTEN_MOUSENOFILTER); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepDeviceType; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) - chprintf(gp, "%u:%u\n", pem->x, pem->y); - if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) - break; - } - } - - // Reset to just changed movements. - geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA); - - /* - * Test: Calibration - */ - -StepCalibrate: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n3. GINPUT_MOUSE_CALIBRATION_ERROR\n\n"); - gwinSetColor(ghc, Gray); - chprintf(gp, "Ensure GINPUT_MOUSE_NEED_CALIBRATION = TRUE and GINPUT_MOUSE_CALIBRATION_ERROR is >= 0\n\n"); - gwinSetColor(ghc, White); - chprintf(gp, "You will be presented with a number of points to touch.\nPress them in turn.\n\n" - "If the calibration repeatedly fails, increase GINPUT_MOUSE_CALIBRATION_ERROR and try again.\n\n"); - - if (ghNext) - chprintf(gp, "Press Next to start the calibration.\n"); - else if (deviceType == GEVENT_MOUSE) - chprintf(gp, "Click the mouse button to start the calibration.\n"); - else - chprintf(gp, "Press and release your finger to start the calibration.\n"); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepRawJitter; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) - break; - } - } - - // Calibrate - ginputCalibrateMouse(0); - - /* From now on we can use Next and Previous Buttons */ - if (!ghNext) { - - ghNext = gwinCreateButton(&gNext, swidth-50, 0, 50, 20, font, GBTN_NORMAL); - gwinSetButtonText(ghNext, "Next", FALSE); - gsNext = gwinGetButtonSource(ghNext); - geventAttachSource(&gl, gsNext, 0); - gwinAttachButtonMouseSource(ghNext, gs); - - ghPrev = gwinCreateButton(&gPrev, swidth-100, 0, 50, 20, font, GBTN_NORMAL); - gwinSetButtonText(ghPrev, "Back", FALSE); - gsPrev = gwinGetButtonSource(ghPrev); - geventAttachSource(&gl, gsPrev, 0); - gwinAttachButtonMouseSource(ghPrev, gs); - -#if 0 - { - GSourceHandle gsButton1, gsButton2; - - // Attach a couple of hardware toggle buttons to our Next and Back buttons as well. - // We can always use the mouse to trigger the buttons if you don't want to use hardware toggles. - // This code depends on your hardware. Turn it on only if you have - // defined a board definition for your toggle driver. Then change - // the next two lines to be correct for your hardware. The values - // below are correct for the Win32 toggle driver. - gsButton1 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY1); - gsButton2 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY2); - gwinAttachButtonToggleSource(ghNext, gsButton2); - gwinAttachButtonToggleSource(ghPrev, gsButton1); - } -#endif - } - - // Calibration used the whole screen - re-establish our title - gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Green, White, justifyLeft); - gwinButtonDraw(ghNext); - gwinButtonDraw(ghPrev); - - /* - * Test: Mouse movement jitter - */ - -StepJitter: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n4. GINPUT_MOUSE_MOVE_JITTER\n\n"); - - gwinSetColor(ghc, White); - if (deviceType == GEVENT_MOUSE) - chprintf(gp, "Press and hold the mouse button and move around as if to draw.\n\n"); - else - chprintf(gp, "Press firmly on the surface and move around as if to draw.\n\n"); - - chprintf(gp, "Dots will display in this window. Ensure that when you stop moving your finger that " - "new dots stop displaying.\nNew dots should only display when your finger is moving.\n\n" - "Adjust GINPUT_MOUSE_MOVE_JITTER to the smallest value that this reliably works for.\n\n"); - chprintf(gp, "Press Next or Back to continue.\n\n"); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepCalibrate; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) - chprintf(gp, "."); - } - } - - /* - * Test: Polling frequency - */ - -StepPolling: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n5. GINPUT_MOUSE_POLL_PERIOD\n\n"); - - gwinSetColor(ghc, White); - chprintf(gp, "Press firmly on the surface (or press and hold the mouse button) and move around as if to draw.\n\n"); - chprintf(gp, "A green line will follow your finger.\n" - "Adjust GINPUT_MOUSE_POLL_PERIOD to the highest value that provides a line without " - "gaps that are too big.\nDecreasing the value increases CPU usage.\n" - "About 25 (millisecs) normally produces good results." - "This test can be ignored for interrupt driven drivers.\n\n"); - chprintf(gp, "Press Next or Back to continue.\n\n"); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepJitter; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) - gdispDrawPixel(pem->x, pem->y, Green); - } - } - - /* - * Test: Click Jitter - */ - -StepClickJitter: - gwinClear(ghc); - gwinSetColor(ghc, Yellow); - chprintf(gp, "\n6. GINPUT_MOUSE_MAX_CLICK_JITTER\n\n"); - - gwinSetColor(ghc, White); - chprintf(gp, "Press and release the touch surface to \"click\".\nTry both short and long presses.\n"); - chprintf(gp, "For a mouse click with the left and right buttons.\n\n"); - chprintf(gp, "Dots will display in this window. A yellow dash is a left (or short) click. " - "A red x is a right (or long) click.\n\n" - "Adjust GINPUT_MOUSE_CLICK_JITTER to the smallest value that this reliably works for.\n" - "Adjust GINPUT_MOUSE_CLICK_TIME to adjust distinguishing short vs long presses.\n" - "TIME_INFINITE means there are no long presses (although a right mouse button will still work).\n\n" - "Note: moving your finger (mouse) during a click cancels it.\n\n"); - chprintf(gp, "This is the last test but you can press Next or Back to continue.\n\n"); - - while(1) { - pe = geventEventWait(&gl, TIME_INFINITE); - if (pe->type == GEVENT_GWIN_BUTTON) { - peb = (GEventGWinButton *)pe; - if (peb->button == ghPrev) - goto StepPolling; - if (peb->button == ghNext) - break; - } - if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { - pem = (GEventMouse *)pe; - if ((pem->meta & GMETA_MOUSE_CLICK)) { - gwinSetColor(ghc, Yellow); - chprintf(gp, "-"); - } - if ((pem->meta & GMETA_MOUSE_CXTCLICK)) { - gwinSetColor(ghc, Red); - chprintf(gp, "x"); - } - } - } - - // Can't let this really exit - goto StepDeviceType; -} +/* + ChibiOS/GFX - Copyright (C) 2012, 2013 + 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 "chprintf.h" +#include "gfx.h" + +static GConsoleObject gc; +static GButtonObject gNext; +static GButtonObject gPrev; +static GListener gl; + +/*------------------------------------------------------------------------* + * GINPUT Touch Driver Calibrator. * + *------------------------------------------------------------------------*/ +int main(void) { + GSourceHandle gs, gsNext, gsPrev; + GEvent *pe; + GEventMouse *pem; + GEventGWinButton *peb; + coord_t swidth, sheight; + GHandle ghc, ghNext, ghPrev; + BaseSequentialStream *gp; + GEventType deviceType; + font_t font; + + halInit(); // Initialise the Hardware + chSysInit(); // Initialize the OS + gdispInit(); // Initialize the display + + // Get the display dimensions + swidth = gdispGetWidth(); + sheight = gdispGetHeight(); + ghNext = ghPrev = 0; + + // Create our title + font = gdispOpenFont("UI2"); + gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Red, White, justifyLeft); + + // Create our main display window + ghc = gwinCreateConsole(&gc, 0, 20, swidth, sheight-20, font); + gwinClear(ghc); + gp = gwinGetConsoleStream(ghc); + + // Initialize the mouse in our special no calibration mode. + geventListenerInit(&gl); + gs = ginputGetMouse(9999); + geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA); + + /* + * Test: Device Type + */ + +StepDeviceType: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n1. DEVICE TYPE\n\n"); + + pem = (GEventMouse *)&gl.event; + ginputGetMouseStatus(0, pem); + deviceType = pem->type; + + gwinSetColor(ghc, White); + chprintf(gp, "This is detected as a %s device\n\n", + deviceType == GEVENT_MOUSE ? "MOUSE" : (pem->type == GEVENT_TOUCH ? "TOUCH" : "UNKNOWN")); + + if (ghNext) + chprintf(gp, "Press Next or Back to continue.\n"); + else if (deviceType == GEVENT_MOUSE) + chprintf(gp, "Click the mouse button to move on to the next test.\n"); + else + chprintf(gp, "Press and release your finger to move on to the next test.\n"); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepClickJitter; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) + break; + } + } + + /* + * Test: Mouse raw reading jitter + */ + +StepRawJitter: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n2. GINPUT_MOUSE_READ_CYCLES\n\n"); + + gwinSetColor(ghc, White); + if (deviceType == GEVENT_MOUSE) + chprintf(gp, "Press and hold the mouse button.\n\n"); + else + chprintf(gp, "Press and hold on the surface.\n\n"); + chprintf(gp, "Numbers will display in this window.\n" + "Ensure that values don't jump around very much when your finger is stationary.\n\n" + "Increasing GINPUT_MOUSE_READ_CYCLES helps reduce jitter but increases CPU usage.\n\n"); + + if (ghNext) + chprintf(gp, "Press Next or Back to continue.\n"); + else if (deviceType == GEVENT_MOUSE) + chprintf(gp, "Release the mouse button to move on to the next test.\n"); + else + chprintf(gp, "Release your finger to move on to the next test.\n"); + + // For this test turn on ALL mouse movement events + geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA|GLISTEN_MOUSENOFILTER); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepDeviceType; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) + chprintf(gp, "%u:%u\n", pem->x, pem->y); + if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) + break; + } + } + + // Reset to just changed movements. + geventAttachSource(&gl, gs, GLISTEN_MOUSEDOWNMOVES|GLISTEN_MOUSEMETA); + + /* + * Test: Calibration + */ + +StepCalibrate: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n3. GINPUT_MOUSE_CALIBRATION_ERROR\n\n"); + gwinSetColor(ghc, Gray); + chprintf(gp, "Ensure GINPUT_MOUSE_NEED_CALIBRATION = TRUE and GINPUT_MOUSE_CALIBRATION_ERROR is >= 0\n\n"); + gwinSetColor(ghc, White); + chprintf(gp, "You will be presented with a number of points to touch.\nPress them in turn.\n\n" + "If the calibration repeatedly fails, increase GINPUT_MOUSE_CALIBRATION_ERROR and try again.\n\n"); + + if (ghNext) + chprintf(gp, "Press Next to start the calibration.\n"); + else if (deviceType == GEVENT_MOUSE) + chprintf(gp, "Click the mouse button to start the calibration.\n"); + else + chprintf(gp, "Press and release your finger to start the calibration.\n"); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepRawJitter; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if (!ghNext && (pem->meta & GMETA_MOUSE_UP)) + break; + } + } + + // Calibrate + ginputCalibrateMouse(0); + + /* From now on we can use Next and Previous Buttons */ + if (!ghNext) { + + ghNext = gwinCreateButton(&gNext, swidth-50, 0, 50, 20, font, GBTN_NORMAL); + gwinSetButtonText(ghNext, "Next", FALSE); + gsNext = gwinGetButtonSource(ghNext); + geventAttachSource(&gl, gsNext, 0); + gwinAttachButtonMouseSource(ghNext, gs); + + ghPrev = gwinCreateButton(&gPrev, swidth-100, 0, 50, 20, font, GBTN_NORMAL); + gwinSetButtonText(ghPrev, "Back", FALSE); + gsPrev = gwinGetButtonSource(ghPrev); + geventAttachSource(&gl, gsPrev, 0); + gwinAttachButtonMouseSource(ghPrev, gs); + +#if 0 + { + GSourceHandle gsButton1, gsButton2; + + // Attach a couple of hardware toggle buttons to our Next and Back buttons as well. + // We can always use the mouse to trigger the buttons if you don't want to use hardware toggles. + // This code depends on your hardware. Turn it on only if you have + // defined a board definition for your toggle driver. Then change + // the next two lines to be correct for your hardware. The values + // below are correct for the Win32 toggle driver. + gsButton1 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY1); + gsButton2 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY2); + gwinAttachButtonToggleSource(ghNext, gsButton2); + gwinAttachButtonToggleSource(ghPrev, gsButton1); + } +#endif + } + + // Calibration used the whole screen - re-establish our title + gdispFillStringBox(0, 0, swidth, 20, "Touch Calibration", font, Green, White, justifyLeft); + gwinButtonDraw(ghNext); + gwinButtonDraw(ghPrev); + + /* + * Test: Mouse movement jitter + */ + +StepJitter: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n4. GINPUT_MOUSE_MOVE_JITTER\n\n"); + + gwinSetColor(ghc, White); + if (deviceType == GEVENT_MOUSE) + chprintf(gp, "Press and hold the mouse button and move around as if to draw.\n\n"); + else + chprintf(gp, "Press firmly on the surface and move around as if to draw.\n\n"); + + chprintf(gp, "Dots will display in this window. Ensure that when you stop moving your finger that " + "new dots stop displaying.\nNew dots should only display when your finger is moving.\n\n" + "Adjust GINPUT_MOUSE_MOVE_JITTER to the smallest value that this reliably works for.\n\n"); + chprintf(gp, "Press Next or Back to continue.\n\n"); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepCalibrate; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) + chprintf(gp, "."); + } + } + + /* + * Test: Polling frequency + */ + +StepPolling: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n5. GINPUT_MOUSE_POLL_PERIOD\n\n"); + + gwinSetColor(ghc, White); + chprintf(gp, "Press firmly on the surface (or press and hold the mouse button) and move around as if to draw.\n\n"); + chprintf(gp, "A green line will follow your finger.\n" + "Adjust GINPUT_MOUSE_POLL_PERIOD to the highest value that provides a line without " + "gaps that are too big.\nDecreasing the value increases CPU usage.\n" + "About 25 (millisecs) normally produces good results." + "This test can be ignored for interrupt driven drivers.\n\n"); + chprintf(gp, "Press Next or Back to continue.\n\n"); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepJitter; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if ((pem->current_buttons & GINPUT_MOUSE_BTN_LEFT)) + gdispDrawPixel(pem->x, pem->y, Green); + } + } + + /* + * Test: Click Jitter + */ + +StepClickJitter: + gwinClear(ghc); + gwinSetColor(ghc, Yellow); + chprintf(gp, "\n6. GINPUT_MOUSE_MAX_CLICK_JITTER\n\n"); + + gwinSetColor(ghc, White); + chprintf(gp, "Press and release the touch surface to \"click\".\nTry both short and long presses.\n"); + chprintf(gp, "For a mouse click with the left and right buttons.\n\n"); + chprintf(gp, "Dots will display in this window. A yellow dash is a left (or short) click. " + "A red x is a right (or long) click.\n\n" + "Adjust GINPUT_MOUSE_CLICK_JITTER to the smallest value that this reliably works for.\n" + "Adjust GINPUT_MOUSE_CLICK_TIME to adjust distinguishing short vs long presses.\n" + "TIME_INFINITE means there are no long presses (although a right mouse button will still work).\n\n" + "Note: moving your finger (mouse) during a click cancels it.\n\n"); + chprintf(gp, "This is the last test but you can press Next or Back to continue.\n\n"); + + while(1) { + pe = geventEventWait(&gl, TIME_INFINITE); + if (pe->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pe; + if (peb->button == ghPrev) + goto StepPolling; + if (peb->button == ghNext) + break; + } + if (pe->type == GEVENT_MOUSE || pe->type == GEVENT_TOUCH) { + pem = (GEventMouse *)pe; + if ((pem->meta & GMETA_MOUSE_CLICK)) { + gwinSetColor(ghc, Yellow); + chprintf(gp, "-"); + } + if ((pem->meta & GMETA_MOUSE_CXTCLICK)) { + gwinSetColor(ghc, Red); + chprintf(gp, "x"); + } + } + } + + // Can't let this really exit + goto StepDeviceType; +} diff --git a/demos/modules/window/gfxconf.h b/demos/modules/gwin/basic/gfxconf.h similarity index 96% rename from demos/modules/window/gfxconf.h rename to demos/modules/gwin/basic/gfxconf.h index c8080075..e567e5a0 100644 --- a/demos/modules/window/gfxconf.h +++ b/demos/modules/gwin/basic/gfxconf.h @@ -1,33 +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 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 - -#endif /* _GFXCONF_H */ +/** + * 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 + +#endif /* _GFXCONF_H */ diff --git a/demos/modules/window/main.c b/demos/modules/gwin/basic/main.c similarity index 96% rename from demos/modules/window/main.c rename to demos/modules/gwin/basic/main.c index 6571f109..a0326fac 100644 --- a/demos/modules/window/main.c +++ b/demos/modules/gwin/basic/main.c @@ -1,67 +1,67 @@ -/* - ChibiOS/GFX - Copyright (C) 2012, 2013 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/GFX is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "gfx.h" - -/* The handles for our two Windows */ -GHandle GW1, GW2; - -int main(void) { - halInit(); - chSysInit(); - coord_t i, j; - - /* 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); - - 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 - * of windows - */ - gwinFillCircle(GW1, 20, 20, 15); - gwinFillCircle(GW2, 20, 20, 15); - - while(TRUE) { - chThdSleepMilliseconds(500); - } -} - +/* + ChibiOS/GFX - Copyright (C) 2012, 2013 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +/* The handles for our two Windows */ +GHandle GW1, GW2; + +int main(void) { + halInit(); + chSysInit(); + coord_t i, j; + + /* 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); + + 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 + * of windows + */ + gwinFillCircle(GW1, 20, 20, 15); + gwinFillCircle(GW2, 20, 20, 15); + + while(TRUE) { + chThdSleepMilliseconds(500); + } +} + diff --git a/demos/modules/console/gfxconf.h b/demos/modules/gwin/console/gfxconf.h similarity index 96% rename from demos/modules/console/gfxconf.h rename to demos/modules/gwin/console/gfxconf.h index 254bf181..178beb86 100644 --- a/demos/modules/console/gfxconf.h +++ b/demos/modules/gwin/console/gfxconf.h @@ -1,43 +1,43 @@ -/** - * 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 - -/* Builtin Fonts */ -#define GDISP_INCLUDE_FONT_SMALL TRUE -#define GDISP_INCLUDE_FONT_LARGER FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 TRUE -#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE - -/* Features for the GWIN sub-system. */ -#define GWIN_NEED_CONSOLE TRUE - -#endif /* _GFXCONF_H */ +/** + * 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 + +/* Builtin Fonts */ +#define GDISP_INCLUDE_FONT_SMALL TRUE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + +/* Features for the GWIN sub-system. */ +#define GWIN_NEED_CONSOLE TRUE + +#endif /* _GFXCONF_H */ diff --git a/demos/modules/console/main.c b/demos/modules/gwin/console/main.c similarity index 96% rename from demos/modules/console/main.c rename to demos/modules/gwin/console/main.c index 63a4c6ee..90ebf86f 100644 --- a/demos/modules/console/main.c +++ b/demos/modules/gwin/console/main.c @@ -1,87 +1,87 @@ -/* - ChibiOS/GFX - Copyright (C) 2012, 2013 - 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 "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; - font_t font1, font2; - - halInit(); - chSysInit(); - - /* initialize and clear the display */ - gdispInit(); - gdispClear(Black); - font1 = gdispOpenFont("UI2 Double"); - font2 = gdispOpenFont("Small"); - - /* create the three console windows and set a font for each */ - GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, font1); - GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), font2); - GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), font2); - - /* Set the fore- and background colors for each console */ - gwinSetColor(GW1, Green); - 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, 2013 + 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 "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; + font_t font1, font2; + + halInit(); + chSysInit(); + + /* initialize and clear the display */ + gdispInit(); + gdispClear(Black); + font1 = gdispOpenFont("UI2 Double"); + font2 = gdispOpenFont("Small"); + + /* create the three console windows and set a font for each */ + GW1 = gwinCreateConsole(NULL, 0, 0, gdispGetWidth(), gdispGetHeight()/2, font1); + GW2 = gwinCreateConsole(NULL, 0, gdispGetHeight()/2, gdispGetWidth()/2, gdispGetHeight(), font2); + GW3 = gwinCreateConsole(NULL, gdispGetWidth()/2, gdispGetHeight()/2, gdispGetWidth(), gdispGetHeight(), font2); + + /* Set the fore- and background colors for each console */ + gwinSetColor(GW1, Green); + 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); + } +} +