diff --git a/doc/检测流程.md b/doc/检测流程.md new file mode 100644 index 0000000..3097c91 --- /dev/null +++ b/doc/检测流程.md @@ -0,0 +1,223 @@ +```mermaid +classDiagram + class MainFlowCtrlScheduler + class GStateMgrService + class DeviceWorkStateMgrService + class DeviceState + class ModuleEnableCtrlDriver + class LiquidOperationCtrlService + + class A8kActionTask + class AC20ScanReactionPlate + AC20ScanReactionPlate --|> A8kActionTask + + class IMainFlowStateChangeProcesser + class Thread + MainFlowCtrlScheduler --> GStateMgrService + MainFlowCtrlScheduler --> DeviceWorkStateMgrService + MainFlowCtrlScheduler --> ModuleEnableCtrlDriver + MainFlowCtrlScheduler --> LiquidOperationCtrlService + MainFlowCtrlScheduler "1" --> "*" A8kActionTask + MainFlowCtrlScheduler --> IMainFlowStateChangeProcesser + MainFlowCtrlScheduler --> Thread + + DeviceWorkStateMgrService --> DeviceState +``` + + +```mermaid +--- +title: 检测流程初始化 +--- + +flowchart TD + A(开始) --> |Spring容器启动后| B[注册所有的检测流程可以将会执行的动作] + B --> C[注册设备状态变更处理器] + C --> D[核心流程将会执行的动作按照方法名字母顺序升序排序] + D --> E[启动职守线程处理设备工作状态变更] + E --> F(结束) +``` +```mermaid +--- +title: 设备工作状态变更状态图 +--- +stateDiagram-v2 + [*] --> IDLE + IDLE --> WORKING : 点击开始检测/执行检测流程 + WORKING --> PAUSE : 点击暂停 + PAUSE --> WORKING : 点击继续/onResume + WORKING --> IDLE : 点击停止/设备清空状态复位 + PAUSE --> IDLE : 点击停止 +``` + +```mermaid +--- +title: 系统的工作状态 +--- +stateDiagram-v2 + [*] --> COMPLETED + COMPLETED --> START_PENDING : 点击开始检测 + START_PENDING --> COMPLETED : [设备状态为IDLE]/设置设备状态为WORKING + COMPLETED --> PAUSE_PENDING : 点击暂停 + PAUSE_PENDING --> COMPLETED : [设备状态为WORKING]/设置设备状态为PAUSE + COMPLETED --> RESUME_PENDING : 点击继续 + RESUME_PENDING --> COMPLETED : [设备状态为PAUSE]/设置设备状态为WORKING + COMPLETED --> STOP_PENDING : 点击停止 + STOP_PENDING --> COMPLETED : [设备状态不为IDLE]/设置设备状态为IDLE +``` + +```mermaid +--- +title: 系统状态定时处理流程 +--- + +flowchart TD + A(开始) --> B[获取系统状态] + B --> C{设备错误} + C --Y--> B + C --N--> D[设备工作状态处理] + D --> E[系统状态处理] + E --> END(结束) + +``` + + +```mermaid +--- +title: 设备状态变更处理流程 +--- +flowchart TD + BEGIN(开始) --> DeviceStateDiv{设备状态} + DeviceStateDiv --暂停--> OnPause[do nothing] + DeviceStateDiv --恢复--> OnResume[do nothing] + DeviceStateDiv --工作--> OnWorking + OnPause --> END(结束) + OnResume --> END(结束) + OnWorking --> END(结束) + subgraph OnWorking + SUB_BEGIN(开始) --> G + G{存在就绪任务} --Y--> B[执行操作] + G --N--> E[获取系统状态] + B --> C{存在设备错误} + C --Y--> D[填充错误信息] + D --> E + C --N--> E + E --> F{系统状态切换中或者系统出现错误} + F --Y--> SUB_END(结束) + F --N--> G + end + +``` + + +```mermaid +--- +title: 系统状态处理 +--- +flowchart TD + BEGIN(开始) --> A[获取系统状态] + A --> B{存在设备错误} + B --Y--> C[标记为发生严重错误] + C --> D[设置系统状态为状态变更完成] + D --> E[发送应用错误信息] + E --> F[失能所有电机] + F --> G[设置设备状态为空闲] + G --> END(结束) + + B --N--> H{系统状态判断} + H --启动切换中--> OnStartPending[设备状态为IDLE则设备状态设置为WORKING] + H --暂停切换中--> OnPausePending[设备状态为WORKING则设备状态设置为PAUSE] + H --恢复切换中--> OnResumePending[设备状态为PAUSE则设备状态设置为WORKING] + H --停止切换中--> OnStopPending[设备状态不为IDLE则设备状态设置为IDLE] + OnStartPending --> J[设置系统状态为状态变更完成] + OnPausePending --> J + OnResumePending --> J + OnStopPending --> J + J --> END +``` + + +```mermaid +classDiagram + class A8kActionTask { + + Boolean isReady() + + List doAction() + } + + class AC20ScanReactionPlate { + + } + + AC20ScanReactionPlate --|> A8kActionTask + AC20ScanReactionPlate --> OptScanModuleStateMgrService + AC20ScanReactionPlate --> ProjectContextMgrService + AC20ScanReactionPlate --> ReactionRecordMgrService + AC20ScanReactionPlate --> OptScanModuleCtrlService +``` + + +```mermaid +--- +title: 扫描反应板获取结果工作流程 +--- +flowchart TD + BEGIN(开始) --> A[设置光学扫描模组状态为扫描中] + A --> B[获取项目上下文] + + B --> E[根据项目中的光学类型生成扫描原始结果] + E --> F[根据原始结果分析得到反应结果] + F --> G[丢弃反应板] + G --> H[设置光学扫描模组状态为空闲] + H --> I[保存反应板反应结果] + I --> END(结束) +``` + +```mermaid +--- +title: Can总线服务类图 +--- +classDiagram + class A8kCanBusService { + + } + + class A8kCanBusConnection { + + onOpen() + + onMessage() + + callcmd() + + send() + + moduleGetStatus() + } + + class WebSocketClient + + A8kCanBusService --> A8kCanBusConnection + A8kCanBusConnection --|> WebSocketClient + +``` + +```mermaid +--- +title: 单次任务执行时序 +--- +sequenceDiagram + participant A8kActionTask + participant OptScanModuleCtrlService + participant OptModuleDriver + participant A8kCanBusService + participant AC20ScanReactionPlate + participant A8kCanBusConnection + participant WebSocketClient + A8kActionTask ->> AC20ScanReactionPlate: doAction + AC20ScanReactionPlate ->> AC20ScanReactionPlate: doOptScanXX + AC20ScanReactionPlate ->> OptScanModuleCtrlService: optScan + OptScanModuleCtrlService ->> OptScanModuleCtrlService: startOptScan + OptScanModuleCtrlService ->> OptModuleDriver: setReg + OptModuleDriver ->> A8kCanBusService: moduleSetReg + A8kCanBusService ->> A8kCanBusConnection: callcmd2 + A8kCanBusConnection ->> A8kCanBusConnection: packParamsToPacket + A8kCanBusConnection ->> A8kCanBusConnection: autoReSend + A8kCanBusConnection ->> A8kCanBusConnection: priSend + A8kCanBusConnection ->> A8kCanBusConnection: _priSend + A8kCanBusConnection ->> WebSocketClient: send +``` \ No newline at end of file diff --git a/doc/系统事件消息总线.md b/doc/系统事件消息总线.md new file mode 100644 index 0000000..e400d39 --- /dev/null +++ b/doc/系统事件消息总线.md @@ -0,0 +1,68 @@ +```mermaid +classDiagram + class AppEventBusService { + + regListener(AppEventListener listener) + + pushEvent(AppEvent appEvent) + - eventBusSchedule() + - callOnEvent(AppEvent appEvent) + } + + AppEventBusService --> Thread + AppEventBusService --> BlockingQueue + AppEventBusService "1" --> "*" AppEventListener + AppEventListener --> AppEvent + + A8kCanBusOnConnectEvent --|> AppEvent + AppTubeholderSettingUpdateEvent --|> AppEvent + A8kHardwareReport --|> AppEvent + A8kCanBusOnConnectEvent --|> AppEvent + AppIDCardMountEvent --|> AppEvent + AppIDCardUnmountEvent --|> AppEvent + AppPromptEvent --|> AppEvent + AppWarningNotifyEvent --|> AppEvent + DoA8kStepActionEvent --|> AppEvent + +``` + +```mermaid +flowchart TD + BEGIN(开始) --容器初始化完成--> A[初始化事件处理线程] + A --> B{阻塞消息队列存在待处理消息} + B --Y--> C[遍历消息处理器调用消息处理器处理消息] + B --N--> B + C --> B +``` + + +```mermaid +--- +title 设备状态与应用事件更新 +--- +classDiagram + class AppWebSocketEndpointMgr { + - broadcastEvent() + - broadcastState() + %% 上报应用事件 + + reportEvent() + %% 上报设备状态 + + reportDeviceState() + + %% 上报Session状态 + + reportSessionState() + + %% 上报耗材状态 + + reportConsumableStateState() + } + class AppStateWebsocketEndpoint + class AppEventWebsocketEndpoint + class FrontEndMessageBoxAndEventMgr + class DeviceWorkStateMgrService + class GStateMgrService + class TubeStateMgrService + class IncubationPlateStateMgrService + class OptScanModuleStateMgrService + class ConsumablesMgrService + class TubeHolderSettingMgrService + + class Report +``` \ No newline at end of file diff --git a/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java b/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java index 6a07ef9..b12b94c 100644 --- a/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java +++ b/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java @@ -39,6 +39,12 @@ public class CodeScanerDriverCtrlPage { return ret; } + public void codeScannerStressTest(Integer repeatCnt, Integer timeout) throws AppException { + for (int i = 0; i < repeatCnt; i++) { + codeScanerDriver.feedingModScannerModCodeScannerScanCode( timeout * 1000); + } + } + public void feedingModScannerModCodeScannerStartScan() throws AppException { codeScanerDriver.feedingModScannerModCodeScannerStartScan(); } @@ -55,6 +61,7 @@ public class CodeScanerDriverCtrlPage { page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode); page.addFunction("扫码开始", this::pipetteGunStartScan); page.addFunction("扫码停止", this::pipetteGunStopScan); + page.addFunction("压力测试", this::codeScannerStressTest); page.newGroup("进出料扫描"); page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode);