ugfx/src/ginput/driver_mouse.h

154 lines
5.9 KiB
C

/*
* This file is subject to the terms of the GFX License. If a copy of
* the license was not distributed with this file, you can obtain one at:
*
* http://ugfx.org/license.html
*/
/**
* @file src/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__)
typedef struct MouseReading {
coord_t x, y, z;
uint16_t buttons;
} MouseReading;
#if !GINPUT_TOUCH_NOCALIBRATE
typedef struct MouseCalibration {
float ax;
float bx;
float cx;
float ay;
float by;
float cy;
} MouseCalibration;
#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;
#include "ginput_lld_mouse_config.h"
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @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
*/
MouseInstance *ginputMouseGetNewMouseForDisplay(const MOUSEVMT *vmt, GDisplay *g);
/**
* @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 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
*
* @notapi
*/
void ginputMouseWakeup(void);
/**
* @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 ginputMouseWakeupI(void);
#ifdef __cplusplus
}
#endif
#endif /* GINPUT_NEED_MOUSE */
#endif /* _LLD_GINPUT_MOUSE_H */
/** @} */