feat(ch934x): 添加GPIO方向控制和串口参数配置功能

- 添加Ch934xMode和GpioDirection枚举类定义
- 实现GPIO方向控制相关方法(setGpioDir/queryGpioDirFromCache)
- 添加GPIO使能控制(enableGpio)和数量/组数查询(getGpiocount/getGpiogroup)
- 实现串口参数配置(setSerialParameter)包括波特率/数据位/停止位/校验位/流控
- 添加Break信号控制(setBreak)功能
- 实现当前串口模式查询(getCurrentMode)
- 添加设备连接状态查询(isConnected)和已打开设备列表获取(getConnectedDevices)
- 更新文档说明GPIO方向控制和串口参数配置用法
- 在示例应用中添加相关功能按钮和操作逻辑
This commit is contained in:
Developer
2026-07-07 16:15:11 +08:00
parent 4813e79c80
commit 020904bd2a
8 changed files with 765 additions and 9 deletions
@@ -229,6 +229,36 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
exceptionCallbackEnabled = true;
result.success(null);
break;
case "setBreak":
result.success(handleSetBreak(call));
break;
case "getCurrentMode":
result.success(handleGetCurrentMode(call));
break;
case "getGPIOCount":
result.success(handleGetGPIOCount(call));
break;
case "getGPIOGroup":
result.success(handleGetGPIOGroup(call));
break;
case "enableGPIO":
result.success(handleEnableGPIO(call));
break;
case "setGPIODir":
result.success(handleSetGPIODir(call));
break;
case "queryGPIODirFromCache":
result.success(handleQueryGPIODirFromCache(call));
break;
case "isConnected":
result.success(handleIsConnected(call));
break;
case "getConnectedDevices":
result.success(handleGetConnectedDevices());
break;
case "setSerialParameter":
result.success(handleSetSerialParameter(call));
break;
default:
result.notImplemented();
}
@@ -637,6 +667,187 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
return modemStatusCache;
}
// ------------------------------------------------------------------------
// 新增接口(对应文档 setBreak / querySerialErrorCount / getCurrentMode / …)
// ------------------------------------------------------------------------
/** 文档 setBreak。 */
private boolean handleSetBreak(@NonNull MethodCall call) {
if (activeDevice == null || activeSerialNumber < 0) {
return false;
}
Boolean valid = call.argument("valid");
if (valid == null) {
return false;
}
try {
return CH934XManager.getInstance().setBreak(
activeDevice, activeSerialNumber, valid);
} catch (Throwable t) {
return false;
}
}
/** 文档 getCurrentMode。 */
private int handleGetCurrentMode(@NonNull MethodCall call) {
if (activeDevice == null || activeSerialNumber < 0) {
return -1;
}
try {
Mode mode = CH934XManager.getInstance().getCurrentMode(
activeDevice, activeSerialNumber);
if (mode == null) return -1;
String name = mode.name();
if ("NORMAL".equals(name)) return 0;
if ("HARDFLOW".equals(name)) return 1;
if ("GPIO".equals(name)) return 2;
return -1;
} catch (Throwable t) {
return -1;
}
}
/** 文档 getGPIOCount。 */
private int handleGetGPIOCount(@NonNull MethodCall call) {
UsbDevice device = resolveDevice(call);
if (device == null) {
return -1;
}
try {
return CH934XManager.getInstance().getGPIOCount(device);
} catch (Throwable t) {
return -1;
}
}
/** 文档 getGPIOGroup。 */
private int handleGetGPIOGroup(@NonNull MethodCall call) {
UsbDevice device = resolveDevice(call);
if (device == null) {
return -1;
}
try {
return CH934XManager.getInstance().getGPIOGroup(device);
} catch (Throwable t) {
return -1;
}
}
/** 文档 enableGPIO。需要 ChipType 参数,由 Dart 侧传入 int 映射值。 */
private boolean handleEnableGPIO(@NonNull MethodCall call) {
UsbDevice device = resolveDevice(call);
if (device == null) {
return false;
}
Integer chipTypeVal = call.argument("chipType");
Integer gpioGroup = call.argument("gpioGroup");
Integer enable = call.argument("enable");
if (chipTypeVal == null || gpioGroup == null || enable == null) {
return false;
}
ChipType chipType = parseChipType(chipTypeVal);
if (chipType == null) {
return false;
}
try {
return CH934XManager.getInstance().enableGPIO(
device, chipType, gpioGroup, enable);
} catch (Throwable t) {
return false;
}
}
/** 文档 setGPIODir。 */
private boolean handleSetGPIODir(@NonNull MethodCall call) {
if (activeDevice == null) {
return false;
}
Integer gpioGroup = call.argument("gpioGroup");
Integer gpioNumber = call.argument("gpioNumber");
Integer dir = call.argument("dir");
if (gpioGroup == null || gpioNumber == null || dir == null) {
return false;
}
GPIO_DIR gpioDir = dir == 0 ? GPIO_DIR.IN : GPIO_DIR.OUT;
try {
return CH934XManager.getInstance().setGPIODir(
activeDevice, gpioGroup, gpioNumber, gpioDir);
} catch (Throwable t) {
return false;
}
}
/** 文档 queryGPIODirFromCache。返回 0=IN,1=OUT,负值=失败。 */
private int handleQueryGPIODirFromCache(@NonNull MethodCall call) {
if (activeDevice == null) {
return -1;
}
Integer gpioGroup = call.argument("gpioGroup");
Integer gpioNumber = call.argument("gpioNumber");
if (gpioGroup == null || gpioNumber == null) {
return -1;
}
try {
GPIO_DIR dir = CH934XManager.getInstance().queryGPIODirFromCache(
activeDevice, gpioGroup, gpioNumber);
if (dir == null) return -1;
return dir == GPIO_DIR.OUT ? 1 : 0;
} catch (Throwable t) {
return -1;
}
}
/** 文档 isConnected。 */
private boolean handleIsConnected(@NonNull MethodCall call) {
UsbDevice device = resolveDevice(call);
if (device == null) {
return false;
}
try {
return CH934XManager.getInstance().isConnected(device);
} catch (Throwable t) {
return false;
}
}
/** 文档 getConnectedDevices。返回已打开设备的 deviceId 列表。 */
private List<Integer> handleGetConnectedDevices() {
List<Integer> ids = new ArrayList<>();
try {
ArrayList<UsbDevice> devices = CH934XManager.getInstance().getConnectedDevices();
if (devices != null) {
for (UsbDevice d : devices) {
ids.add(d.getDeviceId());
}
}
} catch (Throwable ignored) {
}
return ids;
}
/** 文档 setSerialParameter。配置当前活跃串口的参数。 */
private boolean handleSetSerialParameter(@NonNull MethodCall call) {
if (activeDevice == null || activeSerialNumber < 0) {
return false;
}
Integer baud = call.argument("baud");
Integer dataBit = call.argument("dataBit");
Integer stopBit = call.argument("stopBit");
Integer parityBit = call.argument("parityBit");
Boolean flow = call.argument("flow");
if (baud == null || dataBit == null || stopBit == null
|| parityBit == null || flow == null) {
return false;
}
try {
return CH934XManager.getInstance().setSerialParameter(
activeDevice, activeSerialNumber,
baud, dataBit, stopBit, parityBit, flow);
} catch (Throwable t) {
return false;
}
}
// ------------------------------------------------------------------------
// 内部辅助
// ------------------------------------------------------------------------
@@ -680,6 +891,25 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
return 5;
}
/** 将 Dart 侧传入的 int 还原为 SDK ChipType。null 表示未知类型。 */
@Nullable
private ChipType parseChipType(int value) {
String name;
switch (value) {
case 0: name = "CH9344"; break;
case 1: name = "CH9344L"; break;
case 2: name = "CH9350"; break;
case 3: name = "CH9348Q"; break;
case 4: name = "CH9342"; break;
default: return null;
}
try {
return ChipType.valueOf(name);
} catch (IllegalArgumentException e) {
return null;
}
}
private List<Map<String, Object>> buildSerialPortList(int count) {
List<Map<String, Object>> ports = new ArrayList<>();
for (int i = 0; i < Math.max(count, 0); i++) {