|
@@ -277,6 +277,10 @@ def refresh_screen_panel(panel_id):
|
|
|
# 获取本机 IP 地址显示在 t1.txt
|
|
# 获取本机 IP 地址显示在 t1.txt
|
|
|
ip_address = _get_display_ip()
|
|
ip_address = _get_display_ip()
|
|
|
|
|
|
|
|
|
|
+ # 当前 panel 对应的设备地址
|
|
|
|
|
+ device_address = panel_config.get(panel_id, {}).get('address', 1)
|
|
|
|
|
+ panel_led_states = led_states.get(device_address, {})
|
|
|
|
|
+
|
|
|
screen_display.send_cmd(f't2.txt="{NEXTION_PANEL_NAME_PREFIX}{idx + 1}"', delay_ms=delay_ms)
|
|
screen_display.send_cmd(f't2.txt="{NEXTION_PANEL_NAME_PREFIX}{idx + 1}"', delay_ms=delay_ms)
|
|
|
screen_display.send_cmd(f't1.txt="{ip_address}"', delay_ms=delay_ms)
|
|
screen_display.send_cmd(f't1.txt="{ip_address}"', delay_ms=delay_ms)
|
|
|
screen_display.send_cmd(f't4.txt="{dtu_config.get("firmware_version", "v1.0.0")}"', delay_ms=delay_ms)
|
|
screen_display.send_cmd(f't4.txt="{dtu_config.get("firmware_version", "v1.0.0")}"', delay_ms=delay_ms)
|
|
@@ -287,9 +291,11 @@ def refresh_screen_panel(panel_id):
|
|
|
|
|
|
|
|
for port_id in range(1, 25):
|
|
for port_id in range(1, 25):
|
|
|
# 屏幕网口图片显示 LED 颜色状态
|
|
# 屏幕网口图片显示 LED 颜色状态
|
|
|
- color = led_states.get(port_id, 0)
|
|
|
|
|
|
|
+ color = panel_led_states.get(port_id, 0)
|
|
|
pic = LED_COLOR_TO_PIC.get(color, 0)
|
|
pic = LED_COLOR_TO_PIC.get(color, 0)
|
|
|
- screen_display.send_cmd(f'p{port_id - 1}.pic={pic}', delay_ms=delay_ms)
|
|
|
|
|
|
|
+ cmd = f'p{port_id - 1}.pic={pic}'
|
|
|
|
|
+ ok = screen_display.send_cmd(cmd, delay_ms=delay_ms)
|
|
|
|
|
+ logger.info(f"[Nextion] panel={panel_id} addr={device_address} port={port_id} led_color={color} pic={pic} cmd={cmd} ok={ok}")
|
|
|
|
|
|
|
|
logger.info(f"屏幕已刷新: {panel_id} (终端{idx + 1})")
|
|
logger.info(f"屏幕已刷新: {panel_id} (终端{idx + 1})")
|
|
|
return True, '屏幕已刷新'
|
|
return True, '屏幕已刷新'
|
|
@@ -1203,7 +1209,9 @@ def dtu_handle_control(topic, payload):
|
|
|
response_payload['payload']['error_code'] = 1005
|
|
response_payload['payload']['error_code'] = 1005
|
|
|
response_payload['payload']['error_message'] = result['error']
|
|
response_payload['payload']['error_message'] = result['error']
|
|
|
else:
|
|
else:
|
|
|
- led_states[int(port_id)] = color
|
|
|
|
|
|
|
+ if device_address not in led_states:
|
|
|
|
|
+ led_states[device_address] = {}
|
|
|
|
|
+ led_states[device_address][int(port_id)] = color
|
|
|
_refresh_current_screen_panel()
|
|
_refresh_current_screen_panel()
|
|
|
|
|
|
|
|
elif command == 'QUERY_DTU_STATUS':
|
|
elif command == 'QUERY_DTU_STATUS':
|
|
@@ -2458,6 +2466,25 @@ def refresh_screen():
|
|
|
return jsonify({'success': False, 'message': message}), 400
|
|
return jsonify({'success': False, 'message': message}), 400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+@app.route('/api/screen/test_cmd', methods=['POST'])
|
|
|
|
|
+def screen_test_cmd():
|
|
|
|
|
+ """向 Nextion 屏幕发送原始命令(调试用)。"""
|
|
|
|
|
+ try:
|
|
|
|
|
+ data = request.json
|
|
|
|
|
+ cmd = data.get('cmd')
|
|
|
|
|
+ if not cmd:
|
|
|
|
|
+ return jsonify({'success': False, 'message': '缺少 cmd 参数'}), 400
|
|
|
|
|
+ status = screen_display.get_status()
|
|
|
|
|
+ if not status.get('connected'):
|
|
|
|
|
+ return jsonify({'success': False, 'message': '屏幕串口未连接'}), 400
|
|
|
|
|
+ ok = screen_display.send_cmd(cmd, delay_ms=data.get('delay_ms', 50))
|
|
|
|
|
+ logger.info(f"[Nextion TEST] cmd={cmd} ok={ok}")
|
|
|
|
|
+ return jsonify({'success': ok, 'cmd': cmd, 'screen_connected': True})
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"屏幕测试命令失败: {e}")
|
|
|
|
|
+ return jsonify({'success': False, 'message': str(e)}), 500
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
# 网络配置相关API
|
|
# 网络配置相关API
|
|
|
@app.route('/api/network/config', methods=['GET'])
|
|
@app.route('/api/network/config', methods=['GET'])
|
|
|
def get_network_config():
|
|
def get_network_config():
|
|
@@ -2720,8 +2747,10 @@ def modbus_set_rgb_led():
|
|
|
'raw_data': result.get('raw_data', '')
|
|
'raw_data': result.get('raw_data', '')
|
|
|
}), 400
|
|
}), 400
|
|
|
|
|
|
|
|
- # 更新 LED 状态追踪
|
|
|
|
|
- led_states[led_number] = color
|
|
|
|
|
|
|
+ # 按设备地址更新 LED 状态追踪
|
|
|
|
|
+ if device_address not in led_states:
|
|
|
|
|
+ led_states[device_address] = {}
|
|
|
|
|
+ led_states[device_address][led_number] = color
|
|
|
_refresh_current_screen_panel()
|
|
_refresh_current_screen_panel()
|
|
|
|
|
|
|
|
return jsonify({
|
|
return jsonify({
|
|
@@ -3018,8 +3047,9 @@ def get_panel_status():
|
|
|
return jsonify({'success': True, 'panels': panel_status})
|
|
return jsonify({'success': True, 'panels': panel_status})
|
|
|
|
|
|
|
|
|
|
|
|
|
-# LED 状态追踪 (内存中跟踪每个灯的最后设置状态)
|
|
|
|
|
-led_states = {i: 0 for i in range(1, 25)} # 0=off, 1=red, 2=green, 3=blue
|
|
|
|
|
|
|
+# LED 状态追踪 (按设备地址跟踪每个灯的最后设置状态)
|
|
|
|
|
+# 结构: {device_address: {port_id: color}}, color: 0=off, 1=red, 2=green, 3=blue
|
|
|
|
|
+led_states = {}
|
|
|
|
|
|
|
|
# Nextion 串口屏网口图片与 LED 颜色的映射关系
|
|
# Nextion 串口屏网口图片与 LED 颜色的映射关系
|
|
|
# 屏幕图片定义: 0=灰(灭), 1=蓝, 2=红, 3=绿
|
|
# 屏幕图片定义: 0=灰(灭), 1=蓝, 2=红, 3=绿
|
|
@@ -3029,7 +3059,14 @@ LED_COLOR_TO_PIC = {0: 0, 1: 2, 2: 3, 3: 1}
|
|
|
|
|
|
|
|
@app.route('/api/modbus/led_status', methods=['GET'])
|
|
@app.route('/api/modbus/led_status', methods=['GET'])
|
|
|
def get_led_status():
|
|
def get_led_status():
|
|
|
- """获取所有 LED 状态"""
|
|
|
|
|
|
|
+ """获取 LED 状态,支持按设备地址过滤"""
|
|
|
|
|
+ device_address = request.args.get('device_address', type=int)
|
|
|
|
|
+ if device_address is not None:
|
|
|
|
|
+ return jsonify({
|
|
|
|
|
+ 'success': True,
|
|
|
|
|
+ 'device_address': device_address,
|
|
|
|
|
+ 'leds': led_states.get(device_address, {})
|
|
|
|
|
+ })
|
|
|
return jsonify({'success': True, 'leds': led_states})
|
|
return jsonify({'success': True, 'leds': led_states})
|
|
|
|
|
|
|
|
|
|
|
|
@@ -3049,6 +3086,8 @@ def set_all_leds():
|
|
|
return jsonify({'success': False, 'message': '串口未连接'}), 400
|
|
return jsonify({'success': False, 'message': '串口未连接'}), 400
|
|
|
|
|
|
|
|
results = []
|
|
results = []
|
|
|
|
|
+ if device_address not in led_states:
|
|
|
|
|
+ led_states[device_address] = {}
|
|
|
for led_num in range(1, 25):
|
|
for led_num in range(1, 25):
|
|
|
result = modbus_client.set_rgb_led(
|
|
result = modbus_client.set_rgb_led(
|
|
|
device_address=device_address,
|
|
device_address=device_address,
|
|
@@ -3060,7 +3099,7 @@ def set_all_leds():
|
|
|
results.append({'led': led_num, 'success': False, 'error': result['error']})
|
|
results.append({'led': led_num, 'success': False, 'error': result['error']})
|
|
|
else:
|
|
else:
|
|
|
results.append({'led': led_num, 'success': True})
|
|
results.append({'led': led_num, 'success': True})
|
|
|
- led_states[led_num] = color
|
|
|
|
|
|
|
+ led_states[device_address][led_num] = color
|
|
|
|
|
|
|
|
_refresh_current_screen_panel()
|
|
_refresh_current_screen_panel()
|
|
|
return jsonify({'success': True, 'results': results})
|
|
return jsonify({'success': True, 'results': results})
|