mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
dock bump protection improvements
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user