Skip to content

Commit bcaa1f6

Browse files
committed
prepare kotlin JVM for KMP
1 parent 789ba55 commit bcaa1f6

31 files changed

Lines changed: 213 additions & 272 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,6 @@ vrconfig.yml.tmp
4747

4848
# Nixos
4949
.bin/
50+
51+
# macOS
52+
.DS_Store

server/android/src/main/java/dev/slimevr/android/serial/AndroidSerialHandler.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import dev.slimevr.serial.SerialListener
1717
import io.eiren.util.logging.LogManager
1818
import java.io.IOException
1919
import java.nio.ByteBuffer
20-
import java.nio.charset.StandardCharsets
2120
import java.util.concurrent.CopyOnWriteArrayList
2221
import java.util.stream.Stream
2322
import kotlin.streams.asSequence
@@ -128,9 +127,10 @@ class AndroidSerialHandler(val activity: AppCompatActivity) :
128127
}
129128

130129
private fun detectNewPorts() {
131-
val addDifferences = knownPorts.asSequence() - lastKnownPorts
132-
val delDifferences = lastKnownPorts - knownPorts.asSequence().toSet()
133-
lastKnownPorts = knownPorts.asSequence().toSet()
130+
val knownPortsSet = knownPorts.asSequence().toSet()
131+
val addDifferences = knownPortsSet - lastKnownPorts
132+
val delDifferences = lastKnownPorts - knownPortsSet
133+
lastKnownPorts = knownPortsSet
134134
addDifferences.forEach { onNewDevice(it) }
135135
delDifferences.forEach { onDeviceDel(it) }
136136
}
@@ -297,7 +297,7 @@ class AndroidSerialHandler(val activity: AppCompatActivity) :
297297
// Collect serial in a buffer until newline (or character limit)
298298
// This is somewhat of a workaround for Android serial buffer being smaller
299299
// than on desktop, so we don't read full lines and it causes parsing issues
300-
readBuffer.append(StandardCharsets.UTF_8.decode(ByteBuffer.wrap(data)))
300+
readBuffer.append(Charsets.UTF_8.decode(ByteBuffer.wrap(data)))
301301

