修改UCD逻辑、添加关闭界面的x

This commit is contained in:
xinzhu.yin
2026-06-22 10:31:19 +08:00
parent 9c15751dd0
commit 22f8b12690
5 changed files with 294 additions and 52 deletions

View File

@@ -156,8 +156,7 @@ class _UcdSdkBackend:
return True
except Exception as e:
self._force_cleanup()
self._reinit_tsi_lib()
self.hard_reset()
return False
def close(self):
@@ -168,19 +167,24 @@ class _UcdSdkBackend:
self._stop_audio_output()
except Exception:
pass
self._close_device_object(self.dev)
self._reset_state()
self._reinit_tsi_lib()
return True
except Exception as e:
try:
self._close_device_object(self.dev)
except Exception:
log.exception("UcdSdk.close device object failed")
finally:
self._reset_state()
try:
self._reinit_tsi_lib()
except Exception:
pass
return False
log.exception("UcdSdk.close reinit failed")
return True
def hard_reset(self) -> None:
"""丢弃失效句柄并重建 TSI意外断连后重连前调用"""
self.dev = None
self.role = None
self._reset_state()
self._reinit_tsi_lib()
def _ensure_tsi_lib(self) -> None:
if self.lUniTAP is None:
@@ -188,7 +192,13 @@ class _UcdSdkBackend:
def _reinit_tsi_lib(self) -> None:
"""Destroy and recreate TsiLib so the native driver rescans USB devices."""
old = self.lUniTAP
self.lUniTAP = None
if old is not None:
try:
old.cleanup()
except Exception:
log.exception("UcdSdk._reinit_tsi_lib cleanup failed")
for _ in range(3):
gc.collect()
time.sleep(2.0)
@@ -1068,6 +1078,26 @@ class UCD323Device(IUcdDevice):
self._info = None
self._bus.publish(ConnectionChanged(DeviceKind.UCD, False, prev_serial))
def force_reset(self) -> None:
"""释放失效的 SDK 句柄,软件状态复位为 CLOSED意外断连后重连前调用"""
with self._acquire_device_lock("force_reset"):
was_open = self._state != UcdState.CLOSED
prev_serial = self._info.serial if self._info else None
try:
self._sdk.hard_reset()
except Exception: # noqa: BLE001
log.exception("UCD force_reset SDK failed")
self._state = UcdState.CLOSED
self._curr_signal = None
self._curr_timing = None
self._curr_pattern = None
self._last_applied = None
self._info = None
if was_open:
self._bus.publish(
ConnectionChanged(DeviceKind.UCD, False, prev_serial)
)
# --- 信号 / 图案配置 ---
def configure(self, signal: SignalFormat, timing: TimingSpec) -> bool: