mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 09:31:20 -04:00
deeper pass
This commit is contained in:
@@ -73,9 +73,9 @@ export function ControlSystemProvider({ children }) {
|
||||
typeof pageSettings?.driveMacroBackoffEnabled === 'boolean'
|
||||
? pageSettings.driveMacroBackoffEnabled
|
||||
: true;
|
||||
const session = useSessionSelector((state) => state.session);
|
||||
const roverId = useSessionSelector((state) => state.session?.assignment?.roverId ?? null);
|
||||
const homeAssistantEntities = useSessionSelector((state) => state.session?.homeAssistant?.entities ?? []);
|
||||
const { homeAssistantSetState } = useSessionActions();
|
||||
const roverId = session?.assignment?.roverId ?? null;
|
||||
const overcurrentLimiter = useOvercurrentLimiter(roverId);
|
||||
const driveTransform = useCallback(
|
||||
(speeds) => applyDriveOvercurrentScale(speeds, overcurrentLimiter.scales, overcurrentLimiter.adminImmune),
|
||||
@@ -88,7 +88,7 @@ export function ControlSystemProvider({ children }) {
|
||||
const pipeline = useCommandPipeline({ driveTransform, auxTransform });
|
||||
|
||||
const turnOnAllLights = useCallback(() => {
|
||||
const entities = session?.homeAssistant?.entities || [];
|
||||
const entities = homeAssistantEntities || [];
|
||||
const targets = entities.filter(
|
||||
(ent) =>
|
||||
(ent.type === 'light' || ent.type === 'switch') &&
|
||||
@@ -105,7 +105,7 @@ export function ControlSystemProvider({ children }) {
|
||||
});
|
||||
// Give the loop a chance; clear pending after issuing commands.
|
||||
pendingLightsRef.current = false;
|
||||
}, [session?.homeAssistant?.entities, homeAssistantSetState]);
|
||||
}, [homeAssistantEntities, homeAssistantSetState]);
|
||||
|
||||
useEffect(() => {
|
||||
dispatch({ type: 'control/set-rover', payload: pipeline.roverId });
|
||||
@@ -114,18 +114,18 @@ export function ControlSystemProvider({ children }) {
|
||||
useEffect(() => {
|
||||
const prevMode = prevModeRef.current;
|
||||
prevModeRef.current = state.mode;
|
||||
if (prevMode !== 'drive' && state.mode === 'drive' && session?.homeAssistant?.entities) {
|
||||
if (prevMode !== 'drive' && state.mode === 'drive' && homeAssistantEntities?.length) {
|
||||
turnOnAllLights();
|
||||
} else if (prevMode !== 'drive' && state.mode === 'drive') {
|
||||
pendingLightsRef.current = true;
|
||||
}
|
||||
}, [state.mode, session?.homeAssistant?.entities, turnOnAllLights]);
|
||||
}, [state.mode, homeAssistantEntities, turnOnAllLights]);
|
||||
|
||||
useEffect(() => {
|
||||
if (pendingLightsRef.current && session?.homeAssistant?.entities) {
|
||||
if (pendingLightsRef.current && homeAssistantEntities?.length) {
|
||||
turnOnAllLights();
|
||||
}
|
||||
}, [session?.homeAssistant?.entities, turnOnAllLights]);
|
||||
}, [homeAssistantEntities, turnOnAllLights]);
|
||||
|
||||
useEffect(() => {
|
||||
const mergedKeymap = { ...DEFAULT_KEYMAP, ...(controlSettings?.keymap || {}) };
|
||||
@@ -308,7 +308,7 @@ export function ControlSystemProvider({ children }) {
|
||||
let macroToRun = macro;
|
||||
if (macroId === 'drive-sequence') {
|
||||
turnOnAllLights();
|
||||
if (!session?.homeAssistant?.entities) {
|
||||
if (!homeAssistantEntities?.length) {
|
||||
pendingLightsRef.current = true;
|
||||
}
|
||||
recordControlIntent();
|
||||
@@ -327,7 +327,7 @@ export function ControlSystemProvider({ children }) {
|
||||
driveMacroBackoffEnabled,
|
||||
pipeline,
|
||||
recordControlIntent,
|
||||
session?.homeAssistant?.entities,
|
||||
homeAssistantEntities,
|
||||
state.macros,
|
||||
turnOnAllLights,
|
||||
],
|
||||
|
||||
@@ -16,13 +16,13 @@ import { bytesToBase64, clampRange, sleep } from './controlMath.js';
|
||||
export function useCommandPipeline(options = {}) {
|
||||
const { driveTransform, auxTransform } = options;
|
||||
const socket = useSocket();
|
||||
const session = useSessionSelector((state) => state.session);
|
||||
const roverId = session?.assignment?.roverId;
|
||||
const roverId = useSessionSelector((state) => state.session?.assignment?.roverId ?? null);
|
||||
const roster = useSessionSelector((state) => state.session?.roster ?? []);
|
||||
|
||||
const rosterEntry = useMemo(() => {
|
||||
if (!roverId || !Array.isArray(session?.roster)) return null;
|
||||
return session.roster.find((entry) => String(entry.id) === String(roverId)) || null;
|
||||
}, [roverId, session?.roster]);
|
||||
if (!roverId || !Array.isArray(roster)) return null;
|
||||
return roster.find((entry) => String(entry.id) === String(roverId)) || null;
|
||||
}, [roverId, roster]);
|
||||
|
||||
const servoConfig = useMemo(() => {
|
||||
if (!rosterEntry?.cameraServo || !rosterEntry.cameraServo.enabled) return null;
|
||||
|
||||
@@ -136,7 +136,7 @@ export default function KeyboardInputManager() {
|
||||
sendSong,
|
||||
},
|
||||
} = useControlSystem();
|
||||
const session = useSessionSelector((state) => state.session);
|
||||
const homeAssistant = useSessionSelector((state) => state.session?.homeAssistant || null);
|
||||
const { homeAssistantSetState } = useSessionActions();
|
||||
const { focusChat, blurChat, isChatFocused } = useChat();
|
||||
const { value: inputSettings } = useSettingsNamespace('inputs', INPUT_SETTINGS_DEFAULTS);
|
||||
@@ -318,7 +318,7 @@ export default function KeyboardInputManager() {
|
||||
|
||||
const triggerHomeAssistantCycle = useCallback(
|
||||
(targetState) => {
|
||||
const ha = session?.homeAssistant;
|
||||
const ha = homeAssistant;
|
||||
if (!ha?.enabled || !ha?.connected) return;
|
||||
if (ha?.lightPolicy?.locked || ha?.lightPolicy?.lockedOn) return;
|
||||
const entities = ha.entities || [];
|
||||
@@ -346,7 +346,7 @@ export default function KeyboardInputManager() {
|
||||
}
|
||||
}
|
||||
},
|
||||
[homeAssistantSetState, session?.homeAssistant],
|
||||
[homeAssistantSetState, homeAssistant],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
@@ -29,7 +29,7 @@ function clampUnit(value) {
|
||||
}
|
||||
|
||||
export function useOvercurrentLimiter(roverId, options = {}) {
|
||||
const session = useSessionSelector((state) => state.session);
|
||||
const role = useSessionSelector((state) => state.session?.role || null);
|
||||
const frame = useTelemetryFrame(roverId);
|
||||
const sensors = frame?.sensors || {};
|
||||
const overcurrentFlags = sensors?.wheelOvercurrents || {};
|
||||
@@ -131,10 +131,7 @@ export function useOvercurrentLimiter(roverId, options = {}) {
|
||||
return { motors, groups };
|
||||
}, [overcurrentFlags]);
|
||||
|
||||
const adminImmune =
|
||||
session?.role === 'admin' ||
|
||||
session?.role === 'lockdown' ||
|
||||
session?.role === 'lockdown-admin';
|
||||
const adminImmune = role === 'admin' || role === 'lockdown' || role === 'lockdown-admin';
|
||||
|
||||
return useMemo(
|
||||
() => ({
|
||||
|
||||
Reference in New Issue
Block a user