# DevicePlugin 阶段一任务分解文档

## 项目背景
根据 CEO 陈逸飞指示和架构师王思远设计文档 `docs/DEVICE_PLUGIN_DESIGN.md`，实施 DevicePlugin 统一设备管理插件的阶段一（基础框架）。

## 总体目标
建立 DevicePlugin 基础框架，支持 Linux ARM64 平台的 Display 和 SleepInhibit 两个核心能力，为后续功能扩展打下基础。

## 任务列表与执行顺序

### Task 1: Message enum 扩展
**负责人建议**: 张明远（内核工程师，精通 Rust 类型系统和消息传递）

**优先级**: P0（阻塞后续所有任务）

**输入文件**:
- `src/core/message.rs` — 现有 Message enum 定义
- `docs/DEVICE_PLUGIN_DESIGN.md` — DeviceCommand/DeviceResponse/DeviceEvent 设计

**任务描述**:
1. 在 `Message` enum 中添加三个新变体：
   - `DeviceCommand(DeviceCommand)` — 业务插件向 DevicePlugin 发送的命令
   - `DeviceResponse(DeviceResponse)` — DevicePlugin 返回的响应
   - `DeviceEvent(DeviceEvent)` — DevicePlugin 广播的事件
2. 在 `message.rs` 中定义以下新类型（参考设计文档第4节）：
   - `pub enum DeviceCommand` — 至少包含 GetDisplayInfo, SetBrightness, SetBacklight, WriteFramebuffer, SetSleepInhibit
   - `pub enum DeviceResponse` — 至少包含 DisplayInfo, Ok, Error
   - `pub enum DeviceEvent` — 至少包含 DisplayConnected, DisplayDisconnected
   - `pub enum DeviceCapability` — 至少包含 Display, Backlight, Framebuffer
   - `pub enum PixelFormat` — 至少包含 RGBA8888, RGB888
   - `pub enum SensorType` — 预留，至少包含 Temperature
   - `pub enum TouchAction` — 预留，至少包含 Down, Move, Up
3. 所有新类型必须派生 `Debug, Clone, Serialize, Deserialize`（跨 FFI 边界要求）
4. 为复杂变体添加文档注释说明用途

**输出文件**:
- `src/core/message.rs` — 更新后的消息定义

**验收标准**:
- [ ] `cargo check --workspace` 零 warning
- [ ] 所有新类型正确派生 serde traits
- [ ] DeviceCommand 至少包含 5 个变体（Display + SleepInhibit 相关）
- [ ] DeviceResponse 至少包含 3 个变体
- [ ] 文档注释清晰说明每个变体的用途

**预计工时**: 2 小时

---

### Task 2: DevicePlugin 骨架与 Backend trait
**负责人建议**: 王思远（架构师，精通系统架构和 trait 设计）

**优先级**: P0（依赖 Task 1）

**依赖**: Task 1 必须完成（Message enum 已扩展）

**输入文件**:
- `src/core/message.rs` — Task 1 完成后的消息定义
- `src/plugins/screen/mod.rs` — 现有插件实现参考
- `src/core/plugin.rs` — Plugin trait 定义
- `docs/DEVICE_PLUGIN_DESIGN.md` — DeviceBackend trait 设计（第3节）

**任务描述**:
1. 创建 `src/plugins/device/mod.rs`：
   - 定义 `pub struct DevicePlugin` 包含字段：
     - `ctx: Option<PluginContext>`
     - `backend: Box<dyn DeviceBackend>`
   - 实现 `Plugin` trait 的所有方法：
     - `id()` 返回 "device"
     - `info()` 返回插件信息
     - `init()` 初始化 backend
     - `start()` 启动 backend
     - `handle_message()` 匹配 `Message::DeviceCommand`，调用 `backend.handle_command()`，返回 `Message::DeviceResponse`
     - `stop()` 调用 `backend.shutdown()`
   - 实现 `DevicePlugin::new(backend: Box<dyn DeviceBackend>)` 构造函数
