diff --git a/drivers/gadc/AT91SAM7/gadc_lld.c b/drivers/gadc/AT91SAM7/gadc_lld.c index 791e6bee..00af65a5 100644 --- a/drivers/gadc/AT91SAM7/gadc_lld.c +++ b/drivers/gadc/AT91SAM7/gadc_lld.c @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file drivers/gadc/AT91SAM7/gadc_lld.c + * @brief GADC - Periodic ADC driver source file for the AT91SAM7 cpu. + * + * @defgroup Driver Driver + * @ingroup GADC + * @{ + */ + #include "ch.h" #include "hal.h" #include "gfx.h" diff --git a/drivers/gaudin/gadc/gaudin_lld.c b/drivers/gaudin/gadc/gaudin_lld.c index 7a416569..42b4aafc 100644 --- a/drivers/gaudin/gadc/gaudin_lld.c +++ b/drivers/gaudin/gadc/gaudin_lld.c @@ -4,6 +4,15 @@ * * http://chibios-gfx.com/license.html */ + +/** + * @file drivers/gaudin/gadc/gaudin_lld.c + * @brief GAUDIN - Driver file for using the cpu ADC (via GADC). + * + * @addtogroup GAUDIN + * + * @{ + */ #include "ch.h" #include "hal.h" diff --git a/drivers/ginput/touch/ADS7843/ginput_lld_mouse_config.h b/drivers/ginput/touch/ADS7843/ginput_lld_mouse_config.h index e2d44b4b..c0219712 100644 --- a/drivers/ginput/touch/ADS7843/ginput_lld_mouse_config.h +++ b/drivers/ginput/touch/ADS7843/ginput_lld_mouse_config.h @@ -4,19 +4,29 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _LLD_GINPUT_MOUSE_CONFIG_H -#define _LLD_GINPUT_MOUSE_CONFIG_H - -#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH -#define GINPUT_MOUSE_NEED_CALIBRATION TRUE -#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE -#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 5 -#define GINPUT_MOUSE_READ_CYCLES 4 -#define GINPUT_MOUSE_POLL_PERIOD 25 -#define GINPUT_MOUSE_MAX_CLICK_JITTER 10 -#define GINPUT_MOUSE_MAX_MOVE_JITTER 2 -#define GINPUT_MOUSE_CLICK_TIME 500 - -#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ -/** @} */ + +/** + * @file drivers/ginput/touch/ADS7843/ginput_lld_mouse_config.h + * @brief GINPUT LLD header file for mouse/touch driver. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * + * @{ + */ + +#ifndef _LLD_GINPUT_MOUSE_CONFIG_H +#define _LLD_GINPUT_MOUSE_CONFIG_H + +#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH +#define GINPUT_MOUSE_NEED_CALIBRATION TRUE +#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE +#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 5 +#define GINPUT_MOUSE_READ_CYCLES 4 +#define GINPUT_MOUSE_POLL_PERIOD 25 +#define GINPUT_MOUSE_MAX_CLICK_JITTER 10 +#define GINPUT_MOUSE_MAX_MOVE_JITTER 2 +#define GINPUT_MOUSE_CLICK_TIME 500 + +#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ +/** @} */ diff --git a/drivers/ginput/touch/MCU/ginput_lld_mouse_config.h b/drivers/ginput/touch/MCU/ginput_lld_mouse_config.h index bf84cb7c..29d6aea5 100644 --- a/drivers/ginput/touch/MCU/ginput_lld_mouse_config.h +++ b/drivers/ginput/touch/MCU/ginput_lld_mouse_config.h @@ -4,19 +4,29 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _LLD_GINPUT_MOUSE_CONFIG_H -#define _LLD_GINPUT_MOUSE_CONFIG_H - -#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH -#define GINPUT_MOUSE_NEED_CALIBRATION TRUE -#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE -#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 12 -#define GINPUT_MOUSE_READ_CYCLES 4 -#define GINPUT_MOUSE_POLL_PERIOD 25 -#define GINPUT_MOUSE_MAX_CLICK_JITTER 2 -#define GINPUT_MOUSE_MAX_MOVE_JITTER 2 -#define GINPUT_MOUSE_CLICK_TIME 500 - -#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ -/** @} */ + +/** + * @file drivers/ginput/touch/MCU/ginput_lld_mouse_config.h + * @brief GINPUT LLD header file for touch driver. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * + * @{ + */ + +#ifndef _LLD_GINPUT_MOUSE_CONFIG_H +#define _LLD_GINPUT_MOUSE_CONFIG_H + +#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH +#define GINPUT_MOUSE_NEED_CALIBRATION TRUE +#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE +#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 12 +#define GINPUT_MOUSE_READ_CYCLES 4 +#define GINPUT_MOUSE_POLL_PERIOD 25 +#define GINPUT_MOUSE_MAX_CLICK_JITTER 2 +#define GINPUT_MOUSE_MAX_MOVE_JITTER 2 +#define GINPUT_MOUSE_CLICK_TIME 500 + +#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ +/** @} */ diff --git a/drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h b/drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h index 84cb7aa9..9d08d724 100644 --- a/drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h +++ b/drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h @@ -4,23 +4,33 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _LLD_GINPUT_MOUSE_CONFIG_H -#define _LLD_GINPUT_MOUSE_CONFIG_H - -#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH -#define GINPUT_MOUSE_NEED_CALIBRATION TRUE -#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE -#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 5 -#define GINPUT_MOUSE_READ_CYCLES 1 -#define GINPUT_MOUSE_POLL_PERIOD 25 -#define GINPUT_MOUSE_MAX_CLICK_JITTER 10 -#define GINPUT_MOUSE_MAX_MOVE_JITTER 5 -#define GINPUT_MOUSE_CLICK_TIME 450 - -/* default values - over write these in your boad files */ -#define STMP811_SLOWER_RESPONSE FALSE -#define STMP811_NO_GPIO_IRQPIN FALSE - -#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ -/** @} */ + +/** + * @file drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h + * @brief GINPUT LLD header file for mouse/touch driver. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * + * @{ + */ + +#ifndef _LLD_GINPUT_MOUSE_CONFIG_H +#define _LLD_GINPUT_MOUSE_CONFIG_H + +#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH +#define GINPUT_MOUSE_NEED_CALIBRATION TRUE +#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE +#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 5 +#define GINPUT_MOUSE_READ_CYCLES 1 +#define GINPUT_MOUSE_POLL_PERIOD 25 +#define GINPUT_MOUSE_MAX_CLICK_JITTER 10 +#define GINPUT_MOUSE_MAX_MOVE_JITTER 5 +#define GINPUT_MOUSE_CLICK_TIME 450 + +/* default values - over write these in your boad files */ +#define STMP811_SLOWER_RESPONSE FALSE +#define STMP811_NO_GPIO_IRQPIN FALSE + +#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ +/** @} */ diff --git a/drivers/multiple/Win32/ginput_lld_mouse_config.h b/drivers/multiple/Win32/ginput_lld_mouse_config.h index 4c322e18..39478aaa 100644 --- a/drivers/multiple/Win32/ginput_lld_mouse_config.h +++ b/drivers/multiple/Win32/ginput_lld_mouse_config.h @@ -4,37 +4,47 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _LLD_GINPUT_MOUSE_CONFIG_H -#define _LLD_GINPUT_MOUSE_CONFIG_H - -// This driver supports being both a mouse or a touch device (we don't actually know which it really is) -// When operating in mouse mode a long left button click does not generate a context click. -// When operating in touch mode we allow sloppier clicks etc -#if 1 - #define GINPUT_MOUSE_EVENT_TYPE GEVENT_MOUSE - #define GINPUT_MOUSE_CLICK_TIME TIME_INFINITE // Long click != Context Click - #define GINPUT_MOUSE_NEED_CALIBRATION FALSE - #define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE - #define GINPUT_MOUSE_READ_CYCLES 1 - #define GINPUT_MOUSE_MAX_CALIBRATION_ERROR -1 - #define GINPUT_MOUSE_MAX_CLICK_JITTER 0 - #define GINPUT_MOUSE_MAX_MOVE_JITTER 0 -#else - #define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH - #define GINPUT_MOUSE_CLICK_TIME 700 // Long click = Context Click - #define GINPUT_MOUSE_NEED_CALIBRATION FALSE // Can be set to TRUE just for testing - #define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE - #define GINPUT_MOUSE_READ_CYCLES 1 - #define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 2 - #define GINPUT_MOUSE_MAX_CLICK_JITTER 2 - #define GINPUT_MOUSE_MAX_MOVE_JITTER 2 -#endif - -// This driver supports both an "interrupt" mode, and a polled mode -#define GINPUT_MOUSE_POLL_PERIOD TIME_INFINITE // Interrupt driven by the Window thread -//#define GINPUT_MOUSE_POLL_PERIOD 25 // Poll driven - -#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ -/** @} */ - + +/** + * @file drivers/multiple/Win32/ginput_lld_mouse_config.h + * @brief GINPUT LLD header file for mouse/touch driver. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * + * @{ + */ + +#ifndef _LLD_GINPUT_MOUSE_CONFIG_H +#define _LLD_GINPUT_MOUSE_CONFIG_H + +// This driver supports being both a mouse or a touch device (we don't actually know which it really is) +// When operating in mouse mode a long left button click does not generate a context click. +// When operating in touch mode we allow sloppier clicks etc +#if 1 + #define GINPUT_MOUSE_EVENT_TYPE GEVENT_MOUSE + #define GINPUT_MOUSE_CLICK_TIME TIME_INFINITE // Long click != Context Click + #define GINPUT_MOUSE_NEED_CALIBRATION FALSE + #define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE + #define GINPUT_MOUSE_READ_CYCLES 1 + #define GINPUT_MOUSE_MAX_CALIBRATION_ERROR -1 + #define GINPUT_MOUSE_MAX_CLICK_JITTER 0 + #define GINPUT_MOUSE_MAX_MOVE_JITTER 0 +#else + #define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH + #define GINPUT_MOUSE_CLICK_TIME 700 // Long click = Context Click + #define GINPUT_MOUSE_NEED_CALIBRATION FALSE // Can be set to TRUE just for testing + #define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE + #define GINPUT_MOUSE_READ_CYCLES 1 + #define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 2 + #define GINPUT_MOUSE_MAX_CLICK_JITTER 2 + #define GINPUT_MOUSE_MAX_MOVE_JITTER 2 +#endif + +// This driver supports both an "interrupt" mode, and a polled mode +#define GINPUT_MOUSE_POLL_PERIOD TIME_INFINITE // Interrupt driven by the Window thread +//#define GINPUT_MOUSE_POLL_PERIOD 25 // Poll driven + +#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */ +/** @} */ + diff --git a/include/gadc/gadc.h b/include/gadc/gadc.h index 17d1f028..af43ce06 100644 --- a/include/gadc/gadc.h +++ b/include/gadc/gadc.h @@ -5,6 +5,35 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gadc/gadc.h + * @brief GADC - Periodic ADC subsystem header file. + * + * @addtogroup GADC + * + * @details The reason why ChibiOS/GFX has it's own ADC abstraction is because + * the Chibi-OS drivers are very CPU specific and do not + * provide a way across all hardware platforms to create periodic + * ADC conversions. There are also issues with devices with different + * characteristics or periodic requirements on the same ADC + * device (but different channels). This layer attempts to solve these + * problems to provide a architecture neutral API. It also provides extra + * features such as multi-buffer chaining for high speed ADC sources. + * It provides one high speed virtual ADC device (eg a microphone) and + * numerous low speed (less than 100Hz) virtual ADC devices (eg dials, + * temperature sensors etc). The high speed device has timer based polling + * to ensure exact conversion periods and a buffer management system. + * The low speed devices are assumed to be non-critical timing devices + * and do not have any buffer management. + * Note that while only one high speed device has been provided it can + * be used to read multiple physical ADC channels on the one physical + * ADC device. + * All callback routines are thread based unlike the Chibi-OS interrupt based + * routines. + * + * @{ + */ + #ifndef _GADC_H #define _GADC_H diff --git a/include/gadc/lld/gadc_lld.h b/include/gadc/lld/gadc_lld.h index 4638920e..a2f4822c 100644 --- a/include/gadc/lld/gadc_lld.h +++ b/include/gadc/lld/gadc_lld.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gadc/lld/gadc_lld.h + * @brief GADC - Periodic ADC driver header file. + * + * @defgroup Driver Driver + * @ingroup GADC + * @{ + */ + #ifndef _GADC_LLD_H #define _GADC_LLD_H diff --git a/include/gaudin/gaudin.h b/include/gaudin/gaudin.h index f8d19d94..0a530cf9 100644 --- a/include/gaudin/gaudin.h +++ b/include/gaudin/gaudin.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gaudin/gaudin.h + * @brief GAUDIN - Audio Input subsystem header file. + * + * @addtogroup GAUDIN + * + * @{ + */ + #ifndef _GAUDIN_H #define _GAUDIN_H diff --git a/include/gaudin/lld/gaudin_lld.h b/include/gaudin/lld/gaudin_lld.h index b516ace6..6a9e34c1 100644 --- a/include/gaudin/lld/gaudin_lld.h +++ b/include/gaudin/lld/gaudin_lld.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gaudin/lld/gaudin_lld.h + * @brief GAUDIN - Audio Input driver header file. + * + * @defgroup Driver Driver + * @ingroup GAUDIN + * @{ + */ + #ifndef _GAUDIN_LLD_H #define _GAUDIN_LLD_H diff --git a/include/gaudout/gaudout.h b/include/gaudout/gaudout.h index 1de2a5c7..ef60eeb0 100644 --- a/include/gaudout/gaudout.h +++ b/include/gaudout/gaudout.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gaudout/gaudout.h + * @brief GAUDOUT - Audio Output subsystem header file. + * + * @addtogroup GAUDOUT + * + * @{ + */ + #ifndef _GAUDOUT_H #define _GAUDOUT_H diff --git a/include/gevent/gevent.h b/include/gevent/gevent.h index 15efd0b9..27d05db6 100644 --- a/include/gevent/gevent.h +++ b/include/gevent/gevent.h @@ -4,6 +4,20 @@ * * http://chibios-gfx.com/license.html */ + +/** + * @file include/gevent/gevent.h + * @brief GEVENT GFX User Event subsystem header file. + * + * @addtogroup GEVENT + * + * @details GEVENT provides a simple to use but yet powerful event + * system. + * + * @pre GFX_USE_GEVENT must be set to TRUE in your gfxconf.h + * + * @{ + */ #ifndef _GEVENT_H #define _GEVENT_H diff --git a/include/ginput/dial.h b/include/ginput/dial.h index 5f565a4d..af54952a 100644 --- a/include/ginput/dial.h +++ b/include/ginput/dial.h @@ -4,6 +4,22 @@ * * http://chibios-gfx.com/license.html */ + +/** + * @file include/ginput/dial.h + * @brief GINPUT GFX User Input subsystem header file. + * + * @defgroup Dial Dial + * @ingroup GINPUT + * + * @details A dial provides a powerful way to navigate through menus + * on a display. + * + * @pre GFX_USE_GINPUT must be set to TRUE in your gfxconf.h + * @pre GINPUT_NEED_DIAL must be set to TRUE in your gfxconf.h + * + * @{ + */ #ifndef _GINPUT_DIAL_H #define _GINPUT_DIAL_H diff --git a/include/ginput/ginput.h b/include/ginput/ginput.h index 07a5e0b7..be998c4e 100644 --- a/include/ginput/ginput.h +++ b/include/ginput/ginput.h @@ -4,32 +4,46 @@ * * http://chibios-gfx.com/license.html */ -#ifndef _GINPUT_H -#define _GINPUT_H - -#include "gfx.h" - -#if GFX_USE_GINPUT || defined(__DOXYGEN__) - -/* How to use... - - 1. Get source handles for all the inputs you are interested in. - - Attempting to get a handle for one instance of an input more than once will return the same handle - 2. Create a listener - 3. Assign inputs to your listener. - - Inputs can be assigned or released from a listener at any time. - - An input can be assigned to more than one listener. - 4. Loop on getting listener events - 5. When complete destroy the listener -*/ - -// Include various ginput types -#include "ginput/mouse.h" -#include "ginput/keyboard.h" -#include "ginput/toggle.h" -#include "ginput/dial.h" - -#endif /* GFX_USE_GINPUT */ - -#endif /* _GINPUT_H */ -/** @} */ + +/** + * @file include/ginput/ginput.h + * @brief GINPUT GFX User Input subsystem header file. + * + * @addtogroup GINPUT + * + * @details GINPUT provides an easy and common interface to use different input devices + * such as touchscreens and mices. + * + * @pre GFX_USE_GINPUT must be set to TRUE in your gfxconf.h + * + * @{ + */ +#ifndef _GINPUT_H +#define _GINPUT_H + +#include "gfx.h" + +#if GFX_USE_GINPUT || defined(__DOXYGEN__) + +/* How to use... + + 1. Get source handles for all the inputs you are interested in. + - Attempting to get a handle for one instance of an input more than once will return the same handle + 2. Create a listener + 3. Assign inputs to your listener. + - Inputs can be assigned or released from a listener at any time. + - An input can be assigned to more than one listener. + 4. Loop on getting listener events + 5. When complete destroy the listener +*/ + +// Include various ginput types +#include "ginput/mouse.h" +#include "ginput/keyboard.h" +#include "ginput/toggle.h" +#include "ginput/dial.h" + +#endif /* GFX_USE_GINPUT */ + +#endif /* _GINPUT_H */ +/** @} */ diff --git a/include/ginput/keyboard.h b/include/ginput/keyboard.h index 2c00a6c6..add2eff7 100644 --- a/include/ginput/keyboard.h +++ b/include/ginput/keyboard.h @@ -4,116 +4,125 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _GINPUT_KEYBOARD_H -#define _GINPUT_KEYBOARD_H - -#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ - -#define GINPUT_KEYBOARD_NUM_PORTS 1 // The total number of keyboard inputs - -// Event types for various ginput sources -#define GEVENT_KEYBOARD (GEVENT_GINPUT_FIRST+2) - -typedef struct GEventKeyboard_t { - GEventType type; // The type of this event (GEVENT_KEYBOARD) - uint16_t instance; // The keyboard instance - char c; // The Ascii code for the current key press. - // The only possible values are 0(NUL), 8(BS), 9(TAB), 13(CR), 27(ESC), 32(SPACE) to 126(~), 127(DEL) - // 0 indicates an extended only key. - uint16_t code; // An extended keyboard code. Codes less than 128 match their ascii equivelent. - #define GKEY_NULL 0 - #define GKEY_BACKSPACE 8 - #define GKEY_TAB 9 - #define GKEY_CR 13 - #define GKEY_ESC 27 - #define GKEY_SPACE 32 - #define GKEY_DEL 127 - #define GKEY_UP 0x0101 - #define GKEY_DOWN 0x0102 - #define GKEY_LEFT 0x0103 - #define GKEY_RIGHT 0x0104 - #define GKEY_HOME 0x0105 - #define GKEY_END 0x0106 - #define GKEY_PAGEUP 0x0107 - #define GKEY_PAGEDOWN 0x0108 - #define GKEY_INSERT 0x0109 - #define GKEY_DELETE 0x010A - #define GKEY_SHIFT 0x0201 - #define GKEY_CNTRL 0x0202 - #define GKEY_ALT 0x0203 - #define GKEY_WINKEY 0x0204 - #define GKEY_RCLKEY 0x0205 - #define GKEY_FNKEY 0x0206 - #define GKEY_FN1 0x0301 - #define GKEY_FN2 0x0302 - #define GKEY_FN3 0x0303 - #define GKEY_FN4 0x0304 - #define GKEY_FN5 0x0305 - #define GKEY_FN6 0x0306 - #define GKEY_FN7 0x0307 - #define GKEY_FN8 0x0308 - #define GKEY_FN9 0x0309 - #define GKEY_FN10 0x030A - #define GKEY_FN11 0x030B - #define GKEY_FN12 0x030C - uint16_t current_buttons; // A bit is set to indicate various meta status. - #define GMETA_KEY_DOWN 0x0001 - #define GMETA_KEY_SHIFT 0x0002 - #define GMETA_KEY_CNTRL 0x0004 - #define GMETA_KEY_ALT 0x0008 - #define GMETA_KEY_WINKEY 0x0010 - #define GMETA_KEY_RCLKKEY 0x0020 - #define GMETA_KEY_FN 0x0040 - #define GMETA_KEY_MISSED_EVENT 0x8000 - uint16_t last_buttons; // The value of current_buttons on the last event -} GEventKeyboard; - -// Keyboard Listen Flags - passed to geventAddSourceToListener() -#define GLISTEN_KEYREPEATS 0x0001 // Return key repeats (where the key is held down to get a repeat character) -#define GLISTEN_KEYCODES 0x0002 // Return all key presses including extended code key presses (not just ascii codes) -#define GLISTEN_KEYALL 0x0004 // Return keyup's, keydown's and everything in between (but not repeats unless GLISTEN_KEYREPEATS is set). -#define GLISTEN_KEYSINGLE 0x8000 // Return only when one particular extended code key is pressed or released. The particular extended code is OR'd into this value - // eg. (GLISTEN_KEYSINGLE | GKEY_CR) - // No other flags may be set with this flag. - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief Create a keyboard input instance - * - * @param[in] instance The ID of the keyboard input instance (from 0 to 9999) - * - * @return The source handle of the created input instance - */ - GSourceHandle ginputGetKeyboard(uint16_t instance); - - /** - * @brief Get the current keyboard status - * - * @param[in] instance The ID of the keyboard input instance - * @param[in] pkeyboard The keyboard event struct - * - * @return Returns FALSE on an error (eg invalid instance) - */ - bool_t ginputGetKeyboardStatus(uint16_t instance, GEventKeyboard *pkeyboard); - -#ifdef __cplusplus -} -#endif - -#endif /* GINPUT_NEED_KEYBOARD */ - -#endif /* _GINPUT_KEYBOARD_H */ -/** @} */ - + +/** + * @file include/ginput/keyboard.h + * @brief GINPUT GFX User Input subsystem header file. + * + * @defgroup Keyboard Keyboard + * @ingroup GINPUT + * @{ + */ + +#ifndef _GINPUT_KEYBOARD_H +#define _GINPUT_KEYBOARD_H + +#if GINPUT_NEED_KEYBOARD || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Type definitions */ +/*===========================================================================*/ + +#define GINPUT_KEYBOARD_NUM_PORTS 1 // The total number of keyboard inputs + +// Event types for various ginput sources +#define GEVENT_KEYBOARD (GEVENT_GINPUT_FIRST+2) + +typedef struct GEventKeyboard_t { + GEventType type; // The type of this event (GEVENT_KEYBOARD) + uint16_t instance; // The keyboard instance + char c; // The Ascii code for the current key press. + // The only possible values are 0(NUL), 8(BS), 9(TAB), 13(CR), 27(ESC), 32(SPACE) to 126(~), 127(DEL) + // 0 indicates an extended only key. + uint16_t code; // An extended keyboard code. Codes less than 128 match their ascii equivelent. + #define GKEY_NULL 0 + #define GKEY_BACKSPACE 8 + #define GKEY_TAB 9 + #define GKEY_CR 13 + #define GKEY_ESC 27 + #define GKEY_SPACE 32 + #define GKEY_DEL 127 + #define GKEY_UP 0x0101 + #define GKEY_DOWN 0x0102 + #define GKEY_LEFT 0x0103 + #define GKEY_RIGHT 0x0104 + #define GKEY_HOME 0x0105 + #define GKEY_END 0x0106 + #define GKEY_PAGEUP 0x0107 + #define GKEY_PAGEDOWN 0x0108 + #define GKEY_INSERT 0x0109 + #define GKEY_DELETE 0x010A + #define GKEY_SHIFT 0x0201 + #define GKEY_CNTRL 0x0202 + #define GKEY_ALT 0x0203 + #define GKEY_WINKEY 0x0204 + #define GKEY_RCLKEY 0x0205 + #define GKEY_FNKEY 0x0206 + #define GKEY_FN1 0x0301 + #define GKEY_FN2 0x0302 + #define GKEY_FN3 0x0303 + #define GKEY_FN4 0x0304 + #define GKEY_FN5 0x0305 + #define GKEY_FN6 0x0306 + #define GKEY_FN7 0x0307 + #define GKEY_FN8 0x0308 + #define GKEY_FN9 0x0309 + #define GKEY_FN10 0x030A + #define GKEY_FN11 0x030B + #define GKEY_FN12 0x030C + uint16_t current_buttons; // A bit is set to indicate various meta status. + #define GMETA_KEY_DOWN 0x0001 + #define GMETA_KEY_SHIFT 0x0002 + #define GMETA_KEY_CNTRL 0x0004 + #define GMETA_KEY_ALT 0x0008 + #define GMETA_KEY_WINKEY 0x0010 + #define GMETA_KEY_RCLKKEY 0x0020 + #define GMETA_KEY_FN 0x0040 + #define GMETA_KEY_MISSED_EVENT 0x8000 + uint16_t last_buttons; // The value of current_buttons on the last event +} GEventKeyboard; + +// Keyboard Listen Flags - passed to geventAddSourceToListener() +#define GLISTEN_KEYREPEATS 0x0001 // Return key repeats (where the key is held down to get a repeat character) +#define GLISTEN_KEYCODES 0x0002 // Return all key presses including extended code key presses (not just ascii codes) +#define GLISTEN_KEYALL 0x0004 // Return keyup's, keydown's and everything in between (but not repeats unless GLISTEN_KEYREPEATS is set). +#define GLISTEN_KEYSINGLE 0x8000 // Return only when one particular extended code key is pressed or released. The particular extended code is OR'd into this value + // eg. (GLISTEN_KEYSINGLE | GKEY_CR) + // No other flags may be set with this flag. + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief Create a keyboard input instance + * + * @param[in] instance The ID of the keyboard input instance (from 0 to 9999) + * + * @return The source handle of the created input instance + */ + GSourceHandle ginputGetKeyboard(uint16_t instance); + + /** + * @brief Get the current keyboard status + * + * @param[in] instance The ID of the keyboard input instance + * @param[in] pkeyboard The keyboard event struct + * + * @return Returns FALSE on an error (eg invalid instance) + */ + bool_t ginputGetKeyboardStatus(uint16_t instance, GEventKeyboard *pkeyboard); + +#ifdef __cplusplus +} +#endif + +#endif /* GINPUT_NEED_KEYBOARD */ + +#endif /* _GINPUT_KEYBOARD_H */ +/** @} */ + diff --git a/include/ginput/lld/dial.h b/include/ginput/lld/dial.h index bdcd2c3b..7c16851f 100644 --- a/include/ginput/lld/dial.h +++ b/include/ginput/lld/dial.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/ginput/lld/dial.h + * @brief GINPUT header file for dial drivers. + * + * @defgroup Dial Dial + * @ingroup GINPUT + * @{ + */ + #ifndef _LLD_GINPUT_DIAL_H #define _LLD_GINPUT_DIAL_H diff --git a/include/ginput/lld/mouse.h b/include/ginput/lld/mouse.h index 111e8263..a9e755c4 100644 --- a/include/ginput/lld/mouse.h +++ b/include/ginput/lld/mouse.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/ginput/lld/mouse.h + * @brief GINPUT LLD header file for mouse/touch drivers. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * @{ + */ + #ifndef _LLD_GINPUT_MOUSE_H #define _LLD_GINPUT_MOUSE_H diff --git a/include/ginput/lld/toggle.h b/include/ginput/lld/toggle.h index 34aafe32..869b92f8 100644 --- a/include/ginput/lld/toggle.h +++ b/include/ginput/lld/toggle.h @@ -4,49 +4,58 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _LLD_GINPUT_TOGGLE_H -#define _LLD_GINPUT_TOGGLE_H - -#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__) - -// Describes how the toggle bits are obtained -typedef struct GToggleConfig_t { - void *id; - unsigned mask; - unsigned invert; - iomode_t mode; -} GToggleConfig; - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - - extern const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES]; - - void ginput_lld_toggle_init(const GToggleConfig *ptc); - unsigned ginput_lld_toggle_getbits(const GToggleConfig *ptc); - - /* This routine is provided to low level drivers to wakeup a value read from a thread context. - * Particularly useful if GINPUT_TOGGLE_POLL_PERIOD = TIME_INFINITE - */ - void ginputToggleWakeup(void); - - /* This routine is provided to low level drivers to wakeup a value read from an ISR - * Particularly useful if GINPUT_TOGGLE_POLL_PERIOD = TIME_INFINITE - */ - void ginputToggleWakeupI(void); - -#ifdef __cplusplus -} -#endif - -#endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */ - -#endif /* _LLD_GINPUT_TOGGLE_H */ -/** @} */ - + +/** + * @file include/ginput/lld/toggle.h + * @brief GINPUT header file for toggle drivers. + * + * @defgroup Toggle Toggle + * @ingroup GINPUT + * @{ + */ + +#ifndef _LLD_GINPUT_TOGGLE_H +#define _LLD_GINPUT_TOGGLE_H + +#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__) + +// Describes how the toggle bits are obtained +typedef struct GToggleConfig_t { + void *id; + unsigned mask; + unsigned invert; + iomode_t mode; +} GToggleConfig; + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + + extern const GToggleConfig GInputToggleConfigTable[GINPUT_TOGGLE_CONFIG_ENTRIES]; + + void ginput_lld_toggle_init(const GToggleConfig *ptc); + unsigned ginput_lld_toggle_getbits(const GToggleConfig *ptc); + + /* This routine is provided to low level drivers to wakeup a value read from a thread context. + * Particularly useful if GINPUT_TOGGLE_POLL_PERIOD = TIME_INFINITE + */ + void ginputToggleWakeup(void); + + /* This routine is provided to low level drivers to wakeup a value read from an ISR + * Particularly useful if GINPUT_TOGGLE_POLL_PERIOD = TIME_INFINITE + */ + void ginputToggleWakeupI(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */ + +#endif /* _LLD_GINPUT_TOGGLE_H */ +/** @} */ + diff --git a/include/ginput/mouse.h b/include/ginput/mouse.h index d49a7a97..011372c4 100644 --- a/include/ginput/mouse.h +++ b/include/ginput/mouse.h @@ -4,140 +4,156 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _GINPUT_MOUSE_H -#define _GINPUT_MOUSE_H - -#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ - -/* This type definition is also used by touch */ -typedef struct GEventMouse_t { - GEventType type; // The type of this event (GEVENT_MOUSE or GEVENT_TOUCH) - uint16_t instance; // The mouse/touch instance - coord_t x, y, z; // The position of the mouse. - // - For touch devices, Z is the current pressure if supported (otherwise 0) - // - For mice, Z is the 3rd dimension if supported (otherwise 0) - uint16_t current_buttons; // A bit is set if the button is down. - // - For touch only bit 0 is relevant - // - For mice the order of the buttons is (from 0 to n) left, right, middle, any other buttons - // - Bit 15 being set indicates that an important mouse event has been missed. - #define GINPUT_MOUSE_BTN_LEFT 0x0001 - #define GINPUT_MOUSE_BTN_RIGHT 0x0002 - #define GINPUT_MOUSE_BTN_MIDDLE 0x0004 - #define GINPUT_MOUSE_BTN_4 0x0008 - #define GINPUT_MISSED_MOUSE_EVENT 0x8000 - #define GINPUT_TOUCH_PRESSED GINPUT_MOUSE_BTN_LEFT - uint16_t last_buttons; // The value of current_buttons on the last event - enum GMouseMeta_e { - GMETA_NONE = 0, // There is no meta event currently happening - GMETA_MOUSE_DOWN = 1, // Button 0 has just gone down - GMETA_MOUSE_UP = 2, // Button 0 has just gone up - GMETA_MOUSE_CLICK = 4, // Button 0 has just gone through a short down - up cycle - GMETA_MOUSE_CXTCLICK = 8 // For mice - The right button has just been depressed - // For touch - a long press has just occurred - } meta; - } GEventMouse; - -// Mouse/Touch Listen Flags - passed to geventAddSourceToListener() -#define GLISTEN_MOUSEMETA 0x0001 // Create events for meta events such as CLICK and CXTCLICK -#define GLISTEN_MOUSEDOWNMOVES 0x0002 // Creates mouse move events when the primary mouse button is down (touch is on the surface) -#define GLISTEN_MOUSEUPMOVES 0x0004 // Creates mouse move events when the primary mouse button is up (touch is off the surface - if the hardware allows). -#define GLISTEN_MOUSENOFILTER 0x0008 // Don't filter out mouse moves where the position hasn't changed. -#define GLISTEN_TOUCHMETA GLISTEN_MOUSEMETA -#define GLISTEN_TOUCHDOWNMOVES GLISTEN_MOUSEDOWNMOVES -#define GLISTEN_TOUCHUPMOVES GLISTEN_MOUSEUPMOVES -#define GLISTEN_TOUCHNOFILTER GLISTEN_MOUSENOFILTER - -#define GINPUT_MOUSE_NUM_PORTS 1 // The total number of mouse/touch inputs supported - -// Event types for the mouse ginput source -#define GEVENT_MOUSE (GEVENT_GINPUT_FIRST+0) -#define GEVENT_TOUCH (GEVENT_GINPUT_FIRST+1) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief Creates an instance of a mouse and returns the Source handler - * @note hack: if the instance is 9999, no calibration will be performed! - * - * @param[in] instance The ID of the mouse input instance (from 0 to 9999) - * - * @return The source handle of the created instance - */ - GSourceHandle ginputGetMouse(uint16_t instance); - - /** - * @brief Get the current mouse position and button status - * @note Unlinke a listener event, this status cannot record meta events such as - * "CLICK". - * - * @param[in] instance The ID of the mouse input instance - * @param[in] pmouse The mouse event - * - * @return FALSE on an error (eg. invalid instance) - */ - bool_t ginputGetMouseStatus(uint16_t instance, GEventMouse *pmouse); - - /** - * @brief Performs a calibration - * - * @param[in] instance The ID of the mouse input instance - * - * @return FALSE if the driver dosen't support a calibration of if the handle is invalid - */ - bool_t ginputCalibrateMouse(uint16_t instance); - - /* Set the routines to save and fetch calibration data. - * This function should be called before first calling ginputGetMouse() for a particular instance - * as the gdispGetMouse() routine may attempt to fetch calibration data and perform a startup calibration if there is no way to get it. - * If this is called after gdispGetMouse() has been called and the driver requires calibration storage, it will immediately save the data is has already obtained. - * The 'requireFree' parameter indicates if the fetch buffer must be free()'d to deallocate the buffer provided by the Fetch routine. - */ - typedef void (*GMouseCalibrationSaveRoutine)(uint16_t instance, const uint8_t *calbuf, size_t sz); // Save calibration data - typedef const char * (*GMouseCalibrationLoadRoutine)(uint16_t instance); // Load calibration data (returns NULL if not data saved) - - /** - * @brief Set the routines to store and restore calibration data - * - * @details This function should be called before first calling ginputGetMouse() for a particular instance - * as the gdispGetMouse() routine may attempt to fetch calibration data and perform a startup calibration if there is no way to get it. - * If this is called after gdispGetMouse() has been called and the driver requires calibration storage, it will immediately save the - * data is has already obtained. - * The 'requireFree' parameter indicates if the fetch buffer must be free()'d to deallocate the buffer provided by the Fetch routine. - * - * @param[in] instance The ID of the mouse input instance - * @param[in] fnsave The routine to save the data - * @param[in] fnload The routine to restore the data - * @param[in] requireFree ToDo - */ - void ginputSetMouseCalibrationRoutines(uint16_t instance, GMouseCalibrationSaveRoutine fnsave, GMouseCalibrationLoadRoutine fnload, bool_t requireFree); - - /** - * @brief Test if a particular mouse/touch instance requires routines to save it's alibration data - * @note Not implemented yet - * - * @param[in] instance The ID of the mouse input instance - * - * @return TRUE if needed - */ - bool_t ginputRequireMouseCalibrationStorage(uint16_t instance); - -#ifdef __cplusplus -} -#endif - -#endif /* GINPUT_NEED_MOUSE */ - -#endif /* _GINPUT_MOUSE_H */ -/** @} */ - + +/** + * @file include/ginput/mouse.h + * @brief GINPUT GFX User Input subsystem header file for mouse and touch. + * + * @defgroup Mouse Mouse + * @ingroup GINPUT + * + * @details GINPUT allows it to easily interface touchscreens and mices to + * your application. + * + * @pre GFX_USE_GINPUT must be set to TRUE in your gfxconf.h + * @pre GINPUT_NEED_MOUSE must be set to TRUE in your gfxconf.h + * + * @{ + */ + +#ifndef _GINPUT_MOUSE_H +#define _GINPUT_MOUSE_H + +#if GINPUT_NEED_MOUSE || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Type definitions */ +/*===========================================================================*/ + +/* This type definition is also used by touch */ +typedef struct GEventMouse_t { + GEventType type; // The type of this event (GEVENT_MOUSE or GEVENT_TOUCH) + uint16_t instance; // The mouse/touch instance + coord_t x, y, z; // The position of the mouse. + // - For touch devices, Z is the current pressure if supported (otherwise 0) + // - For mice, Z is the 3rd dimension if supported (otherwise 0) + uint16_t current_buttons; // A bit is set if the button is down. + // - For touch only bit 0 is relevant + // - For mice the order of the buttons is (from 0 to n) left, right, middle, any other buttons + // - Bit 15 being set indicates that an important mouse event has been missed. + #define GINPUT_MOUSE_BTN_LEFT 0x0001 + #define GINPUT_MOUSE_BTN_RIGHT 0x0002 + #define GINPUT_MOUSE_BTN_MIDDLE 0x0004 + #define GINPUT_MOUSE_BTN_4 0x0008 + #define GINPUT_MISSED_MOUSE_EVENT 0x8000 + #define GINPUT_TOUCH_PRESSED GINPUT_MOUSE_BTN_LEFT + uint16_t last_buttons; // The value of current_buttons on the last event + enum GMouseMeta_e { + GMETA_NONE = 0, // There is no meta event currently happening + GMETA_MOUSE_DOWN = 1, // Button 0 has just gone down + GMETA_MOUSE_UP = 2, // Button 0 has just gone up + GMETA_MOUSE_CLICK = 4, // Button 0 has just gone through a short down - up cycle + GMETA_MOUSE_CXTCLICK = 8 // For mice - The right button has just been depressed + // For touch - a long press has just occurred + } meta; + } GEventMouse; + +// Mouse/Touch Listen Flags - passed to geventAddSourceToListener() +#define GLISTEN_MOUSEMETA 0x0001 // Create events for meta events such as CLICK and CXTCLICK +#define GLISTEN_MOUSEDOWNMOVES 0x0002 // Creates mouse move events when the primary mouse button is down (touch is on the surface) +#define GLISTEN_MOUSEUPMOVES 0x0004 // Creates mouse move events when the primary mouse button is up (touch is off the surface - if the hardware allows). +#define GLISTEN_MOUSENOFILTER 0x0008 // Don't filter out mouse moves where the position hasn't changed. +#define GLISTEN_TOUCHMETA GLISTEN_MOUSEMETA +#define GLISTEN_TOUCHDOWNMOVES GLISTEN_MOUSEDOWNMOVES +#define GLISTEN_TOUCHUPMOVES GLISTEN_MOUSEUPMOVES +#define GLISTEN_TOUCHNOFILTER GLISTEN_MOUSENOFILTER + +#define GINPUT_MOUSE_NUM_PORTS 1 // The total number of mouse/touch inputs supported + +// Event types for the mouse ginput source +#define GEVENT_MOUSE (GEVENT_GINPUT_FIRST+0) +#define GEVENT_TOUCH (GEVENT_GINPUT_FIRST+1) + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief Creates an instance of a mouse and returns the Source handler + * @note hack: if the instance is 9999, no calibration will be performed! + * + * @param[in] instance The ID of the mouse input instance (from 0 to 9999) + * + * @return The source handle of the created instance + */ + GSourceHandle ginputGetMouse(uint16_t instance); + + /** + * @brief Get the current mouse position and button status + * @note Unlinke a listener event, this status cannot record meta events such as + * "CLICK". + * + * @param[in] instance The ID of the mouse input instance + * @param[in] pmouse The mouse event + * + * @return FALSE on an error (eg. invalid instance) + */ + bool_t ginputGetMouseStatus(uint16_t instance, GEventMouse *pmouse); + + /** + * @brief Performs a calibration + * + * @param[in] instance The ID of the mouse input instance + * + * @return FALSE if the driver dosen't support a calibration of if the handle is invalid + */ + bool_t ginputCalibrateMouse(uint16_t instance); + + /* Set the routines to save and fetch calibration data. + * This function should be called before first calling ginputGetMouse() for a particular instance + * as the gdispGetMouse() routine may attempt to fetch calibration data and perform a startup calibration if there is no way to get it. + * If this is called after gdispGetMouse() has been called and the driver requires calibration storage, it will immediately save the data is has already obtained. + * The 'requireFree' parameter indicates if the fetch buffer must be free()'d to deallocate the buffer provided by the Fetch routine. + */ + typedef void (*GMouseCalibrationSaveRoutine)(uint16_t instance, const uint8_t *calbuf, size_t sz); // Save calibration data + typedef const char * (*GMouseCalibrationLoadRoutine)(uint16_t instance); // Load calibration data (returns NULL if not data saved) + + /** + * @brief Set the routines to store and restore calibration data + * + * @details This function should be called before first calling ginputGetMouse() for a particular instance + * as the gdispGetMouse() routine may attempt to fetch calibration data and perform a startup calibration if there is no way to get it. + * If this is called after gdispGetMouse() has been called and the driver requires calibration storage, it will immediately save the + * data is has already obtained. + * The 'requireFree' parameter indicates if the fetch buffer must be free()'d to deallocate the buffer provided by the Fetch routine. + * + * @param[in] instance The ID of the mouse input instance + * @param[in] fnsave The routine to save the data + * @param[in] fnload The routine to restore the data + * @param[in] requireFree ToDo + */ + void ginputSetMouseCalibrationRoutines(uint16_t instance, GMouseCalibrationSaveRoutine fnsave, GMouseCalibrationLoadRoutine fnload, bool_t requireFree); + + /** + * @brief Test if a particular mouse/touch instance requires routines to save it's alibration data + * @note Not implemented yet + * + * @param[in] instance The ID of the mouse input instance + * + * @return TRUE if needed + */ + bool_t ginputRequireMouseCalibrationStorage(uint16_t instance); + +#ifdef __cplusplus +} +#endif + +#endif /* GINPUT_NEED_MOUSE */ + +#endif /* _GINPUT_MOUSE_H */ +/** @} */ + diff --git a/include/ginput/toggle.h b/include/ginput/toggle.h index 0910433b..ee3d8420 100644 --- a/include/ginput/toggle.h +++ b/include/ginput/toggle.h @@ -4,81 +4,97 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _GINPUT_TOGGLE_H -#define _GINPUT_TOGGLE_H - -#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Low Level Driver details and error checks. */ -/*===========================================================================*/ - -// Get the hardware definitions - Number of instances etc. -#include "ginput_lld_toggle_config.h" - -#ifndef GINPUT_TOGGLE_POLL_PERIOD - #define GINPUT_TOGGLE_POLL_PERIOD 200 -#endif - -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ - -// Event types for various ginput sources -#define GEVENT_TOGGLE (GEVENT_GINPUT_FIRST+3) - -typedef struct GEventToggle_t { - GEventType type; // The type of this event (GEVENT_TOGGLE) - uint16_t instance; // The toggle instance - bool_t on; // True if the toggle/button is on - } GEventToggle; - -// Toggle Listen Flags - passed to geventAddSourceToListener() -#define GLISTEN_TOGGLE_ON 0x0001 // Return an event when the toggle turns on -#define GLISTEN_TOGGLE_OFF 0x0002 // Return an event when the toggle turns off - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief Create a toggle input instance - * - * @param[in] instance The ID of the toggle input instance (from 0 to 9999) - * - * @return The source handle of the created instance - */ - GSourceHandle ginputGetToggle(uint16_t instance); - - /** - * @brief Can be used to invert the sense of a toggle - * - * @param[in] instance The ID of the toggle input instance - * @param[in] invert If TRUE, will be inverted - */ - void ginputInvertToggle(uint16_t instance, bool_t invert); - - /** - * @brief Get the current toggle status - * - * @param[in] instance The ID of the toggle input instance - * @param[in] ptoggle The toggle event struct - * - * @return Returns FALSE on an error (eg invalid instance) - */ - bool_t ginputGetToggleStatus(uint16_t instance, GEventToggle *ptoggle); - -#ifdef __cplusplus -} -#endif - -#endif /* GINPUT_NEED_TOGGLE */ - -#endif /* _GINPUT_TOGGLE_H */ -/** @} */ - + +/** + * @file include/ginput/toggle.h + * @brief GINPUT GFX User Input subsystem header file. + * + * @defgroup Toggle Toggle + * @ingroup GINPUT + * + * @details GINPUT allows it to interface toggle buttons easily to your + * application. + * + * @pre GFX_USE_GINPUT must be set to TRUE in your gfxconf.h + * @pre GINPUT_NEED_TOGGLE must be set to TRUE in your gfxconf.h + * + * @{ + */ + +#ifndef _GINPUT_TOGGLE_H +#define _GINPUT_TOGGLE_H + +#if GINPUT_NEED_TOGGLE || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Low Level Driver details and error checks. */ +/*===========================================================================*/ + +// Get the hardware definitions - Number of instances etc. +#include "ginput_lld_toggle_config.h" + +#ifndef GINPUT_TOGGLE_POLL_PERIOD + #define GINPUT_TOGGLE_POLL_PERIOD 200 +#endif + +/*===========================================================================*/ +/* Type definitions */ +/*===========================================================================*/ + +// Event types for various ginput sources +#define GEVENT_TOGGLE (GEVENT_GINPUT_FIRST+3) + +typedef struct GEventToggle_t { + GEventType type; // The type of this event (GEVENT_TOGGLE) + uint16_t instance; // The toggle instance + bool_t on; // True if the toggle/button is on + } GEventToggle; + +// Toggle Listen Flags - passed to geventAddSourceToListener() +#define GLISTEN_TOGGLE_ON 0x0001 // Return an event when the toggle turns on +#define GLISTEN_TOGGLE_OFF 0x0002 // Return an event when the toggle turns off + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief Create a toggle input instance + * + * @param[in] instance The ID of the toggle input instance (from 0 to 9999) + * + * @return The source handle of the created instance + */ + GSourceHandle ginputGetToggle(uint16_t instance); + + /** + * @brief Can be used to invert the sense of a toggle + * + * @param[in] instance The ID of the toggle input instance + * @param[in] invert If TRUE, will be inverted + */ + void ginputInvertToggle(uint16_t instance, bool_t invert); + + /** + * @brief Get the current toggle status + * + * @param[in] instance The ID of the toggle input instance + * @param[in] ptoggle The toggle event struct + * + * @return Returns FALSE on an error (eg invalid instance) + */ + bool_t ginputGetToggleStatus(uint16_t instance, GEventToggle *ptoggle); + +#ifdef __cplusplus +} +#endif + +#endif /* GINPUT_NEED_TOGGLE */ + +#endif /* _GINPUT_TOGGLE_H */ +/** @} */ + diff --git a/include/gmisc/gmisc.h b/include/gmisc/gmisc.h index 7e471c72..bf1aa498 100644 --- a/include/gmisc/gmisc.h +++ b/include/gmisc/gmisc.h @@ -5,6 +5,15 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gmisc/gmisc.h + * @brief GMISC - Miscellaneous Routines header file. + * + * @addtogroup GAUDIN + * + * @{ + */ + #ifndef _GMISC_H #define _GMISC_H diff --git a/include/gtimer/gtimer.h b/include/gtimer/gtimer.h index acdda990..7d7747d4 100644 --- a/include/gtimer/gtimer.h +++ b/include/gtimer/gtimer.h @@ -4,147 +4,167 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _GTIMER_H -#define _GTIMER_H - -#include "gfx.h" - -#if GFX_USE_GTIMER || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ - -/* Data part of a static GTimer initialiser */ -#define _GTIMER_DATA() {0,0,0,0,0,0,0} - -/* Static GTimer initialiser */ -#define GTIMER_DECL(name) GTimer name = _GTIMER_DATA() - -/* A callback function (executed in a thread context) */ -typedef void (*GTimerFunction)(void *param); - -/** - * @brief A GTimer structure - */ -typedef struct GTimer_t { - GTimerFunction fn; - void *param; - systime_t when; - systime_t period; - uint16_t flags; - struct GTimer_t *next; - struct GTimer_t *prev; -} GTimer; - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialise a timer. - * - * @param[in] pt pointer to a GTimer structure - * - * @api - */ -void gtimerInit(GTimer *pt); - -/** - * @brief Set a timer going or alter its properties if it is already going. - * - * @param[in] pt Pointer to a GTimer structure - * @param[in] fn The callback function - * @param[in] param The parameter to pass to the callback function - * @param[in] periodic Is the timer a periodic timer? FALSE is a once-only timer. - * @param[in] millisec The timer period. The following special values are allowed: - * TIME_IMMEDIATE causes the callback function to be called asap. - * A periodic timer with this value will fire once only. - * TIME_INFINITE never timeout (unless triggered by gtimerJab or gtimerJabI) - * - * @note If the timer is already active its properties are updated with the new parameters. - * The current period will be immediately canceled (without the callback function being - * called) and the timer will be restart with the new timer properties. - * @note The callback function should be careful not to over-run the thread stack. - * Define a new value for the macro GTIME_THREAD_STACK_SIZE if you want to - * change the default size. - * @note The callback function should return as quickly as possible as all - * timer callbacks are performed by a single thread. If a callback function - * takes too long it could affect the timer response for other timers. - * @note A timer callback function is not a replacement for a dedicated thread if the - * function wants to perform computationally expensive stuff. - * @note As the callback function is called on GTIMER's thread, the function must make sure it uses - * appropriate synchronisation controls such as semaphores or mutexes around any data - * structures it shares with other threads such as the main application thread. - * - * @api - */ -void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, bool_t periodic, systime_t millisec); - -/** - * @brief Stop a timer (periodic or otherwise) - * - * @param[in] pt Pointer to a GTimer structure - * - * @note If the timer is not active this does nothing. - * - * @api - */ -void gtimerStop(GTimer *pt); - -/** - * @brief Test if a timer is currently active - * - * @param[in] pt Pointer to a GTimer structure - * - * @return TRUE if active, FALSE otherwise - * - * @api - */ -bool_t gtimerIsActive(GTimer *pt); - -/** - * @brief Jab a timer causing the current period to immediate expire - * @details The callback function will be called as soon as possible. - * - * @pre Use from a normal thread context. - * - * @param[in] pt Pointer to a GTimer structure - * - * @note If the timer is not active this does nothing. - * @note Repeated Jabs before the callback function actually happens are ignored. - * - * @api - */ -void gtimerJab(GTimer *pt); - -/** - * @brief Jab a timer causing the current period to immediate expire - * @details The callback function will be called as soon as possible. - * - * @pre Use from an interrupt routine context. - * - * @param[in] pt Pointer to a GTimer structure - * - * @note If the timer is not active this does nothing. - * @note Repeated Jabs before the callback function actually happens are ignored. - * - * @iclass - * @api - */ -void gtimerJabI(GTimer *pt); - -#ifdef __cplusplus -} -#endif - -#endif /* GFX_USE_GTIMER */ - -#endif /* _GTIMER_H */ -/** @} */ - + +/** + * @file include/gtimer/gtimer.h + * @brief GTIMER GFX User Timer subsystem header file. + * + * @addtogroup GTIMER + * + * @details The reason why ChibiOS/GFX has it's own timer abstraction is because + * virtual timers provided by ChibiOS/RT are interrupt context only. + * While great for what they are designed for, they make coding of the input + * drivers much more complex. + * For non-performance critical drivers like these input drivers, it would also + * hog an in-ordinate amount of critical (interrupt locked) system time. + * This contrary to the goals of a real-time operating system. So a user-land + * (thread based) timer mechanism is also required. + * + * @pre GFX_USE_GTIMER must be set to TRUE in your gfxconf.h + * + * @{ + */ + +#ifndef _GTIMER_H +#define _GTIMER_H + +#include "gfx.h" + +#if GFX_USE_GTIMER || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Type definitions */ +/*===========================================================================*/ + +/* Data part of a static GTimer initialiser */ +#define _GTIMER_DATA() {0,0,0,0,0,0,0} + +/* Static GTimer initialiser */ +#define GTIMER_DECL(name) GTimer name = _GTIMER_DATA() + +/* A callback function (executed in a thread context) */ +typedef void (*GTimerFunction)(void *param); + +/** + * @brief A GTimer structure + */ +typedef struct GTimer_t { + GTimerFunction fn; + void *param; + systime_t when; + systime_t period; + uint16_t flags; + struct GTimer_t *next; + struct GTimer_t *prev; +} GTimer; + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialise a timer. + * + * @param[in] pt pointer to a GTimer structure + * + * @api + */ +void gtimerInit(GTimer *pt); + +/** + * @brief Set a timer going or alter its properties if it is already going. + * + * @param[in] pt Pointer to a GTimer structure + * @param[in] fn The callback function + * @param[in] param The parameter to pass to the callback function + * @param[in] periodic Is the timer a periodic timer? FALSE is a once-only timer. + * @param[in] millisec The timer period. The following special values are allowed: + * TIME_IMMEDIATE causes the callback function to be called asap. + * A periodic timer with this value will fire once only. + * TIME_INFINITE never timeout (unless triggered by gtimerJab or gtimerJabI) + * + * @note If the timer is already active its properties are updated with the new parameters. + * The current period will be immediately canceled (without the callback function being + * called) and the timer will be restart with the new timer properties. + * @note The callback function should be careful not to over-run the thread stack. + * Define a new value for the macro GTIME_THREAD_STACK_SIZE if you want to + * change the default size. + * @note The callback function should return as quickly as possible as all + * timer callbacks are performed by a single thread. If a callback function + * takes too long it could affect the timer response for other timers. + * @note A timer callback function is not a replacement for a dedicated thread if the + * function wants to perform computationally expensive stuff. + * @note As the callback function is called on GTIMER's thread, the function must make sure it uses + * appropriate synchronisation controls such as semaphores or mutexes around any data + * structures it shares with other threads such as the main application thread. + * + * @api + */ +void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, bool_t periodic, systime_t millisec); + +/** + * @brief Stop a timer (periodic or otherwise) + * + * @param[in] pt Pointer to a GTimer structure + * + * @note If the timer is not active this does nothing. + * + * @api + */ +void gtimerStop(GTimer *pt); + +/** + * @brief Test if a timer is currently active + * + * @param[in] pt Pointer to a GTimer structure + * + * @return TRUE if active, FALSE otherwise + * + * @api + */ +bool_t gtimerIsActive(GTimer *pt); + +/** + * @brief Jab a timer causing the current period to immediate expire + * @details The callback function will be called as soon as possible. + * + * @pre Use from a normal thread context. + * + * @param[in] pt Pointer to a GTimer structure + * + * @note If the timer is not active this does nothing. + * @note Repeated Jabs before the callback function actually happens are ignored. + * + * @api + */ +void gtimerJab(GTimer *pt); + +/** + * @brief Jab a timer causing the current period to immediate expire + * @details The callback function will be called as soon as possible. + * + * @pre Use from an interrupt routine context. + * + * @param[in] pt Pointer to a GTimer structure + * + * @note If the timer is not active this does nothing. + * @note Repeated Jabs before the callback function actually happens are ignored. + * + * @iclass + * @api + */ +void gtimerJabI(GTimer *pt); + +#ifdef __cplusplus +} +#endif + +#endif /* GFX_USE_GTIMER */ + +#endif /* _GTIMER_H */ +/** @} */ + diff --git a/include/gwin/button.h b/include/gwin/button.h index e56215fa..b96cb83e 100644 --- a/include/gwin/button.h +++ b/include/gwin/button.h @@ -5,6 +5,22 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gwin/button.h + * @brief GWIN Graphic window subsystem header file. + * + * @defgroup Button Button + * @ingroup GWIN + * + * @details GWIN allows it to easily create buttons with different styles + * and check for different meta states such as: PRESSED, CLICKED, + * RELEASED etc. + * + * @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h + * @pre GWIN_NEED_BUTTON must be set to TRUE in your gfxconf.h + * @{ + */ + #ifndef _GWIN_BUTTON_H #define _GWIN_BUTTON_H diff --git a/include/gwin/console.h b/include/gwin/console.h index e1f0260f..55bad841 100644 --- a/include/gwin/console.h +++ b/include/gwin/console.h @@ -4,113 +4,129 @@ * * http://chibios-gfx.com/license.html */ - -#ifndef _GWIN_CONSOLE_H -#define _GWIN_CONSOLE_H - -#if GWIN_NEED_CONSOLE || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define GW_CONSOLE 0x0001 - -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ - -// A console window. Supports wrapped text writing and a cursor. -typedef struct GConsoleObject_t { - GWindowObject gwin; - - struct GConsoleWindowStream_t { - const struct GConsoleWindowVMT_t *vmt; - _base_asynchronous_channel_data - } stream; - - coord_t cx,cy; // Cursor position - uint8_t fy; // Current font height - uint8_t fp; // Current font inter-character spacing - } GConsoleObject; - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Create a console window. - * @details A console window allows text to be written using chprintf() (and the console functions defined here). - * @brief Text in a console window supports newlines and will wrap text as required. - * @return NULL if there is no resultant drawing area, otherwise a window handle. - * - * @param[in] gc The GConsoleObject structure to initialise. If this is NULL the structure is dynamically allocated. - * @param[in] x,y The screen co-ordinates for the bottom left corner of the window - * @param[in] width The width of the window - * @param[in] height The height of the window - * @param[in] font The font to use - * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) - * @note If the dispay does not support scrolling, the window will be cleared when the bottom line is reached. - * @note The default drawing color gets set to White and the background drawing color to Black. - * @note The dimensions and position may be changed to fit on the real screen. - * - * @api - */ -GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font); - -/** - * @brief Get a stream from a console window suitable for use with chprintf(). - * @return The stream handle or NULL if this is not a console window. - * - * @param[in] gh The window handle (must be a console window) - * - * @api - */ -BaseSequentialStream *gwinGetConsoleStream(GHandle gh); - -/** - * @brief Put a character at the cursor position in the window. - * @note Uses the current foreground color to draw the character and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] c The character to draw - * - * @api - */ -void gwinPutChar(GHandle gh, char c); - -/** - * @brief Put a string at the cursor position in the window. It will wrap lines as required. - * @note Uses the current foreground color to draw the string and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] str The string to draw - * - * @api - */ -void gwinPutString(GHandle gh, const char *str); - -/** - * @brief Put the character array at the cursor position in the window. It will wrap lines as required. - * @note Uses the current foreground color to draw the string and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] str The string to draw - * @param[in] n The number of characters to draw - * - * @api - */ -void gwinPutCharArray(GHandle gh, const char *str, size_t n); - -#ifdef __cplusplus -} -#endif - -#endif /* GWIN_NEED_CONSOLE */ - -#endif /* _GWIN_CONSOLE_H */ -/** @} */ + +/** + * @file include/gwin/console.h + * @brief GWIN Graphic window subsystem header file. + * + * @defgroup Console Console + * @ingroup GWIN + * + * @details GWIN allows it to create a console/terminal like window. + * You can simply use chprintf() to print to the terminal. + * + * @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h + * @pre GWIN_NEED_CONSOLE must be set to TRUE in your gfxconf.h + * + * @{ + */ + +#ifndef _GWIN_CONSOLE_H +#define _GWIN_CONSOLE_H + +#if GWIN_NEED_CONSOLE || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +#define GW_CONSOLE 0x0001 + +/*===========================================================================*/ +/* Type definitions */ +/*===========================================================================*/ + +// A console window. Supports wrapped text writing and a cursor. +typedef struct GConsoleObject_t { + GWindowObject gwin; + + struct GConsoleWindowStream_t { + const struct GConsoleWindowVMT_t *vmt; + _base_asynchronous_channel_data + } stream; + + coord_t cx,cy; // Cursor position + uint8_t fy; // Current font height + uint8_t fp; // Current font inter-character spacing + } GConsoleObject; + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Create a console window. + * @details A console window allows text to be written using chprintf() (and the console functions defined here). + * @brief Text in a console window supports newlines and will wrap text as required. + * @return NULL if there is no resultant drawing area, otherwise a window handle. + * + * @param[in] gc The GConsoleObject structure to initialise. If this is NULL the structure is dynamically allocated. + * @param[in] x,y The screen co-ordinates for the bottom left corner of the window + * @param[in] width The width of the window + * @param[in] height The height of the window + * @param[in] font The font to use + * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) + * @note If the dispay does not support scrolling, the window will be cleared when the bottom line is reached. + * @note The default drawing color gets set to White and the background drawing color to Black. + * @note The dimensions and position may be changed to fit on the real screen. + * + * @api + */ +GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font); + +/** + * @brief Get a stream from a console window suitable for use with chprintf(). + * @return The stream handle or NULL if this is not a console window. + * + * @param[in] gh The window handle (must be a console window) + * + * @api + */ +BaseSequentialStream *gwinGetConsoleStream(GHandle gh); + +/** + * @brief Put a character at the cursor position in the window. + * @note Uses the current foreground color to draw the character and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] c The character to draw + * + * @api + */ +void gwinPutChar(GHandle gh, char c); + +/** + * @brief Put a string at the cursor position in the window. It will wrap lines as required. + * @note Uses the current foreground color to draw the string and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] str The string to draw + * + * @api + */ +void gwinPutString(GHandle gh, const char *str); + +/** + * @brief Put the character array at the cursor position in the window. It will wrap lines as required. + * @note Uses the current foreground color to draw the string and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] str The string to draw + * @param[in] n The number of characters to draw + * + * @api + */ +void gwinPutCharArray(GHandle gh, const char *str, size_t n); + +#ifdef __cplusplus +} +#endif + +#endif /* GWIN_NEED_CONSOLE */ + +#endif /* _GWIN_CONSOLE_H */ +/** @} */ diff --git a/include/gwin/gwin.h b/include/gwin/gwin.h index 1c8672de..43095643 100644 --- a/include/gwin/gwin.h +++ b/include/gwin/gwin.h @@ -5,6 +5,24 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gwin/gwin.h + * @brief GWIN Graphic window subsystem header file. + * + * @defgroup Window Window + * @ingroup GWIN + * + * @details GWIN provides a basic window manager which allows it to easily + * create and destroy different windows on runtime. Each window + * will have it's own properties such as colors, brushes as well as + * it's own drawing origin. + * Moving the windows around is not supported yet. + * + * @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h + * + * @{ + */ + #ifndef _GWIN_H #define _GWIN_H diff --git a/include/gwin/internal.h b/include/gwin/internal.h index fbd0d1c1..53392410 100644 --- a/include/gwin/internal.h +++ b/include/gwin/internal.h @@ -4,30 +4,38 @@ * * http://chibios-gfx.com/license.html */ -#ifndef _GWIN_INTERNAL_H -#define _GWIN_INTERNAL_H - -#if GFX_USE_GWIN || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Sub-system constants. */ -/*===========================================================================*/ - -#define GWIN_FLG_DYNAMIC 0x0001 -#define GBTN_FLG_ALLOCTXT 0x0002 -#define GWIN_FIRST_CONTROL_FLAG 0x0004 - -#ifdef __cplusplus -extern "C" { -#endif - -GHandle _gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* GFX_USE_GWIN */ - -#endif /* _GWIN_INTERNAL_H */ -/** @} */ + +/** + * @file include/gwin/internal.h + * @brief GWIN Graphic window subsystem header file. + * + * @addtogroup GWIN + * @{ + */ +#ifndef _GWIN_INTERNAL_H +#define _GWIN_INTERNAL_H + +#if GFX_USE_GWIN || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Sub-system constants. */ +/*===========================================================================*/ + +#define GWIN_FLG_DYNAMIC 0x0001 +#define GBTN_FLG_ALLOCTXT 0x0002 +#define GWIN_FIRST_CONTROL_FLAG 0x0004 + +#ifdef __cplusplus +extern "C" { +#endif + +GHandle _gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* GFX_USE_GWIN */ + +#endif /* _GWIN_INTERNAL_H */ +/** @} */ diff --git a/include/gwin/slider.h b/include/gwin/slider.h index 8f38b504..c22dc5f4 100644 --- a/include/gwin/slider.h +++ b/include/gwin/slider.h @@ -5,6 +5,20 @@ * http://chibios-gfx.com/license.html */ +/** + * @file include/gwin/slider.h + * @brief GWIN Graphic window subsystem header file. + * + * @defgroup Slider Slider + * @ingroup GWIN + * + * @details Create sliders with different styles + * + * @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h + * @pre GWIN_NEED_SLIDER must be set to TRUE in your gfxconf.h + * @{ + */ + #ifndef _GWIN_SLIDER_H #define _GWIN_SLIDER_H diff --git a/src/gwin/button.c b/src/gwin/button.c index 47c060e1..96478390 100644 --- a/src/gwin/button.c +++ b/src/gwin/button.c @@ -5,6 +5,16 @@ * http://chibios-gfx.com/license.html */ +/** + * @file src/gwin/button.c + * @brief GWIN sub-system button code. + * + * @defgroup Button Button + * @ingroup GWIN + * + * @{ + */ + #include "ch.h" #include "hal.h" #include "gfx.h" diff --git a/src/gwin/console.c b/src/gwin/console.c index 13482d25..6abb18dc 100644 --- a/src/gwin/console.c +++ b/src/gwin/console.c @@ -4,133 +4,143 @@ * * http://chibios-gfx.com/license.html */ - -#include "ch.h" -#include "hal.h" -#include "gfx.h" - -#if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__) - -#include - -#include "gwin/internal.h" - -#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE -#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE - -/* - * Stream interface implementation. The interface is write only - */ - -#define Stream2GWindow(ip) ((GHandle)(((char *)(ip)) - (size_t)(&(((GConsoleObject *)0)->stream)))) - -static size_t GWinStreamWrite(void *ip, const uint8_t *bp, size_t n) { gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; } -static size_t GWinStreamRead(void *ip, uint8_t *bp, size_t n) { (void)ip; (void)bp; (void)n; return 0; } -static msg_t GWinStreamPut(void *ip, uint8_t b) { gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; } -static msg_t GWinStreamGet(void *ip) {(void)ip; return RDY_OK; } -static msg_t GWinStreamPutTimed(void *ip, uint8_t b, systime_t time) { (void)time; gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; } -static msg_t GWinStreamGetTimed(void *ip, systime_t timeout) { (void)ip; (void)timeout; return RDY_OK; } -static size_t GWinStreamWriteTimed(void *ip, const uint8_t *bp, size_t n, systime_t time) { (void)time; gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; } -static size_t GWinStreamReadTimed(void *ip, uint8_t *bp, size_t n, systime_t time) { (void)ip; (void)bp; (void)n; (void)time; return 0; } - -struct GConsoleWindowVMT_t { - _base_asynchronous_channel_methods -}; - -static const struct GConsoleWindowVMT_t GWindowConsoleVMT = { - GWinStreamWrite, - GWinStreamRead, - GWinStreamPut, - GWinStreamGet, - GWinStreamPutTimed, - GWinStreamGetTimed, - GWinStreamWriteTimed, - GWinStreamReadTimed -}; - -GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font) { - if (!(gc = (GConsoleObject *)_gwinInit((GWindowObject *)gc, x, y, width, height, sizeof(GConsoleObject)))) - return 0; - gc->gwin.type = GW_CONSOLE; - gwinSetFont(&gc->gwin, font); - gc->stream.vmt = &GWindowConsoleVMT; - gc->cx = 0; - gc->cy = 0; - return (GHandle)gc; -} - -BaseSequentialStream *gwinGetConsoleStream(GHandle gh) { - if (gh->type != GW_CONSOLE) - return 0; - return (BaseSequentialStream *)&(((GConsoleObject *)(gh))->stream); -} - -void gwinPutChar(GHandle gh, char c) { - uint8_t width; - #define gcw ((GConsoleObject *)gh) - - if (gh->type != GW_CONSOLE || !gh->font) return; - - #if GDISP_NEED_CLIP - gdispSetClip(gh->x, gh->y, gh->width, gh->height); - #endif - - if (c == '\n') { - gcw->cx = 0; - gcw->cy += gcw->fy; - // We use lazy scrolling here and only scroll when the next char arrives - } else if (c == '\r') { - // gcw->cx = 0; - } else { - width = gdispGetCharWidth(c, gh->font) + gcw->fp; - if (gcw->cx + width >= gh->width) { - gcw->cx = 0; - gcw->cy += gcw->fy; - } - - if (gcw->cy + gcw->fy > gh->height) { -#if GDISP_NEED_SCROLL - /* scroll the console */ - gdispVerticalScroll(gh->x, gh->y, gh->width, gh->height, gcw->fy, gh->bgcolor); - /* reset the cursor to the start of the last line */ - gcw->cx = 0; - gcw->cy = (((coord_t)(gh->height/gcw->fy))-1)*gcw->fy; -#else - /* clear the console */ - gdispFillArea(gh->x, gh->y, gh->width, gh->height, gh->bgcolor); - /* reset the cursor to the top of the window */ - gcw->cx = 0; - gcw->cy = 0; -#endif - } - -#if GWIN_CONSOLE_USE_CLEAR_LINES - /* clear to the end of the line */ - if (gcw->cx == 0) - gdispFillArea(gh->x, gh->y + gcw->cy, gh->width, gcw->fy, gh->bgcolor); -#endif -#if GWIN_CONSOLE_USE_FILLED_CHARS - gdispFillChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color, gh->bgcolor); -#else - gdispDrawChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color); -#endif - - /* update cursor */ - gcw->cx += width; - } - #undef gcw -} - -void gwinPutString(GHandle gh, const char *str) { - while(*str) - gwinPutChar(gh, *str++); -} - -void gwinPutCharArray(GHandle gh, const char *str, size_t n) { - while(n--) - gwinPutChar(gh, *str++); -} - -#endif /* GFX_USE_GWIN && GWIN_NEED_CONSOLE */ -/** @} */ - + +/** + * @file src/gwin/console.c + * @brief GWIN sub-system console code. + * + * @defgroup Console Console + * @ingroup GWIN + * + * @{ + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__) + +#include + +#include "gwin/internal.h" + +#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE +#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE + +/* + * Stream interface implementation. The interface is write only + */ + +#define Stream2GWindow(ip) ((GHandle)(((char *)(ip)) - (size_t)(&(((GConsoleObject *)0)->stream)))) + +static size_t GWinStreamWrite(void *ip, const uint8_t *bp, size_t n) { gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; } +static size_t GWinStreamRead(void *ip, uint8_t *bp, size_t n) { (void)ip; (void)bp; (void)n; return 0; } +static msg_t GWinStreamPut(void *ip, uint8_t b) { gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; } +static msg_t GWinStreamGet(void *ip) {(void)ip; return RDY_OK; } +static msg_t GWinStreamPutTimed(void *ip, uint8_t b, systime_t time) { (void)time; gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; } +static msg_t GWinStreamGetTimed(void *ip, systime_t timeout) { (void)ip; (void)timeout; return RDY_OK; } +static size_t GWinStreamWriteTimed(void *ip, const uint8_t *bp, size_t n, systime_t time) { (void)time; gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; } +static size_t GWinStreamReadTimed(void *ip, uint8_t *bp, size_t n, systime_t time) { (void)ip; (void)bp; (void)n; (void)time; return 0; } + +struct GConsoleWindowVMT_t { + _base_asynchronous_channel_methods +}; + +static const struct GConsoleWindowVMT_t GWindowConsoleVMT = { + GWinStreamWrite, + GWinStreamRead, + GWinStreamPut, + GWinStreamGet, + GWinStreamPutTimed, + GWinStreamGetTimed, + GWinStreamWriteTimed, + GWinStreamReadTimed +}; + +GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font) { + if (!(gc = (GConsoleObject *)_gwinInit((GWindowObject *)gc, x, y, width, height, sizeof(GConsoleObject)))) + return 0; + gc->gwin.type = GW_CONSOLE; + gwinSetFont(&gc->gwin, font); + gc->stream.vmt = &GWindowConsoleVMT; + gc->cx = 0; + gc->cy = 0; + return (GHandle)gc; +} + +BaseSequentialStream *gwinGetConsoleStream(GHandle gh) { + if (gh->type != GW_CONSOLE) + return 0; + return (BaseSequentialStream *)&(((GConsoleObject *)(gh))->stream); +} + +void gwinPutChar(GHandle gh, char c) { + uint8_t width; + #define gcw ((GConsoleObject *)gh) + + if (gh->type != GW_CONSOLE || !gh->font) return; + + #if GDISP_NEED_CLIP + gdispSetClip(gh->x, gh->y, gh->width, gh->height); + #endif + + if (c == '\n') { + gcw->cx = 0; + gcw->cy += gcw->fy; + // We use lazy scrolling here and only scroll when the next char arrives + } else if (c == '\r') { + // gcw->cx = 0; + } else { + width = gdispGetCharWidth(c, gh->font) + gcw->fp; + if (gcw->cx + width >= gh->width) { + gcw->cx = 0; + gcw->cy += gcw->fy; + } + + if (gcw->cy + gcw->fy > gh->height) { +#if GDISP_NEED_SCROLL + /* scroll the console */ + gdispVerticalScroll(gh->x, gh->y, gh->width, gh->height, gcw->fy, gh->bgcolor); + /* reset the cursor to the start of the last line */ + gcw->cx = 0; + gcw->cy = (((coord_t)(gh->height/gcw->fy))-1)*gcw->fy; +#else + /* clear the console */ + gdispFillArea(gh->x, gh->y, gh->width, gh->height, gh->bgcolor); + /* reset the cursor to the top of the window */ + gcw->cx = 0; + gcw->cy = 0; +#endif + } + +#if GWIN_CONSOLE_USE_CLEAR_LINES + /* clear to the end of the line */ + if (gcw->cx == 0) + gdispFillArea(gh->x, gh->y + gcw->cy, gh->width, gcw->fy, gh->bgcolor); +#endif +#if GWIN_CONSOLE_USE_FILLED_CHARS + gdispFillChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color, gh->bgcolor); +#else + gdispDrawChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color); +#endif + + /* update cursor */ + gcw->cx += width; + } + #undef gcw +} + +void gwinPutString(GHandle gh, const char *str) { + while(*str) + gwinPutChar(gh, *str++); +} + +void gwinPutCharArray(GHandle gh, const char *str, size_t n) { + while(n--) + gwinPutChar(gh, *str++); +} + +#endif /* GFX_USE_GWIN && GWIN_NEED_CONSOLE */ +/** @} */ + diff --git a/src/gwin/graph.c b/src/gwin/graph.c index 05480862..dd4506a3 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -5,6 +5,16 @@ * http://chibios-gfx.com/license.html */ +/** + * @file src/gwin/graph.c + * @brief GWIN sub-system button code. + * + * @defgroup Graph Graph + * @ingroup GWIN + * + * @{ + */ + #include "ch.h" #include "hal.h" #include "gfx.h" diff --git a/src/gwin/slider.c b/src/gwin/slider.c index 72421367..26555f33 100644 --- a/src/gwin/slider.c +++ b/src/gwin/slider.c @@ -5,6 +5,16 @@ * http://chibios-gfx.com/license.html */ +/** + * @file src/gwin/slider.c + * @brief GWIN sub-system slider code. + * + * @defgroup Slider Slider + * @ingroup GWIN + * + * @{ + */ + #include "ch.h" #include "hal.h" #include "gfx.h"