/* * This file is subject to the terms of the GFX License. If a copy of * the license was not distributed with this file, you can obtain one at: * * http://ugfx.io/license.html */ /** * @file src/ginput/ginput_driver_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 #if GINPUT_NEED_MOUSE //|| defined(__DOXYGEN__) // Include the GDRIVER infrastructure #include "../gdriver/gdriver.h" typedef struct GMouseReading { gCoord x, y, z; gU16 buttons; } GMouseReading; #if !GINPUT_TOUCH_NOCALIBRATE typedef struct GMouseCalibration { float ax; float bx; float cx; float ay; float by; float cy; } GMouseCalibration; #endif typedef struct GMouse { GDriver d; // The driver overheads and vmt GMouseReading r; // The current position and state gU16 flags; // Flags #define GMOUSE_FLG_CLICK_TIMER 0x0001 // Currently timing a click #define GMOUSE_FLG_INDELTA 0x0002 // Currently in a up/down transition test #define GMOUSE_FLG_CLIP 0x0004 // Clip reading to the display #define GMOUSE_FLG_CALIBRATE 0x0008 // Calibrate readings #define GMOUSE_FLG_IN_CAL 0x0010 // Currently in calibration routine #define GMOUSE_FLG_FINGERMODE 0x0020 // Mouse is currently in finger mode #define GMOUSE_FLG_NEEDREAD 0x0040 // The mouse needs reading #define GMOUSE_FLG_DRIVER_FIRST 0x0100 // The first flag available for the driver gPoint clickpos; // The position of the last click event gTicks clicktime; // The time of the last click event GDisplay * display; // The display the mouse is associated with #if !GINPUT_TOUCH_NOCALIBRATE GMouseCalibration caldata; // The calibration data #endif // Other driver specific fields may follow. } GMouse; typedef struct GMouseJitter { gCoord calibrate; // Maximum error for a calibration to succeed gCoord click; // Movement allowed without discarding the CLICK or CLICKCXT event gCoord move; // Movement allowed without discarding the MOVE event } GMouseJitter; typedef struct GMouseVMT { GDriverVMT d; // Device flags are part of the general vmt #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 #define GMOUSE_VFLG_DYNAMICONLY 0x8000 // This mouse driver should not be statically initialized eg Win32 gCoord z_max; // TOUCH: Maximum possible z value (fully touched) gCoord z_min; // TOUCH: Minimum possible z value (touch off screen). Note may also be > z_max gCoord z_touchon; // TOUCH: z values between z_max and this are a solid touch on gCoord z_touchoff; // TOUCH: z values between z_min and this are a solid touch off GMouseJitter pen_jitter; // PEN MODE: Jitter settings GMouseJitter finger_jitter; // FINGER MODE: Jitter settings gBool (*init)(GMouse *m, unsigned driverinstance); // Required void (*deinit)(GMouse *m); // Optional gBool (*get)(GMouse *m, GMouseReading *prd); // Required void (*calsave)(GMouse *m, const void *buf, gMemSize sz); // Optional gBool (*calload)(GMouse *m, void *buf, gMemSize sz); // Optional } GMouseVMT; #define gmvmt(m) ((const GMouseVMT const *)((m)->d.vmt)) /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ // If we are not using multiple mice then hard-code the VMT name #if !defined(GINPUT_MOUSE_DRIVER_LIST) #undef GMOUSE_DRIVER_VMT #define GMOUSE_DRIVER_VMT GMOUSEVMT_OnlyOne #endif #ifdef __cplusplus extern "C" { #endif /** * @brief Initialize a mouse driver * * @param[in] g The mouse driver * @param[in] display The display to which the mouse shall be assigned * @param[in] driverinstance The driver instance ToDo: Add some more details * @param[in] systeminstance The mouse instance ToDo: Add some more details * * @return gTrue on success, gFalse otherwise * @note This routine is provided by the high level code for * use in the driver VMT's GMouseVMT.d structure. * * @notapi */ gBool _gmouseInitDriver(GDriver *g, void *display, unsigned driverinstance, unsigned systeminstance); /** * @brief Routine that is called after initialization * * @param[in] g The mouse driver * @note This routine is provided by the high level code for * use in the driver VMT's GMouseVMT.d structure. * * @notapi */ void _gmousePostInitDriver(GDriver *g); /** * @brief Deinitialize a mouse driver * * @param[in] g The mouse driver * @note This routine is provided by the high level code for * use in the driver VMT's GMouseVMT.d structure. * * @notapi */ void _gmouseDeInitDriver(GDriver *g); /** * @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 * * @notapi */ void _gmouseWakeup(GMouse *m); /** * @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 * * @iclass * @notapi */ void _gmouseWakeupI(GMouse *m); #ifdef __cplusplus } #endif #endif /* GINPUT_NEED_MOUSE */ #endif /* _LLD_GINPUT_MOUSE_H */ /** @} */