From b606786ce5026db5db060c1e29798fe985be096b Mon Sep 17 00:00:00 2001 From: Ilia Ki Date: Sun, 21 Apr 2024 22:56:05 +0700 Subject: [PATCH] Add more compact bundle protocol --- .../tracking/trackers/udp/FeatureFlags.kt | 2 ++ .../trackers/udp/UDPProtocolParser.kt | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FeatureFlags.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FeatureFlags.kt index 6e90462a66..c935e63d39 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FeatureFlags.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FeatureFlags.kt @@ -43,6 +43,7 @@ class FirmwareFeatures { enum class ServerFeatureFlags { /** Server can parse bundle packets: `PACKET_BUNDLE` = 100 (0x64). */ PROTOCOL_BUNDLE_SUPPORT, + PROTOCOL_BUNDLE_V2_SUPPORT, // Add new flags here @@ -51,6 +52,7 @@ enum class ServerFeatureFlags { companion object { val flagsEnabled: Set = setOf( PROTOCOL_BUNDLE_SUPPORT, + PROTOCOL_BUNDLE_V2_SUPPORT, // Add enabled flags here ) diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPProtocolParser.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPProtocolParser.kt index f1b4276cde..605c9157a3 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPProtocolParser.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPProtocolParser.kt @@ -40,6 +40,25 @@ class UDPProtocolParser { buf.position(bundlePacketStart + bundlePacketLen) } return bundlePackets.toTypedArray() + } else if (packetId == PACKET_BUNDLE_V2) { + bundlePackets.clear() + while (buf.hasRemaining()) { + val bundlePacketLen = Math.min(buf.get().toUByte().toInt(), buf.remaining()) // 1 byte + if (bundlePacketLen == 0) continue + + val bundlePacketStart = buf.position() + val bundleBuf = buf.slice() + bundleBuf.limit(bundlePacketLen) + val bundlePacketId = bundleBuf.get().toUByte().toInt() // 1 byte + val newPacket = getNewPacket(bundlePacketId) + newPacket?.let { + newPacket.readData(bundleBuf) + bundlePackets.add(newPacket) + } + + buf.position(bundlePacketStart + bundlePacketLen) + } + return bundlePackets.toTypedArray() } val newPacket = getNewPacket(packetId) @@ -127,7 +146,9 @@ class UDPProtocolParser { const val PACKET_TEMPERATURE = 20 const val PACKET_USER_ACTION = 21 const val PACKET_FEATURE_FLAGS = 22 + const val PACKET_IMU_FRAME = 23 const val PACKET_BUNDLE = 100 + const val PACKET_BUNDLE_V2 = 101 const val PACKET_PROTOCOL_CHANGE = 200 private val HANDSHAKE_BUFFER = ByteArray(64) private val bundlePackets = ArrayList(128)