OpenLogi

0x6100 · touchpadRawXY

查询集成触控板,并在启用原始上报后接收原始多点触控帧。

0x6100 公开集成触控板的原始多点触控帧。它报告触控板几何参数、传感器属性和当前原始上报标志。一个帧包含两个触点,因此更多触点的帧会使用相同时间戳跨多个报告发送。

规格: Logitech HID++ 2.0 —— touchpadRawXY(v0)。用于: OpenLogi 只提供类型化 openlogi-hidpp 包装器。

函数参考

TouchpadRawXyFeature 实现 feature 版本 0。

方法

函数HID++ fn签名返回值
get_touchpad_info0()TouchpadInfo
get_raw_report_state1()RawReportFlags
set_raw_report_state2(flags: RawReportFlags)()
listenevent()async_channel::Receiver<TouchpadRawEvent>

前三个方法是 async,并返回 Result<…, Hidpp20Error>。listen 是同步方法。

类型

TouchpadInfo

字段类型说明
x_sizeu16原生坐标单位中的触控板宽度。
y_sizeu16原生坐标单位中的触控板高度。
z_data_rangeu8Z 数据范围。0x00 表示没有,0x0f 表示 16 位。
area_data_rangeu8区域数据范围。0x0f 表示 16 位。
timestamp_unitsu8以 0.1 ms 为单位的时间戳增量。
max_finger_countu8最大追踪触点数。
originOrigin坐标原点。
pen_supportbool是否支持手写笔输入。
raw_report_mapping_versionu8原始上报映射版本。
dpiu16原生传感器 DPI。

RawReportFlags

字段值说明
RAW1 << 0启用原始上报。
FORCE_ADD1 << 1向 16 位上报添加力值。已废弃。
ENHANCED1 << 2启用增强上报。
WIDTH_HEIGHT1 << 3报告宽度和高度,而不报告区域。
NATIVE_GESTURE1 << 4报告原生手势。
MAJOR_MINOR1 << 5报告长轴、短轴和方向数据。
WIDTH_HEIGHT_8BIT1 << 6报告 8 位宽高字节,而不报告区域。

部分组合相互排斥。常见有效位图是 0x00、0x05、0x09、0x21 和 0x41。包装器会在读取值中保留未知位。它会原样写入调用者提供的 RawReportFlags 所有位。

Origin

变体值说明
LowerLeft1左下角。
LowerRight2右下角。
UpperLeft3左上角。
UpperRight4右上角。

DualXyData 和 TouchPoint

字段类型说明
timestampu16运行中的帧时间戳。
touch1TouchPoint报告中的第一个触点。
touch2TouchPoint报告中的第二个触点。
buttonbool表面物理开关状态。
end_of_framebool此报告完成该帧。
finger_countu8帧中的总触点数。
contact_typeu8两位类型。0 是手指;其他值保留。
contact_statusu8两位状态。0 是悬停;1 是触摸;其他值保留。
xu1614 位 X 坐标。
yu1614 位 Y 坐标。
finger_idu8四位触点 ID。
zu8Z 距离或力值高字节,取决于标志。
areau8区域、力值低字节或标志选择的其他数据。

事件

TouchpadRawXyFeature 实现 EmittingFeature<TouchpadRawEvent>。它只接受事件子 ID 0。

变体说明
DualXy(DualXyData)一条带有两个触点槽位的原始报告。

线格式

所有三个函数都发送三字节请求。OpenLogi 读取扩展响应负载,并忽略下表未列出的响应字节。

get_touchpad_info(fn 0)

字节字段备注
0–1x_sizeu16,BE。
2–3y_sizeu16,BE。
4z_data_range原始 u8。
5area_data_range原始 u8。
6timestamp_units原始 u8,以 0.1 ms 为单位。
7max_finger_count原始 u8。
8origin值 1–4 映射到 Origin。其他值返回 Hidpp20Error::UnsupportedResponse。
9pen_support非零为 true。
10–11—OpenLogi 忽略这些字节。
12raw_report_mapping_version原始 u8。
13–14dpiu16,BE。
15—OpenLogi 忽略该字节。

get_raw_report_state(fn 1)

字节字段备注
0RawReportFlags所有位都会保留,包括未知位。
1–15—OpenLogi 忽略这些字节。

set_raw_report_state(fn 2)

字节字段备注
0flags精确的 RawReportFlags::bits() 值。
1–2—OpenLogi 写入 0x00。

OpenLogi 接受成功的传输响应,但不解码响应负载。

DualXy 事件(fn 0)

事件负载是 16 字节。coord14(high, low) 是 (high & 0x3f) << 8 | low。

字节字段备注
0–1timestampu16,BE。
2 bits[7:6]、3touch1.contact_type、touch1.x类型和 14 位 X 坐标。
4 bits[7:6]、5touch1.contact_status、touch1.y状态和 14 位 Y 坐标。
6、7touch1.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]、10touch2.contact_type、touch2.x类型和 14 位 X 坐标。
11 bits[7:6]、12touch2.contact_status、touch2.y状态和 14 位 Y 坐标。
13、14touch2.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:?}");
    }
}

本页目录