Files
renode-stm32/scripts/external_devices.py
chuan 652d5d0dc1 feat!: 接入可选送丝机与双型号焊枪仿真
- 增加送丝机及两种焊枪的启动选择,未启用时保留原有简化外设
- 实现外设串口协议、工艺缓存与导入、参数保存、报警输入和独立供电
- 提供外设 WebSocket 状态及控制接口,按连接管理按钮持有和碰撞故障释放
- 添加外设卡片、静态光斑、监控输入与故障操作,统一布局并保存展开状态
- 添加外设协议与固件联动用例,以及点射收尾期间再次出光的回执回归用例
- 整理协议边界及测试条目,记录旧款焊枪驱动和电源报警未被固件转发的现状
- BREAKING CHANGE: 自定义平台实例化 BoardWebSocketServer 时需提供 ExternalDevices 依赖
2026-10-23 14:08:01 +08:00

30 lines
1.3 KiB
Python

"""解析可选外部设备,保持未启用时的既有仿真路径"""
from dataclasses import dataclass
from scripts.environment import setting
from scripts.settings import as_boolean
@dataclass(frozen=True)
class ExternalDevices:
"""一次启动使用的固定设备组合,不向浏览器缓存写入配置"""
wire: bool = False
laser: int = 0
def __post_init__(self):
if self.laser not in (0, 1, 2):
raise ValueError('Laser profile must be 0, 1 or 2')
@classmethod
def resolve(cls, wire=None, laser1=None, laser2=None):
"""逐项使用显式参数覆盖环境设置,拒绝同一 RS485 接口上的双焊枪"""
values = [value if value is not None else as_boolean(setting('H723_' + name, 'false'))
for name, value in (('WIRE', wire), ('LASER1', laser1), ('LASER2', laser2))]
if values[1] and values[2]:
raise ValueError('--laser1 and --laser2 cannot be enabled together; use --no-laser1/--no-laser2 to override .env')
return cls(values[0], 1 if values[1] else 2 if values[2] else 0)
def monitor_commands(self):
"""在 CPU 启动前选择设备,默认组合不改变旧送丝机状态"""
return f'sysbus.externalDevices Configure {str(self.wire).lower()} {self.laser}\n'