feat: plugin-sdk同步Device类型 + example-plugin适配新Message变体
This commit is contained in:
@@ -2311,3 +2311,23 @@ DevicePlugin 阶段一 Task 4:集成测试 ✅
|
|||||||
### 下一步
|
### 下一步
|
||||||
Task 4 已完成,DevicePlugin 阶段一基础框架全部就绪。等待 PM 刘建国向 CEO 汇报。
|
Task 4 已完成,DevicePlugin 阶段一基础框架全部就绪。等待 PM 刘建国向 CEO 汇报。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**李思琪** (2026-03-13 15:42)
|
||||||
|
|
||||||
|
已完成 plugin-sdk 与主库 Device 类型同步任务。
|
||||||
|
|
||||||
|
**完成内容**:
|
||||||
|
1. 在 plugin-sdk/src/lib.rs 的 Message enum 中添加了 DeviceCommand、DeviceResponse、DeviceEvent 三个变体
|
||||||
|
2. 定义了完整的 Device 相关类型(PixelFormat、SensorType、TouchAction、DeviceCapability、DeviceCommand、DeviceResponse、DeviceEvent),与主库 src/core/message.rs 保持完全一致
|
||||||
|
3. 所有类型都派生了 Debug, Clone, Serialize, Deserialize, PartialEq
|
||||||
|
4. 添加了完整的中文文档注释
|
||||||
|
5. 修复了 example-plugin 中的 match 穷尽性问题
|
||||||
|
|
||||||
|
**验证结果**:
|
||||||
|
- `cargo check --workspace --all-targets` 零 warning
|
||||||
|
- `cargo test --workspace` 全部通过(77 个测试)
|
||||||
|
|
||||||
|
plugin-sdk 现在已与主库的 Device 消息系统完全同步,第三方插件可以使用这些类型与 DevicePlugin 进行通信。
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,12 @@ pub enum Message {
|
|||||||
///
|
///
|
||||||
/// 字符串内容通常为就绪插件的名称。
|
/// 字符串内容通常为就绪插件的名称。
|
||||||
PluginReady(String),
|
PluginReady(String),
|
||||||
|
/// 设备命令(业务插件 → DevicePlugin)。
|
||||||
|
DeviceCommand(DeviceCommand),
|
||||||
|
/// 设备响应(DevicePlugin → 请求者)。
|
||||||
|
DeviceResponse(DeviceResponse),
|
||||||
|
/// 设备事件(DevicePlugin → 广播)。
|
||||||
|
DeviceEvent(DeviceEvent),
|
||||||
/// 自定义业务消息。
|
/// 自定义业务消息。
|
||||||
///
|
///
|
||||||
/// 当标准消息不足以表达插件间协议时,可通过 `kind` 区分消息类型,
|
/// 当标准消息不足以表达插件间协议时,可通过 `kind` 区分消息类型,
|
||||||
@@ -143,6 +149,136 @@ pub enum Message {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── 设备管理类型 ──
|
||||||
|
|
||||||
|
/// 像素格式
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
|
pub enum PixelFormat {
|
||||||
|
/// RGBA 8888 格式(每像素 4 字节)
|
||||||
|
RGBA8888,
|
||||||
|
/// RGB 888 格式(每像素 3 字节)
|
||||||
|
RGB888,
|
||||||
|
/// RGB 565 格式(每像素 2 字节)
|
||||||
|
RGB565,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 传感器类型
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
|
pub enum SensorType {
|
||||||
|
/// 温度传感器
|
||||||
|
Temperature,
|
||||||
|
/// 湿度传感器
|
||||||
|
Humidity,
|
||||||
|
/// 光线传感器
|
||||||
|
Light,
|
||||||
|
/// 接近传感器
|
||||||
|
Proximity,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 触摸动作
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
|
pub enum TouchAction {
|
||||||
|
/// 按下
|
||||||
|
Down,
|
||||||
|
/// 移动
|
||||||
|
Move,
|
||||||
|
/// 抬起
|
||||||
|
Up,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 设备能力
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
|
pub enum DeviceCapability {
|
||||||
|
/// 显示屏
|
||||||
|
Display,
|
||||||
|
/// 触摸屏
|
||||||
|
Touch,
|
||||||
|
/// 按钮
|
||||||
|
Buttons,
|
||||||
|
/// 音频
|
||||||
|
Audio,
|
||||||
|
/// 电池
|
||||||
|
Battery,
|
||||||
|
/// 背光
|
||||||
|
Backlight,
|
||||||
|
/// 传感器
|
||||||
|
Sensors,
|
||||||
|
/// 帧缓冲
|
||||||
|
Framebuffer,
|
||||||
|
/// GPIO
|
||||||
|
GPIO,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 设备命令(业务插件 → DevicePlugin)
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub enum DeviceCommand {
|
||||||
|
/// 获取显示信息
|
||||||
|
GetDisplayInfo,
|
||||||
|
/// 设置亮度(0-100)
|
||||||
|
SetBrightness(u8),
|
||||||
|
/// 设置背光开关
|
||||||
|
SetBacklight(bool),
|
||||||
|
/// 写入帧缓冲
|
||||||
|
WriteFramebuffer { data: Vec<u8>, format: PixelFormat },
|
||||||
|
/// 设置防息屏
|
||||||
|
SetSleepInhibit(bool),
|
||||||
|
/// 获取电池电量
|
||||||
|
GetBatteryLevel,
|
||||||
|
/// 设置音量(0-100)
|
||||||
|
SetVolume(u8),
|
||||||
|
/// 播放音频
|
||||||
|
PlayAudio { path: String },
|
||||||
|
/// 获取触摸事件
|
||||||
|
GetTouchEvents,
|
||||||
|
/// 获取按钮状态
|
||||||
|
GetButtonState,
|
||||||
|
/// 获取传感器数据
|
||||||
|
GetSensorData(SensorType),
|
||||||
|
/// 自定义命令
|
||||||
|
CustomCommand {
|
||||||
|
subsystem: String,
|
||||||
|
payload: serde_json::Value,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 设备响应(DevicePlugin → 请求者)
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub enum DeviceResponse {
|
||||||
|
/// 显示信息
|
||||||
|
DisplayInfo {
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
format: PixelFormat,
|
||||||
|
},
|
||||||
|
/// 传感器数据
|
||||||
|
SensorData { sensor: SensorType, value: f64 },
|
||||||
|
/// 电池电量(0-100)
|
||||||
|
BatteryLevel(u8),
|
||||||
|
/// 操作成功
|
||||||
|
Ok,
|
||||||
|
/// 操作失败
|
||||||
|
Error(String),
|
||||||
|
/// 自定义响应
|
||||||
|
Custom(serde_json::Value),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 设备事件(DevicePlugin → 广播)
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub enum DeviceEvent {
|
||||||
|
/// 触摸事件
|
||||||
|
TouchEvent { x: i32, y: i32, action: TouchAction },
|
||||||
|
/// 按钮事件
|
||||||
|
ButtonEvent { button: u8, pressed: bool },
|
||||||
|
/// 电池电量低
|
||||||
|
BatteryLow(u8),
|
||||||
|
/// 显示器已连接
|
||||||
|
DisplayConnected,
|
||||||
|
/// 显示器已断开
|
||||||
|
DisplayDisconnected,
|
||||||
|
/// 传感器警报
|
||||||
|
SensorAlert { sensor: SensorType, value: f64 },
|
||||||
|
}
|
||||||
|
|
||||||
// ── FFI 类型(与主程序 plugin_abi.rs 完全对应) ──
|
// ── FFI 类型(与主程序 plugin_abi.rs 完全对应) ──
|
||||||
|
|
||||||
/// 插件实例在 FFI 边界上的不透明句柄。
|
/// 插件实例在 FFI 边界上的不透明句柄。
|
||||||
|
|||||||
@@ -468,6 +468,15 @@ impl ShowenPlugin for ExamplePlugin {
|
|||||||
Message::PluginReady(plugin_name) => {
|
Message::PluginReady(plugin_name) => {
|
||||||
eprintln!("[ExamplePlugin] observed peer readiness: {plugin_name}");
|
eprintln!("[ExamplePlugin] observed peer readiness: {plugin_name}");
|
||||||
}
|
}
|
||||||
|
Message::DeviceCommand(_cmd) => {
|
||||||
|
eprintln!("[ExamplePlugin] device command received (not handled)");
|
||||||
|
}
|
||||||
|
Message::DeviceResponse(_resp) => {
|
||||||
|
eprintln!("[ExamplePlugin] device response received (not handled)");
|
||||||
|
}
|
||||||
|
Message::DeviceEvent(_event) => {
|
||||||
|
eprintln!("[ExamplePlugin] device event received (not handled)");
|
||||||
|
}
|
||||||
Message::Custom { kind, payload } => {
|
Message::Custom { kind, payload } => {
|
||||||
eprintln!("[ExamplePlugin] custom message: kind={kind}, payload={payload}");
|
eprintln!("[ExamplePlugin] custom message: kind={kind}, payload={payload}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,3 +65,27 @@
|
|||||||
- cargo check --workspace --all-targets 零 warning
|
- cargo check --workspace --all-targets 零 warning
|
||||||
- cargo test --workspace 全部通过(73 个测试,新增 7 个)
|
- cargo test --workspace 全部通过(73 个测试,新增 7 个)
|
||||||
- 测试覆盖了所有核心消息类型的序列化和 MockBackend 的基本行为
|
- 测试覆盖了所有核心消息类型的序列化和 MockBackend 的基本行为
|
||||||
|
|
||||||
|
## 个人经验 (2026-03-13 SDK 同步)
|
||||||
|
- 完成 plugin-sdk 与主库 Device 类型同步任务
|
||||||
|
- 在 plugin-sdk/src/lib.rs 的 Message enum 中添加了三个新变体:
|
||||||
|
- DeviceCommand(DeviceCommand)
|
||||||
|
- DeviceResponse(DeviceResponse)
|
||||||
|
- DeviceEvent(DeviceEvent)
|
||||||
|
- 在 plugin-sdk 中定义了完整的 Device 相关类型(与主库保持一致):
|
||||||
|
- PixelFormat enum (RGBA8888, RGB888, RGB565)
|
||||||
|
- SensorType enum (Temperature, Humidity, Light, Proximity)
|
||||||
|
- TouchAction enum (Down, Move, Up)
|
||||||
|
- DeviceCapability enum (Display, Touch, Buttons, Audio, Battery, Backlight, Sensors, Framebuffer, GPIO)
|
||||||
|
- DeviceCommand enum (12 个变体,包括 GetDisplayInfo, SetBrightness, WriteFramebuffer 等)
|
||||||
|
- DeviceResponse enum (6 个变体,包括 DisplayInfo, SensorData, BatteryLevel 等)
|
||||||
|
- DeviceEvent enum (6 个变体,包括 TouchEvent, ButtonEvent, BatteryLow 等)
|
||||||
|
- 所有类型都派生了 Debug, Clone, Serialize, Deserialize, PartialEq(与主库一致)
|
||||||
|
- 添加了完整的中文文档注释
|
||||||
|
- 修复了 example-plugin 中的 match 穷尽性问题,添加了三个 Device 消息的处理分支
|
||||||
|
- cargo check --workspace --all-targets 零 warning
|
||||||
|
- cargo test --workspace 全部通过(77 个测试)
|
||||||
|
- 经验总结:
|
||||||
|
- SDK 与主库的类型同步需要保持完全一致的派生宏和字段定义
|
||||||
|
- 添加新的 Message 变体后,需要检查所有现有插件的 match 表达式
|
||||||
|
- Rust 的穷尽性检查是很好的安全网,确保不会遗漏新增的消息类型
|
||||||
|
|||||||
Reference in New Issue
Block a user