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)
|
||||
|
||||
Reference in New Issue
Block a user