two
This commit is contained in:
+44
-72
@@ -31,6 +31,7 @@ class LaserManager:
|
||||
|
||||
# 私有状态
|
||||
self._serial = None # 激光串口,由 laser_manager 自己持有
|
||||
self._laser_gpio = None # A14 激光开关,低电平开启、高电平关闭
|
||||
self._calibration_active = False
|
||||
self._calibration_result = None
|
||||
self._calibration_lock = threading.Lock()
|
||||
@@ -69,10 +70,21 @@ class LaserManager:
|
||||
|
||||
# ==================== 初始化方法 ====================
|
||||
|
||||
def init_control_gpio(self):
|
||||
"""尽早初始化 A14,并拉高确保激光关闭。"""
|
||||
from maix import gpio, pinmap
|
||||
|
||||
pinmap.set_pin_function(config.LASER_CONTROL_PIN, config.LASER_CONTROL_GPIO)
|
||||
if self._laser_gpio is None:
|
||||
self._laser_gpio = gpio.GPIO(config.LASER_CONTROL_GPIO, gpio.Mode.OUT)
|
||||
self._laser_gpio.value(config.LASER_CONTROL_OFF_LEVEL)
|
||||
self._laser_turned_on = False
|
||||
print(f"[LASER] {config.LASER_CONTROL_PIN}=HIGH,激光已关闭")
|
||||
|
||||
def init(self, serial_device=None, baudrate=None):
|
||||
"""
|
||||
初始化激光模块(包括串口)
|
||||
初始化完成后主动发送关闭命令,防止 UART 初始化噪声误触发激光
|
||||
初始化激光模块(A14 开关 + 测距串口)
|
||||
初始化时先将 A14 拉高关闭激光,防止开机误触发
|
||||
|
||||
Args:
|
||||
serial_device: 串口设备路径,默认使用 config.DISTANCE_SERIAL_DEVICE
|
||||
@@ -82,23 +94,11 @@ class LaserManager:
|
||||
device = serial_device or config.DISTANCE_SERIAL_DEVICE
|
||||
baud = baudrate or config.DISTANCE_SERIAL_BAUDRATE
|
||||
|
||||
self.init_control_gpio()
|
||||
|
||||
self._serial = uart.UART(device, baud)
|
||||
print(f"[LASER] 激光串口初始化完成: device={device}, baudrate={baud}")
|
||||
|
||||
# 等待串口稳定后主动关闭激光,防止初始化噪声误触发
|
||||
time.sleep_ms(100)
|
||||
try:
|
||||
self._serial.read(-1) # 清空接收缓冲区
|
||||
except Exception:
|
||||
pass
|
||||
self._serial.write(config.LASER_OFF_CMD)
|
||||
time.sleep_ms(60)
|
||||
try:
|
||||
self._serial.read(-1) # 清空回包
|
||||
except Exception:
|
||||
pass
|
||||
print("[LASER] 已发送关闭命令(防止开机误触发)")
|
||||
|
||||
# ==================== 业务方法 ====================
|
||||
|
||||
def load_laser_point(self):
|
||||
@@ -147,66 +147,38 @@ class LaserManager:
|
||||
return False
|
||||
|
||||
def turn_on_laser(self):
|
||||
"""发送指令开启激光,并读取回包(部分模块支持)"""
|
||||
if self._serial is None:
|
||||
self.logger.error("[LASER] 激光串口未初始化,请先调用 init()")
|
||||
return None
|
||||
|
||||
# 打印调试信息
|
||||
self.logger.info(f"[LASER] 发送开启命令: {config.LASER_ON_CMD.hex()}")
|
||||
|
||||
# 清空接收缓冲区
|
||||
"""A14 输出低电平,开启激光。"""
|
||||
if self._laser_gpio is None:
|
||||
if self.logger:
|
||||
self.logger.error("[LASER] A14 GPIO 未初始化,请先调用 init()")
|
||||
return False
|
||||
try:
|
||||
self._serial.read(-1) # 清空缓冲区
|
||||
except:
|
||||
pass
|
||||
|
||||
# 发送命令
|
||||
written = self._serial.write(config.LASER_ON_CMD)
|
||||
self.logger.info(f"[LASER] 写入字节数: {written}")
|
||||
|
||||
time.sleep_ms(60)
|
||||
|
||||
# 读取回包
|
||||
resp = self._serial.read(len=20, timeout=10)
|
||||
if resp:
|
||||
self.logger.info(f"[LASER] 收到回包 ({len(resp)}字节): {resp.hex()}")
|
||||
if resp == config.LASER_ON_CMD:
|
||||
self.logger.info("✅ 激光开启指令已确认")
|
||||
else:
|
||||
self.logger.warning("🔇 无回包(可能正常或模块不支持回包)")
|
||||
self._laser_turned_on = True
|
||||
return resp
|
||||
self._laser_gpio.value(config.LASER_CONTROL_ON_LEVEL)
|
||||
self._laser_turned_on = True
|
||||
if self.logger:
|
||||
self.logger.info("[LASER] A14=LOW,激光开启")
|
||||
return True
|
||||
except Exception as e:
|
||||
if self.logger:
|
||||
self.logger.error(f"[LASER] A14 开启激光失败: {e}")
|
||||
return False
|
||||
|
||||
def turn_off_laser(self):
|
||||
"""发送指令关闭激光"""
|
||||
if self._serial is None:
|
||||
self.logger.error("[LASER] 激光串口未初始化,请先调用 init()")
|
||||
return None
|
||||
|
||||
# 打印调试信息
|
||||
self.logger.info(f"[LASER] 发送关闭命令: {config.LASER_OFF_CMD.hex()}")
|
||||
|
||||
# 清空接收缓冲区
|
||||
"""A14 输出高电平,关闭激光。"""
|
||||
if self._laser_gpio is None:
|
||||
if self.logger:
|
||||
self.logger.error("[LASER] A14 GPIO 未初始化,请先调用 init()")
|
||||
return False
|
||||
try:
|
||||
self._serial.read(-1)
|
||||
except:
|
||||
pass
|
||||
|
||||
# 发送命令
|
||||
written = self._serial.write(config.LASER_OFF_CMD)
|
||||
self.logger.info(f"[LASER] 写入字节数: {written}")
|
||||
|
||||
time.sleep_ms(60)
|
||||
|
||||
# 读取回包
|
||||
resp = self._serial.read(20)
|
||||
if resp:
|
||||
self.logger.info(f"[LASER] 收到回包 ({len(resp)}字节): {resp.hex()}")
|
||||
else:
|
||||
self.logger.warning("🔇 无回包")
|
||||
self._laser_turned_on = False
|
||||
return resp
|
||||
self._laser_gpio.value(config.LASER_CONTROL_OFF_LEVEL)
|
||||
self._laser_turned_on = False
|
||||
if self.logger:
|
||||
self.logger.info("[LASER] A14=HIGH,激光关闭")
|
||||
return True
|
||||
except Exception as e:
|
||||
if self.logger:
|
||||
self.logger.error(f"[LASER] A14 关闭激光失败: {e}")
|
||||
return False
|
||||
|
||||
def flash_laser(self, duration_ms=1000):
|
||||
"""闪一下激光(非阻塞版本)"""
|
||||
|
||||
Reference in New Issue
Block a user