Detect and use tracker PID during HID enumeration (#1556)

This commit is contained in:
sctanf
2026-01-07 04:13:33 -05:00
committed by GitHub
parent e27ec63985
commit 255b8b2865
11 changed files with 104 additions and 7 deletions

View File

@@ -8,10 +8,13 @@ import android.content.IntentFilter
import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbManager
import androidx.core.content.ContextCompat
import dev.slimevr.VRServer
import dev.slimevr.config.config
import dev.slimevr.tracking.trackers.Device
import dev.slimevr.tracking.trackers.Tracker
import dev.slimevr.tracking.trackers.TrackerStatus
import dev.slimevr.tracking.trackers.hid.HIDCommon
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_PID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_RECEIVER_PID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_RECEIVER_VID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.PACKET_SIZE
@@ -91,7 +94,7 @@ class AndroidHIDManager(
}
fun checkConfigureDevice(usbDevice: UsbDevice, requestPermission: Boolean = false) {
if (usbDevice.vendorId == HID_TRACKER_RECEIVER_VID && usbDevice.productId == HID_TRACKER_RECEIVER_PID) {
if (usbDevice.vendorId == HID_TRACKER_RECEIVER_VID && (usbDevice.productId == HID_TRACKER_RECEIVER_PID || usbDevice.productId == HID_TRACKER_PID)) {
if (usbManager.hasPermission(usbDevice)) {
LogManager.info("[TrackerServer] Already have permission for ${usbDevice.deviceName}")
proceedWithDeviceConfiguration(usbDevice)
@@ -199,8 +202,9 @@ class AndroidHIDManager(
}
private fun deviceEnumerate(requestPermission: Boolean = false) {
val trackersOverHID: Boolean = VRServer.instance.configManager.vrConfig.hidConfig.trackersOverHID
val hidDeviceList: MutableList<UsbDevice> = usbManager.deviceList.values.filter {
it.vendorId == HID_TRACKER_RECEIVER_VID && it.productId == HID_TRACKER_RECEIVER_PID
it.vendorId == HID_TRACKER_RECEIVER_VID && (it.productId == HID_TRACKER_RECEIVER_PID || (trackersOverHID && it.productId == HID_TRACKER_PID))
}.toMutableList()
synchronized(devicesByHID) {
// Work on devicesByHid and add/remove as necessary

View File

@@ -0,0 +1,7 @@
package dev.slimevr.config
import com.fasterxml.jackson.annotation.JsonIgnore
class HIDConfig {
var trackersOverHID = false
}

View File

@@ -42,6 +42,8 @@ class VRConfig {
val stayAlignedConfig = StayAlignedConfig()
val hidConfig = HIDConfig()
@JsonDeserialize(using = TrackerConfigMapDeserializer::class)
@JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class)
private val trackers: MutableMap<String, TrackerConfig> = HashMap()

View File

@@ -412,6 +412,11 @@ public class RPCSettingsBuilder {
.createStayAlignedSettings(
fbb,
server.configManager.getVrConfig().getStayAlignedConfig()
),
RPCSettingsBuilderKotlin.INSTANCE
.createHIDSettings(
fbb,
server.configManager.getVrConfig().getHidConfig()
)
);
}

View File

@@ -1,7 +1,9 @@
package dev.slimevr.protocol.rpc.settings
import com.google.flatbuffers.FlatBufferBuilder
import dev.slimevr.config.HIDConfig
import dev.slimevr.config.StayAlignedConfig
import solarxr_protocol.rpc.HIDSettings
import solarxr_protocol.rpc.StayAlignedSettings
object RPCSettingsBuilderKotlin {
@@ -29,4 +31,13 @@ object RPCSettingsBuilderKotlin {
config.flatRelaxedPose.footAngleInDeg,
config.setupComplete,
)
fun createHIDSettings(
fbb: FlatBufferBuilder,
config: HIDConfig,
): Int = HIDSettings
.createHIDSettings(
fbb,
config.trackersOverHID,
)
}

View File

@@ -369,6 +369,12 @@ class RPCSettingsHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) {
config.flatRelaxedPose.footAngleInDeg = requestConfig.flatFootAngle()
}
if (req.hidSettings() != null) {
val config = api.server.configManager.vrConfig.hidConfig
val requestConfig = req.hidSettings()
config.trackersOverHID = requestConfig.trackersOverHid()
}
api.server.configManager.saveConfig()
}
@@ -385,7 +391,7 @@ class RPCSettingsHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) {
val settings = SettingsResponse
.createSettingsResponse(
fbb,
RPCSettingsBuilder.createSteamVRSettings(fbb, bridge), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
RPCSettingsBuilder.createSteamVRSettings(fbb, bridge), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
)
val outbound =
rpcHandler.createRPCMessage(fbb, RpcMessage.SettingsResponse, settings)

View File

@@ -27,6 +27,7 @@ class HIDCommon {
companion object {
const val HID_TRACKER_RECEIVER_VID = 0x1209
const val HID_TRACKER_RECEIVER_PID = 0x7690
const val HID_TRACKER_PID = 0x7692
const val PACKET_SIZE = 16

View File

@@ -1,9 +1,12 @@
package dev.slimevr.desktop.tracking.trackers.hid
import dev.slimevr.VRServer
import dev.slimevr.config.config
import dev.slimevr.tracking.trackers.Device
import dev.slimevr.tracking.trackers.Tracker
import dev.slimevr.tracking.trackers.TrackerStatus
import dev.slimevr.tracking.trackers.hid.HIDCommon
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_PID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_RECEIVER_PID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.HID_TRACKER_RECEIVER_VID
import dev.slimevr.tracking.trackers.hid.HIDCommon.Companion.PACKET_SIZE
@@ -55,7 +58,7 @@ class DesktopHIDManager(name: String, private val trackersConsumer: Consumer<Tra
}
private fun checkConfigureDevice(hidDevice: HidDevice) {
if (hidDevice.vendorId == HID_TRACKER_RECEIVER_VID && hidDevice.productId == HID_TRACKER_RECEIVER_PID) { // TODO: Use correct ids
if (hidDevice.vendorId == HID_TRACKER_RECEIVER_VID && (hidDevice.productId == HID_TRACKER_RECEIVER_PID || hidDevice.productId == HID_TRACKER_PID)) { // TODO: Use list of valid ids
val serial = hidDevice.serialNumber ?: "Unknown HID Device"
if (hidDevice.isClosed) {
if (!hidDevice.open()) {
@@ -208,12 +211,29 @@ class DesktopHIDManager(name: String, private val trackersConsumer: Consumer<Tra
}
private fun deviceEnumerate() {
var root: HidDeviceInfoStructure? = null
var rootReceivers: HidDeviceInfoStructure? = null
var rootTrackers: HidDeviceInfoStructure? = null
val trackersOverHID: Boolean = VRServer.instance.configManager.vrConfig.hidConfig.trackersOverHID
try {
root = HidApi.enumerateDevices(HID_TRACKER_RECEIVER_VID, HID_TRACKER_RECEIVER_PID) // TODO: change to proper vendorId and productId, need to enum all appropriate productId
rootReceivers = HidApi.enumerateDevices(HID_TRACKER_RECEIVER_VID, HID_TRACKER_RECEIVER_PID) // TODO: Use list of ids
rootTrackers = if (trackersOverHID) {
HidApi.enumerateDevices(HID_TRACKER_RECEIVER_VID, HID_TRACKER_PID)
} else {
null
} // TODO: Use list of ids
} catch (e: Throwable) {
LogManager.severe("[TrackerServer] Couldn't enumerate HID devices", e)
}
var root: HidDeviceInfoStructure? = rootReceivers
if (root == null) {
root = rootTrackers
} else {
var last: HidDeviceInfoStructure = root
while (last.hasNext()) {
last = last.next()
}
last.next = rootTrackers
}
val hidDeviceList: MutableList<HidDevice> = mutableListOf()
if (root != null) {
var hidDeviceInfoStructure: HidDeviceInfoStructure? = root