aboutsummaryrefslogtreecommitdiffstats
path: root/src/ginput/driver_mouse.h
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2014-07-02 09:40:01 +1000
committerinmarket <andrewh@inmarket.com.au>2014-07-02 09:40:01 +1000
commit92d972cfd83b67961dc63d60c5317ec2651eb256 (patch)
treec52c0f2b46a02466cae70fa2c08d54d964129ef5 /src/ginput/driver_mouse.h
parent1a2e98af967d4433e98c5fa388cb816b1af46e2d (diff)
downloaduGFX-92d972cfd83b67961dc63d60c5317ec2651eb256.tar.gz
uGFX-92d972cfd83b67961dc63d60c5317ec2651eb256.tar.bz2
uGFX-92d972cfd83b67961dc63d60c5317ec2651eb256.zip
First part new mouse infrastructure
Diffstat (limited to 'src/ginput/driver_mouse.h')
-rw-r--r--src/ginput/driver_mouse.h193
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 */
/** @} */