0x6100 · touchpadRawXY
查询集成触控板,并在启用原始上报后接收原始多点触控帧。
0x6100 公开集成触控板的原始多点触控帧。它报告触控板几何参数、传感器属性和当前原始上报标志。一个帧包含两个触点,因此更多触点的帧会使用相同时间戳跨多个报告发送。
规格: Logitech HID++ 2.0 —— touchpadRawXY(v0)。用于: OpenLogi 只提供类型化
openlogi-hidpp包装器。
函数参考
TouchpadRawXyFeature 实现 feature 版本 0。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_touchpad_info | 0 | () | TouchpadInfo |
get_raw_report_state | 1 | () | RawReportFlags |
set_raw_report_state | 2 | (flags: RawReportFlags) | () |
listen | event | () | async_channel::Receiver<TouchpadRawEvent> |
前三个方法是 async,并返回 Result<…, Hidpp20Error>。listen 是同步方法。
类型
TouchpadInfo
| 字段 | 类型 | 说明 |
|---|---|---|
x_size | u16 | 原生坐标单位中的触控板宽度。 |
y_size | u16 | 原生坐标单位中的触控板高度。 |
z_data_range | u8 | Z 数据范围。0x00 表示没有,0x0f 表示 16 位。 |
area_data_range | u8 | 区域数据范围。0x0f 表示 16 位。 |
timestamp_units | u8 | 以 0.1 ms 为单位的时间戳增量。 |
max_finger_count | u8 | 最大追踪触点数。 |
origin | Origin | 坐标原点。 |
pen_support | bool | 是否支持手写笔输入。 |
raw_report_mapping_version | u8 | 原始上报映射版本。 |
dpi | u16 | 原生传感器 DPI。 |
RawReportFlags
| 字段 | 值 | 说明 |
|---|---|---|
RAW | 1 << 0 | 启用原始上报。 |
FORCE_ADD | 1 << 1 | 向 16 位上报添加力值。已废弃。 |
ENHANCED | 1 << 2 | 启用增强上报。 |
WIDTH_HEIGHT | 1 << 3 | 报告宽度和高度,而不报告区域。 |
NATIVE_GESTURE | 1 << 4 | 报告原生手势。 |
MAJOR_MINOR | 1 << 5 | 报告长轴、短轴和方向数据。 |
WIDTH_HEIGHT_8BIT | 1 << 6 | 报告 8 位宽高字节,而不报告区域。 |
部分组合相互排斥。常见有效位图是 0x00、0x05、0x09、0x21 和 0x41。包装器会在读取值中保留未知位。它会原样写入调用者提供的 RawReportFlags 所有位。
Origin
| 变体 | 值 | 说明 |
|---|---|---|
LowerLeft | 1 | 左下角。 |
LowerRight | 2 | 右下角。 |
UpperLeft | 3 | 左上角。 |
UpperRight | 4 | 右上角。 |
DualXyData 和 TouchPoint
| 字段 | 类型 | 说明 |
|---|---|---|
timestamp | u16 | 运行中的帧时间戳。 |
touch1 | TouchPoint | 报告中的第一个触点。 |
touch2 | TouchPoint | 报告中的第二个触点。 |
button | bool | 表面物理开关状态。 |
end_of_frame | bool | 此报告完成该帧。 |
finger_count | u8 | 帧中的总触点数。 |
contact_type | u8 | 两位类型。0 是手指;其他值保留。 |
contact_status | u8 | 两位状态。0 是悬停;1 是触摸;其他值保留。 |
x | u16 | 14 位 X 坐标。 |
y | u16 | 14 位 Y 坐标。 |
finger_id | u8 | 四位触点 ID。 |
z | u8 | Z 距离或力值高字节,取决于标志。 |
area | u8 | 区域、力值低字节或标志选择的其他数据。 |
事件
TouchpadRawXyFeature 实现 EmittingFeature<TouchpadRawEvent>。它只接受事件子 ID 0。
| 变体 | 说明 |
|---|---|
DualXy(DualXyData) | 一条带有两个触点槽位的原始报告。 |
线格式
所有三个函数都发送三字节请求。OpenLogi 读取扩展响应负载,并忽略下表未列出的响应字节。
get_touchpad_info(fn 0)
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–1 | x_size | u16,BE。 |
| 2–3 | y_size | u16,BE。 |
| 4 | z_data_range | 原始 u8。 |
| 5 | area_data_range | 原始 u8。 |
| 6 | timestamp_units | 原始 u8,以 0.1 ms 为单位。 |
| 7 | max_finger_count | 原始 u8。 |
| 8 | origin | 值 1–4 映射到 Origin。其他值返回 Hidpp20Error::UnsupportedResponse。 |
| 9 | pen_support | 非零为 true。 |
| 10–11 | — | OpenLogi 忽略这些字节。 |
| 12 | raw_report_mapping_version | 原始 u8。 |
| 13–14 | dpi | u16,BE。 |
| 15 | — | OpenLogi 忽略该字节。 |
get_raw_report_state(fn 1)
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | RawReportFlags | 所有位都会保留,包括未知位。 |
| 1–15 | — | OpenLogi 忽略这些字节。 |
set_raw_report_state(fn 2)
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | flags | 精确的 RawReportFlags::bits() 值。 |
| 1–2 | — | OpenLogi 写入 0x00。 |
OpenLogi 接受成功的传输响应,但不解码响应负载。
DualXy 事件(fn 0)
事件负载是 16 字节。coord14(high, low) 是 (high & 0x3f) << 8 | low。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–1 | timestamp | u16,BE。 |
2 bits[7:6]、3 | touch1.contact_type、touch1.x | 类型和 14 位 X 坐标。 |
4 bits[7:6]、5 | touch1.contact_status、touch1.y | 状态和 14 位 Y 坐标。 |
| 6、7 | touch1.z、touch1.area | 原始、受标志影响的字节。 |
8 bits[7:4] | touch1.finger_id | 四位 ID。 |
8 bit[2] | button | 物理开关状态。 |
8 bit[0] | end_of_frame | 帧完成状态。 |
8 bits[3,1] | — | OpenLogi 忽略这些位。 |
9 bits[7:6]、10 | touch2.contact_type、touch2.x | 类型和 14 位 X 坐标。 |
11 bits[7:6]、12 | touch2.contact_status、touch2.y | 状态和 14 位 Y 坐标。 |
| 13、14 | touch2.z、touch2.area | 原始、受标志影响的字节。 |
15 bits[7:4] | touch2.finger_id | 四位 ID。 |
15 bits[3:0] | finger_count | 四位触点数。 |
OpenLogi 的用法
v0.8.15 的设备层和代理层没有使用 TouchpadRawXyFeature。类型化包装器不会为 OpenLogi 用户修改上报标志、读回上报标志或恢复上报标志。
Rust 用法
use hidpp::{
device::Device,
feature::{
EmittingFeature,
touchpad_raw_xy::{RawReportFlags, TouchpadRawXyFeature},
},
};
// device: &mut Device, already created via Device::new(channel, index)
device.enumerate_features().await?;
if let Some(feature) = device.get_feature::<TouchpadRawXyFeature>() {
println!("{:?}", feature.get_touchpad_info().await?);
feature.set_raw_report_state(RawReportFlags::RAW).await?;
let receiver = feature.listen();
while let Ok(event) = receiver.recv().await {
println!("{event:?}");
}
}