andyjusa/hydroshift2-rs

GitHub: andyjusa/hydroshift2-rs

非官方 Rust 库,通过 USB 直接控制联力 HydroShift II LCD-C 散热器的 LCD 显示、RGB 灯效与水泵风扇,无需官方 L-Connect 软件。

Stars: 0 | Forks: 0

# hydroshift2 **非官方的 Lian Li HydroShift II LCD-C Rust 协议与 USB 控制库** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/andyjusa/hydroshift2-rs/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-67e8f9.svg)](LICENSE) [![Rust 1.85+](https://img.shields.io/badge/rust-1.85%2B-f97316.svg)](https://www.rust-lang.org/) 无需 L-Connect 进程、DLL、服务或网络连接。
## 控制功能 | 表面 | 功能 | |---|---| | 圆形 LCD | 480×480 JPEG 背景与透明 PNG overlay | | LCD 控制 | 亮度、0°/90°/180°/270° 旋转、时钟/会话设置 | | 水泵圆环 | 24 个可寻址 RGB LED,静态帧与上传的动画 | | 散热 | 1600–2500 RPM 的水泵目标映射以及三个风扇控制字节 | | 传输 | 直接 USB bulk endpoint `0x01` / `0x81` | 该 crate 同时公开了高级的 [`HydroShiftII`] 控制器和无状态的 [`Protocol`] packet 编码器。USB、图像编码以及内置的 TinyUZ 支持 均由 feature flag 控制。 ## 快速入门 ``` [dependencies] hydroshift2 = { git = "https://github.com/andyjusa/hydroshift2-rs" } ``` ``` use hydroshift2::{HydroShiftII, Rotation}; fn main() -> hydroshift2::Result<()> { // Claims the USB interface and clears retained vendor LCD layers. let mut device = HydroShiftII::open_and_initialize()?; device.set_lcd_brightness(220)?; device.set_rotation(Rotation::Degrees0)?; device.set_pump_speed(2025, [0, 0, 0])?; // One RGB frame uses the dependency-free Rust TinyUZ encoder. device.set_static_rgb([0, 232, 255], 0.8)?; // A 64-frame, 20 FPS loop is compressed once and played by the device. device.set_rainbow()?; Ok(()) } ``` 打开设备不会改变其状态: ``` use hydroshift2::HydroShiftII; let device = HydroShiftII::open()?; // Call initialize_lcd() only when you want to clear the retained LCD layers. # Ok::<(), hydroshift2::Error>(()) ``` ### 发送 LCD 图像 ``` use hydroshift2::HydroShiftII; fn main() -> hydroshift2::Result<()> { let image = image::open("dashboard.png")?; let mut device = HydroShiftII::open_and_initialize()?; device.send_image(&image, 90)?; Ok(()) } ``` 硬件显示屏在物理上是圆形的,但其传输的画布是一个 正方形 480×480 图像。请在你的渲染器中对可见的圆进行遮罩或合成。 ## RGB 动画模型 水泵圆环不需要为每个动画帧进行一次主机 USB 写入。一批 帧会被 TinyUZ 压缩,通过命令 `0xFC` 上传,然后由控制器按照 提供的间隔进行播放。`set_rainbow()` 会以 50 毫秒的间隔(20 FPS)上传 64 帧。 - 单帧更新使用内置的纯 Rust 编码器。 - 多帧上传在 Windows 上使用锁定的官方 TinyUZ 1.1.1 压缩器,因为已知该表示形式能被 H2 固件接受。 - 该可执行文件采用 MIT 许可证,经过 SHA-256 校验,在构建时嵌入,并在需要时 提取到 `%LOCALAPPDATA%/hydroshift2-rs/tinyuz/1.1.1/`。 - 其他平台可以将 `TinyUzCli::from_path(...)` 传递给 `send_rgb_frames_with(...)`。 ## 协议说明 每条控制消息都以一个 500 字节的明文 header 开头。该 header 使用 PKCS#7 padding 进行 DES-CBC 加密,放置在一个 512 字节的信封中,并以 `A1 1A` 结尾。图像和 RGB payload 跟在该信封之后。 | 命令 | 用途 | Payload 详情 | |---:|---|---| | `0x65` | JPEG LCD 背景 | header `8..12` 处的大端字节长度 | | `0x66` | PNG LCD overlay | header `8..12` 处的大端字节长度 | | `0x0D` | LCD 旋转 | 一个字节,`0..3` | | `0x0E` | LCD 亮度 | 一个字节,`0..255` | | `0x33` | 设备时钟 | UTC 日期/时间和显示模式 | | `0xFB` | 水泵/风扇控制 | 带 CRC-16/CCITT 的 16 字节块 | | `0xFC` | 24-LED 圆环帧 | TinyUZ 数据 + 帧数 + 间隔 + LED 数量 | `Protocol::*_at` 变体接受显式的时间戳,用于 packet-capture 比较和确定性测试。 ## 功能 | 功能 | 默认 | 描述 | |---|:---:|---| | `usb` | ✓ | `rusb` 发现与 bulk 传输 | | `image` | ✓ | JPEG/PNG 编码与干净的 LCD 初始化 | | `bundled-tinyuz` | ✓ | 用于多帧 RGB 的锁定版 Windows x64 TinyUZ | 仅使用协议的消费者可以禁用所有功能: ``` hydroshift2 = { git = "https://github.com/andyjusa/hydroshift2-rs", default-features = false } ``` ## 安全性 - 在声明 USB 接口之前请关闭 L-Connect。两个控制器同时写入 同一设备将发生竞争,并可能留下陈旧的 LCD 或 RGB 状态。 - 水泵请求被限制在观察到的 1600–2500 RPM 范围内。 - `open()` 仅声明接口;`open_and_initialize()` 会有意 清除两个保留的 LCD 合成层。 - 请将所有逆向工程的硬件控制视为风险自负的操作。 ## 示例与验证 ``` cargo run --example probe cargo run --example static_rgb cargo run --example rainbow cargo run --example lcd_image -- path\to\dashboard.png cargo test --all-features ``` 最初的实现已在 [SpatialLume](https://github.com/andyjusa/SpatialLume) 中得到应用,其中 LCD 和圆环 独立于 L-Connect 进行驱动。 ## 许可证 该 Rust 库基于 [MIT 许可证](LICENSE) 提供内置的。 TinyUZ 二进制文件保留其上游的 MIT 许可证;请参阅 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
标签:LCD屏幕, RGB灯效, Rust, USB通信, 可视化界面, 散热管理, 硬件控制, 网络流量审计, 通知系统