OpenLogi

0x8090 · modeStatus

读写设备工作模式——通过位掩码控制的状态寄存器在性能模式与续航模式之间切换,并查询硬件与软件切换能力。

性能模式与续航模式之间切换设备的工作状态。getModeStatus(function 0)读取当前的 ModeStatus(主状态字节与次状态字节);setModeStatus(function 1)通过显式的已更改位掩码将其写回,确保调用方仅修改目标位。便捷封装 set_performance_mode 直接驱动 PERFORMANCE 单一标志,无需手动管理掩码。getDeviceConfig(function 2)报告设备支持哪些切换机制。

  • ModeStatus —— getModeStatus 的返回结构体,包含 status0: ModeStatus0(主标志位)与 status1: u8(次状态字节,v1 中为保留字段,但会透传给调用方)。
  • ModeStatus0::PERFORMANCE —— 置位 = 性能模式;清零 = 续航模式。
  • ModeStatusCapabilities::HARDWARE_SWITCH —— 设备有可更改模式位的物理开关。
  • ModeStatusCapabilities::SOFTWARE_SWITCH —— 软件可更改模式位。
  • ModeStatusChange —— 将期望值(status0status1)与已更改位掩码(changed_mask0changed_mask1)配对;仅写入被掩码选中的位。

规格: Logitech HID++ 2.0 —— modeStatus用于: openlogi-hidpp 中的类型化封装。

Function reference

The ModeStatusFeature wrapper (0x8090) exposes:

Methods

FunctionHID++ fnSignatureReturns
get_mode_status0()ModeStatus
set_mode_status1(change: ModeStatusChange)()
set_performance_mode1(enabled: bool)()
get_device_config2()ModeStatusCapabilities

All methods are async and return Result<…, Hidpp20Error>.

Types

ModeStatus

Current mode-status bytes returned by get_mode_status.

FieldTypeDescription
status0ModeStatus0Primary status bits.
status1u8Secondary status byte, reserved by v1 but preserved for callers.

ModeStatusChange

A mode-status update request passed to set_mode_status.

FieldTypeDescription
status0ModeStatus0Desired primary status bits.
status1u8Desired secondary status byte.
changed_mask0ModeStatus0Primary changed-bit mask.
changed_mask1u8Secondary changed-bit mask.

ModeStatus0

The first mode-status byte.

FlagBit/ValueDescription
PERFORMANCEbit 0Performance mode. When unset, the device is in endurance mode.

ModeStatusCapabilities

Capabilities reported by ModeStatus.

FlagBit/ValueDescription
HARDWARE_SWITCHbit 0A hardware switch can change the mode bit.
SOFTWARE_SWITCHbit 1Software can change the mode bit.

Wire format

Getter requests carry a 3-byte zero payload; set_mode_status uses a 16-byte long payload. Responses are decoded from the extended 16-byte payload returned by each call.

get_mode_status (fn 0)

Request: [0x00, 0x00, 0x00] (no parameters)

Response (byte → field):

ByteFieldNotes
0status0ModeStatus0 bitflags — bit 0 = PERFORMANCE
1status1Secondary status byte (reserved in v1)
2–15Unused

set_mode_status (fn 1)

Request (16-byte long payload):

ByteFieldNotes
0status0ModeStatus0::bits() — desired primary flags
1status1Desired secondary byte
2changed_mask0ModeStatus0::bits() — which primary bits to write
3changed_mask1Which secondary bits to write
4–15Zero

Response: no bytes consumed (only error status checked).

set_performance_mode (fn 1)

Convenience wrapper. Sends set_mode_status with status0 = PERFORMANCE (or empty) and changed_mask0 = PERFORMANCE, status1 = 0, changed_mask1 = 0. Wire layout is identical to set_mode_status above.

get_device_config (fn 2)

Request: [0x00, 0x00, 0x00] (no parameters)

Response (byte → field):

ByteFieldNotes
0capabilities high byteBig-endian u16 — bits 8–15 (none defined)
1capabilities low bytebit 0 = HARDWARE_SWITCH, bit 1 = SOFTWARE_SWITCH
2–15Unused

Usage (Rust)

use hidpp::{device::Device, feature::mode_status::ModeStatusFeature};

// device: &mut Device, already created via Device::new(channel, index)
device.enumerate_features().await?;
if let Some(feat) = device.get_feature::<ModeStatusFeature>() {
    // Read current mode
    let status = feat.get_mode_status().await?;
    println!("performance mode: {}", status.status0.contains(hidpp::feature::mode_status::ModeStatus0::PERFORMANCE));

    // Switch to performance mode
    feat.set_performance_mode(true).await?;

    // Check which switch mechanisms the device exposes
    let caps = feat.get_device_config().await?;
    println!("hw switch: {}, sw switch: {}",
        caps.contains(hidpp::feature::mode_status::ModeStatusCapabilities::HARDWARE_SWITCH),
        caps.contains(hidpp::feature::mode_status::ModeStatusCapabilities::SOFTWARE_SWITCH));
}

本页目录