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)
|
"requestPermission" -> requestPermission(call, result)
|
||||||
"openPort" -> openPort(call, result)
|
"openPort" -> openPort(call, result)
|
||||||
"write" -> write(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)
|
"close" -> closePort(call, result)
|
||||||
else -> result.notImplemented()
|
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) {
|
private fun closePort(call: MethodCall, result: Result) {
|
||||||
val portId = call.argument<Int>("portId") ?: run {
|
val portId = call.argument<Int>("portId") ?: run {
|
||||||
result.error("INVALID_ARGUMENT", "portId required", null)
|
result.error("INVALID_ARGUMENT", "portId required", null)
|
||||||
|
|||||||
@@ -32,6 +32,50 @@ class UsbSerialPort {
|
|||||||
return written ?? 0;
|
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.
|
/// Close the port and release native resources.
|
||||||
Future<void> close() async {
|
Future<void> close() async {
|
||||||
await _methods.invokeMethod<void>('close', {'portId': _portId});
|
await _methods.invokeMethod<void>('close', {'portId': _portId});
|
||||||
|
|||||||
Reference in New Issue
Block a user