This commit is contained in:
Developer
2026-05-18 17:56:16 +08:00
parent c000eb12f8
commit b56180ccc8

View File

@@ -56,6 +56,18 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
/** 全局 WCHUARTManager 实例 */
private WCHUARTManager manager;
/**
* 维护 Modem 信号绝对电平状态。
*
* WCH SDK IModemStatus.onStatusChanged 的参数 isDSRRaised/isCTSRaised/isDCDRaised/isRINGRaised
* 在字面上是"上升沿标志"但实际观察表明其行为符合电平值true=高电平false=低电平)。
* 为确保语义明确且不受 SDK 行为变化影响,在此维护绝对电平状态。
*/
private boolean currentDSRLevel = false;
private boolean currentCTSLevel = false;
private boolean currentDCDLevel = false;
private boolean currentRINGLevel = false;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
channel = new MethodChannel(binding.getBinaryMessenger(), "ch34");
@@ -545,6 +557,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
manager.disconnect(device);
openedDevices.remove(deviceName);
usbStateStreamHandler.notifyStateChanged(deviceName, false);
resetModemStatusLevels();
}
result.success(null);
} catch (Exception e) {
@@ -578,6 +591,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
}
}
openedDevices.clear();
resetModemStatusLevels();
}
// ==================== GPIO 功能 ====================
@@ -752,14 +766,22 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
@Override
public void onStatusChanged(int serialNumber, boolean isDCDRaised,
boolean isDSRRaised, boolean isCTSRaised, boolean isRINGRaised) {
// 根据 SDK 回调参数更新绝对电平状态
// WCH SDK 的 isDSRRaised 等参数在每次状态变化回调中表示该信号的
// 当前电平值true=高电平false=低电平
currentDCDLevel = isDCDRaised;
currentDSRLevel = isDSRRaised;
currentCTSLevel = isCTSRaised;
currentRINGLevel = isRINGRaised;
Log.d(TAG, "Modem onStatusChanged: serial=" + serialNumber
+ " dcd=" + isDCDRaised + " dsr=" + isDSRRaised
+ " cts=" + isCTSRaised + " ri=" + isRINGRaised);
+ " dcd=" + currentDCDLevel + " dsr=" + currentDSRLevel
+ " cts=" + currentCTSLevel + " ri=" + currentRINGLevel);
Map<String, Object> map = new HashMap<>();
map.put("dcd", isDCDRaised);
map.put("dsr", isDSRRaised);
map.put("cts", isCTSRaised);
map.put("ri", isRINGRaised);
map.put("dcd", currentDCDLevel);
map.put("dsr", currentDSRLevel);
map.put("cts", currentCTSLevel);
map.put("ri", currentRINGLevel);
Log.d(TAG, "Sending modem status to Flutter: " + map);
modemStreamHandler.sendStatus(map);
}
@@ -786,6 +808,8 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
private void removeModemStatusCallback(@NonNull MethodCall call, @NonNull Result result) {
try {
modemStreamHandler.stopListening();
// 重置 Modem 信号绝对电平状态,防止重连时状态残留
resetModemStatusLevels();
result.success(null);
} catch (Exception e) {
Log.e(TAG, "removeModemStatusCallback error", e);
@@ -858,6 +882,18 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
// ==================== 辅助方法 ====================
/**
* 重置 Modem 信号绝对电平状态。
*
* 在移除 Modem 回调或关闭设备时调用,确保下次注册回调时状态干净。
*/
private void resetModemStatusLevels() {
currentDSRLevel = false;
currentCTSLevel = false;
currentDCDLevel = false;
currentRINGLevel = false;
}
private void ensureManagerInitialized() {
if (manager == null) {
Application app;