From 851565fc85539ec240f7ddaa283ce70122f227c4 Mon Sep 17 00:00:00 2001 From: ishotjr Date: Wed, 6 May 2026 10:55:57 -0400 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=94=8E=F0=9F=93=9B=20Add=20manufactur?= =?UTF-8?q?er/vendor=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 2 +- gui/public/i18n/cs/translation.ftl | 2 ++ gui/public/i18n/de/translation.ftl | 1 + gui/public/i18n/en/translation.ftl | 2 ++ gui/public/i18n/es-419/translation.ftl | 1 + gui/public/i18n/fr/translation.ftl | 1 + gui/public/i18n/nl/translation.ftl | 1 + gui/public/i18n/pt-BR/translation.ftl | 1 + gui/public/i18n/th/translation.ftl | 1 + gui/public/i18n/zh-Hans/translation.ftl | 1 + gui/public/i18n/zh-Hant/translation.ftl | 1 + .../components/tracker/TrackerSettings.tsx | 1 + .../trackers/udp/FirmwareConstants.kt | 2 ++ .../trackers/udp/TrackersUDPServer.kt | 2 ++ .../tracking/trackers/udp/UDPDevice.kt | 7 +------ .../tracking/trackers/udp/UDPPacket.kt | 19 +++++++++++++++++++ 16 files changed, 38 insertions(+), 7 deletions(-) diff --git a/.gitmodules b/.gitmodules index 286659e33d..32e75031e5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "solarxr-protocol"] path = solarxr-protocol - url = https://github.com/SlimeVR/SolarXR-Protocol.git + url = https://github.com/SomaticVR/SolarXR-Protocol.git diff --git a/gui/public/i18n/cs/translation.ftl b/gui/public/i18n/cs/translation.ftl index f2d7dbfbc3..a6b4794c79 100644 --- a/gui/public/i18n/cs/translation.ftl +++ b/gui/public/i18n/cs/translation.ftl @@ -95,6 +95,8 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = Obecné nRF board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion + ## Proportions diff --git a/gui/public/i18n/de/translation.ftl b/gui/public/i18n/de/translation.ftl index f3df11fb50..9b695edaba 100644 --- a/gui/public/i18n/de/translation.ftl +++ b/gui/public/i18n/de/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = Generisches nRF board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index 7158573da2..1c6a02f9a1 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -114,6 +114,8 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = Generic nRF board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion +board_type-undefined = Undefined ## Proportions skeleton_bone-NONE = None diff --git a/gui/public/i18n/es-419/translation.ftl b/gui/public/i18n/es-419/translation.ftl index 8fbb9f4467..de9902ec17 100644 --- a/gui/public/i18n/es-419/translation.ftl +++ b/gui/public/i18n/es-419/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = nRF Genérico board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/fr/translation.ftl b/gui/public/i18n/fr/translation.ftl index 7bd5e93a68..631186501c 100644 --- a/gui/public/i18n/fr/translation.ftl +++ b/gui/public/i18n/fr/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = nRF Générique board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/nl/translation.ftl b/gui/public/i18n/nl/translation.ftl index 3fd083bde7..49eaabb789 100644 --- a/gui/public/i18n/nl/translation.ftl +++ b/gui/public/i18n/nl/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = Generic nRF board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/pt-BR/translation.ftl b/gui/public/i18n/pt-BR/translation.ftl index c7a92c34ca..9fc98007f7 100644 --- a/gui/public/i18n/pt-BR/translation.ftl +++ b/gui/public/i18n/pt-BR/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = nRF genérico board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/th/translation.ftl b/gui/public/i18n/th/translation.ftl index f16b9f5717..8235e90ea8 100644 --- a/gui/public/i18n/th/translation.ftl +++ b/gui/public/i18n/th/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = บอร์ด NRF ทั่วไป board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/zh-Hans/translation.ftl b/gui/public/i18n/zh-Hans/translation.ftl index 760875d9c5..b0cbdfaf09 100644 --- a/gui/public/i18n/zh-Hans/translation.ftl +++ b/gui/public/i18n/zh-Hans/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = nRF系列 board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR蝴蝶 开发版 board_type-SLIMEVR_BUTTERFLY = SlimeVR蝴蝶 +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/public/i18n/zh-Hant/translation.ftl b/gui/public/i18n/zh-Hant/translation.ftl index 8c620b7a71..3f00a53819 100644 --- a/gui/public/i18n/zh-Hant/translation.ftl +++ b/gui/public/i18n/zh-Hant/translation.ftl @@ -120,6 +120,7 @@ board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini board_type-GENERIC_NRF = 通用 nRF board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly +board_type-SOMATICVR_ORION = Somatic Orion ## Proportions diff --git a/gui/src/components/tracker/TrackerSettings.tsx b/gui/src/components/tracker/TrackerSettings.tsx index 7f6acd8fd7..fe0ba16bc6 100644 --- a/gui/src/components/tracker/TrackerSettings.tsx +++ b/gui/src/components/tracker/TrackerSettings.tsx @@ -133,6 +133,7 @@ export function TrackerSettingsPage() { }, []); const boardType = useMemo(() => { + if (tracker?.device?.hardwareInfo?.officialBoardType) { return l10n.getString( 'board_type-' + diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FirmwareConstants.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FirmwareConstants.kt index bac7d126b9..5b5ce8c741 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FirmwareConstants.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/FirmwareConstants.kt @@ -61,6 +61,7 @@ enum class BoardType(val id: UInt) { GENERIC_NRF(24u), SLIMEVR_BUTTERFLY_DEV(25u), SLIMEVR_BUTTERFLY(26u), + SOMATICVR_ORION(27u), DEV_RESERVED(250u), ; @@ -94,6 +95,7 @@ enum class BoardType(val id: UInt) { GENERIC_NRF -> "Generic nRF" SLIMEVR_BUTTERFLY_DEV -> "SlimeVR Dev Butterfly" SLIMEVR_BUTTERFLY -> "SlimeVR Butterfly" + SOMATICVR_ORION -> "Somatic Orion" DEV_RESERVED -> "Prototype" } diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/TrackersUDPServer.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/TrackersUDPServer.kt index ea5c6d5ba1..6b3285b3ef 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/TrackersUDPServer.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/TrackersUDPServer.kt @@ -133,6 +133,7 @@ class TrackersUDPServer(private val port: Int, name: String, private val tracker handshake.macString ?: addr.hostAddress, handshake.boardType, handshake.mcuType, + handshake.manufacturer, ) VRServer.instance.deviceManager.addDevice(connection) connection.protocolVersion = handshake.protocolVersion @@ -150,6 +151,7 @@ class TrackersUDPServer(private val port: Int, name: String, private val tracker // Fixing this would break config! connection.descriptiveName = "udp:/$addr" connection.firmwareVersion = handshake.firmware + connection.manufacturer = handshake.manufacturer synchronized(connections) { // Register the new connection val i = connections.size diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPDevice.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPDevice.kt index bed58741c8..cf37c18ec9 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPDevice.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPDevice.kt @@ -14,6 +14,7 @@ class UDPDevice( override val hardwareIdentifier: String, override val boardType: BoardType = BoardType.UNKNOWN, override val mcuType: MCUType = MCUType.UNKNOWN, + override var manufacturer: String? = null, ) : Device(true) { override val id: Int = nextLocalDeviceId.incrementAndGet() @@ -75,11 +76,5 @@ class UDPDevice( override fun toString(): String = "udp:/$ipAddress" - override var manufacturer: String? - get() = "SlimeVR" - set(manufacturer) { - super.manufacturer = manufacturer - } - fun getTracker(id: Int): Tracker? = trackers[id] } diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPPacket.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPPacket.kt index c83277b2cc..bde327eed1 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPPacket.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/udp/UDPPacket.kt @@ -99,6 +99,7 @@ data class UDPPacket3Handshake( var protocolVersion: Int = 0, var firmware: String? = null, var macString: String? = null, + var manufacturer: String? = null, ) : UDPPacket(3) { override fun readData(buf: ByteBuffer) { if (buf.remaining() == 0) return @@ -136,6 +137,24 @@ data class UDPPacket3Handshake( ) if (macString == "00:00:00:00:00:00") macString = null } + + var trackerType: UInt = 0u + if (buf.remaining() > 1) { + // not sure if this is the right type etc., but we just want to skip over it + trackerType = buf.get().toUInt() + } + + var vendorLength = 0 + if (buf.remaining() > 0) vendorLength = buf.get().toInt() + + // VENDOR_NAME/manufacturer length is 1 longer than + // that because it's null-terminated + var vendor: String = "placeholder" + vendor = readASCIIString(buf, vendorLength) + + // redundant, but just in case they are somehow different + manufacturer = vendor + } override fun writeData(buf: ByteBuffer) { From f38bdcdd77590ae059037d5140b2d8fa4083d405 Mon Sep 17 00:00:00 2001 From: ishotjr Date: Wed, 6 May 2026 11:55:35 -0400 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=9D=F0=9F=94=83=20Revert=20submodu?= =?UTF-8?q?le=20in=20anticipation=20of=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 32e75031e5..286659e33d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "solarxr-protocol"] path = solarxr-protocol - url = https://github.com/SomaticVR/SolarXR-Protocol.git + url = https://github.com/SlimeVR/SolarXR-Protocol.git