302302
if (readBuffer.contains('\n') || readBuffer.length >= 1024) {
303303
addLog(readBuffer.toString(), false)

server/android/src/main/java/dev/slimevr/android/tracking/trackers/hid/AndroidHIDManager.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.PACKET_SIZE
1818
import dev.slimevr.tracking.trackers.hid.HIDDevice
1919
import io.eiren.util.logging.LogManager
2020
import java.nio.ByteBuffer
21-
import java.util.function.Consumer
2221

2322
const val ACTION_USB_PERMISSION = "dev.slimevr.USB_PERMISSION"
2423

@@ -27,7 +26,7 @@ const val ACTION_USB_PERMISSION = "dev.slimevr.USB_PERMISSION"
2726
*/
2827
class AndroidHIDManager(
2928
name: String,
30-
private val trackersConsumer: Consumer<Tracker>,
29+
private val trackersConsumer: (Tracker) -> Unit,
3130
private val context: Context,
3231
) : Thread(name) {
3332
private val devices: MutableList<HIDDevice> = mutableListOf()

server/core/src/main/java/dev/slimevr/VRServer.kt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,8 @@ import io.eiren.util.collections.FastList
4141
import io.eiren.util.logging.LogManager
4242
import solarxr_protocol.datatypes.TrackerIdT
4343
import solarxr_protocol.rpc.ResetType
44-
import java.util.*
45-
import java.util.concurrent.LinkedBlockingQueue
44+
import java.util.Timer
4645
import java.util.concurrent.atomic.AtomicInteger
47-
import java.util.function.Consumer
4846
import kotlin.collections.ArrayList
4947
import kotlin.concurrent.schedule
5048

@@ -71,8 +69,8 @@ class VRServer @JvmOverloads constructor(
7169
private val trackers: MutableList<Tracker> = FastList()
7270
val trackersServer: TrackersUDPServer
7371
private val bridges: MutableList<Bridge> = FastList()
74-
private val tasks: Queue<Runnable> = LinkedBlockingQueue()
75-
private val newTrackersConsumers: MutableList<Consumer<Tracker>> = FastList()
72+
private val tasks: ArrayDeque<Runnable> = ArrayDeque()
73+
private val newTrackersConsumers: MutableList<(Tracker) -> Unit> = FastList()
7674
private val trackerStatusListeners: MutableList<TrackerStatusListener> = FastList()
7775
private val onTick: MutableList<Runnable> = FastList()
7876
private val lock = acquireMulticastLock()
@@ -214,11 +212,11 @@ class VRServer @JvmOverloads constructor(
214212
}
215213

216214
@ThreadSafe
217-
fun addNewTrackerConsumer(consumer: Consumer<Tracker>) {
215+
fun addNewTrackerConsumer(consumer: (Tracker) -> Unit) {
218216
queueTask {
219217
newTrackersConsumers.add(consumer)
220218
for (tracker in trackers) {
221-
consumer.accept(tracker)
219+
consumer(tracker)
222220
}
223221
}
224222
}
@@ -235,7 +233,7 @@ class VRServer @JvmOverloads constructor(
235233
}
236234

237235
@ThreadSafe
238-
fun addSkeletonUpdatedCallback(consumer: Consumer<HumanSkeleton>) {
236+
fun addSkeletonUpdatedCallback(consumer: (HumanSkeleton) -> Unit) {
239237
queueTask { humanPoseManager.addSkeletonUpdatedCallback(consumer) }
240238
}
241239

@@ -246,7 +244,7 @@ class VRServer @JvmOverloads constructor(
246244
// final long start = System.currentTimeMillis();
247245
fpsTimer.update()
248246
do {
249-
val task = tasks.poll() ?: break
247+
val task = tasks.removeFirstOrNull() ?: break
250248
task.run()
251249
} while (true)
252250
for (task in onTick) {
@@ -296,7 +294,7 @@ class VRServer @JvmOverloads constructor(
296294
trackers.add(tracker)
297295
trackerAdded(tracker)
298296
for (tc in newTrackersConsumers) {
299-
tc.accept(tracker)
297+
tc(tracker)
300298
}
301299
}
302300
}

server/core/src/main/java/dev/slimevr/autobone/AutoBone.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import io.github.axisangles.ktmath.Vector3
2020
import org.apache.commons.lang3.tuple.Pair
2121
import java.io.File
2222
import java.util.*
23-
import java.util.function.Consumer
24-
import java.util.function.Function
2523
import kotlin.math.*
2624

2725
class AutoBone(private val server: VRServer) {
@@ -74,17 +72,14 @@ class AutoBone(private val server: VRServer) {
7472
// Get current or default skeleton configs
7573
val skeleton = server.humanPoseManager
7674
// Still compensate for a null skeleton, as it may not be initialized yet
77-
val getOffset: Function<SkeletonConfigOffsets, Float> =
78-
if (skeleton != null) {
79-
Function { key: SkeletonConfigOffsets -> skeleton.getOffset(key) }
80-
} else {
81-
val defaultConfig = SkeletonConfigManager(false)
82-
Function { config: SkeletonConfigOffsets ->
83-
defaultConfig.getOffset(config)
84-
}
85-
}
75+
val defaultConfig = SkeletonConfigManager(false)
76+
val getOffset: (SkeletonConfigOffsets) -> Float = if (skeleton != null) {
77+
{ key: SkeletonConfigOffsets -> skeleton.getOffset(key) }
78+
} else {
79+
{ config: SkeletonConfigOffsets -> defaultConfig.getOffset(config) }
80+
}
8681
for (bone in adjustOffsets) {
87-
val offset = getOffset.apply(bone)
82+
val offset = getOffset(bone)
8883
if (offset > 0f) {
8984
offsets[bone] = offset
9085
}
@@ -216,7 +211,7 @@ class AutoBone(private val server: VRServer) {
216211
frames: PoseFrames,
217212
config: AutoBoneConfig = globalConfig,
218213
skeletonConfig: SkeletonConfig = globalSkeletonConfig,
219-
epochCallback: Consumer<Epoch>? = null,
214+
epochCallback: ((Epoch) -> Unit)? = null,
220215
): AutoBoneResults {
221216
check(frames.frameHolders.isNotEmpty()) { "Recording has no trackers." }
222217
check(frames.maxFrameCount > 0) { "Recording has no frames." }
@@ -296,7 +291,7 @@ class AutoBone(private val server: VRServer) {
296291

297292
private fun epoch(
298293
step: PoseFrameStep<AutoBoneStep>,
299-
epochCallback: Consumer<Epoch>? = null,
294+
epochCallback: ((Epoch) -> Unit)? = null,
300295
) {
301296
val config = step.config
302297
val epoch = step.epoch
@@ -319,7 +314,7 @@ class AutoBone(private val server: VRServer) {
319314
for (entry in scaledOffsets.entries) {
320315
entry.setValue(entry.value * estimatedHeight)
321316
}
322-
epochCallback.accept(Epoch(epoch + 1, config.numEpochs, step.data.errorStats, scaledOffsets))
317+
epochCallback(Epoch(epoch + 1, config.numEpochs, step.data.errorStats, scaledOffsets))
323318
}
324319
}
325320

server/core/src/main/java/dev/slimevr/autobone/AutoBoneHandler.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import dev.slimevr.tracking.processor.config.SkeletonConfigOffsets
1414
import io.eiren.util.StringUtils
1515
import io.eiren.util.collections.FastList
1616
import io.eiren.util.logging.LogManager
17+
import kotlinx.coroutines.runBlocking
1718
import org.apache.commons.lang3.tuple.Pair
1819
import java.util.*
1920
import java.util.concurrent.CopyOnWriteArrayList
@@ -118,7 +119,7 @@ class AutoBoneHandler(private val server: VRServer) {
118119
eta = totalTime - (progress.frame * totalTime / progress.totalFrames),
119120
)
120121
}
121-
val frames = framesFuture.get()
122+
val frames = runBlocking { framesFuture.await() }
122123
LogManager.info("[AutoBone] Done recording!")
123124

124125
// Save a recurring recording for users to send as debug info
@@ -188,7 +189,7 @@ class AutoBoneHandler(private val server: VRServer) {
188189
val framesFuture = poseRecorder.framesAsync
189190
if (framesFuture != null) {
190191
announceProcessStatus(AutoBoneProcessType.SAVE, "Waiting for recording...")
191-
val frames = framesFuture.get()
192+
val frames = runBlocking { framesFuture.await() }
192193
check(frames.frameHolders.isNotEmpty()) { "Recording has no trackers." }
193194
check(frames.maxFrameCount > 0) { "Recording has no frames." }
194195
announceProcessStatus(AutoBoneProcessType.SAVE, "Saving recording...")
@@ -242,7 +243,7 @@ class AutoBoneHandler(private val server: VRServer) {
242243
val framesFuture = poseRecorder.framesAsync
243244
if (framesFuture != null) {
244245
announceProcessStatus(AutoBoneProcessType.PROCESS, "Waiting for recording...")
245-
val frames = framesFuture.get()
246+
val frames = runBlocking { framesFuture.await() }
246247
frameRecordings.add(Pair.of("<Recording>", frames))
247248
} else {
248249
announceProcessStatus(

server/core/src/main/java/dev/slimevr/autobone/PoseFrameIterator.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ object PoseFrameIterator {
4242
val frameCount = step.maxFrameCount
4343

4444
// Perform any setup that needs to be done before the current epoch
45-
step.preEpoch?.accept(step)
45+
step.preEpoch?.invoke(step)
4646

4747
val randIndices = if (config.randomizeFrameOrder) {
4848
randomIndices(step.maxFrameCount, step.random)
@@ -77,14 +77,14 @@ object PoseFrameIterator {
7777
}
7878

7979
// Process the iteration
80-
step.onStep.accept(step)
80+
step.onStep(step)
8181

8282
// Move on to the next iteration
8383
frameCursor += config.cursorIncrement
8484
}
8585
cursorOffset++
8686
}
8787

88-
step.postEpoch?.accept(step)
88+
step.postEpoch?.invoke(step)
8989
}
9090
}

server/core/src/main/java/dev/slimevr/autobone/PoseFrameStep.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import dev.slimevr.config.ConfigManager
55
import dev.slimevr.poseframeformat.PoseFrames
66
import dev.slimevr.poseframeformat.player.TrackerFramesPlayer
77
import dev.slimevr.tracking.processor.HumanPoseManager
8-
import java.util.function.Consumer
98
import kotlin.random.Random
109

1110
class PoseFrameStep<T>(
@@ -14,11 +13,11 @@ class PoseFrameStep<T>(
1413
serverConfig: ConfigManager? = null,
1514
val frames: PoseFrames,
1615
/** The consumer run before each epoch. */
17-
val preEpoch: Consumer<PoseFrameStep<T>>? = null,
16+
val preEpoch: ((PoseFrameStep<T>) -> Unit)? = null,
1817
/** The consumer run for each step. */
19-
val onStep: Consumer<PoseFrameStep<T>>,
18+
val onStep: (PoseFrameStep<T>) -> Unit,
2019
/** The consumer run after each epoch. */
21-
val postEpoch: Consumer<PoseFrameStep<T>>? = null,
20+
val postEpoch: ((PoseFrameStep<T>) -> Unit)? = null,
2221
/** The current epoch. */
2322
var epoch: Int = 0,
2423
/** The current frame cursor position in [frames] for skeleton1. */

server/core/src/main/java/dev/slimevr/firmware/FirmwareUpdateHandler.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import java.security.MessageDigest
2424
import java.util.*
2525
import java.util.concurrent.ConcurrentHashMap
2626
import java.util.concurrent.CopyOnWriteArrayList
27-
import java.util.stream.Collectors
2827
import kotlin.concurrent.scheduleAtFixedRate
28+
import kotlin.streams.asSequence
2929

3030
data class DownloadedFirmwarePart(
3131
val firmware: ByteArray,
@@ -120,8 +120,8 @@ class FirmwareUpdateHandler(private val server: VRServer) :
120120
ssid: String,
121121
password: String,
122122
) {
123-
// Can't use .toList() on Android
124-
val serialPort = this.server.serialHandler.knownPorts.collect(Collectors.toList())
123+
val serialPort = this.server.serialHandler.knownPorts
124+
.asSequence()
125125
.find { port -> deviceId.id == port.portLocation }
126126

127127
if (serialPort == null) {

server/core/src/main/java/dev/slimevr/firmware/OTAUpdateTask.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@ import java.net.ServerSocket
1212
import java.net.Socket
1313
import java.security.MessageDigest
1414
import java.security.NoSuchAlgorithmException
15-
import java.util.*
16-
import java.util.function.Consumer
15+
import java.util.UUID
1716
import kotlin.math.min
1817

1918
class OTAUpdateTask(
2019
private val firmware: ByteArray,
2120
private val deviceId: UpdateDeviceId<Int>,
2221
private val deviceIp: InetAddress,
23-
private val statusCallback: Consumer<UpdateStatusEvent<Int>>,
22+
private val statusCallback: (UpdateStatusEvent<Int>) -> Unit,
2423
) {
2524
private val receiveBuffer: ByteArray = ByteArray(38)
2625
var socketServer: ServerSocket? = null
@@ -44,7 +43,7 @@ class OTAUpdateTask(
4443
try {
4544
DatagramSocket().use { socket ->
4645
authSocket = socket
47-
statusCallback.accept(UpdateStatusEvent(deviceId, FirmwareUpdateStatus.AUTHENTICATING))
46+
statusCallback(UpdateStatusEvent(deviceId, FirmwareUpdateStatus.AUTHENTICATING))
4847
LogManager.info("[OTAUpdate] Sending OTA invitation to: $deviceIp")
4948

5049
val fileMd5 = bytesToMd5(firmware)
@@ -116,7 +115,7 @@ class OTAUpdateTask(
116115
var offset = 0
117116
val chunkSize = 2048
118117
while (offset != firmware.size && !canceled) {
119-
statusCallback.accept(
118+
statusCallback(
120119
UpdateStatusEvent(
121120
deviceId,
122121
FirmwareUpdateStatus.UPLOADING,
@@ -161,7 +160,7 @@ class OTAUpdateTask(
161160
ServerSocket(0).use { serverSocket ->
162161
socketServer = serverSocket
163162
if (!authenticate(serverSocket.localPort)) {
164-
statusCallback.accept(
163+
statusCallback(
165164
UpdateStatusEvent(
166165
deviceId,
167166
FirmwareUpdateStatus.ERROR_AUTHENTICATION_FAILED,
@@ -171,7 +170,7 @@ class OTAUpdateTask(
171170
}
172171

173172
if (!upload(serverSocket)) {
174-
statusCallback.accept(
173+
statusCallback(
175174
UpdateStatusEvent(
176175
deviceId,
177176
FirmwareUpdateStatus.ERROR_UPLOAD_FAILED,
@@ -180,7 +179,7 @@ class OTAUpdateTask(
180179
return
181180
}
182181

183-
statusCallback.accept(
182+
statusCallback(
184183
UpdateStatusEvent(
185184
deviceId,
186185
FirmwareUpdateStatus.REBOOTING,

0 commit comments

Comments
 (0)