Add clear drift compensation

This commit is contained in:
Louka
2023-01-23 21:15:56 -05:00
parent 3e308b222f
commit 0ef42d01bb
7 changed files with 89 additions and 3 deletions

View File

@@ -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

View 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>
);
}

View File

@@ -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>

View File

@@ -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;

View File

@@ -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

View File

@@ -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) {