Skip to content

Commit 9056ca7

Browse files
committed
Add warning when SteamVR hand trackers are erroneously enabled
1 parent fdbc52a commit 9056ca7

4 files changed

Lines changed: 86 additions & 0 deletions

File tree

gui/public/i18n/en/translation.ftl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,9 @@ tracking_checklist-FULL_RESET-desc = Some trackers need a reset to be performed.
16451645
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR not running
16461646
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR is not running. Are you using it for VR?
16471647
tracking_checklist-STEAMVR_DISCONNECTED-open = Launch SteamVR
1648+
tracking_checklist-STEAMVR_HANDS_ENABLED = Hand trackers toggled on
1649+
tracking_checklist-STEAMVR_HANDS_ENABLED-desc = You have enabled the SteamVR virtual hand trackers. This will cause button inputs to not work in SteamVR and in games.
1650+
tracking_checklist-STEAMVR_HANDS_ENABLED-go = Disable them
16481651
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibrate your trackers
16491652
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = You didn't perform tracker calibration. Please let your trackers (highlighted in yellow) rest on a stable surface for a few seconds.
16501653
tracking_checklist-TRACKER_ERROR = Trackers with Errors

gui/src/components/tracking-checklist/TrackingChecklist.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import {
66
} from '@/hooks/tracking-checklist';
77
import classNames from 'classnames';
88
import {
9+
ChangeSettingsRequestT,
910
ResetType,
11+
RpcMessage,
12+
SettingsRequestT,
13+
SettingsResponseT,
14+
SteamVRTrackersSettingT,
1015
TrackingChecklistPublicNetworksT,
1116
TrackingChecklistStepId,
1217
} from 'solarxr-protocol';
@@ -29,6 +34,7 @@ import { TrackingChecklistModal } from './TrackingChecklistModal';
2934
import { NavLink, useNavigate } from 'react-router-dom';
3035
import { useBreakpoint } from '@/hooks/breakpoint';
3136
import { openUrl } from '@/hooks/crossplatform';
37+
import { useWebsocketAPI } from '@/hooks/websocket-api';
3238

3339
function Step({
3440
step: { status, id, optional, firstRequired },
@@ -102,6 +108,55 @@ function Step({
102108
);
103109
}
104110

111+
function SteamVRHandsEnabled() {
112+
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
113+
const [steamVrTrackers, setSteamVrTrackers] = useState<Omit<
114+
SteamVRTrackersSettingT,
115+
'pack'
116+
> | null>(null);
117+
118+
useEffect(() => {
119+
sendRPCPacket(RpcMessage.SettingsRequest, new SettingsRequestT());
120+
}, []);
121+
122+
useRPCPacket(RpcMessage.SettingsResponse, (settings: SettingsResponseT) => {
123+
if (settings.steamVrTrackers) {
124+
setSteamVrTrackers(settings.steamVrTrackers);
125+
}
126+
});
127+
128+
const disableHandTrackers = () => {
129+
const settings = new ChangeSettingsRequestT();
130+
settings.steamVrTrackers = new SteamVRTrackersSettingT(
131+
steamVrTrackers?.waist,
132+
steamVrTrackers?.chest,
133+
steamVrTrackers?.automaticTrackerToggle,
134+
steamVrTrackers?.leftFoot,
135+
steamVrTrackers?.rightFoot,
136+
steamVrTrackers?.leftKnee,
137+
steamVrTrackers?.rightKnee,
138+
steamVrTrackers?.leftElbow,
139+
steamVrTrackers?.rightElbow,
140+
false,
141+
false
142+
);
143+
sendRPCPacket(RpcMessage.ChangeSettingsRequest, settings);
144+
};
145+
146+
return (
147+
<div className="space-y-2.5">
148+
<Typography id="tracking_checklist-STEAMVR_HANDS_ENABLED-desc" />
149+
<div className="flex">
150+
<Button
151+
id="tracking_checklist-STEAMVR_HANDS_ENABLED-go"
152+
variant="primary"
153+
onClick={disableHandTrackers}
154+
/>
155+
</div>
156+
</div>
157+
);
158+
}
159+
105160
const stepContentLookup: Record<
106161
number,
107162
(
@@ -352,6 +407,9 @@ const stepContentLookup: Record<
352407
</>
353408
);
354409
},
410+
[TrackingChecklistStepId.STEAMVR_HANDS_ENABLED]: () => {
411+
return <SteamVRHandsEnabled />;
412+
},
355413
};
356414

