aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ginput/ginput_keyboard.c26
-rw-r--r--src/gos/gos.h25
-rw-r--r--src/gos/gos_chibios.c37
-rw-r--r--src/gos/gos_chibios.h7
-rw-r--r--src/gos/gos_cmsis2.c110
-rw-r--r--src/gos/gos_cmsis2.h99
-rw-r--r--src/gos/gos_ecos.c11
-rw-r--r--src/gos/gos_ecos.h2
-rw-r--r--src/gos/gos_linux.c18
-rw-r--r--src/gos/gos_linux.h3
-rw-r--r--src/gos/gos_options.h16
-rw-r--r--src/gos/gos_osx.c11
-rw-r--r--src/gos/gos_osx.h2
-rw-r--r--src/gos/gos_qt.cpp10
-rw-r--r--src/gos/gos_qt.h2
-rw-r--r--src/gos/gos_rawrtos.h1
-rw-r--r--src/gos/gos_rtx5.h32
-rw-r--r--src/gos/gos_rules.h6
-rw-r--r--src/gos/gos_win32.c2
-rw-r--r--src/gos/gos_win32.h2
-rw-r--r--src/gos/gos_x_threads.h4
-rw-r--r--src/gwin/gwin_textedit.c95
22 files changed, 368 insertions, 153 deletions
diff --git a/src/ginput/ginput_keyboard.c b/src/ginput/ginput_keyboard.c
index 0018dafb..141bdd2b 100644
--- a/src/ginput/ginput_keyboard.c
+++ b/src/ginput/ginput_keyboard.c
@@ -471,7 +471,7 @@ void _gkeyboardInit(void) {
static const GKeyboardVMT * const dclist[] = {GINPUT_KEYBOARD_DRIVER_LIST};
for(i = 0; i < sizeof(dclist)/sizeof(dclist[0]); i++) {
- if (!(dclist[i]->d.flags & GKEYBOARD_VFLG_DYNAMICONLY))
+ if (!(dclist[i]->d.flags & GKEYBOARD_VFLG_DYNAMICONLY))
gdriverRegister(&dclist[i]->d, 0);
}
}
@@ -481,8 +481,8 @@ void _gkeyboardInit(void) {
{
extern const GKeyboardVMT const GKEYBOARDVMT_OnlyOne[1];
- if (!(GKEYBOARDVMT_OnlyOne->d.flags & GKEYBOARD_VFLG_DYNAMICONLY))
- gdriverRegister(&GKEYBOARDVMT_OnlyOne->d, 0);
+ if (!(GKEYBOARDVMT_OnlyOne->d.flags & GKEYBOARD_VFLG_DYNAMICONLY))
+ gdriverRegister(&GKEYBOARDVMT_OnlyOne->d, 0);
}
#endif
@@ -493,43 +493,43 @@ void _gkeyboardDeinit(void) {
}
bool_t _gkeyboardInitDriver(GDriver *g, void *param, unsigned driverinstance, unsigned systeminstance) {
- #define k ((GKeyboard *)g)
+ #define k ((GKeyboard *)g)
(void) param;
- (void) systeminstance;
+ (void) systeminstance;
// The initial keyboard layout comes from the VMT
k->pLayout = gkvmt(k)->defLayout;
// Init the mouse
- if (!gkvmt(k)->init((GKeyboard *)g, driverinstance))
- return FALSE;
+ if (!gkvmt(k)->init((GKeyboard *)g, driverinstance))
+ return FALSE;
// Ensure the Poll timer is started
if (!gtimerIsActive(&KeyboardTimer))
gtimerStart(&KeyboardTimer, KeyboardPoll, 0, TRUE, GINPUT_KEYBOARD_POLL_PERIOD);
- return TRUE;
+ return TRUE;
- #undef k
+ #undef k
}
void _gkeyboardPostInitDriver(GDriver *g) {
- #define k ((GKeyboard *)g)
+ #define k ((GKeyboard *)g)
// Run the init sequence from the layout microcode.
microengine(k, 0, FLAG_INIT);
- #undef k
+ #undef k
}
void _gkeyboardDeInitDriver(GDriver *g) {
- (void) g;
+ (void) g;
}
GSourceHandle ginputGetKeyboard(unsigned instance) {
if (instance == GKEYBOARD_ALL_INSTANCES)
return (GSourceHandle)&KeyboardTimer;
- return (GSourceHandle)gdriverGetInstance(GDRIVER_TYPE_KEYBOARD, instance);
+ return (GSourceHandle)gdriverGetInstance(GDRIVER_TYPE_KEYBOARD, instance);
}
bool_t ginputGetKeyboardStatus(unsigned instance, GEventKeyboard *pe) {
diff --git a/src/gos/gos.h b/src/gos/gos.h
index ddca0d94..dedfcdda 100644
--- a/src/gos/gos.h
+++ b/src/gos/gos.h
@@ -403,27 +403,6 @@
void gfxSemSignalI(gfxSem *psem);
/**
- * @brief Get the current semaphore count
- * @return The current semaphore count
- *
- * @param[in] psem A pointer to the semaphore
- *
- * @api
- */
- semcount_t gfxSemCounter(gfxSem *psem);
-
- /**
- * @brief Get the current semaphore count
- * @return The current semaphore count
- *
- * @param[in] psem A pointer to the semaphore
- *
- * @iclass
- * @api
- */
- semcount_t gfxSemCounterI(gfxSem *psem);
-
- /**
* @brief Start a new thread.
* @return Returns a thread handle if the thread was started, NULL on an error
*
@@ -497,8 +476,12 @@
#include "gos_arduino.h"
#elif GFX_USE_OS_CMSIS
#include "gos_cmsis.h"
+#elif GFX_USE_OS_CMSIS2
+ #include "gos_cmsis2.h"
#elif GFX_USE_OS_KEIL
#include "gos_keil.h"
+#elif GFX_USE_OS_RTX5
+ #include "gos_rtx5.h"
#elif GFX_USE_OS_NIOS
#include "gos_nios.h"
#elif GFX_USE_OS_QT
diff --git a/src/gos/gos_chibios.c b/src/gos/gos_chibios.c
index d02127ab..8bad8ed6 100644
--- a/src/gos/gos_chibios.c
+++ b/src/gos/gos_chibios.c
@@ -139,8 +139,13 @@ bool_t gfxSemWait(gfxSem *psem, delaytime_t ms)
bool_t gfxSemWaitI(gfxSem *psem)
{
- if (chSemGetCounterI(&psem->sem) <= 0)
- return FALSE;
+ #if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
+ if (psem->sem.s_cnt <= 0)
+ return GFalse;
+ #elif (CH_KERNEL_MAJOR == 4)
+ if (psem->sem.cnt <= 0)
+ return GFalse;
+ #endif
chSemFastWaitI(&psem->sem);
return TRUE;
}
@@ -149,8 +154,13 @@ void gfxSemSignal(gfxSem *psem)
{
chSysLock();
- if (gfxSemCounterI(psem) < psem->limit)
- chSemSignalI(&psem->sem);
+ #if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
+ if (psem->sem.s_cnt < psem->limit)
+ chSemSignalI(&psem->sem);
+ #elif (CH_KERNEL_MAJOR == 4)
+ if (psem->sem.cnt < psem->limit)
+ chSemSignalI(&psem->sem);
+ #endif
chSchRescheduleS();
chSysUnlock();
@@ -158,19 +168,24 @@ void gfxSemSignal(gfxSem *psem)
void gfxSemSignalI(gfxSem *psem)
{
- if (gfxSemCounterI(psem) < psem->limit)
- chSemSignalI(&psem->sem);
+ #if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
+ if (psem->sem.s_cnt < psem->limit)
+ chSemSignalI(&psem->sem);
+ #elif (CH_KERNEL_MAJOR == 4)
+ if (psem->sem.cnt < psem->limit)
+ chSemSignalI(&psem->sem);
+ #endif
}
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param)
{
if (!stackarea) {
if (!stacksz) stacksz = 256;
-#if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
- return chThdCreateFromHeap(0, stacksz, prio, (tfunc_t)fn, param);
-#elif CH_KERNEL_MAJOR == 4
- return chThdCreateFromHeap(0, stacksz, "ugfx", prio, (tfunc_t)fn, param);
-#endif
+ #if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
+ return chThdCreateFromHeap(0, stacksz, prio, (tfunc_t)fn, param);
+ #elif CH_KERNEL_MAJOR == 4
+ return chThdCreateFromHeap(0, stacksz, "ugfx", prio, (tfunc_t)fn, param);
+ #endif
}
if (!stacksz)
diff --git a/src/gos/gos_chibios.h b/src/gos/gos_chibios.h
index c3fc9d36..aedfb492 100644
--- a/src/gos/gos_chibios.h
+++ b/src/gos/gos_chibios.h
@@ -120,13 +120,6 @@ bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
bool_t gfxSemWaitI(gfxSem *psem);
void gfxSemSignal(gfxSem *psem);
void gfxSemSignalI(gfxSem *psem);
-#if (CH_KERNEL_MAJOR == 2) || (CH_KERNEL_MAJOR == 3)
-#define gfxSemCounterI(psem) ((psem)->sem.s_cnt)
-#define gfxSemCounter(psem) ((psem)->sem.s_cnt)
-#elif (CH_KERNEL_MAJOR == 4)
-#define gfxSemCounterI(psem) ((psem)->sem.cnt)
-#define gfxSemCounter(psem) ((psem)->sem.cnt)
-#endif
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
#define gfxThreadWait(thread) chThdWait(thread)
#define gfxThreadMe() chThdSelf()
diff --git a/src/gos/gos_cmsis2.c b/src/gos/gos_cmsis2.c
new file mode 100644
index 00000000..abbea6b2
--- /dev/null
+++ b/src/gos/gos_cmsis2.c
@@ -0,0 +1,110 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://ugfx.org/license.html
+ */
+
+#include "../../gfx.h"
+#include <string.h>
+
+#if GFX_USE_OS_CMSIS2
+
+#if !GFX_OS_NO_INIT && !GFX_OS_CALL_UGFXMAIN
+ #error "GOS: Either GFX_OS_NO_INIT or GFX_OS_CALL_UGFXMAIN must be defined for CMSIS V2"
+#endif
+
+void _gosHeapInit(void);
+
+void _gosInit(void)
+{
+ #if GFX_OS_NO_INIT && !GFX_OS_INIT_NO_WARNING
+ #if GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_DIRECT
+ #warning "GOS: Operating System initialization has been turned off. Make sure you call osKernelInitialize()."
+ #elif GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_MACRO
+ COMPILER_WARNING("GOS: Operating System initialization has been turned off. Make sure you call osKernelInitialize().")
+ #endif
+ #endif
+
+ // Set up the heap allocator
+ _gosHeapInit();
+}
+
+#if !GFX_OS_NO_INIT && GFX_OS_CALL_UGFXMAIN
+ static DECLARE_THREAD_FUNCTION(startUGFX_CMSIS2, p) {
+ (void) p;
+ uGFXMain();
+ }
+#endif
+void _gosPostInit(void)
+{
+ #if !GFX_OS_NO_INIT && GFX_OS_CALL_UGFXMAIN
+ switch(osKernelGetState()) {
+ case osKernelInactive:
+ osKernelInitialize();
+ /* Fall Through */
+ case osKernelReady:
+ gfxThreadCreate(0, GFX_OS_UGFXMAIN_STACKSIZE, NORMAL_PRIORITY, startUGFX_CMSIS2, 0);
+ osKernelStart();
+ gfxHalt("Unable to start CMSIS V2 scheduler. Out of memory?");
+ break;
+ default:
+ gfxThreadCreate(0, GFX_OS_UGFXMAIN_STACKSIZE, NORMAL_PRIORITY, startUGFX_CMSIS2, 0);
+ break;
+ }
+ #endif
+}
+
+void _gosDeinit(void)
+{
+}
+
+void gfxMutexInit(gfxMutex* pmutex)
+{
+ *pmutex = osMutexNew(NULL);
+}
+
+void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit)
+{
+ *pmutex = osSemaphoreNew(limit, val, NULL);
+}
+
+bool_t gfxSemWait(gfxSem* psem, delaytime_t ms)
+{
+ if (osSemaphoreAcquire(*psem, gfxMillisecondsToTicks(ms)) == osOK)
+ return TRUE;
+ return FALSE;
+}
+
+gfxThreadHandle gfxThreadCreate(void* stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void* param)
+{
+ osThreadAttr_t def;
+
+ (void)stackarea;
+
+ memset(&def, 0, sizeof(def));
+ def.name = "uGFX";
+ def.attr_bits = osThreadDetached; // osThreadJoinable
+ def.stack_mem = 0;
+ def.stack_size = stacksz;
+ def.priority = prio;
+ //def.tz_module = ????;
+
+ return osThreadNew((osThreadFunc_t)fn, param, &def);
+}
+
+threadreturn_t gfxThreadWait(gfxThreadHandle thread) {
+ while(1) {
+ switch(osThreadGetState(thread)) {
+ case osThreadReady:
+ case osThreadRunning:
+ case osThreadBlocked:
+ gfxYield();
+ break;
+ default:
+ return;
+ }
+ }
+}
+
+#endif /* GFX_USE_OS_CMSIS2 */
diff --git a/src/gos/gos_cmsis2.h b/src/gos/gos_cmsis2.h
new file mode 100644
index 00000000..06d5da04
--- /dev/null
+++ b/src/gos/gos_cmsis2.h
@@ -0,0 +1,99 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://ugfx.org/license.html
+ */
+
+/**
+ * @file src/gos/gos_cmsis2.h
+ * @brief GOS - Operating System Support header file for CMSIS 2.0 RTOS.
+ */
+
+#ifndef _GOS_CMSIS2_H
+#define _GOS_CMSIS2_H
+
+#if GFX_USE_OS_CMSIS2
+
+#include <stdbool.h>
+#include "cmsis_os2.h"
+
+#ifndef GFX_OS_HEAP_SIZE
+ #define GFX_OS_HEAP_SIZE 10240
+#endif
+
+/*===========================================================================*/
+/* Type definitions */
+/*===========================================================================*/
+
+typedef bool bool_t;
+
+#define TIME_IMMEDIATE 0
+#define TIME_INFINITE osWaitForever
+typedef uint32_t delaytime_t;
+typedef uint32_t systemticks_t;
+typedef uint16_t semcount_t;
+typedef void threadreturn_t;
+typedef osPriority_t threadpriority_t;
+
+#define MAX_SEMAPHORE_COUNT osFeature_Semaphore
+#define LOW_PRIORITY osPriorityLow
+#define NORMAL_PRIORITY osPriorityNormal
+#define HIGH_PRIORITY osPriorityHigh
+
+typedef osSemaphoreId_t gfxSem;
+
+typedef osMutexId_t gfxMutex;
+
+typedef osThreadId_t gfxThreadHandle;
+
+#define DECLARE_THREAD_STACK(name, sz) uint8_t name[1]; // Some compilers don't allow zero sized arrays. Let's waste one byte
+#define DECLARE_THREAD_FUNCTION(fnName, param) threadreturn_t fnName(void* param)
+#define THREAD_RETURN(retval)
+
+/*===========================================================================*/
+/* Function declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define gfxExit() os_error(0)
+#define gfxHalt(msg) os_error(1)
+#define gfxSystemTicks() osKernelGetSysTimerCount()
+#define gfxMillisecondsToTicks(ms) (1000*(ms)/osKernelGetTickFreq())
+#define gfxSystemLock() osKernelLock()
+#define gfxSystemUnlock() osKernelUnlock()
+#define gfxSleepMilliseconds(ms) osDelay(ms)
+
+void gfxMutexInit(gfxMutex* pmutex);
+#define gfxMutexDestroy(pmutex) osMutexDelete(*(pmutex))
+#define gfxMutexEnter(pmutex) osMutexAcquire(*(pmutex), TIME_INFINITE)
+#define gfxMutexExit(pmutex) osMutexRelease(*(pmutex))
+
+void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit);
+#define gfxSemDestroy(psem) osSemaphoreDelete(*(psem))
+bool_t gfxSemWait(gfxSem* psem, delaytime_t ms);
+#define gfxSemWaitI(psem) gfxSemWait((psem), 0)
+#define gfxSemSignal(psem) osSemaphoreRelease(*(psem))
+#define gfxSemSignalI(psem) osSemaphoreRelease(*(psem))
+
+gfxThreadHandle gfxThreadCreate(void* stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void* param);
+#define gfxYield() osThreadYield()
+#define gfxThreadMe() osThreadGetId()
+#define gfxThreadClose(thread) {}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*===========================================================================*/
+/* Use the generic heap handling */
+/*===========================================================================*/
+
+#define GOS_NEED_X_HEAP TRUE
+#include "gos_x_heap.h"
+
+#endif /* GFX_USE_OS_CMSIS */
+#endif /* _GOS_CMSIS_H */
diff --git a/src/gos/gos_ecos.c b/src/gos/gos_ecos.c
index f7e557ac..a55773d9 100644
--- a/src/gos/gos_ecos.c
+++ b/src/gos/gos_ecos.c
@@ -84,7 +84,7 @@ void gfxSemSignal(gfxSem *psem)
cyg_semaphore_post(&psem->sem);
else {
cyg_scheduler_lock();
- if (gfxSemCounterI(psem) < psem->limit)
+ if (cyg_semaphore_peek(&psem->sem, &cnt) < psem->limit)
cyg_semaphore_post(&psem->sem);
cyg_scheduler_unlock();
}
@@ -92,17 +92,10 @@ void gfxSemSignal(gfxSem *psem)
void gfxSemSignalI(gfxSem *psem)
{
- if (psem->limit == MAX_SEMAPHORE_COUNT || gfxSemCounterI(psem) < psem->limit)
+ if (psem->limit == MAX_SEMAPHORE_COUNT || cyg_semaphore_peek(&psem->sem, &cnt) < psem->limit)
cyg_semaphore_post(&psem->sem);
}
-semcount_t gfxSemCounterI(gfxSem *psem) {
- semcount_t cnt;
-
- cyg_semaphore_peek(&psem->sem, &cnt);
- return cnt;
-}
-
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param)
{
gfxThreadHandle th;
diff --git a/src/gos/gos_ecos.h b/src/gos/gos_ecos.h
index 6aa55a3a..0e438fb0 100644
--- a/src/gos/gos_ecos.h
+++ b/src/gos/gos_ecos.h
@@ -91,8 +91,6 @@ bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
bool_t gfxSemWaitI(gfxSem *psem);
void gfxSemSignal(gfxSem *psem);
void gfxSemSignalI(gfxSem *psem);
-semcount_t gfxSemCounterI(gfxSem *psem);
-#define gfxSemCounter(psem) gfxSemCounterI(psem)
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
#define gfxThreadWait(thread) NOTIMPLEMENTED_YET
diff --git a/src/gos/gos_linux.c b/src/gos/gos_linux.c
index dac3838f..43371443 100644
--- a/src/gos/gos_linux.c
+++ b/src/gos/gos_linux.c
@@ -165,15 +165,12 @@ threadreturn_t gfxThreadWait(gfxThreadHandle thread) {
}
}
void gfxSemSignal(gfxSem *pSem) {
- if (gfxSemCounter(pSem) < pSem->max)
- sem_post(&pSem->sem);
- }
- semcount_t gfxSemCounter(gfxSem *pSem) {
int res;
res = 0;
sem_getvalue(&pSem->sem, &res);
- return res;
+ if (res < pSem->max)
+ sem_post(&pSem->sem);
}
#else
void gfxSemInit(gfxSem *pSem, semcount_t val, semcount_t limit) {
@@ -239,17 +236,6 @@ threadreturn_t gfxThreadWait(gfxThreadHandle thread) {
pthread_mutex_unlock(&pSem->mtx);
}
- semcount_t gfxSemCounter(gfxSem *pSem) {
- semcount_t res;
-
- // The locking is really only required if obtaining the count is a divisible operation
- // which it might be on a 8/16 bit processor with a 32 bit semaphore count.
- pthread_mutex_lock(&pSem->mtx);
- res = pSem->cnt;
- pthread_mutex_unlock(&pSem->mtx);
-
- return res;
- }
#endif // GFX_USE_POSIX_SEMAPHORES
#endif /* GFX_USE_OS_LINUX */
diff --git a/src/gos/gos_linux.h b/src/gos/gos_linux.h
index fe406cb6..b9bfe82e 100644
--- a/src/gos/gos_linux.h
+++ b/src/gos/gos_linux.h
@@ -65,7 +65,6 @@ typedef pthread_mutex_t gfxMutex;
sem_t sem;
semcount_t max;
} gfxSem;
- #define gfxSemCounterI(psem) gfxSemCounter(psem)
#else
typedef struct gfxSem {
pthread_mutex_t mtx;
@@ -73,7 +72,6 @@ typedef pthread_mutex_t gfxMutex;
semcount_t cnt;
semcount_t max;
} gfxSem;
- #define gfxSemCounterI(psem) ((psem)->cnt)
#endif
/*===========================================================================*/
@@ -95,7 +93,6 @@ void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit);
void gfxSemDestroy(gfxSem *psem);
bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
void gfxSemSignal(gfxSem *psem);
-semcount_t gfxSemCounter(gfxSem *pSem);
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
threadreturn_t gfxThreadWait(gfxThreadHandle thread);
diff --git a/src/gos/gos_options.h b/src/gos/gos_options.h
index e8ce12e7..1c6dc8b1 100644
--- a/src/gos/gos_options.h
+++ b/src/gos/gos_options.h
@@ -91,13 +91,27 @@
#define GFX_USE_OS_CMSIS FALSE
#endif
/**
- * @brief Use Keil CMSIS
+ * @brief Use CMSIS2 RTOS compatible OS
+ * @details Defaults to FALSE
+ */
+ #ifndef GFX_USE_OS_CMSIS2
+ #define GFX_USE_OS_CMSIS2 FALSE
+ #endif
+ /**
+ * @brief Use Keil CMSIS 1.x (RTOS, RTX4)
* @details Defaults to FALSE
*/
#ifndef GFX_USE_OS_KEIL
#define GFX_USE_OS_KEIL FALSE
#endif
/**
+ * @brief Use Keil RTX5
+ * @details Defaults to FALSE
+ */
+ #ifndef GFX_USE_OS_RTX5
+ #define GFX_USE_OS_RTX5 FALSE
+ #endif
+ /**
* @brief Use NIOS-II
* @details Defaults to FALSE
*/
diff --git a/src/gos/gos_osx.c b/src/gos/gos_osx.c
index f06685d7..56d64d98 100644
--- a/src/gos/gos_osx.c
+++ b/src/gos/gos_osx.c
@@ -180,15 +180,4 @@ void gfxSemSignal(gfxSem *pSem) {
pthread_mutex_unlock(&pSem->mtx);
}
-semcount_t gfxSemCounter(gfxSem *pSem) {
- semcount_t res;
-
- // The locking is really only required if obtaining the count is a divisible operation
- // which it might be on a 8/16 bit processor with a 32 bit semaphore count.
- pthread_mutex_lock(&pSem->mtx);
- res = pSem->cnt;
- pthread_mutex_unlock(&pSem->mtx);
- return res;
-}
-
#endif /* GFX_USE_OS_OSX */
diff --git a/src/gos/gos_osx.h b/src/gos/gos_osx.h
index 9a8e10d9..94c67eab 100644
--- a/src/gos/gos_osx.h
+++ b/src/gos/gos_osx.h
@@ -44,7 +44,6 @@ typedef pthread_mutex_t gfxMutex;
#define gfxMutexExit(pmtx) pthread_mutex_unlock(pmtx)
#define gfxSemWaitI(psem) gfxSemWait(psem, TIME_IMMEDIATE)
#define gfxSemSignalI(psem) gfxSemSignal(psem)
-#define gfxSemCounterI(pSem) ((pSem)->cnt)
#define TIME_IMMEDIATE 0
#define TIME_INFINITE ((delaytime_t)-1)
@@ -78,7 +77,6 @@ void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit);
void gfxSemDestroy(gfxSem *psem);
bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
void gfxSemSignal(gfxSem *psem);
-semcount_t gfxSemCounter(gfxSem *pSem);
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
threadreturn_t gfxThreadWait(gfxThreadHandle thread);
diff --git a/src/gos/gos_qt.cpp b/src/gos/gos_qt.cpp
index 422f1535..e7480dd2 100644
--- a/src/gos/gos_qt.cpp
+++ b/src/gos/gos_qt.cpp
@@ -178,16 +178,6 @@ void gfxSemSignalI(gfxSem *psem)
static_cast<QSemaphore*>(*psem)->release(1);
}
-semcount_t gfxSemCounter(gfxSem *psem)
-{
- return static_cast<QSemaphore*>(*psem)->available();
-}
-
-semcount_t gfxSemCounterI(gfxSem *psem)
-{
- return static_cast<QSemaphore*>(*psem)->available();
-}
-
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param)
{
Q_UNUSED(stackarea)
diff --git a/src/gos/gos_qt.h b/src/gos/gos_qt.h
index 9986d7f2..45d743f5 100644
--- a/src/gos/gos_qt.h
+++ b/src/gos/gos_qt.h
@@ -63,8 +63,6 @@ bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
bool_t gfxSemWaitI(gfxSem *psem);
void gfxSemSignal(gfxSem *psem);
void gfxSemSignalI(gfxSem *psem);
-semcount_t gfxSemCounter(gfxSem *psem);
-semcount_t gfxSemCounterI(gfxSem *psem);
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
threadreturn_t gfxThreadWait(gfxThreadHandle thread);
gfxThreadHandle gfxThreadMe(void);
diff --git a/src/gos/gos_rawrtos.h b/src/gos/gos_rawrtos.h
index e7778d15..d1026c9d 100644
--- a/src/gos/gos_rawrtos.h
+++ b/src/gos/gos_rawrtos.h
@@ -47,7 +47,6 @@ typedef RAW_TASK_OBJ* gfxThreadHandle;
#define gfxSemDestroy(psem) raw_semaphore_delete(psem)
#define gfxSemSignal(psem) raw_semaphore_put((psem))
#define gfxSemSignalI(psem) raw_semaphore_put_all((psem))
-#define gfxSemCounterI(psem) ((psem)->count)
#define gfxThreadMe() {(unsigned int)raw_task_identify()}
#define gfxThreadClose(thread) {}
diff --git a/src/gos/gos_rtx5.h b/src/gos/gos_rtx5.h
new file mode 100644
index 00000000..b07a2164
--- /dev/null
+++ b/src/gos/gos_rtx5.h
@@ -0,0 +1,32 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://ugfx.org/license.html
+ */
+
+/**
+ * @file src/gos/gos_rtx5.h
+ * @brief GOS - Operating System Support header file for Keil RTX
+ */
+
+#ifndef _GOS_RTX5_H
+#define _GOS_RTX5_H
+
+#if GFX_USE_OS_RTX5
+
+/*
+ * Keil RTX uses the CMSIS RTOS interface. Therefore, just use the CMSIS2 RTOS port
+ */
+
+// Disable KEIL to avoid error: "GOS: More than one operation system has been defined as TRUE."
+#undef GFX_USE_OS_RTX5
+#define GFX_USE_OS_RTX5 FALSE
+
+// Enable generic CMSIS RTOS implementation
+#undef GFX_USE_OS_CMSIS2
+#define GFX_USE_OS_CMSIS2 TRUE
+#include "gos_cmsis2.h"
+
+#endif /* GFX_USE_OS_RTX5 */
+#endif /* _GOS_RTX5_H */
diff --git a/src/gos/gos_rules.h b/src/gos/gos_rules.h
index 6779045d..08de1f3f 100644
--- a/src/gos/gos_rules.h
+++ b/src/gos/gos_rules.h
@@ -16,11 +16,11 @@
#ifndef _GOS_RULES_H
#define _GOS_RULES_H
-#if !GFX_USE_OS_CHIBIOS && !GFX_USE_OS_WIN32 && !GFX_USE_OS_LINUX && !GFX_USE_OS_OSX && !GFX_USE_OS_RAW32 && !GFX_USE_OS_FREERTOS && !GFX_USE_OS_ECOS && !GFX_USE_OS_RAWRTOS && !GFX_USE_OS_ARDUINO && !GFX_USE_OS_CMSIS && !GFX_USE_OS_KEIL && !GFX_USE_OS_NIOS && !GFX_USE_OS_QT
+#if !GFX_USE_OS_CHIBIOS && !GFX_USE_OS_WIN32 && !GFX_USE_OS_LINUX && !GFX_USE_OS_OSX && !GFX_USE_OS_RAW32 && !GFX_USE_OS_FREERTOS && !GFX_USE_OS_ECOS && !GFX_USE_OS_RAWRTOS && !GFX_USE_OS_ARDUINO && !GFX_USE_OS_CMSIS && !GFX_USE_OS_CMSIS2 && !GFX_USE_OS_KEIL && !GFX_USE_OS_RTX5 && !GFX_USE_OS_NIOS && !GFX_USE_OS_QT
#error "GOS: No operating system has been defined."
#endif
-#if GFX_USE_OS_CHIBIOS + GFX_USE_OS_WIN32 + GFX_USE_OS_LINUX + GFX_USE_OS_OSX + GFX_USE_OS_RAW32 + GFX_USE_OS_FREERTOS + GFX_USE_OS_ECOS + GFX_USE_OS_RAWRTOS + GFX_USE_OS_ARDUINO + GFX_USE_OS_CMSIS + GFX_USE_OS_KEIL + GFX_USE_OS_NIOS + GFX_USE_OS_QT != 1 * TRUE
+#if GFX_USE_OS_CHIBIOS + GFX_USE_OS_WIN32 + GFX_USE_OS_LINUX + GFX_USE_OS_OSX + GFX_USE_OS_RAW32 + GFX_USE_OS_FREERTOS + GFX_USE_OS_ECOS + GFX_USE_OS_RAWRTOS + GFX_USE_OS_ARDUINO + GFX_USE_OS_CMSIS + GFX_USE_OS_CMSIS2 + GFX_USE_OS_KEIL + GFX_USE_OS_RTX5 + GFX_USE_OS_NIOS + GFX_USE_OS_QT != 1 * TRUE
#error "GOS: More than one operation system has been defined as TRUE."
#endif
@@ -30,7 +30,7 @@
#if GFX_EMULATE_MALLOC
#if GFX_USE_OS_WIN32 || GFX_USE_OS_LINUX || GFX_USE_OS_OSX || GFX_USE_OS_ECOS || \
- (GFX_OS_HEAP_SIZE == 0 && (GFX_USE_OS_RAW32 || GFX_USE_OS_ARDUINO || GFX_USE_OS_CMSIS || GFX_USE_OS_KEIL))
+ (GFX_OS_HEAP_SIZE == 0 && (GFX_USE_OS_RAW32 || GFX_USE_OS_ARDUINO || GFX_USE_OS_CMSIS || GFX_USE_OS_CMSIS2 || GFX_USE_OS_KEIL || GFX_USE_OS_RTX5))
#if GFX_DISPLAY_RULE_WARNINGS
#if GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_DIRECT
#warning "GOS: Cannot emulate malloc as gfxAlloc() internally uses malloc on this platform"
diff --git a/src/gos/gos_win32.c b/src/gos/gos_win32.c
index ba4bbec2..1aa13dd6 100644
--- a/src/gos/gos_win32.c
+++ b/src/gos/gos_win32.c
@@ -86,6 +86,7 @@ typedef LONG (__stdcall *_NtQuerySemaphore)(
PULONG ReturnLength OPTIONAL
);
+/* - Left here simply because of its undocumented cleverness...
semcount_t gfxSemCounter(gfxSem *pSem) {
static _NtQuerySemaphore NtQuerySemaphore;
struct _SEMAPHORE_BASIC_INFORMATION {
@@ -100,6 +101,7 @@ semcount_t gfxSemCounter(gfxSem *pSem) {
return BasicInfo.CurrentCount;
}
+*/
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION(*fn,p), void *param) {
(void) stackarea;
diff --git a/src/gos/gos_win32.h b/src/gos/gos_win32.h
index e6e45d2f..62602ad3 100644
--- a/src/gos/gos_win32.h
+++ b/src/gos/gos_win32.h
@@ -78,7 +78,6 @@ typedef HANDLE gfxThreadHandle;
#define gfxSemWaitI(psem) gfxSemWait((psem), TIME_IMMEDIATE)
#define gfxSemSignal(psem) ReleaseSemaphore(*(psem), 1, 0)
#define gfxSemSignalI(psem) ReleaseSemaphore(*(psem), 1, 0)
-#define gfxSemCounterI(psem) gfxSemCounter(psem)
#define gfxThreadMe() GetCurrentThread()
#define gfxThreadClose(thread) CloseHandle(thread)
@@ -93,7 +92,6 @@ extern "C" {
void gfxHalt(const char *msg);
void gfxSleepMicroseconds(delaytime_t ms);
bool_t gfxSemWait(gfxSem *psem, delaytime_t ms);
-semcount_t gfxSemCounter(gfxSem *pSem);
void gfxSystemLock(void);
void gfxSystemUnlock(void);
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION(*fn,p), void *param);
diff --git a/src/gos/gos_x_threads.h b/src/gos/gos_x_threads.h
index 05a08cc2..546e9e13 100644
--- a/src/gos/gos_x_threads.h
+++ b/src/gos/gos_x_threads.h
@@ -80,10 +80,6 @@ extern "C" {
void gfxSemSignal(gfxSem *psem);
void gfxSemSignalI(gfxSem *psem);
- // Deprecated Semaphore functions (they still work here)
- #define gfxSemCounter(psem) ((psem)->cnt)
- #define gfxSemCounterI(psem) ((psem)->cnt)
-
// Threads
gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param);
#define gfxThreadClose(thread)
diff --git a/src/gwin/gwin_textedit.c b/src/gwin/gwin_textedit.c
index ec67365e..8e639300 100644
--- a/src/gwin/gwin_textedit.c
+++ b/src/gwin/gwin_textedit.c
@@ -26,22 +26,58 @@
#define gh2obj ((GTexteditObject *)gh)
#define gw2obj ((GTexteditObject *)gw)
-static bool_t resizeText(GWidgetObject* gw, size_t pos, int32_t diff) {
- char *p, *q;
- size_t sz;
-
- p = (char *)gw->text;
- sz = strlen(p)+1;
- if (diff < 0)
- memcpy(p+pos, p+pos-diff, sz-pos+diff);
- if (!(p = gfxRealloc(p, sz, sz+diff)))
- return FALSE;
+static void TextEditRemoveChar(GWidgetObject* gw) {
+ char *p;
+ const char *q;
+ unsigned sz;
+ unsigned pos;
+
+ sz = strlen(gw->text);
+ pos = gw2obj->cursorPos;
+ q = gw->text+pos;
+
+ if (!(gw->g.flags & GWIN_FLG_ALLOCTXT)) {
+ // Allocate and then copy
+ if (!(p = gfxAlloc(sz)))
+ return;
+ if (pos)
+ memcpy(p, gw->text, pos);
+ memcpy(p+pos, q+1, sz-pos);
+ gw->g.flags |= GWIN_FLG_ALLOCTXT;
+ } else {
+ // Copy and then reallocate
+ memcpy((char *)q, q+1, sz-pos);
+ if (!(p = gfxRealloc((char *)gw->text, sz+1, sz))) // This should never fail as we are making it smaller
+ return;
+ }
gw->text = p;
- if (diff > 0) {
- q = p + sz;
- p += pos;
- while(--q >= p)
- q[diff] = q[0];
+}
+
+static bool_t TextEditAddChars(GWidgetObject* gw, unsigned cnt) {
+ char *p;
+ const char *q;
+ unsigned sz;
+ unsigned pos;
+
+ // Get the size of the text buffer
+ sz = strlen(gw->text)+1;
+ pos = gw2obj->cursorPos;
+
+ if (!(gw->g.flags & GWIN_FLG_ALLOCTXT)) {
+ if (!(p = gfxAlloc(sz+cnt)))
+ return FALSE;
+ memcpy(p, gw->text, pos);
+ memcpy(p+pos+cnt, gw->text+pos, sz-pos);
+ gw->g.flags |= GWIN_FLG_ALLOCTXT;
+ gw->text = p;
+ } else {
+ if (!(p = gfxRealloc((char *)gw->text, sz, sz+cnt)))
+ return FALSE;
+ gw->text = p;
+ q = p+pos;
+ p += sz;
+ while(--p >= q)
+ p[cnt] = p[0];
}
return TRUE;
}
@@ -117,7 +153,7 @@ static void TextEditMouseDown(GWidgetObject* gw, coord_t x, coord_t y) {
if (!gw2obj->cursorPos)
return;
gw2obj->cursorPos--;
- resizeText(gw, gw2obj->cursorPos, -1);
+ TextEditRemoveChar(gw);
break;
case GKEY_TAB:
case GKEY_LF:
@@ -129,7 +165,7 @@ static void TextEditMouseDown(GWidgetObject* gw, coord_t x, coord_t y) {
// Delete
if (!gw->text[gw2obj->cursorPos])
return;
- resizeText(gw, gw2obj->cursorPos, -1);
+ TextEditRemoveChar(gw);
break;
default:
// Ignore any other control characters
@@ -137,15 +173,15 @@ static void TextEditMouseDown(GWidgetObject* gw, coord_t x, coord_t y) {
return;
// Keep the edit length to less than the maximum
- if (gw2obj->maxSize && gw2obj->cursorPos+pke->bytecount > gw2obj->maxSize)
+ if (gw2obj->maxSize && strlen(gw->text)+pke->bytecount > gw2obj->maxSize)
return;
// Make space
- resizeText(gw, gw2obj->cursorPos, pke->bytecount);
-
- // Insert the character
- memcpy((char *)gw->text+gw2obj->cursorPos, pke->c, pke->bytecount);
- gw2obj->cursorPos += pke->bytecount;
+ if (TextEditAddChars(gw, pke->bytecount)) {
+ // Insert the characters
+ memcpy((char *)gw->text+gw2obj->cursorPos, pke->c, pke->bytecount);
+ gw2obj->cursorPos += pke->bytecount;
+ }
break;
}
}
@@ -196,24 +232,13 @@ static const gwidgetVMT texteditVMT = {
GHandle gwinGTexteditCreate(GDisplay* g, GTexteditObject* wt, GWidgetInit* pInit, size_t maxSize)
{
- char *p;
-
// Create the underlying widget
if (!(wt = (GTexteditObject*)_gwidgetCreate(g, &wt->w, pInit, &texteditVMT)))
return 0;
wt->maxSize = maxSize;
- // Reallocate the text (if necessary)
- if (!(wt->w.g.flags & GWIN_FLG_ALLOCTXT)) {
- if (!(p = gfxAlloc(wt->maxSize+1)))
- return 0;
- strncpy(p, wt->w.text, wt->maxSize);
- wt->w.text = p;
- wt->w.g.flags |= GWIN_FLG_ALLOCTXT;
- }
-
- // Set text and cursor position
+ // Set cursor position
wt->cursorPos = strlen(wt->w.text);
gwinSetVisible(&wt->w.g, pInit->g.show);