RawHID API
概述
HID RawHID 接口提供自定义通信协议,适用于需要超越标准键盘 、鼠标和手柄接口的专门 HID 功能的应用。这样可以实现双向通信和应用特定的消息传递。
Python HID RawHID API 实现位于 Applications/Python/PikaPython/MatrixOS_HID_RawHID.py,类型提示位于 Applications/Python/PikaPython/_MatrixOS_HID_RawHID.pyi。
MatrixOS.HID.RawHID.Get
def Get(timeout_ms: int = 0) -> bytes
从主机接收原始 HID 数据。
参数:
timeout_ms(int, 可选):等待数据的超时时间(毫秒),默认 0 表示无超时
返回值:
bytes:接收到的原始 HID 数据,如果没有数据则返回空字节
示例:
if MatrixOS.HID.Ready():
# 等待最多 100ms 的 HID 数据
data = MatrixOS.HID.RawHID.Get(100)
if data:
print(f"收到 {len(data)} 字节:{data.hex()}")
MatrixOS.HID.RawHID.Send
def Send(report: bytes) -> bool
向主机发送原始 HID 数据。
参数:
report(bytes):要发送的原始 HID 报告数据
返回值:
bool:成功发送时返回 True,出错时返回 False
示例:
if MatrixOS.HID.Ready():
# 发送自定义 HID 报告
report_data = bytes([0x01, 0x02, 0x03, 0x04])
success = MatrixOS.HID.RawHID.Send(report_data)
if success:
print("HID 报告发送成功")
RawHID 概念
自定义 HID 报告
RawHID 允许发送和接收不符合标准 HID 设备类的自定义 HID 报告:
- 自定义输入报告:设备到主机的通信
- 自定义输出报告:主机到设备的通信
- 功能报告:双向配置数据
数据协议
- 二进制数据:原始字节传输
- 结构化消息:协议特定的数据格式
- 命令/响应:请求-响应通信模式
实现示例
def rawhid_communication_example():
"""RawHID 通信接口示例"""
def send_custom_message(message_type, data):
"""通过 RawHID 发送自定义消息"""
# 这将取决于实际的 RawHID 实现
print(f"发送 RawHID 消息:类型 {message_type},数据:{data}")
def handle_rawhid_input():
"""处理传入的 RawHID 数据"""
# 这将取决于实际的 RawHID 实现
print("检查 RawHID 输入...")
message_types = {
0: "状态请求",
1: "LED 控制",
2: "配置更新",
3: "传感器数据"
}
print("RawHID 通信接口")
print("按按键发送不同的消息类型")
# 显示消息类型
for key_id, msg_type in message_types.items():
xy = MatrixOS.KeyPad.ID2XY(key_id)
MatrixOS.LED.SetColor(xy, Color(0, 100, 200), 100)
MatrixOS.LED.Update(255)
while True:
if not MatrixOS.HID.Ready():
print("HID 未准备好,重新尝试...")
MatrixOS.SYS.DelayMs(1000)
continue
# 检查传入数据
handle_rawhid_input()
# 处理按键输入以发送消息
key_event = MatrixOS.KeyPad.Get(100)
if key_event is not None:
key_id = key_event.ID()
key_info = key_event.KeyInfo()
if key_info.Active() and key_id in message_types:
msg_type = message_types[key_id]
# 根据消息类型准备示例数据
if msg_type == "状态请求":
data = {"运行时间": MatrixOS.SYS.Millis()}
elif msg_type == "LED 控制":
data = {"模式": "彩虹", "亮度": 255}
elif msg_type == "配置更新":
data = {"设置": "自动亮度", "值": True}
elif msg_type == "传感器数据":
data = {"温度": 25.5, "湿度": 60}
send_custom_message(key_id, data)
# 视觉反馈
xy = MatrixOS.KeyPad.ID2XY(key_id)
MatrixOS.LED.SetColor(xy, Color(255, 255, 255), 255)
MatrixOS.LED.Update(255)
MatrixOS.SYS.DelayMs(200)
MatrixOS.LED.SetColor(xy, Color(0, 100, 200), 100)
MatrixOS.LED.Update(255)
rawhid_communication_example()
高级 RawHID 示例
数据记录接口
def rawhid_data_logger():
"""基于 RawHID 的数据记录接口"""
log_buffer = []
max_buffer_size = 100
def add_log_entry(entry_type, data):
"""添加日志条目到缓冲区"""
timestamp = MatrixOS.SYS.Millis()
entry = {
"时间戳": timestamp,
"类型": entry_type,
"数据": data
}
log_buffer.append(entry)
# 维持缓冲区大小
if len(log_buffer) > max_buffer_size:
log_buffer.pop(0)
print(f"日志条目已添加:{entry_type}")
def send_log_data():
"""通过 RawHID 发送日志数据"""
if log_buffer:
# 在实际实现中,这会通过 RawHID 发送
print(f"通过 RawHID 发送 {len(log_buffer)} 条日志")
# 可以为大型日志实现分块传输
else:
print("没有日志数据要发送")
log_types = {
8: "按键",
9: "