mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-11-14 18:58:49 -05:00
25 lines
1.3 KiB
JavaScript
25 lines
1.3 KiB
JavaScript
// Drive Dock State
|
|
// Purpose: Selects only dock-related telemetry fields needed by drive/dock controls.
|
|
// Scope: Keeps the action component focused on rendering while this hook owns telemetry subscription details.
|
|
|
|
import { useMemo } from 'react';
|
|
import { useTelemetrySelector } from '../../context/TelemetryContext.jsx';
|
|
import { dockTelemetryEqual, selectDockTelemetry } from '../../context/telemetryViews.js';
|
|
|
|
export function deriveDriveDockStateFromTelemetry(dockTelemetry) {
|
|
const oiLabel = dockTelemetry?.oiModeLabel || 'Unknown';
|
|
const oiNormalized = oiLabel.toLowerCase();
|
|
const chargingLabel = dockTelemetry?.chargingStateLabel || '';
|
|
const docked = Boolean(dockTelemetry?.homeBase);
|
|
const charging = dockTelemetry?.dockingPhase === 'charging';
|
|
const driving = oiNormalized === 'full' && !dockTelemetry?.movementLocked;
|
|
const dockedNotCharging = docked && !charging;
|
|
const dockingInProgress = !docked && !charging && oiNormalized === 'passive' && dockTelemetry?.dockingPhase !== 'undocking';
|
|
return { driving, docked, charging, dockedNotCharging, dockingInProgress, oiLabel, chargingLabel };
|
|
}
|
|
|
|
export function useDriveDockState(roverId) {
|
|
const dockTelemetry = useTelemetrySelector(roverId, selectDockTelemetry, dockTelemetryEqual);
|
|
return useMemo(() => deriveDriveDockStateFromTelemetry(dockTelemetry), [dockTelemetry]);
|
|
}
|