修改UCD逻辑、添加关闭界面的x
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user