camera controls better takeover

This commit is contained in:
legop3
2026-05-17 21:26:09 -04:00
parent 287d6291dd
commit 31f98a8e32
5 changed files with 24 additions and 15 deletions
@@ -95,7 +95,7 @@ function MobileJoystickPanel({ layout }) {
function MobileActionsColumnContent({ layout }) {
const {
state: { roverId, camera, horn },
state: { roverId, camera, horn, manualDockAssist },
pipeline,
actions: { setServoAngle, setNightVision, setAuxMotors, startHorn, stopHorn },
} = useControlSystem();
@@ -115,6 +115,7 @@ function MobileActionsColumnContent({ layout }) {
: typeof cameraConfig?.homeAngle === 'number'
? cameraConfig.homeAngle
: (cameraMin + cameraMax) / 2;
const cameraDisabled = Boolean(disabled || manualDockAssist?.active);
const handleNightVisionToggle = useCallback(
(nextOn) => {
@@ -174,6 +175,7 @@ function MobileActionsColumnContent({ layout }) {
min={cameraMin}
max={cameraMax}
step={0.5}
disabled={cameraDisabled}
onChange={setServoAngle}
orientation="vertical"
label="Camera Tilt"
+3 -1
View File
@@ -43,7 +43,7 @@ function TopDownMapPanel() {
function DriveDockPanel() {
const {
state: { roverId, keymap, camera, horn },
state: { roverId, keymap, camera, horn, manualDockAssist },
pipeline,
actions: { setServoAngle, setNightVision, startHorn, stopHorn },
} = useControlSystem();
@@ -68,6 +68,7 @@ function DriveDockPanel() {
const hornLabel = formatKeyLabel(keymap?.hornHonk?.[0]);
const upLabel = formatKeyLabel(keymap?.cameraUp?.[0]);
const downLabel = formatKeyLabel(keymap?.cameraDown?.[0]);
const cameraDisabled = Boolean(!roverId || manualDockAssist?.active);
return (
<section className="panel-section grid h-full min-h-0 grid-rows-[minmax(0,1fr)_auto] gap-0.5">
@@ -97,6 +98,7 @@ function DriveDockPanel() {
value={value}
min={min}
max={max}
disabled={cameraDisabled}
onChange={setServoAngle}
keyDownLabel={downLabel}
keyUpLabel={upLabel}
+9 -4
View File
@@ -279,15 +279,17 @@ export function ControlSystemProvider({ children }) {
}, [saveControlSettings]);
const setServoAngle = useCallback(
(value) => {
(value, options = {}) => {
if (!pipeline.servoConfig) return;
const force = Boolean(options?.force);
if (state.manualDockAssist?.active && !force) return;
const clamped = clampServoAngle(pipeline.servoConfig, value);
dispatch({ type: 'control/set-camera-angle', payload: clamped });
pipeline.sendServoAngle(clamped);
servoAngleRef.current = clamped;
recordControlIntent();
},
[pipeline, recordControlIntent],
[pipeline, recordControlIntent, state.manualDockAssist?.active],
);
const nudgeServo = useCallback(
@@ -530,12 +532,15 @@ export function ControlSystemProvider({ children }) {
const prevActive = Boolean(state.manualDockAssist?.active);
if (prevActive === nextActive) return;
dispatch({ type: 'control/set-manual-dock-assist', payload: nextActive });
if (!nextActive) return;
if (!nextActive) {
setServoAngle(0, { force: true });
return;
}
const minAngle =
typeof pipeline.servoConfig?.minAngle === 'number'
? pipeline.servoConfig.minAngle
: -45;
setServoAngle(minAngle);
setServoAngle(minAngle, { force: true });
pipeline.sendSong([{ note: 76, duration: 10 }, { note: 83, duration: 10 }], { slot: 0 });
recordControlIntent();
},