2. 创建 `src/plugins/device/backend.rs`：
   - 定义 `pub trait DeviceBackend: Send` 包含方法（参考设计文档）：
     - `fn name(&self) -> &str;`
     - `fn init(&mut self, config: &serde_json::Value) -> Result<()>;`
     - `fn handle_command(&mut self, cmd: DeviceCommand) -> Result<DeviceResponse>;`
     - `fn capabilities(&self) -> Vec<DeviceCapability>;`
     - `fn shutdown(&mut self) -> Result<()>;`
   - 添加完整的文档注释说明每个方法的职责
3. 在 `src/plugins/device/mod.rs` 中添加 `pub mod backend;` 和 `pub use backend::DeviceBackend;`
4. 在 `src/plugins/mod.rs` 中添加 `pub mod device;`

**输出文件**:
- `src/plugins/device/mod.rs` — DevicePlugin 实现
- `src/plugins/device/backend.rs` — DeviceBackend trait 定义
- `src/plugins/mod.rs` — 模块导出更新

**验收标准**:
- [ ] `cargo check --workspace` 零 warning
- [ ] DevicePlugin 正确实现 Plugin trait 所有方法
- [ ] DeviceBackend trait 方法签名与设计文档一致
- [ ] handle_message 正确处理 DeviceCommand 并返回 DeviceResponse
- [ ] 文档注释完整，说明插件职责和 trait 用途

**预计工时**: 3 小时

---

### Task 3: Linux ARM64 Backend 实现
**负责人建议**: 赵雨薇（屏幕工程师，精通 Linux 显示系统和电源管理）

**优先级**: P0（依赖 Task 2）

**依赖**: Task 2 必须完成（DeviceBackend trait 已定义）

**输入文件**:
- `src/plugins/device/backend.rs` — Task 2 完成后的 trait 定义
- `src/plugins/screen/mod.rs` — 现有 ScreenPlugin 实现（参考 systemd-inhibit 用法）
- `docs/DEVICE_PLUGIN_DESIGN.md` — 后端实现要求

**任务描述**:
1. 创建 `src/plugins/device/linux_arm64.rs`：
   - 定义 `pub struct LinuxArm64Backend` 包含字段：
     - `wake_lock_child: Option<Child>` — systemd-inhibit 子进程
     - `display_info: Option<DisplayInfo>` — 缓存的显示信息
     - `backlight_enabled: bool` — 背光状态
   - 实现 `DeviceBackend` trait：
     - `name()` 返回 "linux-arm64"
     - `init()` 读取 framebuffer 信息（/sys/class/graphics/fb0/virtual_size），初始化 display_info
     - `capabilities()` 返回 `vec![DeviceCapability::Display, DeviceCapability::Backlight, DeviceCapability::Framebuffer]`
     - `handle_command()` 实现以下命令：
       - `GetDisplayInfo` → 返回 `DisplayInfo { width, height, format }`
       - `SetSleepInhibit(true)` → 启动 systemd-inhibit（参考 ScreenPlugin::start_wake_lock）
       - `SetSleepInhibit(false)` → 停止 systemd-inhibit（参考 ScreenPlugin::stop_wake_lock）
       - `SetBacklight(bool)` → 写入 `/sys/class/backlight/*/brightness`（0 或最大值）
       - 其他命令返回 `DeviceResponse::Error("Not implemented".to_string())`
     - `shutdown()` 清理 wake_lock_child
   - 实现 `LinuxArm64Backend::new() -> Self` 构造函数
   - 添加 `#[cfg(target_os = "linux")]` 条件编译
2. 在 `src/plugins/device/mod.rs` 中：
   - 添加 `#[cfg(target_os = "linux")] pub mod linux_arm64;`
   - 添加 `#[cfg(target_os = "linux")] pub use linux_arm64::LinuxArm64Backend;`
   - 添加便捷构造函数 `pub fn new_default() -> Self`，自动选择当前平台后端

**输出文件**:
- `src/plugins/device/linux_arm64.rs` — Linux ARM64 后端实现
- `src/plugins/device/mod.rs` — 更新模块导出和便捷构造函数

