优化配置工具:波特率可编辑、移除激光与全功率时段配置、调整LoRa信道并规范注册状态显示

This commit is contained in:
2026-09-02 10:48:49 +08:00
parent afa83653a3
commit 36baabeb5f
+14 -114
View File
@@ -64,7 +64,9 @@ class LaserTracingConfigApp:
ttk.Label(conn_frame, text="波特率:").grid(row=0, column=3, sticky=tk.W, padx=2) ttk.Label(conn_frame, text="波特率:").grid(row=0, column=3, sticky=tk.W, padx=2)
self.baudrate_var = tk.StringVar(value="9600") self.baudrate_var = tk.StringVar(value="9600")
ttk.Label(conn_frame, textvariable=self.baudrate_var, width=8).grid(row=0, column=4, padx=2) self.baudrate_combo = ttk.Combobox(conn_frame, textvariable=self.baudrate_var, width=8,
values=["2400", "4800", "9600", "19200", "38400", "57600", "115200"])
self.baudrate_combo.grid(row=0, column=4, padx=2)
ttk.Label(conn_frame, text="数据位:").grid(row=0, column=5, sticky=tk.W, padx=2) ttk.Label(conn_frame, text="数据位:").grid(row=0, column=5, sticky=tk.W, padx=2)
self.databits_var = tk.StringVar(value="8") self.databits_var = tk.StringVar(value="8")
@@ -93,47 +95,22 @@ class LaserTracingConfigApp:
self._fc_display_to_value = {} self._fc_display_to_value = {}
self._fc_value_to_display = {} self._fc_value_to_display = {}
fc_displays = [] fc_displays = []
freq = 410100000 freq = 470100000
ch = 1 ch = 0
while freq <= 492900000: while freq <= 492600000:
display = f"信道{ch}: {freq / 1000000:.1f}MHz" display = f"信道{ch}: {freq / 1000000:.1f}MHz"
fc_displays.append(display) fc_displays.append(display)
self._fc_display_to_value[display] = str(freq) self._fc_display_to_value[display] = str(freq)
self._fc_value_to_display[str(freq)] = display self._fc_value_to_display[str(freq)] = display
freq += 200000 freq += 500000
ch += 1 ch += 1
self.lora_fc_display_var = tk.StringVar(value=self._fc_value_to_display.get("433100000", fc_displays[0] if fc_displays else "")) self.lora_fc_display_var = tk.StringVar(value=self._fc_value_to_display.get("470100000", fc_displays[0] if fc_displays else ""))
self.lora_fc_combo = ttk.Combobox(lora_frame, textvariable=self.lora_fc_display_var, self.lora_fc_combo = ttk.Combobox(lora_frame, textvariable=self.lora_fc_display_var,
values=fc_displays, width=20, state="readonly") values=fc_displays, width=20, state="readonly")
self.lora_fc_combo.grid(row=0, column=1, padx=2) self.lora_fc_combo.grid(row=0, column=1, padx=2)
ttk.Button(lora_frame, text="发送", command=self._send_lora_config).grid(row=0, column=3, padx=8) ttk.Button(lora_frame, text="发送", command=self._send_lora_config).grid(row=0, column=3, padx=8)
ttk.Label(lora_frame, text="设置LoRa通信信道频率", foreground="gray").grid(row=0, column=4, padx=(0, 2), sticky=tk.W) ttk.Label(lora_frame, text="设置LoRa通信信道频率", foreground="gray").grid(row=0, column=4, padx=(0, 2), sticky=tk.W)
# 全功率时段配置
fpo_cfg = ttk.LabelFrame(config_frame, text="全功率时段配置", padding=6)
fpo_cfg.pack(fill=tk.X, pady=(0, 4))
ttk.Label(fpo_cfg, text="开始时间(h):").grid(row=0, column=0, sticky=tk.W, padx=2)
self._fpo_start_var = tk.StringVar(value="0")
ttk.Entry(fpo_cfg, textvariable=self._fpo_start_var, width=8).grid(row=0, column=1, padx=2)
ttk.Label(fpo_cfg, text="持续时间(h):").grid(row=0, column=2, sticky=tk.W, padx=2)
self._fpo_dur_var = tk.StringVar(value="0")
ttk.Entry(fpo_cfg, textvariable=self._fpo_dur_var, width=8).grid(row=0, column=3, padx=2)
ttk.Button(fpo_cfg, text="发送", command=self._send_fpo_cfg).grid(row=0, column=4, padx=8)
ttk.Label(fpo_cfg, text="设置全功率时间段,开始0~23时,持续0~24时(0=关闭)", foreground="gray").grid(
row=0, column=5, padx=(0, 2), sticky=tk.W)
# 激光控制配置
laser_cfg = ttk.LabelFrame(config_frame, text="激光控制", padding=6)
laser_cfg.pack(fill=tk.X, pady=(0, 4))
ttk.Button(laser_cfg, text="打 开", command=lambda: self._send_command("laser on")).grid(row=0, column=0, padx=2)
ttk.Button(laser_cfg, text="关 闭", command=lambda: self._send_command("laser off")).grid(row=0, column=1, padx=2)
ttk.Label(laser_cfg, text="自动关闭(min):").grid(row=0, column=2, sticky=tk.W, padx=2)
self._laser_time_var = tk.StringVar(value="10")
ttk.Entry(laser_cfg, textvariable=self._laser_time_var, width=8).grid(row=0, column=3, padx=2)
ttk.Button(laser_cfg, text="设置", command=self._send_laser_time).grid(row=0, column=4, padx=8)
ttk.Label(laser_cfg, text="打开/关闭激光,自动关闭时间(0=禁用)", foreground="gray").grid(
row=0, column=5, padx=(0, 2), sticky=tk.W)
# 查询按钮行 # 查询按钮行
query_frame = ttk.Frame(config_frame) query_frame = ttk.Frame(config_frame)
query_frame.pack(fill=tk.X, pady=4) query_frame.pack(fill=tk.X, pady=4)
@@ -191,37 +168,6 @@ class LaserTracingConfigApp:
val_label.grid(row=row, column=col + 1, sticky=tk.W + tk.E, padx=(0, 10), pady=2) val_label.grid(row=row, column=col + 1, sticky=tk.W + tk.E, padx=(0, 10), pady=2)
self._lp_labels[key] = val_label self._lp_labels[key] = val_label
# 功率与激光配置
pwr_frame = ttk.LabelFrame(self.root, text="功率与激光配置", padding=6)
pwr_frame.pack(fill=tk.X, padx=8, pady=4)
for col in range(4):
pwr_frame.columnconfigure(col, weight=1)
self._pwr_labels = {}
pwr_params = [
("fpo_start", "开始时间"),
("fpo_end", "结束时间"),
("fpo_dur", "全功率时长"),
("fpo_mode", "当前模式"),
]
for idx, (key, label) in enumerate(pwr_params):
row = idx // 2
col = (idx % 2) * 2
ttk.Label(pwr_frame, text=f"{label}:", font=("SimSun", 9)).grid(row=row, column=col, sticky=tk.W, padx=(0, 2), pady=2)
val_label = ttk.Label(pwr_frame, text="-", font=("SimSun", 9), foreground="green")
val_label.grid(row=row, column=col + 1, sticky=tk.W + tk.E, padx=(0, 10), pady=2)
self._pwr_labels[key] = val_label
# 激光另起一行
laser_row = 2
ttk.Label(pwr_frame, text="激光状态:", font=("SimSun", 9)).grid(row=laser_row, column=0, sticky=tk.W, padx=(0, 2), pady=2)
self._laser_state_label = ttk.Label(pwr_frame, text="-", font=("SimSun", 9), foreground="green")
self._laser_state_label.grid(row=laser_row, column=1, sticky=tk.W + tk.E, padx=(0, 10), pady=2)
ttk.Label(pwr_frame, text="自动关闭:", font=("SimSun", 9)).grid(row=laser_row, column=2, sticky=tk.W, padx=(0, 2), pady=2)
self._laser_autooff_label = ttk.Label(pwr_frame, text="-", font=("SimSun", 9), foreground="green")
self._laser_autooff_label.grid(row=laser_row, column=3, sticky=tk.W + tk.E, padx=(0, 10), pady=2)
# 通讯日志区域 # 通讯日志区域
log_frame = ttk.LabelFrame(self.root, text="通讯日志", padding=4) log_frame = ttk.LabelFrame(self.root, text="通讯日志", padding=4)
log_frame.pack(fill=tk.BOTH, expand=True, padx=8, pady=(4, 8)) log_frame.pack(fill=tk.BOTH, expand=True, padx=8, pady=(4, 8))
@@ -308,6 +254,9 @@ class LaserTracingConfigApp:
except serial.SerialException as e: except serial.SerialException as e:
messagebox.showerror("连接失败", str(e)) messagebox.showerror("连接失败", str(e))
self._log(f"连接失败: {e}", "error") self._log(f"连接失败: {e}", "error")
except ValueError:
messagebox.showwarning("参数错误", "波特率必须为数字")
self._log("波特率必须为数字", "error")
def _disconnect(self): def _disconnect(self):
self.running = False self.running = False
@@ -387,32 +336,6 @@ class LaserTracingConfigApp:
return return
self._send_command(f"lora fc {fc}") self._send_command(f"lora fc {fc}")
def _send_fpo_cfg(self):
try:
start = int(self._fpo_start_var.get().strip())
dur = int(self._fpo_dur_var.get().strip())
except ValueError:
messagebox.showwarning("参数错误", "请输入有效整数")
return
if not (0 <= start <= 23):
messagebox.showwarning("参数错误", "开始小时范围 0~23")
return
if not (0 <= dur <= 24):
messagebox.showwarning("参数错误", "时长范围 0~24 (0=关闭)")
return
self._send_command(f"fpocfg {start} {dur}")
def _send_laser_time(self):
try:
mins = int(self._laser_time_var.get().strip())
except ValueError:
messagebox.showwarning("参数错误", "请输入有效整数")
return
if mins < 0:
messagebox.showwarning("参数错误", "关闭时间不能为负")
return
self._send_command(f"laser time {mins}")
# ─────────────────── 回应解析 ─────────────────── # ─────────────────── 回应解析 ───────────────────
def _parse_para_response(self, text): def _parse_para_response(self, text):
@@ -430,8 +353,6 @@ class LaserTracingConfigApp:
(r"Register Status:\s*(.*)", "注册状态"), (r"Register Status:\s*(.*)", "注册状态"),
(r"Lora.*?fc\s*(\d+)", "Lora频率"), (r"Lora.*?fc\s*(\d+)", "Lora频率"),
(r"LpCfg:\s*(.*)", "低功耗配置"), (r"LpCfg:\s*(.*)", "低功耗配置"),
(r"FpoCfg:\s*(.*)", "全功率工作时间段"),
(r"Laser:\s*(.*)", "激光"),
] ]
found = {} found = {}
@@ -444,6 +365,9 @@ class LaserTracingConfigApp:
# 更新参数显示 # 更新参数显示
for key in self._para_order: for key in self._para_order:
value = found.get(key, "-") value = found.get(key, "-")
if key == "注册状态" and value != "-":
raw = value.strip().lower()
value = "已注册" if raw in ("1", "registered", "reg", "ok", "true", "yes", "success") else "未注册"
if key in self._para_labels: if key in self._para_labels:
self._para_labels[key].configure(text=value) self._para_labels[key].configure(text=value)
@@ -493,30 +417,6 @@ class LaserTracingConfigApp:
if et_match: if et_match:
self._lp_labels["ET"].configure(text=format_min(et_match.group(1))) self._lp_labels["ET"].configure(text=format_min(et_match.group(1)))
# 解析全功率工作时间段
if "全功率工作时间段" in found:
fpo_str = found["全功率工作时间段"]
m_start = re.search(r"Start:(\S+)", fpo_str)
m_dur = re.search(r"Dur:(\S+)", fpo_str)
m_end = re.search(r"End:(\S+)", fpo_str)
if m_start:
self._pwr_labels["fpo_start"].configure(text=m_start.group(1).replace(",", ""))
if m_end:
self._pwr_labels["fpo_end"].configure(text=m_end.group(1).replace(",", ""))
if m_dur:
self._pwr_labels["fpo_dur"].configure(text=m_dur.group(1).replace(",", ""))
self._pwr_labels["fpo_mode"].configure(text="低功耗" if "LowPower" in fpo_str else "全功率")
# 解析激光状态
if "激光" in found:
laser_str = found["激光"]
m_state = re.search(r"^([A-Za-z]+)", laser_str)
m_autooff = re.search(r"AutoOff:\s*(\S+)", laser_str)
if m_state:
self._laser_state_label.configure(text=m_state.group(1).replace(",", ""))
if m_autooff:
self._laser_autooff_label.configure(text=m_autooff.group(1).replace(",", ""))
# ─────────────────── 日志 ─────────────────── # ─────────────────── 日志 ───────────────────
def _clear_log(self): def _clear_log(self):