feat(serial): 优化CH934x串口写入性能并修复多认证并发冲突

- 引入独立写执行器池确保同端口有序不同端口可并发
- 将同步写操作改为异步执行避免UI线程阻塞
- 实现认证UI协调器防止身份验证与告警覆盖层冲突
- 添加嵌套单用户认证状态快照管理机制
- 修复双人验证中用户身份一致性检查逻辑
- 优化抽屉信息轮询批量请求提升响应效率
- 修复管理账户权限组关联关系初始化问题
- 调整轮询间隔参数提高系统响应性
This commit is contained in:
2026-07-16 09:13:16 +08:00
parent aea4e4f1cd
commit 8afa99c69d
@@ -21,6 +21,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import cn.wch.ch934xlib.CH934XManager; import cn.wch.ch934xlib.CH934XManager;
@@ -84,6 +86,22 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
/** Modem 状态位缓存(CTS/DSR/RI/DCD)。SDK 仅以回调方式推送,这里聚合最近一次。 */ /** Modem 状态位缓存(CTS/DSR/RI/DCD)。SDK 仅以回调方式推送,这里聚合最近一次。 */
private int modemStatusCache = 0; private int modemStatusCache = 0;
/** 每个串口独立的单线程写执行器:同端口有序,不同端口可并发。 */
private final ExecutorService[] writeExecutors = createWriteExecutors();
private static ExecutorService[] createWriteExecutors() {
ExecutorService[] executors = new ExecutorService[8];
for (int i = 0; i < executors.length; i++) {
final int port = i;
executors[i] = Executors.newSingleThreadExecutor(runnable -> {
Thread thread = new Thread(runnable, "ch934x-write-" + port);
thread.setDaemon(true);
return thread;
});
}
return executors;
}
@Override @Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
applicationContext = binding.getApplicationContext(); applicationContext = binding.getApplicationContext();
@@ -153,6 +171,9 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
activeSerialNumber = -1; activeSerialNumber = -1;
modemCallbackRegistered = false; modemCallbackRegistered = false;
exceptionCallbackEnabled = false; exceptionCallbackEnabled = false;
for (ExecutorService executor : writeExecutors) {
executor.shutdownNow();
}
} }
@Override @Override
@@ -211,7 +232,7 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
result.success(handleRead(call)); result.success(handleRead(call));
break; break;
case "write": case "write":
result.success(handleWrite(call)); handleWriteAsync(call, result);
break; break;
case "setGpioOutput": case "setGpioOutput":
result.success(handleSetGpioOutput(call)); result.success(handleSetGpioOutput(call));
@@ -575,26 +596,35 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
} }
} }
/** 文档 6.2.1。 */ /** 文档 6.2.1。阻塞 SDK 写入在对应串口的专用线程执行。 */
private int handleWrite(@NonNull MethodCall call) throws UartLibException { private void handleWriteAsync(@NonNull MethodCall call, @NonNull Result result) {
if (activeDevice == null) { if (activeDevice == null) {
return 0; result.success(0);
return;
} }
byte[] data = call.argument("data"); byte[] data = call.argument("data");
if (data == null || data.length == 0) { if (data == null || data.length == 0) {
return 0; result.success(0);
return;
} }
Integer portIndex = call.argument("serialPortIndex"); Integer portIndex = call.argument("serialPortIndex");
int idx = portIndex != null ? portIndex : activeSerialNumber; int idx = portIndex != null ? portIndex : activeSerialNumber;
if (idx < 0) { if (idx < 0 || idx >= writeExecutors.length) {
return 0; result.success(0);
return;
} }
final UsbDevice device = activeDevice;
writeExecutors[idx].execute(() -> {
int written = 0;
try { try {
return CH934XManager.getInstance().writeData( written = CH934XManager.getInstance().writeData(
activeDevice, idx, data, data.length, 2000); device, idx, data, data.length, 2000);
} catch (ChipException e) { } catch (Throwable ignored) {
return 0; // 与原同步实现一致:写失败返回 0,由 Dart 层处理。
} }
final int completed = written;
new Handler(Looper.getMainLooper()).post(() -> result.success(completed));
});
} }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------