mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Add clear drift compensation
This commit is contained in:
@@ -92,6 +92,9 @@ widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Show Overlay in SteamVR
|
||||
widget-overlay-is_mirrored_label = Display Overlay as Mirror
|
||||
|
||||
## Widget: Drift compensation
|
||||
widget-drift_compensation-clear = Clear drift compensation
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
|
||||
20
gui/src/components/ClearDriftCompensationButton.tsx
Normal file
20
gui/src/components/ClearDriftCompensationButton.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { ClearDriftCompensationRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { Button } from './commons/Button';
|
||||
|
||||
export function ClearDriftCompensationButton() {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
|
||||
const clearDriftCompensation = () => {
|
||||
const record = new ClearDriftCompensationRequestT();
|
||||
sendRPCPacket(RpcMessage.ClearDriftCompensationRequest, record);
|
||||
};
|
||||
|
||||
return (
|
||||
<Button variant="secondary" onClick={clearDriftCompensation}>
|
||||
{l10n.getString('widget-drift_compensation-clear')}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
@@ -1,6 +1,13 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactNode } from 'react';
|
||||
import { ResetType } from 'solarxr-protocol';
|
||||
import { ReactNode, useEffect, useState } from 'react';
|
||||
import {
|
||||
DriftCompensationSettings,
|
||||
DriftCompensationSettingsT,
|
||||
ResetType,
|
||||
RpcMessage,
|
||||
SettingsRequestT,
|
||||
SettingsResponseT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useConfig } from '../hooks/config';
|
||||
import { useLayout } from '../hooks/layout';
|
||||
import { BVHButton } from './BVHButton';
|
||||
@@ -9,6 +16,8 @@ import { Navbar } from './Navbar';
|
||||
import { TopBar } from './TopBar';
|
||||
import { DeveloperModeWidget } from './widgets/DeveloperModeWidget';
|
||||
import { OverlayWidget } from './widgets/OverlayWidget';
|
||||
import { ClearDriftCompensationButton } from './ClearDriftCompensationButton';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
|
||||
export function MainLayoutRoute({
|
||||
children,
|
||||
@@ -22,6 +31,18 @@ export function MainLayoutRoute({
|
||||
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
|
||||
const { layoutWidth, ref: refw } = useLayout<HTMLDivElement>();
|
||||
const { config } = useConfig();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [driftCompensationEnabled, setDriftCompensationEnabled] =
|
||||
useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
sendRPCPacket(RpcMessage.SettingsRequest, new SettingsRequestT());
|
||||
}, []);
|
||||
|
||||
useRPCPacket(RpcMessage.SettingsResponse, (settings: SettingsResponseT) => {
|
||||
if (settings.driftCompensation != null)
|
||||
setDriftCompensationEnabled(settings.driftCompensation.enabled);
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -59,6 +80,9 @@ export function MainLayoutRoute({
|
||||
></ResetButton>
|
||||
<BVHButton></BVHButton>
|
||||
</div>
|
||||
{driftCompensationEnabled && (
|
||||
<ClearDriftCompensationButton></ClearDriftCompensationButton>
|
||||
)}
|
||||
<div className="w-full">
|
||||
<OverlayWidget></OverlayWidget>
|
||||
</div>
|
||||
|
||||
@@ -33,6 +33,15 @@ public class DriftCompensationConfig {
|
||||
}
|
||||
}
|
||||
|
||||
public void clearTrackersDriftCompensation() {
|
||||
for (Tracker t : Main.getVrServer().getAllTrackers()) {
|
||||
Tracker tracker = t.get();
|
||||
if (tracker instanceof IMUTracker imuTracker) {
|
||||
imuTracker.clearDriftCompensation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean getEnabled() {
|
||||
return enabled;
|
||||
|
||||
@@ -43,6 +43,10 @@ public class RPCHandler extends ProtocolHandler<RpcMessageHeader>
|
||||
registerPacketListener(RpcMessage.ResetRequest, this::onResetRequest);
|
||||
registerPacketListener(RpcMessage.AssignTrackerRequest, this::onAssignTrackerRequest);
|
||||
|
||||
registerPacketListener(
|
||||
RpcMessage.ClearDriftCompensationRequest,
|
||||
this::onClearDriftCompensationRequest
|
||||
);
|
||||
|
||||
registerPacketListener(RpcMessage.RecordBVHRequest, this::onRecordBVHRequest);
|
||||
|
||||
@@ -218,6 +222,22 @@ public class RPCHandler extends ProtocolHandler<RpcMessageHeader>
|
||||
this.api.server.trackerUpdated(tracker);
|
||||
}
|
||||
|
||||
public void onClearDriftCompensationRequest(
|
||||
GenericConnection conn,
|
||||
RpcMessageHeader messageHeader
|
||||
) {
|
||||
ClearDriftCompensationRequest req = (ClearDriftCompensationRequest) messageHeader
|
||||
.message(new ClearDriftCompensationRequest());
|
||||
if (req == null)
|
||||
return;
|
||||
|
||||
this.api.server
|
||||
.getConfigManager()
|
||||
.getVrConfig()
|
||||
.getDriftCompensation()
|
||||
.clearTrackersDriftCompensation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(GenericConnection conn, RpcMessageHeader message) {
|
||||
BiConsumer<GenericConnection, RpcMessageHeader> consumer = this.handlers[message
|
||||
|
||||
@@ -213,6 +213,16 @@ public class IMUTracker
|
||||
}
|
||||
}
|
||||
|
||||
public void clearDriftCompensation() {
|
||||
driftSince = 0L;
|
||||
timeAtLastReset = 0L;
|
||||
totalDriftTime = 0L;
|
||||
if (driftQuats != null) {
|
||||
driftQuats.clear();
|
||||
driftTimes.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (magnetometerCalibrated && hasNewCorrectionData) {
|
||||
|
||||
Submodule solarxr-protocol updated: 6d4c792770...38bb618219
Reference in New Issue
Block a user