dock bump protection improvements

This commit is contained in:
legop3
2026-01-08 22:18:29 -05:00
parent 79c118bc88
commit 55782dabf0
2 changed files with 9 additions and 7 deletions
+1 -2
View File
@@ -74,9 +74,8 @@ io.on('connection', (socket) => {
const left = Number(driveDirect.left); const left = Number(driveDirect.left);
const right = Number(driveDirect.right); const right = Number(driveDirect.right);
const speed = Math.max(Math.abs(left), Math.abs(right)); const speed = Math.max(Math.abs(left), Math.abs(right));
const isForward = Number.isFinite(left) && Number.isFinite(right) && left > 0 && right > 0;
const blockedUntil = driveCooldowns.get(roverId); const blockedUntil = driveCooldowns.get(roverId);
if (blockedUntil && Date.now() < blockedUntil && isForward) { if (blockedUntil && Date.now() < blockedUntil && speed > 0) {
throw new Error('Drive blocked: dock protection cooldown'); throw new Error('Drive blocked: dock protection cooldown');
} }
if (speed > 0) { if (speed > 0) {
+8 -5
View File
@@ -13,7 +13,7 @@ const socketToRovers = new Map(); // socketId -> Set(roverId)
const spectatorSockets = new Set(); const spectatorSockets = new Set();
const turnService = require('./turnService'); const turnService = require('./turnService');
const managerEvents = new EventEmitter(); const managerEvents = new EventEmitter();
const DOCK_GUARD_WINDOW_MS = 3 * 1000; const DOCK_GUARD_WINDOW_MS = 2 * 1000;
const BACKOFF_MS = 500; const BACKOFF_MS = 500;
const BACKOFF_SPEED = 300; const BACKOFF_SPEED = 300;
const backoffTimers = new Map(); // roverId -> Timeout const backoffTimers = new Map(); // roverId -> Timeout
@@ -230,21 +230,24 @@ function handleIdleUndock(undockedRecord) {
} }
setDriveCooldown(suspect.roverId, DOCK_GUARD_WINDOW_MS); setDriveCooldown(suspect.roverId, DOCK_GUARD_WINDOW_MS);
if (bumpRecent) { if (bumpRecent) {
backoffRover(suspect.roverId); nudgeRover(suspect.roverId, 'backward');
} else {
nudgeRover(suspect.roverId, 'forward');
} }
} }
function backoffRover(roverId) { function nudgeRover(roverId, direction = 'backward') {
if (!roverId) return; if (!roverId) return;
const { issueCommand } = require('./commandService'); const { issueCommand } = require('./commandService');
clearTimeout(backoffTimers.get(roverId)); clearTimeout(backoffTimers.get(roverId));
const speed = direction === 'forward' ? BACKOFF_SPEED : -BACKOFF_SPEED;
try { try {
issueCommand(roverId, { issueCommand(roverId, {
type: 'drive', type: 'drive',
driveDirect: { left: -BACKOFF_SPEED, right: -BACKOFF_SPEED }, driveDirect: { left: speed, right: speed },
}); });
} catch (err) { } catch (err) {
logger.warn('Dock protection backoff failed', roverId, err.message); logger.warn('Dock protection nudge failed', roverId, err.message);
return; return;
} }
backoffTimers.set( backoffTimers.set(