Fix changesFlow issues
This commit is contained in:
parent
face7bfd0c
commit
8a4779e9c4
@ -3,12 +3,19 @@ package ru.mipt.npm.sat
|
|||||||
|
|
||||||
import hep.dataforge.context.Global
|
import hep.dataforge.context.Global
|
||||||
import hep.dataforge.names.asName
|
import hep.dataforge.names.asName
|
||||||
|
import hep.dataforge.vision.get
|
||||||
import hep.dataforge.vision.server.visionModule
|
import hep.dataforge.vision.server.visionModule
|
||||||
|
import hep.dataforge.vision.solid.Solid
|
||||||
import hep.dataforge.vision.solid.SolidManager
|
import hep.dataforge.vision.solid.SolidManager
|
||||||
|
import hep.dataforge.vision.solid.color
|
||||||
import io.ktor.server.cio.CIO
|
import io.ktor.server.cio.CIO
|
||||||
import io.ktor.server.engine.embeddedServer
|
import io.ktor.server.engine.embeddedServer
|
||||||
import io.ktor.util.KtorExperimentalAPI
|
import io.ktor.util.KtorExperimentalAPI
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.isActive
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.html.script
|
import kotlinx.html.script
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
@OptIn(KtorExperimentalAPI::class)
|
@OptIn(KtorExperimentalAPI::class)
|
||||||
fun main() {
|
fun main() {
|
||||||
@ -31,5 +38,13 @@ fun main() {
|
|||||||
vision("main".asName(), sat)
|
vision("main".asName(), sat)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
launch {
|
||||||
|
while (isActive){
|
||||||
|
val currentLayer = Random.nextInt(10)
|
||||||
|
(sat["layer[$currentLayer]"] as? Solid)?.color(123)
|
||||||
|
delay(300)
|
||||||
|
(sat["layer[$currentLayer]"] as? Solid)?.color = null
|
||||||
|
}
|
||||||
|
}
|
||||||
}.start(wait = true)
|
}.start(wait = true)
|
||||||
}
|
}
|
@ -97,7 +97,7 @@ public interface MutableVisionGroup : VisionGroup, VisionContainerBuilder<Vision
|
|||||||
// public operator fun set(name: Name, child: Vision?)
|
// public operator fun set(name: Name, child: Vision?)
|
||||||
}
|
}
|
||||||
|
|
||||||
public operator fun <V: Vision> VisionContainer<V>.get(str: String?): V? = get(str?.toName() ?: Name.EMPTY)
|
public operator fun <V: Vision> VisionContainer<V>.get(str: String): V? = get(str.toName())
|
||||||
|
|
||||||
public operator fun <V: Vision> VisionContainerBuilder<V>.set(token: NameToken, child: V?): Unit = set(token.asName(), child)
|
public operator fun <V: Vision> VisionContainerBuilder<V>.set(token: NameToken, child: V?): Unit = set(token.asName(), child)
|
||||||
public operator fun <V: Vision> VisionContainerBuilder<V>.set(key: String, child: V?): Unit = set(key.toName(), child)
|
public operator fun <V: Vision> VisionContainerBuilder<V>.set(key: String, child: V?): Unit = set(key.toName(), child)
|
||||||
|
@ -15,10 +15,10 @@ public open class VisionGroupBase : VisionBase(), MutableVisionGroup {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal mutable container for group children
|
* Internal mutable container for group children
|
||||||
* TODO made protected due to https://github.com/Kotlin/kotlinx.serialization/issues/1200
|
* TODO made protected due to [https://github.com/Kotlin/kotlinx.serialization/issues/1200]
|
||||||
*/
|
*/
|
||||||
@SerialName("children")
|
@SerialName("children")
|
||||||
protected open val childrenInternal: MutableMap<NameToken, Vision> = LinkedHashMap()
|
protected val childrenInternal: MutableMap<NameToken, Vision> = LinkedHashMap()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map of top level named children
|
* A map of top level named children
|
||||||
|
@ -88,15 +88,25 @@ private fun CoroutineScope.collectChange(
|
|||||||
mutex: Mutex,
|
mutex: Mutex,
|
||||||
target: () -> MutableVisionGroup,
|
target: () -> MutableVisionGroup,
|
||||||
) {
|
) {
|
||||||
val targetVision: () -> Vision = { target().getOrCreate(name) }
|
|
||||||
//Collect properties change
|
//Collect properties change
|
||||||
source.onPropertyChange(mutex) { propertyName ->
|
source.config.onChange(mutex){propertyName, oldItem, newItem->
|
||||||
launch {
|
if(oldItem!= newItem){
|
||||||
mutex.withLock {
|
launch {
|
||||||
targetVision().setProperty(propertyName, source.getProperty(propertyName))
|
mutex.withLock {
|
||||||
|
target().getOrCreate(name).setProperty(propertyName, newItem)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// source.onPropertyChange(mutex) { propertyName ->
|
||||||
|
// launch {
|
||||||
|
// mutex.withLock {
|
||||||
|
// target().getOrCreate(name).setProperty(propertyName, source.getProperty(propertyName,false))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
val targetVision: Vision = target().getOrCreate(name)
|
||||||
|
|
||||||
if (source is VisionGroup) {
|
if (source is VisionGroup) {
|
||||||
check(targetVision is MutableVisionGroup) { "Collector for a group should be a group" }
|
check(targetVision is MutableVisionGroup) { "Collector for a group should be a group" }
|
||||||
@ -124,9 +134,6 @@ private fun CoroutineScope.collectChange(
|
|||||||
|
|
||||||
@DFExperimental
|
@DFExperimental
|
||||||
public fun Vision.flowChanges(scope: CoroutineScope, collectionDuration: Duration): Flow<Vision> = flow {
|
public fun Vision.flowChanges(scope: CoroutineScope, collectionDuration: Duration): Flow<Vision> = flow {
|
||||||
//emit initial visual tree
|
|
||||||
emit(this@flowChanges)
|
|
||||||
|
|
||||||
val mutex = Mutex()
|
val mutex = Mutex()
|
||||||
|
|
||||||
var collector = VisionGroupBase()
|
var collector = VisionGroupBase()
|
||||||
|
@ -29,6 +29,7 @@ import io.ktor.routing.get
|
|||||||
import io.ktor.routing.route
|
import io.ktor.routing.route
|
||||||
import io.ktor.routing.routing
|
import io.ktor.routing.routing
|
||||||
import io.ktor.server.engine.ApplicationEngine
|
import io.ktor.server.engine.ApplicationEngine
|
||||||
|
import io.ktor.util.error
|
||||||
import io.ktor.websocket.WebSockets
|
import io.ktor.websocket.WebSockets
|
||||||
import io.ktor.websocket.webSocket
|
import io.ktor.websocket.webSocket
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
@ -129,8 +130,9 @@ public class VisionServer internal constructor(
|
|||||||
val json = visionManager.encodeToString(update)
|
val json = visionManager.encodeToString(update)
|
||||||
outgoing.send(Frame.Text(json))
|
outgoing.send(Frame.Text(json))
|
||||||
}
|
}
|
||||||
} catch (ex: Exception) {
|
} catch (ex: Throwable) {
|
||||||
application.log.debug("Closed server socket for $name with exception $ex")
|
application.log.error("Closed server socket for $name with exception $ex")
|
||||||
|
application.log.error(ex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Plots in their json representation
|
//Plots in their json representation
|
||||||
|
Loading…
Reference in New Issue
Block a user