357415
export function TrackingChecklistMobile() {

gui/src/hooks/tracking-checklist.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export const trackingchecklistIdtoLabel: Record<TrackingChecklistStepId, string>
3030
'tracking_checklist-FEET_MOUNTING_CALIBRATION',
3131
[TrackingChecklistStepId.STAY_ALIGNED_CONFIGURED]:
3232
'tracking_checklist-STAY_ALIGNED_CONFIGURED',
33+
[TrackingChecklistStepId.STEAMVR_HANDS_ENABLED]:
34+
'tracking_checklist-STEAMVR_HANDS_ENABLED',
3335
};
3436

3537
export type TrackingChecklistStepStatus =

server/core/src/main/java/dev/slimevr/trackingchecklist/TrackingChecklistManager.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import dev.slimevr.games.vrchat.VRCConfigRecommendedValues
88
import dev.slimevr.games.vrchat.VRCConfigValidity
99
import dev.slimevr.games.vrchat.VRCConfigValues
1010
import dev.slimevr.tracking.trackers.Tracker
11+
import dev.slimevr.tracking.trackers.TrackerPosition
12+
import dev.slimevr.tracking.trackers.TrackerRole
1113
import dev.slimevr.tracking.trackers.TrackerStatus
1214
import dev.slimevr.tracking.trackers.TrackerUtils
1315
import dev.slimevr.tracking.trackers.udp.TrackerDataType
@@ -86,6 +88,16 @@ class TrackingChecklistManager(private val vrServer: VRServer) : VRCConfigListen
8688
},
8789
)
8890

91+
steps.add(
92+
TrackingChecklistStepT().apply {
93+
id = TrackingChecklistStepId.STEAMVR_HANDS_ENABLED
94+
enabled = false
95+
optional = false
96+
ignorable = false
97+
visibility = TrackingChecklistStepVisibility.WHEN_INVALID
98+
},
99+
)
100+
89101
steps.add(
90102
TrackingChecklistStepT().apply {
91103
id = TrackingChecklistStepId.TRACKER_ERROR
@@ -280,6 +292,17 @@ class TrackingChecklistManager(private val vrServer: VRServer) : VRCConfigListen
280292
it.extraData = null
281293
}
282294
}
295+
296+
val handsEnabled = steamVRBridge.getShareSetting(TrackerRole.LEFT_HAND) || steamVRBridge.getShareSetting(TrackerRole.RIGHT_HAND)
297+
val hasControllers = vrServer.allTrackers.any {
298+
(it.trackerPosition == TrackerPosition.LEFT_HAND || it.trackerPosition == TrackerPosition.RIGHT_HAND) && it.isComputed && !it.isInternal
299+
}
300+
val hasHandTrackers = vrServer.allTrackers.any {
301+
(it.trackerPosition == TrackerPosition.LEFT_HAND || it.trackerPosition == TrackerPosition.RIGHT_HAND) && !it.isComputed
302+
}
303+
updateValidity(TrackingChecklistStepId.STEAMVR_HANDS_ENABLED, !steamvrConnected || !handsEnabled || (!hasControllers && hasHandTrackers)) {
304+
it.enabled = true
305+
}
283306
}
284307

285308
if (vrServer.networkProfileChecker.isSupported) {

0 commit comments

Comments
 (0)