**验收标准**:
- [ ] `cargo check --workspace` 零 warning
- [ ] LinuxArm64Backend 正确实现 DeviceBackend trait
- [ ] GetDisplayInfo 能正确读取 framebuffer 信息
- [ ] SetSleepInhibit 能启动/停止 systemd-inhibit 子进程
- [ ] SetBacklight 能控制背光（至少支持开/关）
- [ ] shutdown 正确清理子进程资源
- [ ] 非 Linux 平台编译不报错（条件编译正确）

**预计工时**: 4 小时

---

### Task 4: 集成测试与文档
**负责人建议**: 李思琪（视频引擎工程师，熟悉状态机和测试，有 Message 序列化经验）

**优先级**: P1（依赖 Task 3）

**依赖**: Task 3 必须完成（Backend 实现完成）

**输入文件**:
- `src/plugins/device/` — Task 1-3 完成后的所有文件
- `src/plugins/screen/mod.rs` — 参考现有插件测试模式
- `docs/DEVICE_PLUGIN_DESIGN.md` — 验收标准（第8节）

**任务描述**:
1. 创建 `src/plugins/device/tests.rs`：
   - 编写至少 5 个单元测试：
     - `test_device_command_serialization` — 测试 DeviceCommand 序列化/反序列化
     - `test_device_response_serialization` — 测试 DeviceResponse 序列化/反序列化
     - `test_backend_capabilities` — 测试 backend.capabilities() 返回正确能力列表
     - `test_get_display_info` — 测试 GetDisplayInfo 命令（mock backend）
     - `test_set_sleep_inhibit` — 测试 SetSleepInhibit 命令（mock backend）
   - 实现一个 `MockBackend` 用于测试（不依赖真实硬件）
2. 在 `src/plugins/device/mod.rs` 中添加 `#[cfg(test)] mod tests;`
3. 更新 `docs/DEVICE_PLUGIN_DESIGN.md`：
   - 在第8节验收标准中勾选已完成项
   - 添加"使用示例"章节，展示如何创建和使用 DevicePlugin
4. 创建 `src/plugins/device/README.md`：
   - 说明 DevicePlugin 的职责和架构
   - 列出支持的平台和能力
   - 提供代码示例（如何发送 DeviceCommand）
   - 说明如何添加新的 Backend 实现

**输出文件**:
- `src/plugins/device/tests.rs` — 单元测试
- `src/plugins/device/README.md` — 插件文档
- `docs/DEVICE_PLUGIN_DESIGN.md` — 更新验收标准

**验收标准**:
- [ ] `cargo check --workspace --all-targets` 零 warning
- [ ] `cargo test --workspace` 全部通过
- [ ] 至少 5 个测试用例，覆盖核心功能
- [ ] MockBackend 实现完整，可用于测试
- [ ] README.md 包含清晰的使用示例和架构说明
- [ ] 设计文档验收标准已更新

**预计工时**: 3 小时

---

### Task 5: ScreenPlugin 功能迁移验证（可选）
**负责人建议**: 赵雨薇（ScreenPlugin 原作者，熟悉现有实现）

**优先级**: P2（依赖 Task 4，可延后到阶段二）

**依赖**: Task 4 必须完成（测试通过）

**输入文件**:
- `src/plugins/screen/mod.rs` — 现有 ScreenPlugin 实现
- `src/plugins/device/` — 新的 DevicePlugin 实现

**任务描述**:
1. 在 `src/plugins/screen/mod.rs` 中添加注释标记待迁移功能：
   - `start_wake_lock()` → 改为发送 `Message::DeviceCommand(DeviceCommand::SetSleepInhibit(true))`
   - `stop_wake_lock()` → 改为发送 `Message::DeviceCommand(DeviceCommand::SetSleepInhibit(false))`
2. 创建 `docs/SCREEN_PLUGIN_MIGRATION.md` 迁移计划文档：
   - 列出需要迁移的功能清单
   - 说明迁移步骤和兼容性策略
   - 标记阶段二执行的具体任务
3. 验证 DevicePlugin 和 ScreenPlugin 可以共存（不冲突）

**输出文件**:
- `src/plugins/screen/mod.rs` — 添加迁移注释
- `docs/SCREEN_PLUGIN_MIGRATION.md` — 迁移计划文档

