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 实例 */ /** 全局 WCHUARTManager 实例 */
private WCHUARTManager manager; 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 @Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
channel = new MethodChannel(binding.getBinaryMessenger(), "ch34"); channel = new MethodChannel(binding.getBinaryMessenger(), "ch34");
@@ -545,6 +557,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
manager.disconnect(device); manager.disconnect(device);
openedDevices.remove(deviceName); openedDevices.remove(deviceName);
usbStateStreamHandler.notifyStateChanged(deviceName, false); usbStateStreamHandler.notifyStateChanged(deviceName, false);
resetModemStatusLevels();
} }
result.success(null); result.success(null);
} catch (Exception e) { } catch (Exception e) {
@@ -578,6 +591,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
} }
} }
openedDevices.clear(); openedDevices.clear();
resetModemStatusLevels();
} }
// ==================== GPIO 功能 ==================== // ==================== GPIO 功能 ====================
@@ -752,14 +766,22 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
@Override @Override
public void onStatusChanged(int serialNumber, boolean isDCDRaised, public void onStatusChanged(int serialNumber, boolean isDCDRaised,
boolean isDSRRaised, boolean isCTSRaised, boolean isRINGRaised) { 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 Log.d(TAG, "Modem onStatusChanged: serial=" + serialNumber
+ " dcd=" + isDCDRaised + " dsr=" + isDSRRaised + " dcd=" + currentDCDLevel + " dsr=" + currentDSRLevel
+ " cts=" + isCTSRaised + " ri=" + isRINGRaised); + " cts=" + currentCTSLevel + " ri=" + currentRINGLevel);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("dcd", isDCDRaised); map.put("dcd", currentDCDLevel);
map.put("dsr", isDSRRaised); map.put("dsr", currentDSRLevel);
map.put("cts", isCTSRaised); map.put("cts", currentCTSLevel);
map.put("ri", isRINGRaised); map.put("ri", currentRINGLevel);
Log.d(TAG, "Sending modem status to Flutter: " + map); Log.d(TAG, "Sending modem status to Flutter: " + map);
modemStreamHandler.sendStatus(map); modemStreamHandler.sendStatus(map);
} }
@@ -786,6 +808,8 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler {
private void removeModemStatusCallback(@NonNull MethodCall call, @NonNull Result result) { private void removeModemStatusCallback(@NonNull MethodCall call, @NonNull Result result) {
try { try {
modemStreamHandler.stopListening(); modemStreamHandler.stopListening();
// 重置 Modem 信号绝对电平状态,防止重连时状态残留
resetModemStatusLevels();
result.success(null); result.success(null);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "removeModemStatusCallback error", 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() { private void ensureManagerInitialized() {
if (manager == null) { if (manager == null) {
Application app; Application app;