diff options
Diffstat (limited to 'src/ginput/driver_mouse.h')
-rw-r--r-- | src/ginput/driver_mouse.h | 193 |
1 files changed, 84 insertions, 109 deletions
diff --git a/src/ginput/driver_mouse.h b/src/ginput/driver_mouse.h index 21d87dac..c60b9a0e 100644 --- a/src/ginput/driver_mouse.h +++ b/src/ginput/driver_mouse.h @@ -19,67 +19,80 @@ #if GINPUT_NEED_MOUSE || defined(__DOXYGEN__) -#include "ginput_lld_mouse_config.h" - -// GEVENT_MOUSE or GEVENT_TOUCH - What type of device is this. -#ifndef GINPUT_MOUSE_EVENT_TYPE - #define GINPUT_MOUSE_EVENT_TYPE GEVENT_MOUSE -#endif - -// TRUE/FALSE - Does the mouse/touch driver require calibration? -#ifndef GINPUT_MOUSE_NEED_CALIBRATION - #define GINPUT_MOUSE_NEED_CALIBRATION FALSE -#endif - -// TRUE/FALSE - Should the calibration happen at the extremes of the panel? -#ifndef GINPUT_MOUSE_CALIBRATE_EXTREMES - #define GINPUT_MOUSE_CALIBRATE_EXTREMES FALSE -#endif - -// TRUE/FALSE - Can the mouse/touch driver itself save calibration data? -#ifndef GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE - #define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE -#endif - -// n or -1 - n means to test calibration result (+/- pixels), -1 means not to. -#ifndef GINPUT_MOUSE_MAX_CALIBRATION_ERROR - #define GINPUT_MOUSE_MAX_CALIBRATION_ERROR -1 -#endif - -// n - How many times to read (and average) per poll -#ifndef GINPUT_MOUSE_READ_CYCLES - #define GINPUT_MOUSE_READ_CYCLES 1 -#endif - -// n - Millisecs between poll's -#ifndef GINPUT_MOUSE_POLL_PERIOD - #define GINPUT_MOUSE_POLL_PERIOD 25 -#endif - -// n - Movement allowed without discarding the CLICK or CLICKCXT event (+/- pixels) -#ifndef GINPUT_MOUSE_MAX_CLICK_JITTER - #define GINPUT_MOUSE_MAX_CLICK_JITTER 1 -#endif - -// n - Movement allowed without discarding the MOVE event (+/- pixels) -#ifndef GINPUT_MOUSE_MAX_MOVE_JITTER - #define GINPUT_MOUSE_MAX_MOVE_JITTER 0 -#endif +typedef struct MouseReading { + coord_t x, y, z; + uint16_t buttons; + } MouseReading; -// ms - Millisecs seperating a CLICK from a CXTCLICK -#ifndef GINPUT_MOUSE_CLICK_TIME - #define GINPUT_MOUSE_CLICK_TIME 700 +#if !GINPUT_TOUCH_NOCALIBRATE + typedef struct MouseCalibration { + float ax; + float bx; + float cx; + float ay; + float by; + float cy; + } MouseCalibration; #endif -// true/false - Whether the mouse driver internally handles screen rotation -#ifndef GINPUT_MOUSE_NO_ROTATION - #define GINPUT_MOUSE_NO_ROTATION FALSE -#endif +typedef struct MouseInstance { + struct MouseInstance * next; // The next mouse instance + const struct MOUSEVMT * vmt; // The mouse VMT + MouseReading r; // The current position and state + uint16_t flags; // Flags + #define GMOUSE_FLG_ACTIVE 0x0001 // Mouse is currently active + #define GMOUSE_FLG_DYNAMIC 0x0002 // Mouse is dynamically allocated + #define GMOUSE_FLG_CLICK_TIMER 0x0004 // Currently timing a click event + #define GMOUSE_FLG_INDELTA 0x0008 // Currently in a up/down transition test + #define GMOUSE_FLG_CLIP 0x0010 // Clip reading to the display + #define GMOUSE_FLG_CALIBRATE 0x0020 // Calibrate readings + #define GMOUSE_FLG_CAL_INPROGRESS 0x0040 // Calibrate is currently in progress + #define GMOUSE_FLG_CAL_SAVED 0x0080 // Calibration has been saved + #define GMOUSE_FLG_FINGERMODE 0x0100 // Mouse is currently in finger mode + point clickpos; // The position of the last click event + systemticks_t clicktime; // The time of the last click event + GDisplay * display; // The display the mouse is associated with + void * param; // A variable for private driver use + #if !GINPUT_TOUCH_NOCALIBRATE + GMouseCalibrationSaveRoutine fnsavecal; // The calibration load routine + GMouseCalibrationLoadRoutine fnloadcal; // The calibration save routine + MouseCalibration caldata; // The calibration data + #endif +} MouseInstance; + +typedef struct MouseJitter { + coord_t calibrate; // Maximum error for a calibration to succeed + coord_t click; // Movement allowed without discarding the CLICK or CLICKCXT event + coord_t move; // Movement allowed without discarding the MOVE event +} MouseJitter; + +typedef struct MOUSEVMT { + uint16_t flags; // Device flags + #define GMOUSE_VFLG_TOUCH 0x0001 // This is a touch device (rather than a mouse). Button 1 is calculated from z value. + #define GMOUSE_VFLG_NOPOLL 0x0002 // Do not poll this device - it is purely interrupt driven + #define GMOUSE_VFLG_SELFROTATION 0x0004 // This device returns readings that are aligned with the display orientation + #define GMOUSE_VFLG_DEFAULTFINGER 0x0008 // Default to finger mode + #define GMOUSE_VFLG_CALIBRATE 0x0010 // This device requires calibration + #define GMOUSE_VFLG_CAL_EXTREMES 0x0020 // Use edge to edge calibration + #define GMOUSE_VFLG_CAL_TEST 0x0040 // Test the results of the calibration + #define GMOUSE_VFLG_ONLY_DOWN 0x0100 // This device returns a valid position only when the mouse is down + #define GMOUSE_VFLG_POORUPDOWN 0x0200 // Position readings during up/down are unreliable + coord_t z_max; // TOUCH: Maximum possible z value (fully touched) + coord_t z_min; // TOUCH: Minimum possible z value (touch off screen). Note may also be > z_max + coord_t z_touchon; // TOUCH: z values between z_max and this are a solid touch on + coord_t z_touchoff; // TOUCH: z values between z_min and this are a solid touch off + + MouseJitter pen_jitter; // PEN MODE: Jitter settings + MouseJitter finger_jitter; // FINGER MODE: Jitter settings + + void (*init)((MouseInstance *pmouse); // Required + void (*get)(MouseInstance *pmouse, MouseReading *prd); // Required + void (*cal_save)(MouseInstance *pmouse, void *buf, size_t sz); // Optional + const char *(*cal_load)(MouseInstance *pmouse); // Optional: Can return NULL if no data is saved. + // Buffer is gfxFree()'d afterwards. +} MOUSEVMT; -typedef struct MouseReading_t { - coord_t x, y, z; - uint16_t buttons; - } MouseReading; +#include "ginput_lld_mouse_config.h" /*===========================================================================*/ /* External declarations. */ @@ -88,70 +101,33 @@ typedef struct MouseReading_t { #ifdef __cplusplus extern "C" { #endif - /** - * @brief Initialise the mouse/touch. + * @brief Get a new empty mouse instance and assign it this VMT and display + * @note This routine is provided to low level drivers by the high level code. + * @note This routine is designed for displays that have their own dedicated mouse + * eg. Win32, X, uGFXnet. + * The display driver will during initialisation call this routine to associate + * itself with a mouse. * * @notapi */ - void ginput_lld_mouse_init(void); + MouseInstance *ginputMouseGetNewMouseForDisplay(const MOUSEVMT *vmt, GDisplay *g); /** - * @brief Read the mouse/touch position. - * - * @param[in] pt A pointer to the structure to fill - * - * @note For drivers that don't support returning a position - * when the touch is up (most touch devices), it should - * return the previous position with the new Z value. - * The z value is the pressure for those touch devices - * that support it (-100 to 100 where > 0 is touched) - * or, 0 or 100 for those drivers that don't. + * @brief Release a mouse + * @note This routine is provided to low level drivers by the high level code. + * @note This routine is designed for displays that have their own dedicated mouse + * eg. Win32, X, uGFXnet. + * When the display has finished with the mouse it can release it. * * @notapi */ - void ginput_lld_mouse_get_reading(MouseReading *pt); - - #if GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE - /** - * @brief Load calibration data from a storage area on the touch controller. - * - * @param[in] instance The mouse instance number - * - * @note The instance parameter is currently always 0 as we only support - * one mouse/touch device at a time. - * @note This routine should only be provided if the driver has its own - * storage area where calibration data can be stored. The drivers - * option.h file should define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE = TRUE - * if it supports this. - * - * @notapi - */ - const char *ginput_lld_mouse_calibration_load(uint16_t instance); - /** - * @brief Save calibration data to a storage area on the touch controller. - * - * @param[in] instance The mouse instance number - * @param[in] calbuf The calibration data to be saved - * @param[in] sz The size of the calibration data - * - * @note The instance parameter is currently always 0 as we only support - * one mouse/touch device at a time. - * @note This routine should only be provided if the driver has its own - * storage area where calibration data can be stored. The drivers - * option.h file should define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE = TRUE - * if it supports this. - * - * @notapi - */ - void ginput_lld_mouse_calibration_save(uint16_t instance, const uint8_t *calbuf, size_t sz); - #endif + void ginputMouseGetNewMouseForDisplay(MouseIntance *pmouse); /** * @brief Wakeup the high level code so that it attempts another read * * @note This routine is provided to low level drivers by the high level code - * @note Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE * * @notapi */ @@ -161,7 +137,6 @@ extern "C" { * @brief Wakeup the high level code so that it attempts another read * * @note This routine is provided to low level drivers by the high level code - * @note Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE * * @iclass * @notapi @@ -172,7 +147,7 @@ extern "C" { } #endif -#endif /* GINPUT_NEED_MOUSE || GINPUT_NEED_TOUCH */ +#endif /* GINPUT_NEED_MOUSE */ #endif /* _LLD_GINPUT_MOUSE_H */ /** @} */ |