auto_poweroff

This commit is contained in:
gcw_4spBpAfv
2026-03-11 18:19:17 +08:00
parent ff629e596d
commit 75def0ff38
7 changed files with 94 additions and 16 deletions

37
main.py
View File

@@ -97,9 +97,7 @@ def cmd_str():
# 3. 初始化 INA226 电量监测芯片
init_ina226()
# 4. 初始化显示和相机
camera_manager.init_camera(640, 480)
camera_manager.init_display()
@@ -213,33 +211,41 @@ def cmd_str():
# 7. 加载激光点配置
laser_manager.load_laser_point()
# 8. 启动空闲计时
hardware_manager.start_idle_timer()
if logger:
logger.info("系统准备完成...")
last_adc_trigger = 0
# 气压采样:减少日志频率(每 N 个点输出一条),避免 logger.debug 拖慢采样
PRESSURE_BATCH_SIZE = 100
pressure_buf = []
pressure_sum = 0
pressure_abs_sum = 0
pressure_min = 4095
pressure_max = 0
pressure_t0_ms = None
last_avg_abs = 0
def _flush_pressure_buf(reason: str):
if not config.AIR_PRESSURE_lOG:
return
nonlocal pressure_buf, pressure_sum, pressure_min, pressure_max, pressure_t0_ms, logger
nonlocal pressure_buf, pressure_sum, pressure_min, pressure_max, pressure_t0_ms, logger, pressure_abs_sum, last_avg_abs
if not pressure_buf:
return
t1_ms = time.ticks_ms()
n = len(pressure_buf)
avg = (pressure_sum / n) if n else 0
avg_abs = (pressure_abs_sum / n) if n else 0
# 一行输出:方便后处理画曲线;同时带上统计信息便于快速看波峰
line = (
f"[气压批量] reason={reason} "
f"t0={pressure_t0_ms} t1={t1_ms} n={n} "
f"min={pressure_min} max={pressure_max} avg={avg:.1f} "
f"min={pressure_min} max={pressure_max} avg={avg:.1f} avg_abs={avg_abs:.3f} "
f"values={','.join(map(str, pressure_buf))}"
f" convert value (kpa): {(max(pressure_buf, key=lambda x: x[1])[1] - last_avg_abs) / (5 - 2.5) * config.AIR_PRESSURE_HARDWARE_MAX:.1f}"
)
if logger:
logger.debug(line)
@@ -247,9 +253,11 @@ def cmd_str():
print(line)
pressure_buf = []
pressure_sum = 0
pressure_abs_sum = 0
pressure_min = 4095
pressure_max = 0
pressure_t0_ms = None
last_avg_abs = avg_abs
# 主循环:检测扳机触发 → 拍照 → 分析 → 上报
while not app.need_exit():
@@ -267,16 +275,29 @@ def cmd_str():
logger.error(f"[MAIN] OTA检查异常: {e}")
time.sleep_ms(250)
continue
# 不在 OTA 状态下,检测是否空闲足够长,自动关机
# print(f"[MAIN] 空闲时间: {hardware_manager.get_idle_time_in_sec() }秒")
# print(f"配置关机时间:{config.AUTO_POWER_OFF_IN_SECONDS} 秒")
if hardware_manager.get_idle_time_in_sec() > config.AUTO_POWER_OFF_IN_SECONDS:
logger.info("[MAIN] 超过设定时间未检测活动,自动关机")
network_manager.safe_enqueue({"poweroff": "超过设定时间未检测活动,自动关机"}, 2)
time.sleep_ms(100)
hardware_manager.power_off()
time.sleep_ms(2000) # 让关机指令生效
break
# 读取ADC值扳机检测
try:
if network_manager.manual_trigger_flag:
network_manager.clear_manual_trigger()
adc_val = config.ADC_TRIGGER_THRESHOLD + 1
adc_abs_val = 10
if logger:
logger.info("[TEST] TCP命令触发射箭")
else:
adc_val = hardware_manager.adc_obj.read()
adc_abs_val = hardware_manager.adc_obj.read_vol()
except Exception as e:
logger = logger_manager.logger
if logger:
@@ -287,8 +308,9 @@ def cmd_str():
# ====== 气压采样缓存(每次循环都记录,批量输出日志)======
if pressure_t0_ms is None:
pressure_t0_ms = current_time
pressure_buf.append(adc_val)
pressure_buf.append((adc_val, adc_abs_val))
pressure_sum += adc_val
pressure_abs_sum += adc_abs_val
if adc_val < pressure_min:
pressure_min = adc_val
if adc_val > pressure_max:
@@ -298,6 +320,7 @@ def cmd_str():
# if adc_val >= 2000:
# print(f"adc :{adc_val}")
if adc_val >= config.ADC_TRIGGER_THRESHOLD:
hardware_manager.start_idle_timer() # 重新计时
diff_ms = current_time - last_adc_trigger
if diff_ms < 3000:
continue
@@ -460,7 +483,7 @@ def cmd_str():
logger = logger_manager.logger
if logger:
logger.error(f"[MAIN] 显示异常: {e}")
time.sleep_ms(10)
time.sleep_ms(5)
except Exception as e:
# 主循环的顶层异常捕获,防止程序静默退出