Skip to content

Commit 3a3aa39

Browse files
committed
WIP: DriveRack
1 parent 362e9dc commit 3a3aa39

35 files changed

Lines changed: 1099 additions & 111 deletions

src/commonMain/kotlin/baaahs/Pinky.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package baaahs
22

33
import baaahs.api.ws.WebSocketRouter
44
import baaahs.dmx.Dmx
5+
import baaahs.driverack.DriveRack
56
import baaahs.fixtures.Fixture
67
import baaahs.fixtures.FixtureManager
78
import baaahs.gl.RootToolchain
@@ -26,6 +27,7 @@ import baaahs.util.Logger
2627
import kotlinx.coroutines.*
2728
import kotlinx.serialization.Serializable
2829
import kotlin.coroutines.CoroutineContext
30+
import kotlin.coroutines.EmptyCoroutineContext
2931

3032
class Pinky(
3133
val model: Model,
@@ -54,12 +56,13 @@ class Pinky(
5456
override val coroutineContext: CoroutineContext = pinkyMainDispatcher + pinkyJob
5557

5658
private val pubSub: PubSub.Server = PubSub.Server(httpServer, coroutineContext)
57-
val gadgetManager = GadgetManager(pubSub, clock, coroutineContext)
59+
private val driveRackBuilder = DriveRack(pubSub, EmptyCoroutineContext + Dispatchers.Default)
60+
private val gadgetManager = GadgetManager(pubSub, clock, coroutineContext)
5861
internal val fixtureManager = FixtureManager(renderManager)
5962

6063
val toolchain = RootToolchain(plugins)
6164
val stageManager: StageManager = StageManager(
62-
toolchain, renderManager, pubSub, storage, fixtureManager, clock, model, gadgetManager
65+
toolchain, renderManager, pubSub, storage, fixtureManager, clock, model, gadgetManager, driveRackBuilder
6366
)
6467

6568
fun switchTo(newShow: Show?, file: Fs.File? = null) {

src/commonMain/kotlin/baaahs/PubSub.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ abstract class PubSub {
395395
protected fun <T> buildTopicInfo(topic: Topic<T>): TopicInfo<T> {
396396
return TopicInfo(topic)
397397
}
398+
399+
abstract fun <T : Any?> openChannel(topic: Topic<T>, initialValue: T, onUpdate: (T) -> Unit): Channel<T>
398400
}
399401

400402
class Server(httpServer: Network.HttpServer, private val handlerContext: CoroutineContext) : Endpoint() {
@@ -409,6 +411,10 @@ abstract class PubSub {
409411
}
410412
}
411413

414+
override fun <T> openChannel(topic: Topic<T>, initialValue: T, onUpdate: (T) -> Unit): Channel<T> {
415+
return publish(topic, initialValue, onUpdate)
416+
}
417+
412418
fun <T : Any?> publish(topic: Topic<T>, data: T, onUpdate: (T) -> Unit): Channel<T> {
413419
val topicName = topic.name
414420

@@ -544,6 +550,10 @@ abstract class PubSub {
544550
link.connectWebSocket(serverAddress, port, "/sm/ws", connectionToServer)
545551
}
546552

553+
override fun <T> openChannel(topic: Topic<T>, initialValue: T, onUpdate: (T) -> Unit): Channel<T> {
554+
return subscribe(topic, onUpdate)
555+
}
556+
547557
@JsName("subscribe")
548558
fun <T> subscribe(topic: Topic<T>, onUpdateFn: (T) -> Unit): Channel<T> {
549559
val subscriber = Origin("Client-side subscriber at ${link.myAddress}")

src/commonMain/kotlin/baaahs/ShowPlayer.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package baaahs
22

3+
import baaahs.driverack.Channel
4+
import baaahs.driverack.DriveRack
35
import baaahs.gl.Toolchain
46
import baaahs.gl.data.Feed
57
import baaahs.gl.shader.OpenShader
@@ -13,9 +15,10 @@ import baaahs.show.live.ShowOpener
1315

1416
interface ShowPlayer {
1517
val toolchain: Toolchain
18+
val driveRack: DriveRack
1619

1720
/**
18-
* This is for [baaahs.plugin.CorePlugin.ModelInfoDataSource], but we should probably find
21+
* This is for [baaahs.plugin.core.datasource.ModelInfoDataSource], but we should probably find
1922
* a better way to get it. Don't add more uses.
2023
*/
2124
@Deprecated("Get it some other way", level = DeprecationLevel.WARNING)
@@ -24,6 +27,7 @@ interface ShowPlayer {
2427
fun <T : Gadget> registerGadget(id: String, gadget: T, controlledDataSource: DataSource? = null)
2528
fun <T : Gadget> useGadget(id: String): T = error("override me?")
2629
fun <T : Gadget> useGadget(dataSource: DataSource): T?
30+
fun <T> useChannel(id: String): Channel<T> = error("override me?")
2731

2832
fun openFeed(id: String, dataSource: DataSource): Feed
2933

src/commonMain/kotlin/baaahs/ShowRunner.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package baaahs
22

3+
import baaahs.driverack.RackMap
34
import baaahs.fixtures.FixtureManager
45
import baaahs.gl.render.RenderManager
56
import baaahs.show.Show
@@ -16,6 +17,7 @@ class ShowRunner(
1617
private val fixtureManager: FixtureManager,
1718
private val updateProblems: (List<ShowProblem>) -> Unit
1819
) {
20+
val rackMap: RackMap get() = openShow.rackMap
1921
private var showState: ShowState = initialShowState ?: openShow.getShowState()
2022
private var activePatchSetChanged: Boolean = true
2123

src/commonMain/kotlin/baaahs/StageManager.kt

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package baaahs
22

33
import baaahs.app.ui.CommonIcons
4+
import baaahs.driverack.BusAlias
5+
import baaahs.driverack.Channel
6+
import baaahs.driverack.DriveRack
7+
import baaahs.driverack.RackMap
48
import baaahs.fixtures.FixtureManager
59
import baaahs.fixtures.RenderPlan
10+
import baaahs.gadgets.Slider
611
import baaahs.gl.Toolchain
712
import baaahs.gl.render.RenderManager
813
import baaahs.io.Fs
@@ -16,6 +21,7 @@ import baaahs.show.Show
1621
import baaahs.show.buildEmptyShow
1722
import baaahs.ui.Icon
1823
import baaahs.ui.Observable
24+
import baaahs.ui.RemovableObserver
1925
import baaahs.ui.addObserver
2026
import baaahs.util.Clock
2127
import kotlinx.coroutines.CoroutineScope
@@ -64,7 +70,8 @@ class StageManager(
6470
private val fixtureManager: FixtureManager,
6571
private val clock: Clock,
6672
modelInfo: ModelInfo,
67-
private val gadgetManager: GadgetManager
73+
private val gadgetManager: GadgetManager,
74+
override val driveRack: DriveRack
6875
) : BaseShowPlayer(toolchain, modelInfo) {
6976
val facade = Facade()
7077
private var showRunner: ShowRunner? = null
@@ -82,6 +89,12 @@ class StageManager(
8289
}
8390
}
8491

92+
private val busA = driveRack.createBus("A")
93+
private val busB = driveRack.createBus("B")
94+
private val buses = listOf(busA, busB)
95+
private val primary = BusAlias(busA)
96+
private val secondary = BusAlias(busB)
97+
8598
@Suppress("unused")
8699
private val clientData =
87100
pubSub.state(Topics.createClientData(fsSerializer), ClientData(storage.fs.rootFile))
@@ -105,8 +118,26 @@ class StageManager(
105118

106119
private var gadgetsChangedJobEnqueued: Boolean = false
107120

121+
private var driveRackObservers = mutableListOf<RemovableObserver<*>>()
108122
override fun <T : Gadget> registerGadget(id: String, gadget: T, controlledDataSource: DataSource?) {
109-
gadgetManager.registerGadget(id, gadget)
123+
var registerWithGadgetManager = true
124+
125+
if (gadget is Slider) {
126+
registerWithGadgetManager = false
127+
128+
// primary.channel<T>(id).addObserver {
129+
// gadget.position = it.value as Float
130+
// }
131+
132+
// buses.map { bus ->
133+
// bus.channel<Any?>(id).addObserver {}
134+
// }.also { driveRackObservers.addAll(it) }
135+
}
136+
137+
if (registerWithGadgetManager) {
138+
gadgetManager.registerGadget(id, gadget)
139+
}
140+
110141
super.registerGadget(id, gadget, controlledDataSource)
111142
}
112143

@@ -121,6 +152,8 @@ class StageManager(
121152
return gadgetManager.useGadget(id)
122153
}
123154

155+
override fun <T> useChannel(id: String): Channel<T> = primary.channel(id)
156+
124157
fun switchTo(
125158
newShow: Show?,
126159
newShowState: ShowState? = null,
@@ -139,6 +172,9 @@ class StageManager(
139172
releaseUnused()
140173

141174
showRunner = newShowRunner
175+
176+
wireDriveRack(newShowRunner?.rackMap ?: RackMap.Empty)
177+
142178
showEditSession.show = newShowRunner?.show
143179
showEditSession.showFile = file
144180
showEditSession.showIsUnsaved = isUnsaved
@@ -148,6 +184,22 @@ class StageManager(
148184
notifyOfShowChanges(fromClientUpdate)
149185
}
150186

187+
private fun wireDriveRack(rackMap: RackMap) {
188+
driveRack.rackMap = rackMap
189+
190+
// rackMap.entries.map { entry ->
191+
// Updatable(entry.initialValue).also { updatable ->
192+
// primary.channel<Any?>(entry.id).addObserver { channel ->
193+
// updatable.value = channel.value
194+
// }
195+
// }
196+
// }
197+
}
198+
199+
class Updatable(
200+
var value: Any? = null
201+
)
202+
151203
private fun updateRunningShowPath(file: Fs.File?) {
152204
GlobalScope.launch {
153205
storage.updateConfig {

src/commonMain/kotlin/baaahs/client/ClientStageManager.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
11
package baaahs.client
22

33
import baaahs.*
4+
import baaahs.driverack.BusAlias
5+
import baaahs.driverack.DriveRack
46
import baaahs.gl.Toolchain
57
import baaahs.model.Model
68
import baaahs.show.DataSource
79
import baaahs.show.Show
810
import baaahs.show.live.ActivePatchSet
911
import baaahs.show.live.OpenShow
12+
import kotlinx.coroutines.Dispatchers
13+
import kotlinx.coroutines.Job
14+
import kotlinx.coroutines.currentCoroutineContext
1015
import kotlinx.serialization.json.JsonElement
1116

1217
class ClientStageManager(
1318
toolchain: Toolchain,
1419
private val pubSub: PubSub.Client,
1520
model: Model
1621
) : BaseShowPlayer(toolchain, model) {
22+
override val driveRack: DriveRack = DriveRack(pubSub, Dispatchers.Default /* TODO() */)
23+
24+
private val busA = driveRack.createBus("A")
25+
private val busB = driveRack.createBus("B")
26+
private val buses = listOf(busA, busB)
27+
private val primary = BusAlias(busA)
28+
private val secondary = BusAlias(busB)
29+
1730
private val gadgets: MutableMap<String, ClientGadget> = mutableMapOf()
1831
private val listeners = mutableListOf<Listener>()
1932
private var openShow: OpenShow? = null
@@ -28,11 +41,14 @@ class ClientStageManager(
2841
return super.openShow(show, showState)
2942
.also {
3043
openShow = it
44+
driveRack.rackMap = it.rackMap
3145
checkForChanges()
3246
}
3347
}
3448

3549
override fun <T : Gadget> registerGadget(id: String, gadget: T, controlledDataSource: DataSource?) {
50+
if (gadget is baaahs.gadgets.Slider) return
51+
3652
gadgets[id] = ClientGadget(id, pubSub, gadget)
3753
super.registerGadget(id, gadget, controlledDataSource)
3854
}

src/commonMain/kotlin/baaahs/control/GadgetControl.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ data class MutableGadgetControl(
6363
return OpenGadgetControl(randomId(gadget.title.camelize()), gadget, controlledDataSource)
6464
}
6565
}
66-
class OpenGadgetControl(
66+
67+
open class OpenGadgetControl(
6768
override val id: String,
6869
override val gadget: Gadget,
69-
val controlledDataSource: DataSource
70+
private val controlledDataSource: DataSource
7071
) : OpenControl {
7172
override fun controlledDataSources(): Set<DataSource> =
7273
setOf(controlledDataSource)
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package baaahs.control
2+
3+
import baaahs.*
4+
import baaahs.app.ui.EditorPanel
5+
import baaahs.app.ui.editor.EditableManager
6+
import baaahs.driverack.Channel
7+
import baaahs.driverack.RackMap
8+
import baaahs.gadgets.Slider
9+
import baaahs.show.Control
10+
import baaahs.show.DataSource
11+
import baaahs.show.live.ControlProps
12+
import baaahs.show.live.OpenContext
13+
import baaahs.show.live.OpenControl
14+
import baaahs.show.live.controlViews
15+
import baaahs.show.mutable.MutableControl
16+
import baaahs.show.mutable.MutableShow
17+
import baaahs.show.mutable.ShowBuilder
18+
import baaahs.ui.View
19+
import baaahs.ui.addObserver
20+
import kotlinx.serialization.SerialName
21+
import kotlinx.serialization.Serializable
22+
import kotlinx.serialization.builtins.serializer
23+
24+
@Serializable
25+
@SerialName("baaahs.Core:Slider")
26+
data class SliderControl(
27+
val slider: Slider,
28+
val controlledDataSourceId: String
29+
) : Control {
30+
override val title: String
31+
get() = slider.title
32+
33+
override fun suggestId(): String = controlledDataSourceId + "Slider"
34+
35+
override fun createMutable(mutableShow: MutableShow): MutableSliderControl {
36+
return MutableSliderControl(slider, mutableShow.findDataSource(controlledDataSourceId).dataSource)
37+
}
38+
39+
override fun allocateChannel(id: String): RackMap.Entry<Float> {
40+
return RackMap.Entry(id, slider.initialValue, Float.serializer())
41+
}
42+
43+
override fun open(
44+
id: String,
45+
openContext: OpenContext,
46+
showPlayer: ShowPlayer
47+
): OpenControl {
48+
val controlledDataSource = openContext.getDataSource(controlledDataSourceId)
49+
val channel = showPlayer.useChannel<Float>(id)
50+
return OpenSliderControl(id, slider, channel, controlledDataSource)
51+
}
52+
}
53+
54+
data class MutableSliderControl(
55+
var slider: Slider,
56+
val controlledDataSource: DataSource
57+
) : MutableControl {
58+
override val title: String
59+
get() = slider.title
60+
61+
override var asBuiltId: String? = null
62+
63+
override fun getEditorPanels(editableManager: EditableManager): List<EditorPanel> {
64+
return emptyList()
65+
}
66+
67+
override fun build(showBuilder: ShowBuilder): Control {
68+
return SliderControl(slider, showBuilder.idFor(controlledDataSource))
69+
}
70+
71+
// TODO: fix
72+
// fun open(): OpenControl {
73+
// return OpenSliderControl(randomId(slider.title.camelize()), slider, channel, controlledDataSource)
74+
// }
75+
}
76+
77+
class OpenSliderControl(
78+
override val id: String,
79+
val slider: Slider,
80+
val channel: Channel<Float>,
81+
val controlledDataSource: DataSource
82+
) : OpenControl {
83+
override val gadget: Gadget = slider
84+
85+
// init {
86+
// channel.addObserver {
87+
//
88+
//
89+
// }
90+
// }
91+
92+
override fun toNewMutable(mutableShow: MutableShow): MutableControl {
93+
return MutableSliderControl(slider, controlledDataSource)
94+
}
95+
96+
override fun getView(controlProps: ControlProps): View =
97+
controlViews.forSlider(this, controlProps)
98+
}

0 commit comments

Comments
 (0)