Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ kotlin {
kotlin.srcDirs(file(project.layout.buildDirectory.file("generated/ksp/metadata/commonMain/kotlin").get()))

dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.5")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:${Versions.serializationRuntime}")
implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.5")
implementation("io.insert-koin:koin-core:${Versions.koin}")
implementation("com.soywiz.korlibs.klock:klock:2.1.2")
implementation("io.github.murzagalin:multiplatform-expressions-evaluator:0.15.0")
api("com.danielgergely.kgl:kgl:${Versions.kgl}")
implementation(project(":rpc"))
Expand Down Expand Up @@ -140,7 +140,7 @@ kotlin {
}
val jvmTest by getting {
dependencies {
runtimeOnly("org.junit.vintage:junit-vintage-engine:${Versions.junit}")
implementation(project.dependencies.platform("org.junit:junit-bom:${Versions.junit}"))
runtimeOnly("org.spekframework.spek2:spek-runner-junit5:${Versions.spek}")
runtimeOnly("org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlin}")

Expand Down Expand Up @@ -334,8 +334,9 @@ tasks.named<JavaExec>("run").configure {

tasks.withType(Test::class) {
useJUnitPlatform {
includeEngines.add("junit-vintage")
includeEngines.add("junit-jupiter")
includeEngines.add("spek2")
excludeTags("glsl")
}
}

Expand All @@ -345,7 +346,7 @@ tasks.named<Test>("jvmTest") {

tasks.withType<DependencyUpdatesTask> {
fun isNonStable(version: String): Boolean =
"eap|alpha|beta|rc".toRegex().containsMatchIn(version.toLowerCase())
"eap|alpha|beta|rc".toRegex().containsMatchIn(version.lowercase())

rejectVersionIf {
isNonStable(candidate.version) && !isNonStable(currentVersion)
Expand Down
5 changes: 5 additions & 0 deletions kotlin-js-store/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,11 @@
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"

"@js-joda/core@3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273"
integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg==

"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
Expand Down
25 changes: 10 additions & 15 deletions src/commonMain/kotlin/baaahs/Pinky.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import baaahs.gl.glsl.CompilationException
import baaahs.io.Fs
import baaahs.libraries.ShaderLibraryManager
import baaahs.mapper.PinkyMapperHandlers
import baaahs.mapper.Storage
import baaahs.mapping.MappingManager
import baaahs.net.Network
import baaahs.plugin.Plugins
Expand All @@ -18,6 +17,7 @@ import baaahs.show.Show
import baaahs.sm.brain.BrainManager
import baaahs.sm.brain.FirmwareDaddy
import baaahs.sm.server.DocumentService
import baaahs.sm.server.PinkyConfigStore
import baaahs.sm.server.ServerNotices
import baaahs.sm.server.StageManager
import baaahs.sm.webapi.Topics
Expand All @@ -34,7 +34,7 @@ class Pinky(
val plugins: Plugins,
// private val switchShowAfterIdleSeconds: Int? = 600,
// private val adjustShowAfterIdleSeconds: Int? = null,
private val storage: Storage,
private val dataDir: Fs.File,
private val link: Network.Link,
val httpServer: Network.HttpServer,
pubSub: PubSub.Server,
Expand All @@ -48,9 +48,10 @@ class Pinky(
val brainManager: BrainManager,
private val shaderLibraryManager: ShaderLibraryManager,
private val networkStats: NetworkStats,
val pinkySettings: PinkySettings,
val serverNotices: ServerNotices,
val pinkyMapperHandlers: PinkyMapperHandlers
private val pinkySettings: PinkySettings,
private val serverNotices: ServerNotices,
private val pinkyMapperHandlers: PinkyMapperHandlers,
private val pinkyConfigStore: PinkyConfigStore
) : CoroutineScope {
val facade = Facade()

Expand Down Expand Up @@ -134,7 +135,7 @@ class Pinky(
mappingResultsLoaderJob = launch { mappingManager.start() }

launch {
val config = storage.loadConfig()
val config = pinkyConfigStore.load()

config?.runningScenePath?.let { path ->
launch { stageManager.sceneDocumentService.load(path) }
Expand Down Expand Up @@ -166,8 +167,8 @@ class Pinky(
}
}

private suspend fun <T> DocumentService<T, *>.load(path: String) {
val file = storage.resolve(path)
private suspend fun <T : Any> DocumentService<T, *>.load(path: String) {
val file = dataDir.resolve(path)
try {
val doc = load(file)
if (doc == null) {
Expand All @@ -176,7 +177,7 @@ class Pinky(
switchTo(doc, file = file)
}
} catch (e: Exception) {
reportError("Failed to load ${documentType.title.lowercase()} at $path", e)
reportError("Failed to load ${documentType.title.lowercase()} at $file", e)
}
}

Expand Down Expand Up @@ -290,12 +291,6 @@ class Pinky(
}
}

@Serializable
data class PinkyConfig(
val runningShowPath: String? = null,
val runningScenePath: String? = null
)

data class PinkySettings(
var targetFramerate: Float = 30f, // Frames per second
)
Expand Down
22 changes: 15 additions & 7 deletions src/commonMain/kotlin/baaahs/api/ws/WebSocketClient.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
package baaahs.api.ws

import baaahs.client.document.mappingSessionStore
import baaahs.imaging.Bitmap
import baaahs.mapper.MappingSession
import baaahs.mapper.Storage
import baaahs.mapper.MappingStore
import baaahs.net.Network
import baaahs.plugin.Plugins
import baaahs.sm.brain.proto.Ports
import baaahs.util.Clock
import baaahs.util.Logger
import com.soywiz.klock.DateTime
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.datetime.Instant
import kotlinx.serialization.SerializationException
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.*

class WebSocketClient(plugins: Plugins, link: Network.Link, address: Network.Address) : Network.WebSocketListener {
class WebSocketClient(
plugins: Plugins,
private val clock: Clock,
link: Network.Link,
address: Network.Address
) : Network.WebSocketListener {
private val mappingSessionStore = plugins.mappingSessionStore
private val json = plugins.json
private lateinit var tcpConnection: Network.TcpConnection
private var connected = false
Expand All @@ -30,8 +38,8 @@ class WebSocketClient(plugins: Plugins, link: Network.Link, address: Network.Add
sendCommand("listImages", sessionName?.let { JsonPrimitive(it) } ?: JsonNull))
}

suspend fun saveImage(sessionStartTime: DateTime, name: String, bitmap: Bitmap): String {
val filename = "${Storage.formatDateTime(sessionStartTime)}/$name.webp"
suspend fun saveImage(sessionStartTime: Instant, name: String, bitmap: Bitmap): String {
val filename = "${MappingStore.formatDateTime(sessionStartTime, clock.tz())}/$name.webp"
val dataUrl = bitmap.toDataUrl()
val startOfData = ";base64,"
val i = dataUrl.indexOf(startOfData)
Expand Down Expand Up @@ -63,7 +71,7 @@ class WebSocketClient(plugins: Plugins, link: Network.Link, address: Network.Add
suspend fun saveSession(mappingSession: MappingSession): String {
return sendCommand(
"saveSession",
json.encodeToJsonElement(MappingSession.serializer(), mappingSession)
mappingSessionStore.encodeToJsonElement(mappingSession)
).jsonPrimitive.contentOrNull ?: error("Failed to save session!")
}

Expand All @@ -72,7 +80,7 @@ class WebSocketClient(plugins: Plugins, link: Network.Link, address: Network.Add
"loadSession",
json.encodeToJsonElement(String.serializer(), name)
)
return json.decodeFromJsonElement(MappingSession.serializer(), response)
return mappingSessionStore.decode(response)
}

private suspend fun sendCommand(command: String, vararg args: JsonElement): JsonElement {
Expand Down
39 changes: 39 additions & 0 deletions src/commonMain/kotlin/baaahs/client/document/DataStore.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package baaahs.client.document

import baaahs.io.Fs
import baaahs.mapper.migration.MappingSessionMigrator
import baaahs.migrator.DataMigrator
import baaahs.plugin.Plugins
import baaahs.scene.migration.SceneMigrator
import baaahs.show.migration.ShowMigrator
import kotlinx.serialization.json.JsonElement

val Plugins.mappingSessionStore get() = DataStore(this, MappingSessionMigrator)
val Plugins.showStore get() = DataStore(this, ShowMigrator)
val Plugins.sceneStore get() = DataStore(this, SceneMigrator)

class DataStore<T : Any>(
private val plugins: Plugins,
private val migrator: DataMigrator<T>
) {
fun decode(content: String) =
plugins.json.decodeFromString(migrator, content)

fun decode(content: JsonElement) =
plugins.json.decodeFromJsonElement(migrator, content)

suspend fun load(file: Fs.File): T? =
file.read()?.let { decode(it) }

fun encode(content: T) =
plugins.json.encodeToString(migrator, content)

fun encodeToJsonElement(content: T) =
plugins.json.encodeToJsonElement(migrator, content)

suspend fun save(file: Fs.File, content: T, allowOverwrite: Boolean = false) =
file.write(
encode(content),
allowOverwrite
)
}
6 changes: 2 additions & 4 deletions src/commonMain/kotlin/baaahs/client/document/SceneManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ import baaahs.doc.SceneDocumentType
import baaahs.io.Fs
import baaahs.io.RemoteFsSerializer
import baaahs.io.resourcesFs
import baaahs.mapper.Storage
import baaahs.plugin.Plugins
import baaahs.scene.*
import baaahs.show.SceneMigrator
import baaahs.show.mutable.MutableDocument
import baaahs.ui.DialogHolder
import baaahs.ui.DialogMenuItem
Expand Down Expand Up @@ -78,7 +76,7 @@ class SceneManager(

private suspend fun sceneFromResources(fileName: String): Scene {
val file = fileFromResources(fileName)
return Storage(resourcesFs, plugins).loadScene(file)?.let {
return plugins.sceneStore.load(file)?.let {
it.copy(model = it.model.copy(title = "New Scene"))
} ?: error("Couldn't find scene")
}
Expand All @@ -91,7 +89,7 @@ class SceneManager(
}

override suspend fun onUpload(name: String, content: String) {
val scene = plugins.json.decodeFromString(SceneMigrator, content)
val scene = plugins.sceneStore.decode(content)
onNew(scene)
}

Expand Down
10 changes: 6 additions & 4 deletions src/commonMain/kotlin/baaahs/client/document/ShowManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import baaahs.doc.ShowDocumentType
import baaahs.gl.Toolchain
import baaahs.io.RemoteFsSerializer
import baaahs.io.resourcesFs
import baaahs.mapper.Storage
import baaahs.show.*
import baaahs.show.SampleData
import baaahs.show.Show
import baaahs.show.ShowMonitor
import baaahs.show.ShowState
import baaahs.show.live.OpenShow
import baaahs.show.mutable.MutableDocument
import baaahs.sm.webapi.Problem
Expand Down Expand Up @@ -76,7 +78,7 @@ class ShowManager(

private suspend fun fromResources(fileName: String): Show {
val file = resourcesFs.resolve("templates", "shows", fileName)
return Storage(resourcesFs, toolchain.plugins).loadShow(file)
return toolchain.plugins.showStore.load(file)
?.copy(title = "New ${documentType.title}")
?: error("Couldn't find show")
}
Expand All @@ -86,7 +88,7 @@ class ShowManager(
}

override suspend fun onUpload(name: String, content: String) {
val show = toolchain.plugins.json.decodeFromString(ShowMigrator, content)
val show = toolchain.plugins.showStore.decode(content)
onNew(show)
}

Expand Down
8 changes: 4 additions & 4 deletions src/commonMain/kotlin/baaahs/controller/Controller.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package baaahs.controller
import baaahs.dmx.DmxTransport
import baaahs.fixtures.*
import baaahs.model.Model
import baaahs.util.Time
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable

/** A Controller represents a physical device directly connected to one or more fixtures. */
Expand Down Expand Up @@ -35,18 +35,18 @@ open class NullController(
override val defaultTransportConfig: TransportConfig? = null
) : Controller {
override val state: ControllerState =
State("Null Controller", "N/A", 0.0)
State("Null Controller", "N/A", null)
override val transportType: TransportType
get() = DmxTransport

@Serializable
class State(
override val title: String,
override val address: String?,
override val onlineSince: Time?,
override val onlineSince: Instant?,
override val firmwareVersion: String? = null,
override val lastErrorMessage: String? = null,
override val lastErrorAt: Time? = null
override val lastErrorAt: Instant? = null
) : ControllerState()

override fun createTransport(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import baaahs.PubSub
import baaahs.plugin.Plugins
import baaahs.sm.webapi.Topics
import baaahs.ui.Observable
import baaahs.util.Time
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable

class ControllersPublisher(
Expand Down Expand Up @@ -32,10 +32,10 @@ class ControllersPublisher(
abstract class ControllerState : Observable() {
abstract val title: String
abstract val address: String?
abstract val onlineSince: Time?
abstract val onlineSince: Instant?
abstract val firmwareVersion: String?
abstract val lastErrorMessage: String?
abstract val lastErrorAt: Time?
abstract val lastErrorAt: Instant?

open fun matches(controllerMatcher: ControllerMatcher): Boolean =
controllerMatcher.matches(title, address)
Expand Down
4 changes: 2 additions & 2 deletions src/commonMain/kotlin/baaahs/controller/SacnController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import baaahs.io.ByteArrayWriter
import baaahs.model.Model
import baaahs.net.Network
import baaahs.util.Logger
import baaahs.util.Time
import kotlinx.datetime.Instant

class SacnController(
val id: String,
Expand All @@ -15,7 +15,7 @@ class SacnController(
override val defaultFixtureOptions: FixtureOptions?,
override val defaultTransportConfig: TransportConfig?,
private val universeCount: Int,
private val onlineSince: Time?,
private val onlineSince: Instant?,
private val universeListener: Dmx.UniverseListener? = null
) : Controller {
override val controllerId: ControllerId = ControllerId(SacnManager.controllerTypeName, id)
Expand Down
Loading