Skip to content
Closed
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,6 @@ vrconfig.yml.tmp

# Nixos
.bin/

# macOS
.DS_Store
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import dev.slimevr.serial.SerialListener
import io.eiren.util.logging.LogManager
import java.io.IOException
import java.nio.ByteBuffer
import java.nio.charset.StandardCharsets
import java.util.concurrent.CopyOnWriteArrayList
import java.util.stream.Stream
import kotlin.streams.asSequence
Expand Down Expand Up @@ -128,9 +127,10 @@ class AndroidSerialHandler(val activity: AppCompatActivity) :
}

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

if (readBuffer.contains('\n') || readBuffer.length >= 1024) {
addLog(readBuffer.toString(), false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.PACKET_SIZE
import dev.slimevr.tracking.trackers.hid.HIDDevice
import io.eiren.util.logging.LogManager
import java.nio.ByteBuffer
import java.util.function.Consumer

const val ACTION_USB_PERMISSION = "dev.slimevr.USB_PERMISSION"

Expand All @@ -27,7 +26,7 @@ const val ACTION_USB_PERMISSION = "dev.slimevr.USB_PERMISSION"
*/
class AndroidHIDManager(
name: String,
private val trackersConsumer: Consumer<Tracker>,
private val trackersConsumer: (Tracker) -> Unit,
private val context: Context,
) : Thread(name) {
private val devices: MutableList<HIDDevice> = mutableListOf()
Expand Down
18 changes: 8 additions & 10 deletions server/core/src/main/java/dev/slimevr/VRServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,8 @@ import io.eiren.util.collections.FastList
import io.eiren.util.logging.LogManager
import solarxr_protocol.datatypes.TrackerIdT
import solarxr_protocol.rpc.ResetType
import java.util.*
import java.util.concurrent.LinkedBlockingQueue
import java.util.Timer
import java.util.concurrent.atomic.AtomicInteger
import java.util.function.Consumer
import kotlin.collections.ArrayList
import kotlin.concurrent.schedule

Expand All @@ -71,8 +69,8 @@ class VRServer @JvmOverloads constructor(
private val trackers: MutableList<Tracker> = FastList()
val trackersServer: TrackersUDPServer
private val bridges: MutableList<Bridge> = FastList()
private val tasks: Queue<Runnable> = LinkedBlockingQueue()
private val newTrackersConsumers: MutableList<Consumer<Tracker>> = FastList()
private val tasks: ArrayDeque<Runnable> = ArrayDeque()
private val newTrackersConsumers: MutableList<(Tracker) -> Unit> = FastList()
private val trackerStatusListeners: MutableList<TrackerStatusListener> = FastList()
private val onTick: MutableList<Runnable> = FastList()
private val lock = acquireMulticastLock()
Expand Down Expand Up @@ -214,11 +212,11 @@ class VRServer @JvmOverloads constructor(
}

@ThreadSafe
fun addNewTrackerConsumer(consumer: Consumer<Tracker>) {
fun addNewTrackerConsumer(consumer: (Tracker) -> Unit) {
queueTask {
newTrackersConsumers.add(consumer)
for (tracker in trackers) {
consumer.accept(tracker)
consumer(tracker)
}
}
}
Expand All @@ -235,7 +233,7 @@ class VRServer @JvmOverloads constructor(
}

@ThreadSafe
fun addSkeletonUpdatedCallback(consumer: Consumer<HumanSkeleton>) {
fun addSkeletonUpdatedCallback(consumer: (HumanSkeleton) -> Unit) {
queueTask { humanPoseManager.addSkeletonUpdatedCallback(consumer) }
}

Expand All @@ -246,7 +244,7 @@ class VRServer @JvmOverloads constructor(
// final long start = System.currentTimeMillis();
fpsTimer.update()
do {
val task = tasks.poll() ?: break
val task = tasks.removeFirstOrNull() ?: break
task.run()
} while (true)
for (task in onTick) {
Expand Down Expand Up @@ -296,7 +294,7 @@ class VRServer @JvmOverloads constructor(
trackers.add(tracker)
trackerAdded(tracker)
for (tc in newTrackersConsumers) {
tc.accept(tracker)
tc(tracker)
}
}
}
Expand Down
25 changes: 10 additions & 15 deletions server/core/src/main/java/dev/slimevr/autobone/AutoBone.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import io.github.axisangles.ktmath.Vector3
import org.apache.commons.lang3.tuple.Pair
import java.io.File
import java.util.*
import java.util.function.Consumer
import java.util.function.Function
import kotlin.math.*

class AutoBone(private val server: VRServer) {
Expand Down Expand Up @@ -74,17 +72,14 @@ class AutoBone(private val server: VRServer) {
// Get current or default skeleton configs
val skeleton = server.humanPoseManager
// Still compensate for a null skeleton, as it may not be initialized yet
val getOffset: Function<SkeletonConfigOffsets, Float> =
if (skeleton != null) {
Function { key: SkeletonConfigOffsets -> skeleton.getOffset(key) }
} else {
val defaultConfig = SkeletonConfigManager(false)
Function { config: SkeletonConfigOffsets ->
defaultConfig.getOffset(config)
}
}
val defaultConfig = SkeletonConfigManager(false)
val getOffset: (SkeletonConfigOffsets) -> Float = if (skeleton != null) {
{ key: SkeletonConfigOffsets -> skeleton.getOffset(key) }
} else {
{ config: SkeletonConfigOffsets -> defaultConfig.getOffset(config) }
}
for (bone in adjustOffsets) {
val offset = getOffset.apply(bone)
val offset = getOffset(bone)
if (offset > 0f) {
offsets[bone] = offset
}
Expand Down Expand Up @@ -216,7 +211,7 @@ class AutoBone(private val server: VRServer) {
frames: PoseFrames,
config: AutoBoneConfig = globalConfig,
skeletonConfig: SkeletonConfig = globalSkeletonConfig,
epochCallback: Consumer<Epoch>? = null,
epochCallback: ((Epoch) -> Unit)? = null,
): AutoBoneResults {
check(frames.frameHolders.isNotEmpty()) { "Recording has no trackers." }
check(frames.maxFrameCount > 0) { "Recording has no frames." }
Expand Down Expand Up @@ -296,7 +291,7 @@ class AutoBone(private val server: VRServer) {

private fun epoch(
step: PoseFrameStep<AutoBoneStep>,
epochCallback: Consumer<Epoch>? = null,
epochCallback: ((Epoch) -> Unit)? = null,
) {
val config = step.config
val epoch = step.epoch
Expand All @@ -319,7 +314,7 @@ class AutoBone(private val server: VRServer) {
for (entry in scaledOffsets.entries) {
entry.setValue(entry.value * estimatedHeight)
}
epochCallback.accept(Epoch(epoch + 1, config.numEpochs, step.data.errorStats, scaledOffsets))
epochCallback(Epoch(epoch + 1, config.numEpochs, step.data.errorStats, scaledOffsets))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import dev.slimevr.tracking.processor.config.SkeletonConfigOffsets
import io.eiren.util.StringUtils
import io.eiren.util.collections.FastList
import io.eiren.util.logging.LogManager
import kotlinx.coroutines.runBlocking
import org.apache.commons.lang3.tuple.Pair
import java.util.*
import java.util.concurrent.CopyOnWriteArrayList
Expand Down Expand Up @@ -118,7 +119,7 @@ class AutoBoneHandler(private val server: VRServer) {
eta = totalTime - (progress.frame * totalTime / progress.totalFrames),
)
}
val frames = framesFuture.get()
val frames = runBlocking { framesFuture.await() }
LogManager.info("[AutoBone] Done recording!")

// Save a recurring recording for users to send as debug info
Expand Down Expand Up @@ -188,7 +189,7 @@ class AutoBoneHandler(private val server: VRServer) {
val framesFuture = poseRecorder.framesAsync
if (framesFuture != null) {
announceProcessStatus(AutoBoneProcessType.SAVE, "Waiting for recording...")
val frames = framesFuture.get()
val frames = runBlocking { framesFuture.await() }
check(frames.frameHolders.isNotEmpty()) { "Recording has no trackers." }
check(frames.maxFrameCount > 0) { "Recording has no frames." }
announceProcessStatus(AutoBoneProcessType.SAVE, "Saving recording...")
Expand Down Expand Up @@ -242,7 +243,7 @@ class AutoBoneHandler(private val server: VRServer) {
val framesFuture = poseRecorder.framesAsync
if (framesFuture != null) {
announceProcessStatus(AutoBoneProcessType.PROCESS, "Waiting for recording...")
val frames = framesFuture.get()
val frames = runBlocking { framesFuture.await() }
frameRecordings.add(Pair.of("<Recording>", frames))
} else {
announceProcessStatus(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ object PoseFrameIterator {
val frameCount = step.maxFrameCount

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

val randIndices = if (config.randomizeFrameOrder) {
randomIndices(step.maxFrameCount, step.random)
Expand Down Expand Up @@ -77,14 +77,14 @@ object PoseFrameIterator {
}

// Process the iteration
step.onStep.accept(step)
step.onStep(step)

// Move on to the next iteration
frameCursor += config.cursorIncrement
}
cursorOffset++
}

step.postEpoch?.accept(step)
step.postEpoch?.invoke(step)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import dev.slimevr.config.ConfigManager
import dev.slimevr.poseframeformat.PoseFrames
import dev.slimevr.poseframeformat.player.TrackerFramesPlayer
import dev.slimevr.tracking.processor.HumanPoseManager
import java.util.function.Consumer
import kotlin.random.Random

class PoseFrameStep<T>(
Expand All @@ -14,11 +13,11 @@ class PoseFrameStep<T>(
serverConfig: ConfigManager? = null,
val frames: PoseFrames,
/** The consumer run before each epoch. */
val preEpoch: Consumer<PoseFrameStep<T>>? = null,
val preEpoch: ((PoseFrameStep<T>) -> Unit)? = null,
/** The consumer run for each step. */
val onStep: Consumer<PoseFrameStep<T>>,
val onStep: (PoseFrameStep<T>) -> Unit,
/** The consumer run after each epoch. */
val postEpoch: Consumer<PoseFrameStep<T>>? = null,
val postEpoch: ((PoseFrameStep<T>) -> Unit)? = null,
/** The current epoch. */
var epoch: Int = 0,
/** The current frame cursor position in [frames] for skeleton1. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ import java.security.MessageDigest
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.CopyOnWriteArrayList
import java.util.stream.Collectors
import kotlin.concurrent.scheduleAtFixedRate
import kotlin.streams.asSequence

data class DownloadedFirmwarePart(
val firmware: ByteArray,
Expand Down Expand Up @@ -120,8 +120,8 @@ class FirmwareUpdateHandler(private val server: VRServer) :
ssid: String,
password: String,
) {
// Can't use .toList() on Android
val serialPort = this.server.serialHandler.knownPorts.collect(Collectors.toList())
val serialPort = this.server.serialHandler.knownPorts
.asSequence()
.find { port -> deviceId.id == port.portLocation }

if (serialPort == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,14 @@ import java.net.ServerSocket
import java.net.Socket
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.*
import java.util.function.Consumer
import java.util.UUID
import kotlin.math.min

class OTAUpdateTask(
private val firmware: ByteArray,
private val deviceId: UpdateDeviceId<Int>,
private val deviceIp: InetAddress,
private val statusCallback: Consumer<UpdateStatusEvent<Int>>,
private val statusCallback: (UpdateStatusEvent<Int>) -> Unit,
) {
private val receiveBuffer: ByteArray = ByteArray(38)
var socketServer: ServerSocket? = null
Expand All @@ -44,7 +43,7 @@ class OTAUpdateTask(
try {
DatagramSocket().use { socket ->
authSocket = socket
statusCallback.accept(UpdateStatusEvent(deviceId, FirmwareUpdateStatus.AUTHENTICATING))
statusCallback(UpdateStatusEvent(deviceId, FirmwareUpdateStatus.AUTHENTICATING))
LogManager.info("[OTAUpdate] Sending OTA invitation to: $deviceIp")

val fileMd5 = bytesToMd5(firmware)
Expand Down Expand Up @@ -116,7 +115,7 @@ class OTAUpdateTask(
var offset = 0
val chunkSize = 2048
while (offset != firmware.size && !canceled) {
statusCallback.accept(
statusCallback(
UpdateStatusEvent(
deviceId,
FirmwareUpdateStatus.UPLOADING,
Expand Down Expand Up @@ -161,7 +160,7 @@ class OTAUpdateTask(
ServerSocket(0).use { serverSocket ->
socketServer = serverSocket
if (!authenticate(serverSocket.localPort)) {
statusCallback.accept(
statusCallback(
UpdateStatusEvent(
deviceId,
FirmwareUpdateStatus.ERROR_AUTHENTICATION_FAILED,
Expand All @@ -171,7 +170,7 @@ class OTAUpdateTask(
}

if (!upload(serverSocket)) {
statusCallback.accept(
statusCallback(
UpdateStatusEvent(
deviceId,
FirmwareUpdateStatus.ERROR_UPLOAD_FAILED,
Expand All @@ -180,7 +179,7 @@ class OTAUpdateTask(
return
}

statusCallback.accept(
statusCallback(
UpdateStatusEvent(
deviceId,
FirmwareUpdateStatus.REBOOTING,
Expand Down
Loading