Add methods to set serial parameters and control lines in UsbSerialPort
Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
@@ -131,6 +131,10 @@ class FlutterUsbSerialPlugin :
|
||||
"requestPermission" -> requestPermission(call, result)
|
||||
"openPort" -> openPort(call, result)
|
||||
"write" -> write(call, result)
|
||||
"setParameters" -> setParameters(call, result)
|
||||
"setDTR" -> setDtr(call, result)
|
||||
"setRTS" -> setRts(call, result)
|
||||
"purgeHwBuffers" -> purgeHwBuffers(call, result)
|
||||
"close" -> closePort(call, result)
|
||||
else -> result.notImplemented()
|
||||
}
|
||||
@@ -272,6 +276,85 @@ class FlutterUsbSerialPlugin :
|
||||
}
|
||||
}
|
||||
|
||||
private fun setParameters(call: MethodCall, result: Result) {
|
||||
val portId = call.argument<Int>("portId") ?: run {
|
||||
result.error("INVALID_ARGUMENT", "portId required", null)
|
||||
return
|
||||
}
|
||||
val baudRate = call.argument<Int>("baudRate") ?: 9600
|
||||
val dataBits = call.argument<Int>("dataBits") ?: 8
|
||||
val parity = call.argument<Int>("parity") ?: UsbSerialPort.PARITY_NONE
|
||||
val stopBits = call.argument<Int>("stopBits") ?: UsbSerialPort.STOPBITS_1
|
||||
val handle = synchronized(portsLock) { openPorts[portId] }
|
||||
if (handle == null) {
|
||||
result.error("PORT_NOT_FOUND", "Port $portId is not open", null)
|
||||
return
|
||||
}
|
||||
try {
|
||||
handle.port.setParameters(baudRate, dataBits, stopBits, parity)
|
||||
result.success(null)
|
||||
} catch (e: Exception) {
|
||||
result.error("SET_PARAMETERS_FAILED", e.message, null)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setDtr(call: MethodCall, result: Result) {
|
||||
setControlLine(call, result, "DTR") { port, value -> port.setDTR(value) }
|
||||
}
|
||||
|
||||
private fun setRts(call: MethodCall, result: Result) {
|
||||
setControlLine(call, result, "RTS") { port, value -> port.setRTS(value) }
|
||||
}
|
||||
|
||||
private fun setControlLine(
|
||||
call: MethodCall,
|
||||
result: Result,
|
||||
name: String,
|
||||
setter: (UsbSerialPort, Boolean) -> Unit,
|
||||
) {
|
||||
val portId = call.argument<Int>("portId") ?: run {
|
||||
result.error("INVALID_ARGUMENT", "portId required", null)
|
||||
return
|
||||
}
|
||||
val value = call.argument<Boolean>("value") ?: run {
|
||||
result.error("INVALID_ARGUMENT", "value required", null)
|
||||
return
|
||||
}
|
||||
val handle = synchronized(portsLock) { openPorts[portId] }
|
||||
if (handle == null) {
|
||||
result.error("PORT_NOT_FOUND", "Port $portId is not open", null)
|
||||
return
|
||||
}
|
||||
try {
|
||||
setter(handle.port, value)
|
||||
result.success(null)
|
||||
} catch (e: Exception) {
|
||||
result.error("SET_${name}_FAILED", e.message, null)
|
||||
}
|
||||
}
|
||||
|
||||
private fun purgeHwBuffers(call: MethodCall, result: Result) {
|
||||
val portId = call.argument<Int>("portId") ?: run {
|
||||
result.error("INVALID_ARGUMENT", "portId required", null)
|
||||
return
|
||||
}
|
||||
val purgeWriteBuffers = call.argument<Boolean>("purgeWriteBuffers") ?: true
|
||||
val purgeReadBuffers = call.argument<Boolean>("purgeReadBuffers") ?: true
|
||||
val handle = synchronized(portsLock) { openPorts[portId] }
|
||||
if (handle == null) {
|
||||
result.error("PORT_NOT_FOUND", "Port $portId is not open", null)
|
||||
return
|
||||
}
|
||||
try {
|
||||
handle.port.purgeHwBuffers(purgeWriteBuffers, purgeReadBuffers)
|
||||
result.success(null)
|
||||
} catch (e: UnsupportedOperationException) {
|
||||
result.success(null)
|
||||
} catch (e: Exception) {
|
||||
result.error("PURGE_FAILED", e.message, null)
|
||||
}
|
||||
}
|
||||
|
||||
private fun closePort(call: MethodCall, result: Result) {
|
||||
val portId = call.argument<Int>("portId") ?: run {
|
||||
result.error("INVALID_ARGUMENT", "portId required", null)
|
||||
|
||||
@@ -32,6 +32,50 @@ class UsbSerialPort {
|
||||
return written ?? 0;
|
||||
}
|
||||
|
||||
/// Updates serial line parameters for an already-open port.
|
||||
Future<void> setParameters({
|
||||
required int baudRate,
|
||||
int dataBits = 8,
|
||||
UsbSerialParity parity = UsbSerialParity.none,
|
||||
UsbSerialStopBits stopBits = UsbSerialStopBits.one,
|
||||
}) async {
|
||||
await _methods.invokeMethod<void>('setParameters', {
|
||||
'portId': _portId,
|
||||
'baudRate': baudRate,
|
||||
'dataBits': dataBits,
|
||||
'parity': parity.index,
|
||||
'stopBits': FlutterUsbSerial._stopBitsIndex(stopBits),
|
||||
});
|
||||
}
|
||||
|
||||
/// Sets the DTR modem control line.
|
||||
Future<void> setDTR(bool value) async {
|
||||
await _methods.invokeMethod<void>('setDTR', {
|
||||
'portId': _portId,
|
||||
'value': value,
|
||||
});
|
||||
}
|
||||
|
||||
/// Sets the RTS modem control line.
|
||||
Future<void> setRTS(bool value) async {
|
||||
await _methods.invokeMethod<void>('setRTS', {
|
||||
'portId': _portId,
|
||||
'value': value,
|
||||
});
|
||||
}
|
||||
|
||||
/// Purges USB serial driver buffers when the driver supports it.
|
||||
Future<void> purgeHwBuffers({
|
||||
bool purgeWriteBuffers = true,
|
||||
bool purgeReadBuffers = true,
|
||||
}) async {
|
||||
await _methods.invokeMethod<void>('purgeHwBuffers', {
|
||||
'portId': _portId,
|
||||
'purgeWriteBuffers': purgeWriteBuffers,
|
||||
'purgeReadBuffers': purgeReadBuffers,
|
||||
});
|
||||
}
|
||||
|
||||
/// Close the port and release native resources.
|
||||
Future<void> close() async {
|
||||
await _methods.invokeMethod<void>('close', {'portId': _portId});
|
||||
|
||||
Reference in New Issue
Block a user