|
@@ -0,0 +1,216 @@
|
|
|
+# 手闸状态指示器
|
|
|
+
|
|
|
+## 功能概述
|
|
|
+
|
|
|
+手闸状态指示器是 DeviceArea 组件中的核心功能之一,用于实时显示高压发生器手闸的当前状态,为操作人员提供即时的视觉反馈。
|
|
|
+
|
|
|
+## 需求说明
|
|
|
+
|
|
|
+### 功能需求
|
|
|
+
|
|
|
+1. **实时状态显示**
|
|
|
+ - 显示手闸的实时操作状态
|
|
|
+ - 显示发生器的整体工作状态
|
|
|
+ - 通过颜色变化提供直观的视觉反馈
|
|
|
+
|
|
|
+2. **状态反馈**
|
|
|
+ - 🟢 绿色:发生器待机,系统准备就绪
|
|
|
+ - 🟡 黄色:手闸按下(一档或二档),准备曝光
|
|
|
+ - ⚪ 默认色:其他状态(手闸抬起等)
|
|
|
+
|
|
|
+3. **交互体验**
|
|
|
+ - 鼠标悬停显示详细状态信息
|
|
|
+ - 通过图标按钮形式呈现
|
|
|
+
|
|
|
+## 技术实现
|
|
|
+
|
|
|
+### 组件位置
|
|
|
+
|
|
|
+- **文件**: `src/pages/exam/DeviceArea.tsx`
|
|
|
+- **状态管理**: `src/states/exam/deviceAreaSlice.ts`
|
|
|
+
|
|
|
+### 状态管理
|
|
|
+
|
|
|
+使用 Redux 管理两个关键状态:
|
|
|
+
|
|
|
+#### 1. generatorStatus (手闸同步状态)
|
|
|
+
|
|
|
+类型:`GeneratorStatus` 枚举
|
|
|
+
|
|
|
+关键状态值:
|
|
|
+- `GENERATOR_RAD_OFF` (0): 手闸抬起
|
|
|
+- `GENERATOR_RAD_PREPARE` (1): 手闸一档按下
|
|
|
+- `GENERATOR_RAD_READY` (2): 手闸二档按下
|
|
|
+- `GENERATOR_RAD_XRAYON` (3): 发生器点片出线
|
|
|
+- `GENERATOR_RAD_XRAYOFF` (4): 发生器点片结束出线
|
|
|
+
|
|
|
+#### 2. generatorStatus_2 (发生器整体状态)
|
|
|
+
|
|
|
+类型:`GENERATOR_STATUS` 枚举
|
|
|
+
|
|
|
+关键状态值:
|
|
|
+- `GENERATOR_STATUS_SHUTDOWN` (0): 关机
|
|
|
+- `GENERATOR_STATUS_INIT` (1): 初始化
|
|
|
+- `GENERATOR_STATUS_SLEEP` (2): 睡眠
|
|
|
+- `GENERATOR_STATUS_CHARGING` (3): 充电
|
|
|
+- `GENERATOR_STATUS_STANDBY` (4): 待机
|
|
|
+- `GENERATOR_STATUS_EXP` (5): 曝光中
|
|
|
+- `GENERATOR_STATUS_ERROR` (6): 错误
|
|
|
+- `GENERATOR_STATUS_CALIBRATION` (7): 校准
|
|
|
+- `GENERATOR_STATUS_SERVICE` (8): 服务
|
|
|
+
|
|
|
+### 状态显示逻辑
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 颜色显示优先级(从高到低)
|
|
|
+IF generatorStatus_2 === GENERATOR_STATUS_STANDBY
|
|
|
+ ➜ 显示绿色 (text-green-500)
|
|
|
+ ➜ 含义:发生器处于待机状态,准备就绪
|
|
|
+
|
|
|
+ELSE IF generatorStatus === GeneratorStatus.GENERATOR_RAD_PREPARE
|
|
|
+ ➜ 显示黄色 (text-yellow-500)
|
|
|
+ ➜ 含义:手闸一档按下,准备状态
|
|
|
+
|
|
|
+ELSE IF generatorStatus === GeneratorStatus.GENERATOR_RAD_READY
|
|
|
+ ➜ 显示黄色 (text-yellow-500)
|
|
|
+ ➜ 含义:手闸二档按下,就绪状态
|
|
|
+
|
|
|
+ELSE
|
|
|
+ ➜ 显示默认色(无特殊样式)
|
|
|
+ ➜ 含义:其他状态(如手闸抬起等)
|
|
|
+```
|
|
|
+
|
|
|
+### 状态更新机制
|
|
|
+
|
|
|
+通过 MQTT 事件驱动状态更新:
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 在 deviceAreaSlice.ts 中注册事件监听器
|
|
|
+
|
|
|
+// 发生器待机状态
|
|
|
+emitter.on('GENERATOR_STATUS_STANDBY', () => {
|
|
|
+ store.dispatch(setGeneratorStatus_2(GENERATOR_STATUS.GENERATOR_STATUS_STANDBY));
|
|
|
+});
|
|
|
+
|
|
|
+// 手闸抬起
|
|
|
+emitter.on('GENERATOR_RAD_OFF', () => {
|
|
|
+ store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_OFF));
|
|
|
+});
|
|
|
+
|
|
|
+// 手闸一档按下
|
|
|
+emitter.on('GENERATOR_RAD_PREPARE', () => {
|
|
|
+ store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_PREPARE));
|
|
|
+});
|
|
|
+
|
|
|
+// 手闸二档按下
|
|
|
+emitter.on('GENERATOR_RAD_READY', () => {
|
|
|
+ store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_READY));
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### 代码实现
|
|
|
+
|
|
|
+```tsx
|
|
|
+// DeviceArea.tsx 中的手闸状态指示器按钮
|
|
|
+<Button
|
|
|
+ style={btnStyle}
|
|
|
+ className={classValue}
|
|
|
+ icon={
|
|
|
+ <ToolOutlined
|
|
|
+ className={
|
|
|
+ generatorStatus_2 === GENERATOR_STATUS.GENERATOR_STATUS_STANDBY
|
|
|
+ ? 'text-green-500'
|
|
|
+ : generatorStatus === GeneratorStatus.GENERATOR_RAD_PREPARE
|
|
|
+ ? 'text-yellow-500'
|
|
|
+ : generatorStatus === GeneratorStatus.GENERATOR_RAD_READY
|
|
|
+ ? 'text-yellow-500'
|
|
|
+ : ''
|
|
|
+ }
|
|
|
+ />
|
|
|
+ }
|
|
|
+ title={`手闸状态指示器: ${generatorStatus}`}
|
|
|
+/>
|
|
|
+```
|
|
|
+
|
|
|
+## 设计特点
|
|
|
+
|
|
|
+### 1. 双状态判断
|
|
|
+
|
|
|
+同时监控两个层面的状态:
|
|
|
+- **发生器整体状态** (`generatorStatus_2`): 系统级状态
|
|
|
+- **手闸操作状态** (`generatorStatus`): 操作级状态
|
|
|
+
|
|
|
+### 2. 优先级设计
|
|
|
+
|
|
|
+发生器待机状态(绿色)优先于手闸操作状态(黄色),确保系统状态的优先显示。
|
|
|
+
|
|
|
+### 3. 事件驱动架构
|
|
|
+
|
|
|
+- 通过 `eventEmitter` 监听硬件 MQTT 事件
|
|
|
+- 实时更新 Redux 状态
|
|
|
+- 组件自动响应状态变化
|
|
|
+
|
|
|
+### 4. 视觉反馈清晰
|
|
|
+
|
|
|
+- 绿色表示安全、就绪
|
|
|
+- 黄色表示警示、准备中
|
|
|
+- 默认色表示待机或其他中性状态
|
|
|
+
|
|
|
+## 状态枚举完整定义
|
|
|
+
|
|
|
+### GeneratorStatus 枚举
|
|
|
+
|
|
|
+```typescript
|
|
|
+enum GeneratorStatus {
|
|
|
+ GENERATOR_SYNC_ERR = -1, // 错误状态
|
|
|
+ GENERATOR_RAD_OFF, // 手闸抬起
|
|
|
+ GENERATOR_RAD_PREPARE, // 手闸一档按下
|
|
|
+ GENERATOR_RAD_READY, // 手闸二档按下
|
|
|
+ GENERATOR_RAD_XRAYON, // 发生器点片出线
|
|
|
+ GENERATOR_RAD_XRAYOFF, // 发生器点片结束出线
|
|
|
+ GENERATOR_FLU_OFF, // 脚闸抬起
|
|
|
+ GENERATOR_FLU_READY, // 脚闸踩下
|
|
|
+ GENERATOR_FLU_XRAYON, // 透视出线
|
|
|
+ GENERATOR_FLU_XRAYOFF, // 透视结束出线
|
|
|
+ GENERATOR_FLU_CINE_READY, // 电影模式准备
|
|
|
+ GENERATOR_SYNC_MAX, // 状态最大值(枚举边界)
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### GENERATOR_STATUS 枚举
|
|
|
+
|
|
|
+```typescript
|
|
|
+enum GENERATOR_STATUS {
|
|
|
+ GENERATOR_STATUS_SHUTDOWN, // 关机
|
|
|
+ GENERATOR_STATUS_INIT, // 初始化
|
|
|
+ GENERATOR_STATUS_SLEEP, // 睡眠
|
|
|
+ GENERATOR_STATUS_CHARGING, // 充电
|
|
|
+ GENERATOR_STATUS_STANDBY, // 待机
|
|
|
+ GENERATOR_STATUS_EXP, // 曝光中
|
|
|
+ GENERATOR_STATUS_ERROR, // 错误
|
|
|
+ GENERATOR_STATUS_CALIBRATION, // 校准
|
|
|
+ GENERATOR_STATUS_SERVICE, // 服务
|
|
|
+ GENERATOR_STATUS_MAX, // 状态最大值(枚举边界)
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 相关文件
|
|
|
+
|
|
|
+- `src/pages/exam/DeviceArea.tsx` - 组件UI实现
|
|
|
+- `src/states/exam/deviceAreaSlice.ts` - 状态管理和事件监听
|
|
|
+- `src/domain/mqttServiceForDevice.ts` - MQTT 消息处理(可能包含事件发送)
|
|
|
+- `src/utils/eventEmitter.ts` - 事件发射器工具
|
|
|
+
|
|
|
+## 使用场景
|
|
|
+
|
|
|
+1. **操作提示**: 操作人员通过颜色判断当前系统状态
|
|
|
+2. **安全确认**: 绿色指示器确认系统处于安全待机状态
|
|
|
+3. **曝光准备**: 黄色指示器警示手闸已按下,准备曝光
|
|
|
+4. **故障诊断**: 通过 tooltip 查看详细的状态数值
|
|
|
+
|
|
|
+## 后续优化建议
|
|
|
+
|
|
|
+1. 考虑添加错误状态的红色显示
|
|
|
+2. 增加状态切换的过渡动画
|
|
|
+3. 考虑添加声音提示(在关键状态变化时)
|
|
|
+4. 优化 tooltip 显示,将数值转换为更友好的文字描述
|