From bf8ceb278fc285eff477294e1ae2cf539ada747b Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 12:38:47 +0100 Subject: [PATCH 01/12] improving performance of gwinListAddItem() by Marc Pignat --- src/gwin/list.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gwin/list.c b/src/gwin/list.c index 0f09e86e..972ea1ab 100644 --- a/src/gwin/list.c +++ b/src/gwin/list.c @@ -431,13 +431,14 @@ int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) { ListItem *newItem; if (useAlloc) { - if (!(newItem = (ListItem *)gfxAlloc(sizeof(ListItem)+strlen(item_name)+1))) + size_t len = strlen(item_name)+1; + if (!(newItem = gfxAlloc(sizeof(ListItem) + len))) return -1; - strcpy((char *)(newItem+1), item_name); + memcpy((char *)(newItem+1), item_name, len); item_name = (const char *)(newItem+1); } else { - if (!(newItem = (ListItem *)gfxAlloc(sizeof(ListItem)))) + if (!(newItem = gfxAlloc(sizeof(ListItem)))) return -1; } From 6515373b2a63a24b77ff20a26e9b18468f29a6f9 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 12:59:36 +0100 Subject: [PATCH 02/12] removing casts of gfxAlloc() return value as that is the whole idea behind having a void pointer --- demos/3rdparty/doom/i_system.c | 4 ++-- demos/modules/gadc/gwinosc.c | 4 ++-- drivers/gaudin/Win32/gaudin_lld.c | 2 +- drivers/multiple/Win32/gdisp_lld_Win32.c | 2 +- drivers/multiple/uGFXnet/gdisp_lld_uGFXnet.c | 2 +- src/gos/raw32.c | 2 +- src/gwin/console.c | 2 +- src/gwin/gwidget.c | 2 +- src/gwin/gwin.c | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/demos/3rdparty/doom/i_system.c b/demos/3rdparty/doom/i_system.c index 094144f6..aa1d7481 100644 --- a/demos/3rdparty/doom/i_system.c +++ b/demos/3rdparty/doom/i_system.c @@ -66,7 +66,7 @@ int I_GetHeapSize (void) byte* I_ZoneBase (int* size) { *size = mb_used*1024*1024; - return (byte *) gfxAlloc (*size); + return gfxAlloc (*size); } @@ -124,7 +124,7 @@ byte* I_Malloc(int length) { byte* mem; - mem = (byte *)gfxAlloc (length); + mem = gfxAlloc (length); memset (mem,0,length); return mem; } diff --git a/demos/modules/gadc/gwinosc.c b/demos/modules/gadc/gwinosc.c index b7201088..4cc1fc3a 100644 --- a/demos/modules/gadc/gwinosc.c +++ b/demos/modules/gadc/gwinosc.c @@ -70,9 +70,9 @@ GHandle gwinGScopeCreate(GDisplay *g, GScopeObject *gs, GWindowInit *pInit, uint return 0; gfxSemInit(&gs->bsem, 0, 1); gs->nextx = 0; - if (!(gs->lastscopetrace = (coord_t *)gfxAlloc(gs->g.width * sizeof(coord_t)))) + if (!(gs->lastscopetrace = gfxAlloc(gs->g.width * sizeof(coord_t)))) return 0; - if (!(gs->audiobuf = (adcsample_t *)gfxAlloc(AUDIOBUFSZ * sizeof(adcsample_t)))) + if (!(gs->audiobuf = gfxAlloc(AUDIOBUFSZ * sizeof(adcsample_t)))) return 0; #if TRIGGER_METHOD == TRIGGER_POSITIVERAMP gs->lasty = gs->g.height/2; diff --git a/drivers/gaudin/Win32/gaudin_lld.c b/drivers/gaudin/Win32/gaudin_lld.c index 665c89f7..dce4cad3 100644 --- a/drivers/gaudin/Win32/gaudin_lld.c +++ b/drivers/gaudin/Win32/gaudin_lld.c @@ -139,7 +139,7 @@ void gaudin_lld_init(const gaudin_params *paud) { /* We need to allocate a wave header for each buffer */ nBuffers = (paud->bufcount + paud->samplesPerEvent - 1) / paud->samplesPerEvent; - if (!(pWaveHdrs = (WAVEHDR *)gfxAlloc(nBuffers * sizeof(WAVEHDR)))) { + if (!(pWaveHdrs = gfxAlloc(nBuffers * sizeof(WAVEHDR)))) { fprintf(stderr, "GAUDIN: Buffer header allocation failed\n"); return; } diff --git a/drivers/multiple/Win32/gdisp_lld_Win32.c b/drivers/multiple/Win32/gdisp_lld_Win32.c index 2910e9eb..9425bd36 100644 --- a/drivers/multiple/Win32/gdisp_lld_Win32.c +++ b/drivers/multiple/Win32/gdisp_lld_Win32.c @@ -458,7 +458,7 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { #endif // Create a private area for this window - priv = (winPriv *)gfxAlloc(sizeof(winPriv)); + priv = gfxAlloc(sizeof(winPriv)); assert(priv != 0); memset(priv, 0, sizeof(winPriv)); g->priv = priv; diff --git a/drivers/multiple/uGFXnet/gdisp_lld_uGFXnet.c b/drivers/multiple/uGFXnet/gdisp_lld_uGFXnet.c index 6f75b512..787062f6 100644 --- a/drivers/multiple/uGFXnet/gdisp_lld_uGFXnet.c +++ b/drivers/multiple/uGFXnet/gdisp_lld_uGFXnet.c @@ -433,7 +433,7 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { #endif // Create a private area for this window - if (!(priv = (netPriv *)gfxAlloc(sizeof(netPriv)))) + if (!(priv = gfxAlloc(sizeof(netPriv)))) gfxHalt("GDISP: uGFXnet - Memory allocation failed"); memset(priv, 0, sizeof(netPriv)); g->priv = priv; diff --git a/src/gos/raw32.c b/src/gos/raw32.c index 5a65ea86..5e11064c 100644 --- a/src/gos/raw32.c +++ b/src/gos/raw32.c @@ -542,7 +542,7 @@ static void _gosThreadsInit(void) { char * framebase; // Allocate a buffer to store our test data - pframeinfo = (saveloc *)gfxAlloc(sizeof(saveloc)*2); + pframeinfo = gfxAlloc(sizeof(saveloc)*2); // Get details of the stack frame from within a function get_stack_state_in_fn(); diff --git a/src/gwin/console.c b/src/gwin/console.c index ef374220..623404be 100644 --- a/src/gwin/console.c +++ b/src/gwin/console.c @@ -285,7 +285,7 @@ GHandle gwinGConsoleCreate(GDisplay *g, GConsoleObject *gc, const GWindowInit *p gcw->bufsize *= gh->height / gdispGetFontMetric(gh->font, fontHeight); // Allocate the buffer - if (!(gcw->buffer = (char*)gfxAlloc(gcw->bufsize))) + if (!(gcw->buffer = gfxAlloc(gcw->bufsize))) return FALSE; // All good! diff --git a/src/gwin/gwidget.c b/src/gwin/gwidget.c index db9dc9fa..484b8c37 100644 --- a/src/gwin/gwidget.c +++ b/src/gwin/gwidget.c @@ -338,7 +338,7 @@ void gwinSetText(GHandle gh, const char *text, bool_t useAlloc) { else if (useAlloc) { char *str; - if ((str = (char *)gfxAlloc(strlen(text)+1))) { + if ((str = gfxAlloc(strlen(text)+1))) { gh->flags |= GWIN_FLG_ALLOCTXT; strcpy(str, text); } diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index 6b9cb81e..11dcdaf1 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -102,7 +102,7 @@ void _gwinInit(void) { GHandle _gwindowCreate(GDisplay *g, GWindowObject *pgw, const GWindowInit *pInit, const gwinVMT *vmt, uint16_t flags) { // Allocate the structure if necessary if (!pgw) { - if (!(pgw = (GWindowObject *)gfxAlloc(vmt->size))) + if (!(pgw = gfxAlloc(vmt->size))) return 0; pgw->flags = flags|GWIN_FLG_DYNAMIC; } else From 5b8cebb79731f5b1712b0e8c3dfecbf5f3e7b561 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 14:02:31 +0100 Subject: [PATCH 03/12] doc --- releases.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/releases.txt b/releases.txt index 2cf47a9a..6d33e662 100644 --- a/releases.txt +++ b/releases.txt @@ -12,6 +12,7 @@ FIX: Console does not execute gwinPrintf() anymore if not visible FEATURE: Added gwinGetColor() and gwinGetBgColor() FEATURE: Console does now have an optional buffer (GWIN_CONSOLE_USE_HISTORY) FEATURE: Added smooth scrolling to list widget +FEATURE: Increased performance of gwinListAddItem() *** changes after 1.9 *** From fababafc9a4fce83c4a6879624a8caa38ea9f438 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 16:55:04 +0100 Subject: [PATCH 04/12] whitespaces --- src/gwin/gwin.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index 11dcdaf1..94799482 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -167,7 +167,9 @@ color_t gwinGetDefaultBgColor(void) { GHandle gwinGWindowCreate(GDisplay *g, GWindowObject *pgw, const GWindowInit *pInit) { if (!(pgw = _gwindowCreate(g, pgw, pInit, &basegwinVMT, 0))) return 0; + gwinSetVisible(pgw, pInit->show); + return pgw; } From a11f7da53638ee4fe282c7b5725294ca1780f9bf Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 19:24:43 +0100 Subject: [PATCH 05/12] added deinit() routines for all modules (not implemented so far) --- include/gfx.h | 11 ++++++-- src/gadc/gadc.c | 8 +++++- src/gaudin/gaudin.c | 9 +++++-- src/gaudout/gaudout.c | 10 ++++++++ src/gdisp/gdisp.c | 9 +++++-- src/gevent/gevent.c | 8 +++++- src/gfx.c | 58 +++++++++++++++++++++++++++++++++++-------- src/ginput/ginput.c | 20 +++++++++++---- src/gmisc/gmisc.c | 9 ++++++- src/gos/chibios.c | 9 +++++-- src/gos/linux.c | 8 +++++- src/gos/osx.c | 8 +++++- src/gos/raw32.c | 8 +++++- src/gos/win32.c | 8 +++++- src/gtimer/gtimer.c | 8 +++++- src/gwin/gwidget.c | 8 +++++- src/gwin/gwin.c | 17 ++++++++++++- src/gwin/gwm.c | 8 +++++- 18 files changed, 190 insertions(+), 34 deletions(-) diff --git a/include/gfx.h b/include/gfx.h index 3a10103f..d261a6ce 100644 --- a/include/gfx.h +++ b/include/gfx.h @@ -204,8 +204,15 @@ extern "C" { */ void gfxInit(void); - /* Compatibility for old programs */ - void DEPRECATED("Use gfxInit() instead") gdispInit(void); + /** + * @brief The one call to end it all + * + * @note This will deinitialise each sub-system that has been turned on. + * @note Do not call this without a previous @p gfxInit(); + * + * @api + */ + void gfxDeinit(void); #ifdef __cplusplus } diff --git a/src/gadc/gadc.c b/src/gadc/gadc.c index e297ef7e..bfa655df 100644 --- a/src/gadc/gadc.c +++ b/src/gadc/gadc.c @@ -236,7 +236,8 @@ void GADC_ISR_ErrorI(ADCDriver *adcp, adcerror_t err) { } /* Our module initialiser */ -void _gadcInit(void) { +void _gadcInit(void) +{ gadc_lld_init(); gfxSemInit(&gadcsem, GADC_MAX_LOWSPEED_DEVICES, GADC_MAX_LOWSPEED_DEVICES); gfxMutexInit(&gadcmutex); @@ -246,6 +247,11 @@ void _gadcInit(void) { #endif } +void _gadcDeinit(void) +{ + /* ToDo */ +} + static inline void StartADC(bool_t onNoHS) { gfxSystemLock(); if (!(gflags & GADC_GFLG_ISACTIVE) || (onNoHS && !curlsdev)) diff --git a/src/gaudin/gaudin.c b/src/gaudin/gaudin.c index a6e173ce..2f0883e7 100644 --- a/src/gaudin/gaudin.c +++ b/src/gaudin/gaudin.c @@ -85,13 +85,18 @@ void GAUDIN_ISR_ErrorI(void) { /* Ignore any errors for now */ } -/* The module initialiser */ -void _gaudinInit(void) { +void _gaudinInit(void) +{ #if GFX_USE_GEVENT gtimerInit(&AudGTimer); #endif } +void _gaudinDeinit(void) +{ + /* ToDo */ +} + bool_t gaudinInit(uint16_t channel, uint32_t frequency, audin_sample_t *buffer, size_t bufcount, size_t samplesPerEvent) { /* Check the channel is valid */ if (channel >= GAUDIN_NUM_CHANNELS || frequency > GAUDIN_MAX_SAMPLE_FREQUENCY) diff --git a/src/gaudout/gaudout.c b/src/gaudout/gaudout.c index e05fc360..56692453 100644 --- a/src/gaudout/gaudout.c +++ b/src/gaudout/gaudout.c @@ -18,6 +18,16 @@ #error "GAUDOUT: Not implemented yet" +void _gaudoutInit(void) +{ + /* ToDo */ +} + +void _gaudoutDeinit(void) +{ + /* ToDo */ +} + #endif /* GFX_USE_GAUDOUT */ /** @} */ diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c index 13f2eda2..3031c455 100644 --- a/src/gdisp/gdisp.c +++ b/src/gdisp/gdisp.c @@ -566,8 +566,8 @@ static void line_clip(GDisplay *g) { /* Driver exported functions. */ /*===========================================================================*/ -/* Our module initialiser */ -void _gdispInit(void) { +void _gdispInit(void) +{ GDisplay *g; uint16_t i; @@ -627,6 +627,11 @@ void _gdispInit(void) { #endif } +void _gdispDeinit(void) +{ + /* ToDo */ +} + GDisplay *gdispGetDisplay(unsigned display) { if (display >= GDISP_TOTAL_DISPLAYS) return 0; diff --git a/src/gevent/gevent.c b/src/gevent/gevent.c index 6681fb53..67b32747 100644 --- a/src/gevent/gevent.c +++ b/src/gevent/gevent.c @@ -46,10 +46,16 @@ static void deleteAssignments(GListener *pl, GSourceHandle gsh) { } } -void _geventInit(void) { +void _geventInit(void) +{ gfxMutexInit(&geventMutex); } +void _geventDeinit(void) +{ + /* ToDo */ +} + void geventListenerInit(GListener *pl) { gfxSemInit(&pl->waitqueue, 0, MAX_SEMAPHORE_COUNT); // Next wait'er will block gfxSemInit(&pl->eventlock, 1, 1); // Only one thread at a time looking at the event buffer diff --git a/src/gfx.c b/src/gfx.c index ff7b29cd..46003f09 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -15,47 +15,50 @@ #include "gfx.h" -void DEPRECATED("Use gfxInit() instead") gdispInit() { gfxInit(); } - /* These init functions are defined by each module but not published */ extern void _gosInit(void); +extern void _gosDeinit(void); #if GFX_USE_GDISP extern void _gdispInit(void); + extern void _gdispDeinit(void); #endif #if GFX_USE_GWIN extern void _gwinInit(void); + extern void _gwinDeinit(void); #endif #if GFX_USE_GEVENT extern void _geventInit(void); + extern void _geventDeinit(void); #endif #if GFX_USE_GTIMER extern void _gtimerInit(void); + extern void _gtimerDeinit(void); #endif #if GFX_USE_GINPUT extern void _ginputInit(void); + extern void _ginputDeinit(void); #endif #if GFX_USE_GADC extern void _gadcInit(void); + extern void _gadcDeinit(void); #endif #if GFX_USE_GAUDIN extern void _gaudinInit(void); + extern void _gaudinDeinit(void); #endif #if GFX_USE_GAUDOUT extern void _gaudoutInit(void); + extern void _gaudoutDeinit(void); #endif #if GFX_USE_GMISC extern void _gmiscInit(void); + extern void _gmiscDeinit(void); #endif -void gfxInit(void) { - static bool_t initDone = FALSE; +void gfxInit(void) +{ + // These must be initialised in the order of their dependancies - /* Ensure we only initialise once */ - if (initDone) - return; - initDone = TRUE; - - /* These must be initialised in the order of their dependancies */ _gosInit(); #if GFX_USE_GMISC _gmiscInit(); @@ -85,3 +88,38 @@ void gfxInit(void) { _gaudoutInit(); #endif } + +void gfxDeinit(void) +{ + // We deinitialise the opposit way as we initialised + + #if GFX_USE_GAUDOUT + _gaudoutDeinit(); + #endif + #if GFX_USE_GAUDIN + _gaoudinDeinit(); + #endif + #if GFX_USE_GADC + _gadcDeinit(); + #endif + #if GFX_USE_GINPUT + _ginputDeinit(); + #endif + #if GFX_USE_GWIN + _gwinDeinit(); + #endif + #if GFX_USE_GDISP + _gdispDeinit(); + #endif + #if GFX_USE_GTIMER + _gtimerDeinit(); + #endif + #if GFX_USE_GEVENT + _geventDeinit(); + #endif + #if GFX_USE_GMISC + _gmiscInit(); + #endif + _gosDeinit(); +} + diff --git a/src/ginput/ginput.c b/src/ginput/ginput.c index 87c4a668..abd16cd8 100644 --- a/src/ginput/ginput.c +++ b/src/ginput/ginput.c @@ -16,11 +16,21 @@ #if GFX_USE_GINPUT -/** - * This should really call an init routine for each ginput sub-system. - * Maybe we'll do this later. - */ -void _ginputInit(void) {} +void _ginputInit(void) +{ + /* ToDo */ + + /** + * This should really call an init routine for each ginput sub-system. + * Maybe we'll do this later. + */ +} + +void _ginputDeinit(void) +{ + +} #endif /* GFX_USE_GINPUT */ /** @} */ + diff --git a/src/gmisc/gmisc.c b/src/gmisc/gmisc.c index 38da6bfa..654dd5e2 100644 --- a/src/gmisc/gmisc.c +++ b/src/gmisc/gmisc.c @@ -14,7 +14,14 @@ #if GFX_USE_GMISC -void _gmiscInit(void) { +void _gmiscInit(void) +{ + +} + +void _gmiscDeinit(void) +{ + } #endif /* GFX_USE_GMISC */ diff --git a/src/gos/chibios.c b/src/gos/chibios.c index 30a2b228..cf02b3e2 100644 --- a/src/gos/chibios.c +++ b/src/gos/chibios.c @@ -22,8 +22,8 @@ #error "GOS: CH_USE_SEMAPHORES must be defined in chconf.h" #endif -/* Our module initialiser */ -void _gosInit(void) { +void _gosInit(void) +{ /* Don't initialise if the user already has */ if (!chThdSelf()) { halInit(); @@ -31,6 +31,11 @@ void _gosInit(void) { } } +void _gosDeinit(void) +{ + /* ToDo */ +} + void *gfxRealloc(void *ptr, size_t oldsz, size_t newsz) { void *np; diff --git a/src/gos/linux.c b/src/gos/linux.c index 97409364..9b4914d5 100644 --- a/src/gos/linux.c +++ b/src/gos/linux.c @@ -20,10 +20,16 @@ static gfxMutex SystemMutex; -void _gosInit(void) { +void _gosInit(void) +{ gfxMutexInit(&SystemMutex); } +void _gosDeinit(void) +{ + /* ToDo */ +} + void gfxSystemLock(void) { gfxMutexEnter(&SystemMutex); } diff --git a/src/gos/osx.c b/src/gos/osx.c index a5560b4e..249147d1 100644 --- a/src/gos/osx.c +++ b/src/gos/osx.c @@ -37,10 +37,16 @@ void get_ticks(mach_timespec_t *mts){ } -void _gosInit(void) { +void _gosInit(void) +{ gfxMutexInit(&SystemMutex); } +void _gosDeinit(void) +{ + /* ToDo */ +} + void gfxSystemLock(void) { gfxMutexEnter(&SystemMutex); } diff --git a/src/gos/raw32.c b/src/gos/raw32.c index 5e11064c..61d09761 100644 --- a/src/gos/raw32.c +++ b/src/gos/raw32.c @@ -26,7 +26,8 @@ static void _gosThreadsInit(void); * Initialise *********************************************************/ -void _gosInit(void) { +void _gosInit(void) +{ // Set up the heap allocator _gosHeapInit(); @@ -34,6 +35,11 @@ void _gosInit(void) { _gosThreadsInit(); } +void _gosDeinit(void) +{ + /* ToDo */ +} + /********************************************************* * For WIn32 emulation - automatically add the tick functions * the user would normally have to provide for bare metal. diff --git a/src/gos/win32.c b/src/gos/win32.c index a05e5c30..3a3f2517 100644 --- a/src/gos/win32.c +++ b/src/gos/win32.c @@ -17,7 +17,13 @@ static HANDLE SystemMutex; -void _gosInit(void) { +void _gosInit(void) +{ + +} + +void _gosDeinit(void) +{ } diff --git a/src/gtimer/gtimer.c b/src/gtimer/gtimer.c index de40e16c..b8f3d4fa 100644 --- a/src/gtimer/gtimer.c +++ b/src/gtimer/gtimer.c @@ -118,11 +118,17 @@ static DECLARE_THREAD_FUNCTION(GTimerThreadHandler, arg) { return 0; } -void _gtimerInit(void) { +void _gtimerInit(void) +{ gfxSemInit(&waitsem, 0, 1); gfxMutexInit(&mutex); } +void _gtimerDeinit(void) +{ + /* ToDo */ +} + void gtimerInit(GTimer *pt) { pt->flags = 0; } diff --git a/src/gwin/gwidget.c b/src/gwin/gwidget.c index 484b8c37..75a69667 100644 --- a/src/gwin/gwidget.c +++ b/src/gwin/gwidget.c @@ -224,11 +224,17 @@ static void gwidgetEvent(void *param, GEvent *pe) { } #endif -void _gwidgetInit(void) { +void _gwidgetInit(void) +{ geventListenerInit(&gl); geventRegisterCallback(&gl, gwidgetEvent, 0); } +void _gwidgetDeinit(void) +{ + /* ToDo */ +} + GHandle _gwidgetCreate(GDisplay *g, GWidgetObject *pgw, const GWidgetInit *pInit, const gwidgetVMT *vmt) { if (!(pgw = (GWidgetObject *)_gwindowCreate(g, &pgw->g, &pInit->g, &vmt->g, GWIN_FLG_WIDGET|GWIN_FLG_ENABLED))) return 0; diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index 94799482..485ccaaa 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -84,7 +84,8 @@ static color_t defaultBgColor = Black; * Class Routines *-----------------------------------------------*/ -void _gwinInit(void) { +void _gwinInit(void) +{ #if GWIN_NEED_WIDGET extern void _gwidgetInit(void); @@ -97,6 +98,20 @@ void _gwinInit(void) { #endif } +void _gwinDeinit(void) +{ + #if GWIN_NEED_WIDGET + extern void _gwidgetDeinit(void); + + _gwidgetDeinit(); + #endif + #if GWIN_NEED_WINDOWMANAGER + extern void _gwmDeinit(void); + + _gwmDeinit(); + #endif +} + // Internal routine for use by GWIN components only // Initialise a window creating it dynamically if required. GHandle _gwindowCreate(GDisplay *g, GWindowObject *pgw, const GWindowInit *pInit, const gwinVMT *vmt, uint16_t flags) { diff --git a/src/gwin/gwm.c b/src/gwin/gwm.c index f4dd8090..e7a71737 100644 --- a/src/gwin/gwm.c +++ b/src/gwin/gwm.c @@ -60,7 +60,8 @@ GWindowManager * _GWINwm; * Window Routines *-----------------------------------------------*/ -void _gwmInit(void) { +void _gwmInit(void) +{ gfxQueueASyncInit(&_GWINList); _GWINwm = (GWindowManager *)&GNullWindowManager; _GWINwm->vmt->Init(); @@ -70,6 +71,11 @@ void _gwmInit(void) { #endif } +void _gwmDeinit(void) +{ + /* ToDo */ +} + void gwinSetWindowManager(struct GWindowManager *gwm) { if (!gwm) gwm = (GWindowManager *)&GNullWindowManager; From 78254345917b3521e5005ecebc8d4f4a002b7a87 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 19:52:46 +0100 Subject: [PATCH 06/12] implemented some deinit() --- src/gadc/gadc.c | 10 +++++++++- src/gaudin/gaudin.c | 5 ++++- src/gevent/gevent.c | 2 +- src/gtimer/gtimer.c | 3 ++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/gadc/gadc.c b/src/gadc/gadc.c index bfa655df..25d5f9bd 100644 --- a/src/gadc/gadc.c +++ b/src/gadc/gadc.c @@ -249,7 +249,15 @@ void _gadcInit(void) void _gadcDeinit(void) { - /* ToDo */ + /* commented stuff is ToDo */ + + // gadc_lld_deinit(); + gfxSemDestroy(&gadcsem); + gfxMutexDestroy(&gadcmutex); + //gtimerDeinit(&LowSpeedGTimer); + #if GFX_USE_GEVENT + //gtimerDeinit(&HighSpeedGTimer); + #endif } static inline void StartADC(bool_t onNoHS) { diff --git a/src/gaudin/gaudin.c b/src/gaudin/gaudin.c index 2f0883e7..8a425a10 100644 --- a/src/gaudin/gaudin.c +++ b/src/gaudin/gaudin.c @@ -94,7 +94,10 @@ void _gaudinInit(void) void _gaudinDeinit(void) { - /* ToDo */ + // Commented stuff still ToDo + #if GFX_USE_GEVENT + gtimerDeinit(&AudGTimer); + #endif } bool_t gaudinInit(uint16_t channel, uint32_t frequency, audin_sample_t *buffer, size_t bufcount, size_t samplesPerEvent) { diff --git a/src/gevent/gevent.c b/src/gevent/gevent.c index 67b32747..779f63a0 100644 --- a/src/gevent/gevent.c +++ b/src/gevent/gevent.c @@ -53,7 +53,7 @@ void _geventInit(void) void _geventDeinit(void) { - /* ToDo */ + gfxMutexDestroy(&geventMutex); } void geventListenerInit(GListener *pl) { diff --git a/src/gtimer/gtimer.c b/src/gtimer/gtimer.c index b8f3d4fa..311176fa 100644 --- a/src/gtimer/gtimer.c +++ b/src/gtimer/gtimer.c @@ -126,7 +126,8 @@ void _gtimerInit(void) void _gtimerDeinit(void) { - /* ToDo */ + gfxSemDestroy(&waitsem); + gfxMutexDestroy(&mutex); } void gtimerInit(GTimer *pt) { From d2de6c351785f323fd4b2a4e337a95bda4c9a626 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 19:55:20 +0100 Subject: [PATCH 07/12] implemented gtimerDeinit() --- include/gtimer/gtimer.h | 15 ++++++++++++--- src/gadc/gadc.c | 4 ++-- src/gtimer/gtimer.c | 8 +++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/gtimer/gtimer.h b/include/gtimer/gtimer.h index 14de352f..06072c7c 100644 --- a/include/gtimer/gtimer.h +++ b/include/gtimer/gtimer.h @@ -68,13 +68,22 @@ extern "C" { #endif /** - * @brief Initialise a timer. + * @brief Initialise a timer * - * @param[in] pt pointer to a GTimer structure + * @param[in] pt Pointer to a GTimer structure * * @api */ -void gtimerInit(GTimer *pt); +void gtimerInit(GTimer* pt); + +/** + * @brief Deinitialise a timer + * + * @param[in] pt Pointer to a GTimer structure + * + * @api + */ +void gtimerDeinit(GTimer* pt); /** * @brief Set a timer going or alter its properties if it is already going. diff --git a/src/gadc/gadc.c b/src/gadc/gadc.c index 25d5f9bd..c9a4a31b 100644 --- a/src/gadc/gadc.c +++ b/src/gadc/gadc.c @@ -254,9 +254,9 @@ void _gadcDeinit(void) // gadc_lld_deinit(); gfxSemDestroy(&gadcsem); gfxMutexDestroy(&gadcmutex); - //gtimerDeinit(&LowSpeedGTimer); + gtimerDeinit(&LowSpeedGTimer); #if GFX_USE_GEVENT - //gtimerDeinit(&HighSpeedGTimer); + gtimerDeinit(&HighSpeedGTimer); #endif } diff --git a/src/gtimer/gtimer.c b/src/gtimer/gtimer.c index 311176fa..3f772e39 100644 --- a/src/gtimer/gtimer.c +++ b/src/gtimer/gtimer.c @@ -130,10 +130,16 @@ void _gtimerDeinit(void) gfxMutexDestroy(&mutex); } -void gtimerInit(GTimer *pt) { +void gtimerInit(GTimer* pt) +{ pt->flags = 0; } +void gtimerDeinit(GTimer* pt) +{ + (void)pt; +} + void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, bool_t periodic, delaytime_t millisec) { gfxMutexEnter(&mutex); From 18417cb458f0d0e4dcb80bc57c8d75ba759ebcd7 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 2 Feb 2014 20:04:36 +0100 Subject: [PATCH 08/12] doc --- releases.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/releases.txt b/releases.txt index 6d33e662..f2cb77d5 100644 --- a/releases.txt +++ b/releases.txt @@ -13,6 +13,7 @@ FEATURE: Added gwinGetColor() and gwinGetBgColor() FEATURE: Console does now have an optional buffer (GWIN_CONSOLE_USE_HISTORY) FEATURE: Added smooth scrolling to list widget FEATURE: Increased performance of gwinListAddItem() +FEATURE: Added gfxDeinit() *** changes after 1.9 *** From 71818b29429b6de41d8e24955ec6e22026fc0ad7 Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 3 Feb 2014 17:57:38 +1000 Subject: [PATCH 09/12] Listbox demo: Change default font to UI2, fix the gfxconf defines, remove surpurflous defines --- demos/modules/gwin/list/gfxconf.h | 137 +----------------------------- demos/modules/gwin/list/main.c | 2 +- 2 files changed, 5 insertions(+), 134 deletions(-) diff --git a/demos/modules/gwin/list/gfxconf.h b/demos/modules/gwin/list/gfxconf.h index 7c4d6fae..ebd35f05 100644 --- a/demos/modules/gwin/list/gfxconf.h +++ b/demos/modules/gwin/list/gfxconf.h @@ -28,161 +28,45 @@ /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GDISP TRUE -#define GDISP_NEED_AUTOFLUSH FALSE -#define GDISP_NEED_TIMERFLUSH FALSE #define GDISP_NEED_VALIDATION TRUE #define GDISP_NEED_CLIP TRUE -#define GDISP_NEED_CIRCLE FALSE -#define GDISP_NEED_ELLIPSE FALSE -#define GDISP_NEED_ARC FALSE #define GDISP_NEED_CONVEX_POLYGON TRUE -#define GDISP_NEED_SCROLL FALSE -#define GDISP_NEED_PIXELREAD FALSE -#define GDISP_NEED_CONTROL FALSE -#define GDISP_NEED_QUERY FALSE -#define GDISP_NEED_MULTITHREAD FALSE -#define GDISP_NEED_STREAMING FALSE #define GDISP_NEED_TEXT TRUE - #define GDISP_NEED_ANTIALIAS FALSE - #define GDISP_NEED_UTF8 FALSE - #define GDISP_NEED_TEXT_KERNING FALSE - #define GDISP_INCLUDE_FONT_UI1 FALSE - #define GDISP_INCLUDE_FONT_UI2 FALSE - #define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS10 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS12 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS16 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS24 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS32 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 FALSE - #define GDISP_INCLUDE_FONT_FIXED_10x20 FALSE - #define GDISP_INCLUDE_FONT_FIXED_7x14 FALSE - #define GDISP_INCLUDE_FONT_FIXED_5x8 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA TRUE - #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA FALSE - #define GDISP_INCLUDE_USER_FONTS FALSE - + #define GDISP_INCLUDE_FONT_UI2 TRUE #define GDISP_NEED_IMAGE TRUE - #define GDISP_NEED_IMAGE_NATIVE FALSE #define GDISP_NEED_IMAGE_GIF TRUE - #define GDISP_NEED_IMAGE_BMP FALSE - #define GDISP_NEED_IMAGE_BMP_1 FALSE - #define GDISP_NEED_IMAGE_BMP_4 FALSE - #define GDISP_NEED_IMAGE_BMP_4_RLE FALSE - #define GDISP_NEED_IMAGE_BMP_8 FALSE - #define GDISP_NEED_IMAGE_BMP_8_RLE FALSE - #define GDISP_NEED_IMAGE_BMP_16 FALSE - #define GDISP_NEED_IMAGE_BMP_24 FALSE - #define GDISP_NEED_IMAGE_BMP_32 FALSE - #define GDISP_NEED_IMAGE_JPG FALSE - #define GDISP_NEED_IMAGE_PNG FALSE - #define GDISP_NEED_IMAGE_ACCOUNTING FALSE - -#define GDISP_NEED_STARTUP_LOGO FALSE - -#define GDISP_DEFAULT_ORIENTATION GDISP_ROTATE_LANDSCAPE -#define GDISP_LINEBUF_SIZE 128 - -#define GDISP_TOTAL_DISPLAYS 1 - #if GDISP_TOTAL_DISPLAYS > 1 - #define GDISP_HARDWARE_STREAM_WRITE FALSE - #define GDISP_HARDWARE_STREAM_READ FALSE - #define GDISP_HARDWARE_STREAM_POS FALSE - #define GDISP_HARDWARE_DRAWPIXEL FALSE - #define GDISP_HARDWARE_CLEARS FALSE - #define GDISP_HARDWARE_FILLS FALSE - #define GDISP_HARDWARE_BITFILLS FALSE - #define GDISP_HARDWARE_SCROLL FALSE - #define GDISP_HARDWARE_PIXELREAD FALSE - #define GDISP_HARDWARE_CONTROL FALSE - #define GDISP_HARDWARE_QUERY FALSE - #define GDISP_HARDWARE_CLIP FALSE - #endif - -#define GDISP_TOTAL_CONTROLLERS 1 - #if GDISP_TOTAL_CONTROLLERS > 1 - #define GDISP_CONTROLLER_LIST GDISPVMT_Win32, GDISPVMT_Win32 - #define GDISP_CONTROLLER_DISPLAYS 1, 1 - #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888 - #endif - -#define GDISP_USE_GFXNET FALSE - #define GDISP_GFXNET_PORT 13001 - #define GDISP_GFXNET_CUSTOM_LWIP_STARTUP FALSE - #define GDISP_DONT_WAIT_FOR_NET_DISPLAY FALSE - #define GDISP_GFXNET_UNSAFE_SOCKETS FALSE - /////////////////////////////////////////////////////////////////////////// // GWIN // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GWIN TRUE -#define GWIN_NEED_WINDOWMANAGER FALSE - -#define GWIN_NEED_CONSOLE FALSE - #define GWIN_CONSOLE_USE_HISTORY FALSE - #define GWIN_CONSOLE_HISTORY_AVERAGING FALSE - #define GWIN_CONSOLE_HISTORY_ATCREATE FALSE - #define GWIN_CONSOLE_USE_BASESTREAM FALSE - #define GWIN_CONSOLE_USE_FLOAT FALSE -#define GWIN_NEED_GRAPH FALSE - +#define GWIN_NEED_WINDOWMANAGER TRUE #define GWIN_NEED_WIDGET TRUE - #define GWIN_NEED_LABEL TRUE - #define GWIN_NEED_BUTTON FALSE - #define GWIN_BUTTON_LAZY_RELEASE FALSE - #define GWIN_NEED_SLIDER FALSE - #define GWIN_NEED_CHECKBOX FALSE - #define GWIN_NEED_IMAGE FALSE - #define GWIN_NEED_IMAGE_ANIMATION FALSE - #define GWIN_NEED_RADIO FALSE #define GWIN_NEED_LIST TRUE #define GWIN_NEED_LIST_IMAGES TRUE - #define GWIN_NEED_PROGRESSBAR FALSE /////////////////////////////////////////////////////////////////////////// // GEVENT // /////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GEVENT FALSE - -#define GEVENT_ASSERT_NO_RESOURCE FALSE -#define GEVENT_MAXIMUM_SIZE 32 -#define GEVENT_MAX_SOURCE_LISTENERS 32 - +#define GFX_USE_GEVENT TRUE /////////////////////////////////////////////////////////////////////////// // GTIMER // /////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GTIMER FALSE - -#define GTIMER_THREAD_PRIORITY HIGH_PRIORITY -#define GTIMER_THREAD_WORKAREA_SIZE 2048 - +#define GFX_USE_GTIMER TRUE /////////////////////////////////////////////////////////////////////////// // GQUEUE // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GQUEUE FALSE -#define GQUEUE_NEED_ASYNC FALSE -#define GQUEUE_NEED_GSYNC FALSE -#define GQUEUE_NEED_FSYNC FALSE - - /////////////////////////////////////////////////////////////////////////// // GINPUT // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GINPUT TRUE - #define GINPUT_NEED_MOUSE TRUE -#define GINPUT_NEED_KEYBOARD FALSE -#define GINPUT_NEED_TOGGLE FALSE -#define GINPUT_NEED_DIAL FALSE /////////////////////////////////////////////////////////////////////////// @@ -190,33 +74,20 @@ /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GADC FALSE -#define GADC_MAX_LOWSPEED_DEVICES 4 - - /////////////////////////////////////////////////////////////////////////// // GAUDIN // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GAUDIN FALSE - /////////////////////////////////////////////////////////////////////////// // GAUDOUT // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GAUDOUT FALSE - /////////////////////////////////////////////////////////////////////////// // GMISC // /////////////////////////////////////////////////////////////////////////// #define GFX_USE_GMISC FALSE -#define GMISC_NEED_ARRAYOPS FALSE -#define GMISC_NEED_FASTTRIG FALSE -#define GMISC_NEED_FIXEDTRIG FALSE -#define GMISC_NEED_INVSQRT FALSE - #define GMISC_INVSQRT_MIXED_ENDIAN FALSE - #define GMISC_INVSQRT_REAL_SLOW FALSE - - #endif /* _GFXCONF_H */ diff --git a/demos/modules/gwin/list/main.c b/demos/modules/gwin/list/main.c index fca5f018..36820c23 100644 --- a/demos/modules/gwin/list/main.c +++ b/demos/modules/gwin/list/main.c @@ -81,7 +81,7 @@ int main(void) { gfxInit(); // Set the widget defaults - gwinSetDefaultFont(gdispOpenFont("DejaVuSans12_AA")); + gwinSetDefaultFont(gdispOpenFont("UI2")); gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE); gdispClear(White); From de7aafe785e5641115aa4b3f5a900515d8d36a28 Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 3 Feb 2014 17:58:43 +1000 Subject: [PATCH 10/12] Fix font clipping properly. Previous fix did not bound the font display in the x direction. --- src/gdisp/gdisp.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c index 3031c455..949bedaf 100644 --- a/src/gdisp/gdisp.c +++ b/src/gdisp/gdisp.c @@ -2769,8 +2769,14 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co #if GDISP_NEED_ANTIALIAS && GDISP_HARDWARE_PIXELREAD static void drawcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) { #define GD ((GDisplay *)state) - if (y < GD->t.clipy0 || y >= GD->t.clipy1) + if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x+count <= GD->t.clipx0 || x >= GD->t.clipx1) return; + if (x < GD->t.clipx0) { + count -= GD->t.clipx0 - x; + x = GD->t.clipx0; + } + if (x+count > GD->t.clipx1) + count = GD->t.clipx1 - x; if (alpha == 255) { GD->p.x = x; GD->p.y = y; GD->p.x1 = x+count-1; GD->p.color = GD->t.color; hline_clip(GD); @@ -2786,8 +2792,14 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co #else static void drawcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) { #define GD ((GDisplay *)state) - if (y < GD->t.clipy0 || y >= GD->t.clipy1) + if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x+count <= GD->t.clipx0 || x >= GD->t.clipx1) return; + if (x < GD->t.clipx0) { + count -= GD->t.clipx0 - x; + x = GD->t.clipx0; + } + if (x+count > GD->t.clipx1) + count = GD->t.clipx1 - x; if (alpha > 0x80) { // A best approximation when using anti-aliased fonts but we can't actually draw them anti-aliased GD->p.x = x; GD->p.y = y; GD->p.x1 = x+count-1; GD->p.color = GD->t.color; hline_clip(GD); @@ -2799,8 +2811,14 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co #if GDISP_NEED_ANTIALIAS static void fillcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) { #define GD ((GDisplay *)state) - if (y < GD->t.clipy0 || y >= GD->t.clipy1) + if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x+count <= GD->t.clipx0 || x >= GD->t.clipx1) return; + if (x < GD->t.clipx0) { + count -= GD->t.clipx0 - x; + x = GD->t.clipx0; + } + if (x+count > GD->t.clipx1) + count = GD->t.clipx1 - x; if (alpha == 255) { GD->p.color = GD->t.color; } else { From 0805033a660bf45751c78f1d715b7765d9aa2642 Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 3 Feb 2014 18:00:46 +1000 Subject: [PATCH 11/12] Ensure double initialisation/de-initialisation of GFX can't occur --- src/gfx.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gfx.c b/src/gfx.c index 46003f09..dfc9cb75 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -15,6 +15,8 @@ #include "gfx.h" +static bool_t initDone = FALSE; + /* These init functions are defined by each module but not published */ extern void _gosInit(void); extern void _gosDeinit(void); @@ -57,6 +59,11 @@ extern void _gosDeinit(void); void gfxInit(void) { + /* Ensure we only initialise once */ + if (initDone) + return; + initDone = TRUE; + // These must be initialised in the order of their dependancies _gosInit(); @@ -91,8 +98,11 @@ void gfxInit(void) void gfxDeinit(void) { - // We deinitialise the opposit way as we initialised + if (!initDone) + return; + initDone = FALSE; + // We deinitialise the opposite way as we initialised #if GFX_USE_GAUDOUT _gaudoutDeinit(); #endif From d869d9b3b80cb9ab2314840b2fa274e89e5342db Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 3 Feb 2014 18:01:44 +1000 Subject: [PATCH 12/12] Fix gtimerDeinit() function and add a TODO to _gtimerDeinit() --- src/gtimer/gtimer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gtimer/gtimer.c b/src/gtimer/gtimer.c index 3f772e39..3e0b6966 100644 --- a/src/gtimer/gtimer.c +++ b/src/gtimer/gtimer.c @@ -128,6 +128,7 @@ void _gtimerDeinit(void) { gfxSemDestroy(&waitsem); gfxMutexDestroy(&mutex); + // Need to destroy GTimer thread here } void gtimerInit(GTimer* pt) @@ -137,7 +138,7 @@ void gtimerInit(GTimer* pt) void gtimerDeinit(GTimer* pt) { - (void)pt; + gtimerStop(pt); } void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, bool_t periodic, delaytime_t millisec) {