From 5059ad615850ff05a542373957223337cef95bd4 Mon Sep 17 00:00:00 2001
From: root <13910913995@163.com>
Date: Tue, 27 Jan 2026 18:16:12 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=B5=8B=E8=AF=95?=
=?UTF-8?q?=E6=8F=90=E4=BA=A4bug=E3=80=82=20=E6=8E=92=E5=BA=8F=E3=80=81?=
=?UTF-8?q?=E8=93=9D=E7=89=99=E5=90=8D=E7=A7=B0=E4=BF=AE=E6=94=B9=E4=B8=8D?=
=?UTF-8?q?=E7=94=9F=E6=95=88=E7=AD=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/config.ini | 2 +-
backend/database.py | 4 +-
backend/devices/device_coordinator.py | 25 +-
backend/devices/remote_control_manager.py | 18 +-
backend/devices/utils/config_manager.py | 2 +
frontend/src/renderer/src/views/Detection.vue | 322 ++++++------------
6 files changed, 152 insertions(+), 221 deletions(-)
diff --git a/backend/config.ini b/backend/config.ini
index 149d17f0..f84a9c3f 100644
--- a/backend/config.ini
+++ b/backend/config.ini
@@ -60,7 +60,7 @@ pressure_port = COM5
pressure_baudrate = 115200
[REMOTE]
-enable = False
+enable = True
port = COM6
baudrate = 115200
timeout = 0.1
diff --git a/backend/database.py b/backend/database.py
index 30b5cecf..48ee85f9 100644
--- a/backend/database.py
+++ b/backend/database.py
@@ -830,7 +830,7 @@ class DatabaseManager:
cursor.execute('''
SELECT * FROM detection_data
WHERE session_id = ?
- ORDER BY timestamp
+ ORDER BY timestamp desc
''', (session_id,))
data_rows = cursor.fetchall()
@@ -849,7 +849,7 @@ class DatabaseManager:
cursor.execute('''
SELECT * FROM detection_video
WHERE session_id = ?
- ORDER BY timestamp
+ ORDER BY timestamp desc
''', (session_id,))
video_rows = cursor.fetchall()
diff --git a/backend/devices/device_coordinator.py b/backend/devices/device_coordinator.py
index 6f66d0c6..7c569fb4 100644
--- a/backend/devices/device_coordinator.py
+++ b/backend/devices/device_coordinator.py
@@ -291,9 +291,11 @@ class DeviceCoordinator:
from .remote_control_manager import RemoteControlManager
remote = RemoteControlManager(self.socketio, self.config_manager)
self.devices['remote'] = remote
- if remote.initialize():
- return True
- return False
+ if not remote.initialize():
+ return False
+ if hasattr(remote, 'start_streaming'):
+ return bool(remote.start_streaming())
+ return True
except Exception as e:
self.logger.error(f"初始化遥控器失败: {e}")
return False
@@ -743,6 +745,12 @@ class DeviceCoordinator:
except ImportError:
from femtobolt_manager import FemtoBoltManager
new_device = FemtoBoltManager(self.socketio, self.config_manager)
+ elif device_name == 'remote':
+ try:
+ from .remote_control_manager import RemoteControlManager
+ except ImportError:
+ from remote_control_manager import RemoteControlManager
+ new_device = RemoteControlManager(self.socketio, self.config_manager)
else:
raise ValueError(f"未知的设备类型: {device_name}")
@@ -777,6 +785,17 @@ class DeviceCoordinator:
init_time = (time.time() - init_start) * 1000
self.logger.info(f"{device_name} 设备初始化成功 (耗时: {init_time:.1f}ms)")
+ if device_name == 'remote' and hasattr(new_device, 'start_streaming'):
+ self.logger.info(f"正在启动 {device_name} 设备推流...")
+ try:
+ if not new_device.start_streaming():
+ self.logger.error(f"启动 {device_name} 设备推流失败")
+ return False
+ was_streaming = True
+ except Exception as e:
+ self.logger.error(f"启动 {device_name} 推流异常: {e}")
+ return False
+
# 设备初始化成功后,确保状态广播正确
# 此时设备应该已经通过initialize()方法中的set_connected(True)触发了状态变化通知
# 但为了确保状态一致性,我们再次确认状态
diff --git a/backend/devices/remote_control_manager.py b/backend/devices/remote_control_manager.py
index 68fb6538..cf0ff7cb 100644
--- a/backend/devices/remote_control_manager.py
+++ b/backend/devices/remote_control_manager.py
@@ -66,7 +66,7 @@ class RemoteControlManager(BaseDevice):
def initialize(self) -> bool:
try:
self.logger.info(f"初始化遥控器串口: {self.port}, {self.baudrate}bps, 8N1")
- self.set_connected(True)
+ self.set_connected(False)
self._device_info['initialized_at'] = time.time()
return True
except Exception as e:
@@ -88,6 +88,9 @@ class RemoteControlManager(BaseDevice):
stopbits=self.stopbits,
timeout=self.timeout,
)
+ self.set_connected(True)
+ self.update_heartbeat()
+ self.is_streaming = True
self._running = True
self._thread = threading.Thread(target=self._worker_loop, daemon=True)
self._thread.start()
@@ -110,6 +113,9 @@ class RemoteControlManager(BaseDevice):
self._thread.join(timeout=2.0)
if self._ser and self._ser.is_open:
self._ser.close()
+ self._ser = None
+ self.set_connected(False)
+ self.is_streaming = False
self.logger.info("遥控器串口监听已停止")
return True
except Exception as e:
@@ -248,6 +254,7 @@ class RemoteControlManager(BaseDevice):
time.sleep(0.05)
continue
chunk = self._ser.read(64)
+ self.update_heartbeat()
if chunk:
try:
hexstr = ' '.join(f'{b:02X}' for b in chunk)
@@ -262,5 +269,14 @@ class RemoteControlManager(BaseDevice):
self.logger.debug("遥控器串口暂无数据")
except Exception as e:
self.logger.error(f"遥控器串口读取异常: {e}")
+ try:
+ if self._ser and self._ser.is_open:
+ self._ser.close()
+ except Exception:
+ pass
+ self._ser = None
+ self.set_connected(False)
+ self.is_streaming = False
+ self._running = False
time.sleep(0.1)
self.logger.info("遥控器串口线程结束")
diff --git a/backend/devices/utils/config_manager.py b/backend/devices/utils/config_manager.py
index 298bec7e..0feddb58 100644
--- a/backend/devices/utils/config_manager.py
+++ b/backend/devices/utils/config_manager.py
@@ -434,6 +434,8 @@ class ConfigManager:
self.set_config_value('DEVICES', 'imu_use_mock', str(config_data['use_mock']))
if 'mac_address' in config_data:
self.set_config_value('DEVICES', 'imu_mac_address', config_data['mac_address'])
+ if 'ble_name' in config_data:
+ self.set_config_value('DEVICES', 'imu_ble_name', config_data['ble_name'])
results['imu'] = {
'success': True,
diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue
index d2d58a3a..5e7ccc51 100644
--- a/frontend/src/renderer/src/views/Detection.vue
+++ b/frontend/src/renderer/src/views/Detection.vue
@@ -3,6 +3,7 @@
@@ -462,7 +444,7 @@
+ class="userinfo-edit-img" style="cursor: pointer;" @click="handleEditUserInfo">
-
-
@@ -612,14 +538,14 @@