From 55782dabf0f446ce0540cb418ad14ad8910d1526 Mon Sep 17 00:00:00 2001 From: legop3 Date: Thu, 8 Jan 2026 22:18:29 -0500 Subject: [PATCH] dock bump protection improvements --- server/src/services/commandService.js | 3 +-- server/src/services/roverManager.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/server/src/services/commandService.js b/server/src/services/commandService.js index 18eccda0..79c22335 100644 --- a/server/src/services/commandService.js +++ b/server/src/services/commandService.js @@ -74,9 +74,8 @@ io.on('connection', (socket) => { const left = Number(driveDirect.left); const right = Number(driveDirect.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); - if (blockedUntil && Date.now() < blockedUntil && isForward) { + if (blockedUntil && Date.now() < blockedUntil && speed > 0) { throw new Error('Drive blocked: dock protection cooldown'); } if (speed > 0) { diff --git a/server/src/services/roverManager.js b/server/src/services/roverManager.js index 701d4014..47acb0d3 100644 --- a/server/src/services/roverManager.js +++ b/server/src/services/roverManager.js @@ -13,7 +13,7 @@ const socketToRovers = new Map(); // socketId -> Set(roverId) const spectatorSockets = new Set(); const turnService = require('./turnService'); const managerEvents = new EventEmitter(); -const DOCK_GUARD_WINDOW_MS = 3 * 1000; +const DOCK_GUARD_WINDOW_MS = 2 * 1000; const BACKOFF_MS = 500; const BACKOFF_SPEED = 300; const backoffTimers = new Map(); // roverId -> Timeout @@ -230,21 +230,24 @@ function handleIdleUndock(undockedRecord) { } setDriveCooldown(suspect.roverId, DOCK_GUARD_WINDOW_MS); 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; const { issueCommand } = require('./commandService'); clearTimeout(backoffTimers.get(roverId)); + const speed = direction === 'forward' ? BACKOFF_SPEED : -BACKOFF_SPEED; try { issueCommand(roverId, { type: 'drive', - driveDirect: { left: -BACKOFF_SPEED, right: -BACKOFF_SPEED }, + driveDirect: { left: speed, right: speed }, }); } catch (err) { - logger.warn('Dock protection backoff failed', roverId, err.message); + logger.warn('Dock protection nudge failed', roverId, err.message); return; } backoffTimers.set(