mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-04 13:25:13 +00:00
185 lines
5.7 KiB
Python
185 lines
5.7 KiB
Python
import time
|
||
import threading
|
||
|
||
|
||
class MockSeparator:
|
||
def __init__(self, port: str = "MOCK"):
|
||
self.port = port
|
||
|
||
# 基本状态属性
|
||
self._power_state: str = "Off" # 电源:On 或 Off
|
||
self._status: str = "Idle" # 当前总体状态
|
||
self._valve_state: str = "Closed" # 阀门状态:Open 或 Closed
|
||
self._settling_time: float = 0.0 # 静置时间(秒)
|
||
|
||
# 搅拌相关属性
|
||
self._shake_time: float = 0.0 # 剩余摇摆时间(秒)
|
||
self._shake_status: str = "Not Shaking" # 摇摆状态
|
||
|
||
# 用于后台模拟 shake 动作
|
||
self._operation_thread = None
|
||
self._thread_lock = threading.Lock()
|
||
|
||
@property
|
||
def power_state(self) -> str:
|
||
return self._power_state
|
||
|
||
@property
|
||
def valve_state(self) -> str:
|
||
return self._valve_state
|
||
|
||
@property
|
||
def settling_time(self) -> float:
|
||
return self._settling_time
|
||
|
||
@property
|
||
def status(self) -> str:
|
||
return self._status
|
||
|
||
@property
|
||
def shake_time(self) -> float:
|
||
with self._thread_lock:
|
||
return self._shake_time
|
||
|
||
@property
|
||
def shake_status(self) -> str:
|
||
with self._thread_lock:
|
||
return self._shake_status
|
||
|
||
def power_control(self, power_state: str) -> str:
|
||
"""
|
||
电源控制:只接受 "On" 或 "Off"
|
||
"""
|
||
if power_state not in ["On", "Off"]:
|
||
self._status = "Error: Invalid power state"
|
||
return "Error"
|
||
|
||
self._power_state = power_state
|
||
if power_state == "On":
|
||
self._status = "Powered On"
|
||
else:
|
||
self._status = "Powered Off"
|
||
self.stop_operations()
|
||
return "Success"
|
||
|
||
def shake(self, shake_time: float) -> str:
|
||
"""
|
||
模拟 shake(搅拌)操作:
|
||
- 进入 "Shaking" 状态,倒计时 shake_time 秒
|
||
- shake 结束后,进入 "Settling" 状态,静置时间固定为 5 秒
|
||
- 最后恢复为 Idle
|
||
"""
|
||
try:
|
||
shake_time = float(shake_time)
|
||
except ValueError:
|
||
self._status = "Error: Invalid shake time"
|
||
return "Error"
|
||
|
||
if self._power_state != "On":
|
||
self._status = "Error: Power Off"
|
||
return "Error"
|
||
|
||
with self._thread_lock:
|
||
self._status = "Shaking"
|
||
self._settling_time = 0.0
|
||
self._shake_time = shake_time
|
||
self._shake_status = "Shaking"
|
||
|
||
def _run_shake():
|
||
remaining = shake_time
|
||
while remaining > 0:
|
||
time.sleep(1)
|
||
remaining -= 1
|
||
with self._thread_lock:
|
||
self._shake_time = remaining
|
||
with self._thread_lock:
|
||
self._status = "Settling"
|
||
self._settling_time = 60.0 # 固定静置时间为60秒
|
||
self._shake_status = "Settling"
|
||
while True:
|
||
with self._thread_lock:
|
||
if self._settling_time <= 0:
|
||
self._status = "Idle"
|
||
self._shake_status = "Idle"
|
||
break
|
||
time.sleep(1)
|
||
with self._thread_lock:
|
||
self._settling_time = max(0.0, self._settling_time - 1)
|
||
|
||
self._operation_thread = threading.Thread(target=_run_shake)
|
||
self._operation_thread.daemon = True
|
||
self._operation_thread.start()
|
||
return "Success"
|
||
|
||
def set_valve(self, command: str) -> str:
|
||
"""
|
||
阀门控制命令:传入 "open" 或 "close"
|
||
"""
|
||
if self._power_state != "On":
|
||
self._status = "Error: Power Off"
|
||
return "Error"
|
||
|
||
command = command.lower()
|
||
if command == "open":
|
||
self._valve_state = "Open"
|
||
self._status = "Valve Opened"
|
||
elif command == "close":
|
||
self._valve_state = "Closed"
|
||
self._status = "Valve Closed"
|
||
else:
|
||
self._status = "Error: Invalid valve command"
|
||
return "Error"
|
||
return "Success"
|
||
|
||
def stop_operations(self) -> str:
|
||
"""
|
||
停止任何正在执行的操作
|
||
"""
|
||
with self._thread_lock:
|
||
self._settling_time = 0.0
|
||
self._status = "Idle"
|
||
self._shake_status = "Idle"
|
||
self._shake_time = 0.0
|
||
return "Success"
|
||
|
||
def get_status_info(self) -> dict:
|
||
"""
|
||
获取当前设备状态信息
|
||
"""
|
||
with self._thread_lock:
|
||
return {
|
||
"status": self._status,
|
||
"power_state": self._power_state,
|
||
"valve_state": self._valve_state,
|
||
"settling_time": self._settling_time,
|
||
"shake_time": self._shake_time,
|
||
"shake_status": self._shake_status,
|
||
}
|
||
|
||
|
||
# 主函数用于测试
|
||
if __name__ == "__main__":
|
||
separator = MockSeparator()
|
||
|
||
print("启动简单版分离器测试...")
|
||
print(separator.power_control("On"))
|
||
print("初始状态:", separator.get_status_info())
|
||
|
||
# 触发 shake 操作,模拟 10 秒的搅拌
|
||
print("执行 shake 操作...")
|
||
print(separator.shake(10.0))
|
||
|
||
# 循环显示状态变化
|
||
for i in range(20):
|
||
time.sleep(1)
|
||
info = separator.get_status_info()
|
||
print(
|
||
f"第{i+1}秒: 状态={info['status']}, 静置时间={info['settling_time']:.1f}秒, "
|
||
f"阀门状态={info['valve_state']}, shake_time={info['shake_time']:.1f}, "
|
||
f"shake_status={info['shake_status']}"
|
||
)
|
||
|
||
# 模拟打开阀门
|
||
print("打开阀门...", separator.set_valve("open"))
|
||
print("最终状态:", separator.get_status_info())
|