Dev #8
@ -0,0 +1,74 @@
|
||||
package ru.mipt.npm.controls.demo.virtual_car
|
||||
|
||||
import kotlinx.coroutines.launch
|
||||
import ru.mipt.npm.controls.properties.*
|
||||
import space.kscience.dataforge.meta.Meta
|
||||
import space.kscience.dataforge.meta.double
|
||||
import space.kscience.dataforge.meta.get
|
||||
import space.kscience.dataforge.meta.transformations.MetaConverter
|
||||
import java.time.Instant
|
||||
import kotlin.time.Duration
|
||||
import kotlin.time.ExperimentalTime
|
||||
|
||||
class VirtualCar : DeviceBySpec<VirtualCar>(VirtualCar) {
|
||||
private var speedState: Pair<Double, Double> = Pair(0.0, 0.0)
|
||||
get() {
|
||||
val previous_speed = field
|
||||
val current_acceleration = this.accelerationState
|
||||
val now = Instant.now().toEpochMilli().toDouble()
|
||||
val time_difference = now - this.timeState
|
||||
this.timeState = now
|
||||
field = Pair(
|
||||
previous_speed.first + time_difference * current_acceleration.first,
|
||||
previous_speed.second + time_difference * current_acceleration.second
|
||||
)
|
||||
return field
|
||||
}
|
||||
|
||||
private var accelerationState: Pair<Double, Double> = Pair(0.0, 0.0)
|
||||
set(value) {
|
||||
this.speedState
|
||||
field = value
|
||||
}
|
||||
|
||||
private var timeState = Instant.now().toEpochMilli().toDouble()
|
||||
|
||||
object DoublePairMetaConverter : MetaConverter<Pair<Double, Double>> {
|
||||
override fun metaToObject(meta: Meta): Pair<Double, Double> = Pair(
|
||||
meta["x"].double ?: 0.0,
|
||||
meta["y"].double ?: 0.0
|
||||
)
|
||||
|
||||
override fun objectToMeta(obj: Pair<Double, Double>): Meta = Meta {
|
||||
"x" put obj.first
|
||||
"y" put obj.second
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
companion object : DeviceSpec<VirtualCar>(::VirtualCar) {
|
||||
val speed by property(DoublePairMetaConverter) { this.speedState }
|
||||
|
||||
val acceleration by property(DoublePairMetaConverter, VirtualCar::accelerationState)
|
||||
|
||||
val carProperties by metaProperty {
|
||||
Meta {
|
||||
val time = Instant.now()
|
||||
"time" put time.toEpochMilli()
|
||||
"speed" put DoublePairMetaConverter.objectToMeta(read(speed))
|
||||
"acceleration" put DoublePairMetaConverter.objectToMeta(read(acceleration))
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalTime::class)
|
||||
override fun VirtualCar.onStartup() {
|
||||
launch {
|
||||
speed.read()
|
||||
acceleration.read()
|
||||
}
|
||||
doRecurring(Duration.milliseconds(50)){
|
||||
carProperties.read()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user