From 03eeb87498de6ef3823b55ec0c33e2e3472fc3f3 Mon Sep 17 00:00:00 2001 From: Carl Andersson Date: Mon, 16 Jan 2023 15:19:45 +0100 Subject: [PATCH] Support arbitrary sensor id's for devices (#464) --- .../java/dev/slimevr/platform/SteamVRBridge.java | 2 +- .../slimevr/protocol/datafeed/DataFeedBuilder.java | 11 +++++++---- server/src/main/java/dev/slimevr/vr/Device.java | 6 +++--- .../slimevr/vr/trackers/udp/TrackersUDPServer.java | 12 ++++++------ .../java/dev/slimevr/vr/trackers/udp/UDPDevice.java | 10 ++++------ 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/server/src/main/java/dev/slimevr/platform/SteamVRBridge.java b/server/src/main/java/dev/slimevr/platform/SteamVRBridge.java index 4734b9ae8..877faaa29 100644 --- a/server/src/main/java/dev/slimevr/platform/SteamVRBridge.java +++ b/server/src/main/java/dev/slimevr/platform/SteamVRBridge.java @@ -103,7 +103,7 @@ public abstract class SteamVRBridge extends ProtobufBridge implements device ); - device.getTrackers().add(tracker); + device.getTrackers().put(0, tracker); Main.getVrServer().getDeviceManager().addDevice(device); TrackerRole role = TrackerRole.getById(trackerAdded.getTrackerRole()); if (role != null) { diff --git a/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java b/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java index a08a6a657..c3c1939d9 100644 --- a/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java +++ b/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java @@ -30,8 +30,6 @@ import java.util.List; public class DataFeedBuilder { public static int createHardwareInfo(FlatBufferBuilder fbb, Device device) { - Tracker tracker = device.getTrackers().get(0).get(); - int nameOffset = device.getFirmwareVersion() != null ? fbb.createString(device.getFirmwareVersion()) : 0; @@ -193,7 +191,7 @@ public class DataFeedBuilder { device .getTrackers() .forEach( - (value) -> trackersOffsets + (key, value) -> trackersOffsets .add(DataFeedBuilder.createTrackerData(fbb, mask.getTrackerData(), value)) ); @@ -214,8 +212,13 @@ public class DataFeedBuilder { if (device.getTrackers().size() <= 0) return 0; - Tracker tracker = device.getTrackers().get(0).get(); + Tracker firstTracker = device.getTrackers().get(0); + if (firstTracker == null) { + // Not actually the "first" tracker, but do we care? + firstTracker = device.getTrackers().entrySet().iterator().next().getValue(); + } + Tracker tracker = firstTracker.get(); if (tracker == null) return 0; diff --git a/server/src/main/java/dev/slimevr/vr/Device.java b/server/src/main/java/dev/slimevr/vr/Device.java index a1734f21f..ea7c36cd7 100644 --- a/server/src/main/java/dev/slimevr/vr/Device.java +++ b/server/src/main/java/dev/slimevr/vr/Device.java @@ -1,9 +1,9 @@ package dev.slimevr.vr; import dev.slimevr.vr.trackers.Tracker; -import io.eiren.util.collections.FastList; import java.net.InetAddress; +import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -16,7 +16,7 @@ public class Device { private String firmwareVersion; private String manufacturer; - private final FastList trackers = new FastList<>(); + private final HashMap trackers = new HashMap<>(); public Device() { this.id = nextLocalDeviceId.incrementAndGet(); @@ -58,7 +58,7 @@ public class Device { return null; } - public FastList getTrackers() { + public HashMap getTrackers() { return trackers; } } diff --git a/server/src/main/java/dev/slimevr/vr/trackers/udp/TrackersUDPServer.java b/server/src/main/java/dev/slimevr/vr/trackers/udp/TrackersUDPServer.java index 390df1c1a..12f65280f 100644 --- a/server/src/main/java/dev/slimevr/vr/trackers/udp/TrackersUDPServer.java +++ b/server/src/main/java/dev/slimevr/vr/trackers/udp/TrackersUDPServer.java @@ -237,7 +237,7 @@ public class TrackersUDPServer extends Thread { Main.getVrServer() ); - connection.getTrackers().add(imu); + connection.getTrackers().put(trackerId, imu); trackersConsumer.accept(imu); LogManager .info( @@ -315,7 +315,7 @@ public class TrackersUDPServer extends Thread { parser.write(bb, conn, new UDPPacket1Heartbeat()); socket.send(new DatagramPacket(rcvBuffer, bb.position(), conn.address)); if (conn.lastPacket + 1000 < System.currentTimeMillis()) { - for (Tracker value : conn.getTrackers()) { + for (Tracker value : conn.getTrackers().values()) { IMUTracker tracker = (IMUTracker) value; if (tracker.getStatus() == TrackerStatus.OK) tracker.setStatus(TrackerStatus.DISCONNECTED); @@ -326,7 +326,7 @@ public class TrackersUDPServer extends Thread { } } else { conn.timedOut = false; - for (Tracker value : conn.getTrackers()) { + for (Tracker value : conn.getTrackers().values()) { IMUTracker tracker = (IMUTracker) value; if (tracker.getStatus() == TrackerStatus.DISCONNECTED) tracker.setStatus(TrackerStatus.OK); @@ -452,7 +452,7 @@ public class TrackersUDPServer extends Thread { break; UDPPacket10PingPong ping = (UDPPacket10PingPong) packet; if (connection.lastPingPacketId == ping.pingId) { - for (Tracker t : connection.getTrackers()) { + for (Tracker t : connection.getTrackers().values()) { IMUTracker imuTracker = (IMUTracker) t; imuTracker .setPing( @@ -485,7 +485,7 @@ public class TrackersUDPServer extends Thread { if (connection.getTrackers().size() > 0) { - for (Tracker value : connection.getTrackers()) { + for (Tracker value : connection.getTrackers().values()) { IMUTracker tr = (IMUTracker) value; tr.setBatteryVoltage(battery.voltage); tr.setBatteryLevel(battery.level * 100); @@ -549,7 +549,7 @@ public class TrackersUDPServer extends Thread { UDPPacket19SignalStrength signalStrength = (UDPPacket19SignalStrength) packet; if (connection.getTrackers().size() > 0) { - for (Tracker value : connection.getTrackers()) { + for (Tracker value : connection.getTrackers().values()) { IMUTracker tr = (IMUTracker) value; tr.setSignalStrength(signalStrength.signalStrength); } diff --git a/server/src/main/java/dev/slimevr/vr/trackers/udp/UDPDevice.java b/server/src/main/java/dev/slimevr/vr/trackers/udp/UDPDevice.java index 64779fba5..cf6cba514 100644 --- a/server/src/main/java/dev/slimevr/vr/trackers/udp/UDPDevice.java +++ b/server/src/main/java/dev/slimevr/vr/trackers/udp/UDPDevice.java @@ -4,10 +4,10 @@ import dev.slimevr.NetworkProtocol; import dev.slimevr.vr.Device; import dev.slimevr.vr.trackers.IMUTracker; import dev.slimevr.vr.trackers.Tracker; -import io.eiren.util.collections.FastList; import java.net.InetAddress; import java.net.SocketAddress; +import java.util.HashMap; public class UDPDevice extends Device { @@ -26,7 +26,7 @@ public class UDPDevice extends Device { public NetworkProtocol protocol = null; public int firmwareBuild = 0; public boolean timedOut = false; - private final FastList trackers = new FastList<>(); + private final HashMap trackers = new HashMap<>(); public UDPDevice(SocketAddress address, InetAddress ipAddress) { this.address = address; @@ -77,13 +77,11 @@ public class UDPDevice extends Device { } @Override - public FastList getTrackers() { + public HashMap getTrackers() { return this.trackers; } public IMUTracker getTracker(int id) { - if (id >= 0 && id < this.getTrackers().size()) - return (IMUTracker) this.getTrackers().get(id); - return null; + return (IMUTracker) this.getTrackers().get(id); } }