Files
ai-titration/utils.py
flt6 5795b7c2da 0529-2
Former-commit-id: 09404bbedb1ff5b9ff9ad0753867012826cf84dc
2025-05-29 19:24:57 +08:00

146 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import logging
import os
from datetime import datetime
from enum import Enum
class State:
"""滴定状态管理类"""
class Mode(Enum):
FAST = 0 # 快速模式
SLOW = 1 # 慢速模式 (middle)
ABOUT = 2 # 接近终点模式
# END = 3 # 终点模式
def __init__(self, bounce_time=1, end_bounce_time=5):
self.mode = self.Mode.FAST
self.bounce_time = bounce_time
self.end_bounce_time = end_bounce_time
# 状态检查标志
self.in_middle_check = False
self.in_end_check = False
# 时间记录
self.middle_detected_time = None
self.end_detected_time = None
def is_fast_mode(self):
return self.mode == self.Mode.FAST
def is_slow_mode(self):
return self.mode == self.Mode.SLOW
def is_about_mode(self):
return self.mode == self.Mode.ABOUT
# def is_end_mode(self):
# return self.mode == self.Mode.END
def enter_middle_state(self, current_time):
"""进入middle状态 - 立即切换到slow模式并开始检查"""
self.mode = self.Mode.SLOW
self.in_middle_check = True
self.middle_detected_time = current_time
def enter_about_state(self, current_time):
"""从middle状态进入about状态"""
if self.mode == self.Mode.SLOW:
self.mode = self.Mode.ABOUT
def enter_end_check(self, current_time):
"""进入end检查状态"""
self.in_end_check = True
self.end_detected_time = current_time
self.mode = self.Mode.ABOUT
def exit_middle_check(self):
"""退出middle检查状态返回fast模式"""
self.in_middle_check = False
self.middle_detected_time = None
self.mode = self.Mode.FAST
def exit_about_with_middle(self):
"""about状态随middle一起退出"""
if self.mode == self.Mode.ABOUT:
self.mode = self.Mode.FAST
def should_check_middle_exit(self, current_time):
"""检查是否应该进行middle退出检查"""
return (self.in_middle_check and
self.middle_detected_time is not None and
current_time - self.middle_detected_time > self.bounce_time)
def should_check_end_result(self, current_time):
"""检查是否应该进行end结果检查"""
return (self.in_end_check and
self.end_detected_time is not None and
current_time - self.end_detected_time > self.end_bounce_time)
def reset_end_check(self):
"""重置end检查状态"""
self.in_end_check = False
self.end_detected_time = None
def get_status_text(self):
"""获取状态显示文本"""
status = []
if self.in_middle_check:
status.append("MIDCHK")
if self.in_end_check:
status.append("ENDCHK")
return ", " + ", ".join(status) if status else ""
def setup_logging(log_level=logging.INFO, log_dir="logs"):
"""
设置logging配置创建不同模块的logger
Args:
log_level: 日志级别默认INFO
log_dir: 日志文件存储目录,默认"logs"
"""
# 创建日志目录
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 获取当前时间作为日志文件名
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
log_file = os.path.join(log_dir, f"titration_{timestamp}.log")
# 配置根logger
logging.basicConfig(
level=log_level,
format='%(asctime)s - %(name)8s - %(levelname)7s - %(message)s',
handlers=[
logging.FileHandler(log_file, encoding='utf-8'),
logging.StreamHandler() # 同时输出到控制台
]
)
return log_file
def get_system_logger():
"""系统初始化和控制相关的logger"""
return logging.getLogger("System")
def get_hardware_logger():
"""硬件控制相关的loggerCH340等"""
return logging.getLogger("Hardware")
def get_vision_logger():
"""图像处理和预测相关的logger"""
return logging.getLogger("Vision")
def get_control_logger():
"""控制逻辑相关的logger"""
return logging.getLogger("Control")
def get_endpoint_logger():
"""终点检测相关的logger"""
return logging.getLogger("Endpoint")
def get_volume_logger():
"""体积计算相关的logger"""
return logging.getLogger("Volume")