Przeglądaj źródła

refactor(backend): 优化屏幕LED状态显示逻辑,新增自动刷新机制

1. 新增LED颜色到屏幕图片的映射表,替换原有的_port_status_to_pic转换逻辑
2. 提取_refresh_current_screen_panel公共函数,在LED状态变更后自动刷新屏幕
3. 简化refresh_screen_panel内的网口图片设置代码,提升可读性
wenhongquan 1 dzień temu
rodzic
commit
2dd5d9b547
1 zmienionych plików z 28 dodań i 1 usunięć
  1. 28 1
      backend/app.py

+ 28 - 1
backend/app.py

@@ -286,7 +286,9 @@ def refresh_screen_panel(panel_id):
         screen_display.send_cmd(f'g0.pco={0 if mqtt_connected else 63488}', delay_ms=delay_ms)
 
         for port_id in range(1, 25):
-            pic = _port_status_to_pic(ps.get(port_id, {}))
+            # 屏幕网口图片显示 LED 颜色状态
+            color = led_states.get(port_id, 0)
+            pic = LED_COLOR_TO_PIC.get(color, 0)
             screen_display.send_cmd(f'p{port_id - 1}.pic={pic}', delay_ms=delay_ms)
 
         logger.info(f"屏幕已刷新: {panel_id} (终端{idx + 1})")
@@ -306,6 +308,21 @@ def switch_screen_panel(direction):
     return refresh_screen_panel(panel_id)
 
 
+def _refresh_current_screen_panel():
+    """LED 等状态变化后,触发当前屏幕 panel 刷新。"""
+    try:
+        panels = get_sorted_panels()
+        if not panels:
+            return
+        with screen_lock:
+            idx = screen_current_panel_index
+            if 0 <= idx < len(panels):
+                panel_id = panels[idx][0]
+                screen_refresh_queue.put((panel_id,))
+    except Exception as e:
+        logger.warning(f"触发屏幕刷新失败: {e}")
+
+
 def screen_button_event_handler(page_id, comp_id, event):
     """处理屏幕按钮事件。"""
     if event != 0x01:
@@ -1185,6 +1202,9 @@ def dtu_handle_control(topic, payload):
             if 'error' in result:
                 response_payload['payload']['error_code'] = 1005
                 response_payload['payload']['error_message'] = result['error']
+            else:
+                led_states[int(port_id)] = color
+                _refresh_current_screen_panel()
 
         elif command == 'QUERY_DTU_STATUS':
             # 查询DTU状态
@@ -2702,6 +2722,7 @@ def modbus_set_rgb_led():
 
         # 更新 LED 状态追踪
         led_states[led_number] = color
+        _refresh_current_screen_panel()
 
         return jsonify({
             'success': True,
@@ -3000,6 +3021,11 @@ def get_panel_status():
 # LED 状态追踪 (内存中跟踪每个灯的最后设置状态)
 led_states = {i: 0 for i in range(1, 25)}  # 0=off, 1=red, 2=green, 3=blue
 
+# Nextion 串口屏网口图片与 LED 颜色的映射关系
+# 屏幕图片定义: 0=灰(灭), 1=蓝, 2=红, 3=绿
+# 后端 LED 颜色定义: 0=灭, 1=红, 2=绿, 3=蓝
+LED_COLOR_TO_PIC = {0: 0, 1: 2, 2: 3, 3: 1}
+
 
 @app.route('/api/modbus/led_status', methods=['GET'])
 def get_led_status():
@@ -3036,6 +3062,7 @@ def set_all_leds():
                 results.append({'led': led_num, 'success': True})
                 led_states[led_num] = color
 
+        _refresh_current_screen_panel()
         return jsonify({'success': True, 'results': results})
 
     except Exception as e: