From 68805d6f42bca9917d64eb21bb37128a9b9373f8 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 25 Feb 2023 10:53:53 +0300 Subject: [PATCH] Refactor onOpen in device spec --- build.gradle.kts | 6 +++- .../kscience/controls/api/DeviceMessage.kt | 4 +-- .../kscience/controls/spec/DeviceBase.kt | 14 ++++++++-- .../kscience/controls/spec/DeviceSpec.kt | 8 ++++++ .../controls/spec/deviceExtensions.kt | 2 +- .../controls/demo/DemoControllerView.kt | 2 +- .../kscience/controls/demo/DemoDevice.kt | 28 +++++++++---------- .../controls/demo/demoDeviceServer.kt | 1 + .../space/kscience/magix/server/server.kt | 1 + 9 files changed, 45 insertions(+), 21 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index cb7b2e4..ecac2af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("space.kscience.gradle.project") } -val dataforgeVersion: String by extra("0.6.0-dev-15") +val dataforgeVersion: String by extra("0.6.1-dev-4") val ktorVersion: String by extra(space.kscience.gradle.KScienceVersions.ktorVersion) val rsocketVersion by extra("0.15.4") val xodusVersion by extra("2.0.1") @@ -14,6 +14,10 @@ val xodusVersion by extra("2.0.1") allprojects { group = "space.kscience" version = "0.1.1-SNAPSHOT" + repositories{ + mavenCentral() + mavenLocal() + } } ksciencePublish { diff --git a/controls-core/src/commonMain/kotlin/space/kscience/controls/api/DeviceMessage.kt b/controls-core/src/commonMain/kotlin/space/kscience/controls/api/DeviceMessage.kt index 8f6f0f9..80a7f9d 100644 --- a/controls-core/src/commonMain/kotlin/space/kscience/controls/api/DeviceMessage.kt +++ b/controls-core/src/commonMain/kotlin/space/kscience/controls/api/DeviceMessage.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.encodeToJsonElement -import space.kscience.dataforge.io.SimpleEnvelope +import space.kscience.dataforge.io.Envelope import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.toJson import space.kscience.dataforge.meta.toMeta @@ -221,4 +221,4 @@ public data class DeviceErrorMessage( public fun DeviceMessage.toMeta(): Meta = Json.encodeToJsonElement(this).toMeta() -public fun DeviceMessage.toEnvelope(): SimpleEnvelope = SimpleEnvelope(toMeta(), null) +public fun DeviceMessage.toEnvelope(): Envelope = Envelope(toMeta(), null) diff --git a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceBase.kt b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceBase.kt index 397eff7..4c114b7 100644 --- a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceBase.kt +++ b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceBase.kt @@ -20,8 +20,8 @@ public abstract class DeviceBase>( override val meta: Meta = Meta.EMPTY ) : Device { - public abstract val properties: Map> //get() = spec.properties - public abstract val actions: Map> //get() = spec.actions + public abstract val properties: Map> + public abstract val actions: Map> override val propertyDescriptors: Collection get() = properties.values.map { it.descriptor } @@ -136,5 +136,15 @@ public open class DeviceBySpec>( ) : DeviceBase(context, meta) { override val properties: Map> get() = spec.properties override val actions: Map> get() = spec.actions + + override suspend fun open(): Unit = with(spec){ + super.open() + self.onOpen() + } + + override fun close(): Unit = with(spec){ + self.onClose() + super.close() + } } diff --git a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceSpec.kt b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceSpec.kt index 67552ea..1cf567c 100644 --- a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceSpec.kt +++ b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/DeviceSpec.kt @@ -23,6 +23,14 @@ public abstract class DeviceSpec { private val _actions = HashMap>() public val actions: Map> get() = _actions + + public open suspend fun D.onOpen(){ + } + + public open fun D.onClose(){ + } + + public fun > registerProperty(deviceProperty: P): P { _properties[deviceProperty.name] = deviceProperty return deviceProperty diff --git a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/deviceExtensions.kt b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/deviceExtensions.kt index 3a9c280..ed48d39 100644 --- a/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/deviceExtensions.kt +++ b/controls-core/src/commonMain/kotlin/space/kscience/controls/spec/deviceExtensions.kt @@ -22,7 +22,7 @@ public fun , R> D.readRecurring(interval: Duration, reader: su } /** - * Do a recurring task on a device. The task could + * Do a recurring (with a fixed delay) task on a device. */ public fun > D.doRecurring(interval: Duration, task: suspend D.() -> Unit): Job = launch { while (isActive) { diff --git a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoControllerView.kt b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoControllerView.kt index 4decac5..cefe834 100644 --- a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoControllerView.kt +++ b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoControllerView.kt @@ -43,7 +43,7 @@ class DemoController : Controller(), ContextAware { plugin(DeviceManager) } - private val deviceManager = context.fetch(DeviceManager) + private val deviceManager = context.request(DeviceManager) fun init() { context.launch { diff --git a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoDevice.kt b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoDevice.kt index 76217ae..10713f3 100644 --- a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoDevice.kt +++ b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/DemoDevice.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.transformations.MetaConverter import java.time.Instant import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime class DemoDevice(context: Context, meta: Meta) : DeviceBySpec(DemoDevice, context, meta) { @@ -19,19 +18,6 @@ class DemoDevice(context: Context, meta: Meta) : DeviceBySpec(DemoDe private var sinScaleState = 1.0 private var cosScaleState = 1.0 - @OptIn(ExperimentalTime::class) - override suspend fun open() { - super.open() - launch { - sinScale.read() - cosScale.read() - timeScale.read() - } - doRecurring(50.milliseconds) { - coordinates.read() - } - } - companion object : DeviceSpec(), Factory { @@ -73,6 +59,20 @@ class DemoDevice(context: Context, meta: Meta) : DeviceBySpec(DemoDe } } + + override suspend fun DemoDevice.onOpen() { + launch { + sinScale.read() + cosScale.read() + timeScale.read() + } + doRecurring(50.milliseconds) { + sin.read() + cos.read() + coordinates.read() + } + } + val resetScale by action(MetaConverter.meta, MetaConverter.meta) { timeScale.write(5000.0) sinScale.write(1.0) diff --git a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/demoDeviceServer.kt b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/demoDeviceServer.kt index c304afe..5b6c7cc 100644 --- a/demo/all-things/src/main/kotlin/space/kscience/controls/demo/demoDeviceServer.kt +++ b/demo/all-things/src/main/kotlin/space/kscience/controls/demo/demoDeviceServer.kt @@ -55,6 +55,7 @@ suspend fun Trace.updateXYFrom(flow: Flow>>) { } +@Suppress("ExtractKtorModule") suspend fun MagixEndpoint.startDemoDeviceServer(): ApplicationEngine = embeddedServer(CIO, 9091) { install(WebSockets) install(RSocketSupport) diff --git a/magix/magix-server/src/main/kotlin/space/kscience/magix/server/server.kt b/magix/magix-server/src/main/kotlin/space/kscience/magix/server/server.kt index 8ed3ba5..b37d5ef 100644 --- a/magix/magix-server/src/main/kotlin/space/kscience/magix/server/server.kt +++ b/magix/magix-server/src/main/kotlin/space/kscience/magix/server/server.kt @@ -70,6 +70,7 @@ public fun CoroutineScope.startMagixServer( ) } + @Suppress("ExtractKtorModule") return embeddedServer(CIO, host = "localhost", port = port) { magixModule(magixFlow) applicationConfiguration(magixFlow)