From a9592d0372e07a32f9461a8493d2fb6573fca5ca Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 12 May 2024 14:14:31 +0300 Subject: [PATCH] Fixed part of motionMaster --- .../controls/ports/AsynchronousPort.kt | 1 + .../pimotionmaster/PiMotionMasterApp.kt | 32 ++++++++++--------- .../pimotionmaster/PiMotionMasterDevice.kt | 4 +-- .../devices/pimotionmaster/piDebugServer.kt | 15 +++++---- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/controls-core/src/commonMain/kotlin/space/kscience/controls/ports/AsynchronousPort.kt b/controls-core/src/commonMain/kotlin/space/kscience/controls/ports/AsynchronousPort.kt index 4462a42..3f89e75 100644 --- a/controls-core/src/commonMain/kotlin/space/kscience/controls/ports/AsynchronousPort.kt +++ b/controls-core/src/commonMain/kotlin/space/kscience/controls/ports/AsynchronousPort.kt @@ -100,6 +100,7 @@ public abstract class AbstractAsynchronousPort( * Send a data packet via the port */ override suspend fun send(data: ByteArray) { + check(isOpen){"The port is not opened"} outgoing.send(data) } diff --git a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterApp.kt b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterApp.kt index 0762e9f..ab1c47a 100644 --- a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterApp.kt +++ b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterApp.kt @@ -45,20 +45,22 @@ fun ColumnScope.piMotionMasterAxis( axisName: String, axis: PiMotionMasterDevice.Axis, ) { + var min by remember { mutableStateOf(0f) } + var max by remember { mutableStateOf(1f) } + var targetPosition by remember { mutableStateOf(0f) } + val position: Double by axis.composeState(PiMotionMasterDevice.Axis.position, 0.0) + + val scope = rememberCoroutineScope() + + LaunchedEffect(axis) { + min = axis.read(PiMotionMasterDevice.Axis.minPosition).toFloat() + max = axis.read(PiMotionMasterDevice.Axis.maxPosition).toFloat() + targetPosition = axis.read(PiMotionMasterDevice.Axis.position).toFloat() + } + + Row { Text(axisName) - var min by remember { mutableStateOf(0f) } - var max by remember { mutableStateOf(0f) } - var targetPosition by remember { mutableStateOf(0f) } - val position: Double by axis.composeState(PiMotionMasterDevice.Axis.position, 0.0) - - val scope = rememberCoroutineScope() - - LaunchedEffect(axis) { - min = axis.read(PiMotionMasterDevice.Axis.minPosition).toFloat() - max = axis.read(PiMotionMasterDevice.Axis.maxPosition).toFloat() - targetPosition = axis.read(PiMotionMasterDevice.Axis.position).toFloat() - } Column { Slider( @@ -70,10 +72,10 @@ fun ColumnScope.piMotionMasterAxis( Slider( value = targetPosition, onValueChange = { newPosition -> + targetPosition = newPosition scope.launch { axis.move(newPosition.toDouble()) } - targetPosition = newPosition }, valueRange = min..max ) @@ -158,13 +160,13 @@ fun PiMotionMasterApp(device: PiMotionMasterDevice) { if (!connected) { device.launch { device.connect(host, port) + axes = device.axes } - axes = device.axes } else { device.launch { device.disconnect() + axes = null } - axes = null } }, modifier = Modifier.fillMaxWidth() diff --git a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterDevice.kt b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterDevice.kt index 4bde0b6..6c271d7 100644 --- a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterDevice.kt +++ b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/PiMotionMasterDevice.kt @@ -165,12 +165,12 @@ class PiMotionMasterDevice( } //Update port //address = portSpec.node - port = portFactory(portSpec, context) - propertyChanged(connected, true) + port = portFactory(portSpec, context).apply { open() } // connector.open() //Initialize axes val idn = read(identity) failIfError { "Can't connect to $portSpec. Error code: $it" } + propertyChanged(connected, true) logger.info { "Connected to $idn on $portSpec" } val ids = request("SAI?").map { it.trim() } if (ids != axes.keys.toList()) { diff --git a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/piDebugServer.kt b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/piDebugServer.kt index 2de548d..4c2b350 100644 --- a/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/piDebugServer.kt +++ b/demo/motors/src/main/kotlin/ru/mipt/npm/devices/pimotionmaster/piDebugServer.kt @@ -8,6 +8,8 @@ import io.ktor.util.InternalAPI import io.ktor.util.moveToByteArray import io.ktor.utils.io.writeAvailable import kotlinx.coroutines.* +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Global @@ -28,13 +30,12 @@ fun Context.launchPiDebugServer(port: Int, axes: List): Job = launch(exc val input = socket.openReadChannel() val output = socket.openWriteChannel() - val sendJob = launch { - virtualDevice.subscribe().collect { - //println("Sending: ${it.decodeToString()}") - output.writeAvailable(it) - output.flush() - } - } + val sendJob = virtualDevice.subscribe().onEach { + //println("Sending: ${it.decodeToString()}") + output.writeAvailable(it) + output.flush() + }.launchIn(this) + try { while (isActive) {