hidpp/feature/
touchpad_raw_xy.rs1pub mod event;
6
7#[cfg(test)]
8mod tests;
9
10use num_enum::{IntoPrimitive, TryFromPrimitive};
11use openlogi_hidpp_derive::Feature;
12
13pub use event::{DualXyData, TouchPoint, TouchpadRawEvent};
14
15use crate::{
16 feature::{EventSource, FeatureEndpoint},
17 protocol::v20::Hidpp20Error,
18};
19
20bitflags::bitflags! {
21 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
27 #[cfg_attr(feature = "serde", derive(serde::Serialize))]
28 pub struct RawReportFlags: u8 {
29 const RAW = 1 << 0;
31 const FORCE_ADD = 1 << 1;
33 const ENHANCED = 1 << 2;
35 const WIDTH_HEIGHT = 1 << 3;
37 const NATIVE_GESTURE = 1 << 4;
39 const MAJOR_MINOR = 1 << 5;
41 const WIDTH_HEIGHT_8BIT = 1 << 6;
43 }
44}
45
46#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, TryFromPrimitive)]
48#[cfg_attr(feature = "serde", derive(serde::Serialize))]
49#[non_exhaustive]
50#[repr(u8)]
51pub enum Origin {
52 LowerLeft = 1,
54 LowerRight = 2,
56 UpperLeft = 3,
58 UpperRight = 4,
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize))]
66#[non_exhaustive]
67pub struct TouchpadInfo {
68 pub x_size: u16,
70 pub y_size: u16,
72 pub z_data_range: u8,
74 pub area_data_range: u8,
76 pub timestamp_units: u8,
78 pub max_finger_count: u8,
80 pub origin: Origin,
82 pub pen_support: bool,
84 pub raw_report_mapping_version: u8,
86 pub dpi: u16,
88}
89
90impl TouchpadInfo {
91 fn from_payload(payload: &[u8; 16]) -> Result<Self, Hidpp20Error> {
92 Ok(Self {
93 x_size: u16::from_be_bytes([payload[0], payload[1]]),
94 y_size: u16::from_be_bytes([payload[2], payload[3]]),
95 z_data_range: payload[4],
96 area_data_range: payload[5],
97 timestamp_units: payload[6],
98 max_finger_count: payload[7],
99 origin: Origin::try_from(payload[8]).map_err(|_| Hidpp20Error::UnsupportedResponse)?,
100 pen_support: payload[9] != 0,
101 raw_report_mapping_version: payload[12],
102 dpi: u16::from_be_bytes([payload[13], payload[14]]),
103 })
104 }
105}
106
107#[derive(Feature)]
109#[creatable(id = 0x6100, version = 0)]
110pub struct TouchpadRawXyFeature {
111 endpoint: FeatureEndpoint,
113
114 events: EventSource<TouchpadRawEvent>,
116}
117
118impl TouchpadRawXyFeature {
119 pub async fn get_touchpad_info(&self) -> Result<TouchpadInfo, Hidpp20Error> {
121 let payload = self.endpoint.call(0, [0; 3]).await?.extend_payload();
122 TouchpadInfo::from_payload(&payload)
123 }
124
125 pub async fn get_raw_report_state(&self) -> Result<RawReportFlags, Hidpp20Error> {
127 let payload = self.endpoint.call(1, [0; 3]).await?.extend_payload();
128 Ok(RawReportFlags::from_bits_retain(payload[0]))
129 }
130
131 pub async fn set_raw_report_state(&self, flags: RawReportFlags) -> Result<(), Hidpp20Error> {
135 self.endpoint.call(2, [flags.bits(), 0, 0]).await?;
136 Ok(())
137 }
138}