feat(ch934x): 添加GPIO方向控制和串口参数配置功能
- 添加Ch934xMode和GpioDirection枚举类定义 - 实现GPIO方向控制相关方法(setGpioDir/queryGpioDirFromCache) - 添加GPIO使能控制(enableGpio)和数量/组数查询(getGpiocount/getGpiogroup) - 实现串口参数配置(setSerialParameter)包括波特率/数据位/停止位/校验位/流控 - 添加Break信号控制(setBreak)功能 - 实现当前串口模式查询(getCurrentMode) - 添加设备连接状态查询(isConnected)和已打开设备列表获取(getConnectedDevices) - 更新文档说明GPIO方向控制和串口参数配置用法 - 在示例应用中添加相关功能按钮和操作逻辑
This commit is contained in:
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user