**验收标准**:
- [ ] 迁移计划文档完整，列出所有待迁移功能
- [ ] ScreenPlugin 和 DevicePlugin 同时注册不报错
- [ ] `cargo check` 和 `cargo test` 通过

**预计工时**: 2 小时

---

## 任务依赖关系图

```
Task 1 (Message enum)
   ↓
Task 2 (DevicePlugin 骨架 + Backend trait)
   ↓
Task 3 (Linux ARM64 Backend)
   ↓
Task 4 (测试与文档)
   ↓
Task 5 (ScreenPlugin 迁移验证，可选)
```

## 团队成员能力评估

| 成员     | 角色           | 相关经验                                      | 适合任务 |
|----------|----------------|-----------------------------------------------|----------|
| 张明远   | 内核工程师     | Rust 类型系统★★★★★，消息传递★★★★★            | Task 1   |
| 王思远   | 架构师         | 系统架构★★★★★，trait 设计★★★★★               | Task 2   |
| 赵雨薇   | 屏幕工程师     | Linux 显示系统★★★★★，电源管理经验丰富         | Task 3, 5|
| 李思琪   | 视频引擎工程师 | 状态机★★★★★，Message 序列化经验，测试经验     | Task 4   |
| 王浩然   | 网络工程师     | 异步编程★★★★★，但本阶段无网络需求             | 备用     |

## 关键风险与应对

### 风险 1: Message enum 改动影响现有插件
**影响**: 中
**应对**: Task 1 完成后立即运行 `cargo check --workspace` 验证所有插件编译通过

### 风险 2: systemd-inhibit 在某些 Linux 发行版不可用
**影响**: 低
**应对**: Task 3 中添加错误处理，systemd-inhibit 失败时记录警告但不阻塞插件启动

### 风险 3: framebuffer 路径在不同设备上可能不同
**影响**: 中
**应对**: Task 3 中实现路径探测逻辑，尝试 /dev/fb0, /sys/class/graphics/fb0 等多个路径

### 风险 4: 任务串行导致总工时较长
**影响**: 中
**应对**: Task 1-3 必须串行，但 Task 4 可以在 Task 3 完成 80% 时提前开始准备 MockBackend

## 时间估算

| 任务   | 预计工时 | 依赖关系 | 可并行 |
|--------|----------|----------|--------|
| Task 1 | 2h       | 无       | 否     |
| Task 2 | 3h       | Task 1   | 否     |
| Task 3 | 4h       | Task 2   | 否     |
| Task 4 | 3h       | Task 3   | 否     |
| Task 5 | 2h       | Task 4   | 可选   |

**总计**: 12-14 小时（1.5-2 个工作日，假设单人串行）

**优化方案**: 
- Task 1 完成后，Task 2 和 Task 3 的负责人可以同时开始准备（阅读文档、设计实现）
- Task 4 可以在 Task 3 完成 80% 时开始编写 MockBackend

## 验收总清单

阶段一完成的标志：

- [ ] `cargo check --workspace --all-targets` 零 warning
- [ ] `cargo test --workspace` 全部通过
- [ ] DevicePlugin 通过 Plugin trait 正确注册和启动
- [ ] Linux ARM64 后端支持 Display + SleepInhibit 两个能力
- [ ] 至少 5 个单元测试覆盖核心功能
- [ ] 文档完整（README.md + 设计文档更新）
- [ ] Message enum 扩展不影响现有插件编译

## 汇报要求

每个任务完成后，负责人需要：
1. 运行 `export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin:$PATH" && cargo check --workspace --all-targets` 验证编译
2. 运行 `export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin:$PATH" && cargo test --workspace` 验证测试
3. 更新自己的 soul 文件，记录本次任务经验
4. 在 `.showen/TEAM_CHAT.md` 中汇报任务完成情况

全部任务完成后，PM 刘建国向 CEO 汇报到 `.showen/inbox/ceo.md`。

---

**文档创建时间**: 2026-03-13  
**文档创建人**: PM 刘建国  
**文档版本**: v1.0
