mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-17 10:00:46 -04:00
swtich to skipping only once at the beginning
This commit is contained in:
@@ -13,6 +13,7 @@ const turnDeadlines = new Map(); // roverId -> timestamp when current driver exp
|
|||||||
const idleDeadlines = new Map(); // roverId -> timestamp when idle skip will happen
|
const idleDeadlines = new Map(); // roverId -> timestamp when idle skip will happen
|
||||||
const idleTimers = new Map(); // roverId -> Timeout
|
const idleTimers = new Map(); // roverId -> Timeout
|
||||||
const idleSkips = new Map(); // roverId -> Map(socketId -> count)
|
const idleSkips = new Map(); // roverId -> Map(socketId -> count)
|
||||||
|
const idleDisarmed = new Map(); // roverId -> boolean, true once driver has acted this turn
|
||||||
|
|
||||||
function driverAdded(roverId, socketId, force) {
|
function driverAdded(roverId, socketId, force) {
|
||||||
const queue = ensureQueue(roverId);
|
const queue = ensureQueue(roverId);
|
||||||
@@ -36,6 +37,7 @@ function driverRemoved(roverId, socketId) {
|
|||||||
idleSkips.delete(roverId);
|
idleSkips.delete(roverId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
idleDisarmed.delete(roverId);
|
||||||
if (queue.current === socketId) {
|
if (queue.current === socketId) {
|
||||||
advanceTurn(roverId);
|
advanceTurn(roverId);
|
||||||
} else {
|
} else {
|
||||||
@@ -55,6 +57,7 @@ function cleanupRover(roverId) {
|
|||||||
idleDeadlines.delete(roverId);
|
idleDeadlines.delete(roverId);
|
||||||
idleTimers.delete(roverId);
|
idleTimers.delete(roverId);
|
||||||
idleSkips.delete(roverId);
|
idleSkips.delete(roverId);
|
||||||
|
idleDisarmed.delete(roverId);
|
||||||
}
|
}
|
||||||
|
|
||||||
function canDrive(roverId, socket) {
|
function canDrive(roverId, socket) {
|
||||||
@@ -83,6 +86,7 @@ function syncState(roverId) {
|
|||||||
turnDeadlines.delete(roverId);
|
turnDeadlines.delete(roverId);
|
||||||
clearTimeout(idleTimers.get(roverId));
|
clearTimeout(idleTimers.get(roverId));
|
||||||
idleDeadlines.delete(roverId);
|
idleDeadlines.delete(roverId);
|
||||||
|
idleDisarmed.delete(roverId);
|
||||||
turnEvents.emit('queue', { roverId });
|
turnEvents.emit('queue', { roverId });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -90,6 +94,7 @@ function syncState(roverId) {
|
|||||||
queue.current = queue.queue[0];
|
queue.current = queue.queue[0];
|
||||||
}
|
}
|
||||||
setActiveDriver(roverId, queue.current);
|
setActiveDriver(roverId, queue.current);
|
||||||
|
idleDisarmed.set(roverId, false);
|
||||||
scheduleNextTurn(roverId);
|
scheduleNextTurn(roverId);
|
||||||
scheduleIdleTimer(roverId);
|
scheduleIdleTimer(roverId);
|
||||||
turnEvents.emit('queue', { roverId });
|
turnEvents.emit('queue', { roverId });
|
||||||
@@ -109,7 +114,13 @@ function scheduleIdleTimer(roverId) {
|
|||||||
const queue = driverQueues.get(roverId);
|
const queue = driverQueues.get(roverId);
|
||||||
clearTimeout(idleTimers.get(roverId));
|
clearTimeout(idleTimers.get(roverId));
|
||||||
idleDeadlines.delete(roverId);
|
idleDeadlines.delete(roverId);
|
||||||
if (!queue || getMode() !== MODES.TURNS || queue.queue.length <= 1 || !queue.current) {
|
if (
|
||||||
|
!queue ||
|
||||||
|
getMode() !== MODES.TURNS ||
|
||||||
|
queue.queue.length <= 1 ||
|
||||||
|
!queue.current ||
|
||||||
|
idleDisarmed.get(roverId)
|
||||||
|
) {
|
||||||
turnEvents.emit('queue', { roverId });
|
turnEvents.emit('queue', { roverId });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -138,6 +149,11 @@ function handleIdleTimeout(roverId, expectedDriver) {
|
|||||||
scheduleIdleTimer(roverId);
|
scheduleIdleTimer(roverId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// already acted this turn, ignore idle timeout
|
||||||
|
if (idleDisarmed.get(roverId)) {
|
||||||
|
scheduleIdleTimer(roverId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const skips = incrementSkip(roverId, expectedDriver);
|
const skips = incrementSkip(roverId, expectedDriver);
|
||||||
stopRover(roverId);
|
stopRover(roverId);
|
||||||
if (skips >= MAX_IDLE_SKIPS) {
|
if (skips >= MAX_IDLE_SKIPS) {
|
||||||
@@ -167,6 +183,7 @@ function advanceTurn(roverId) {
|
|||||||
idleDeadlines.delete(roverId);
|
idleDeadlines.delete(roverId);
|
||||||
clearTimeout(idleTimers.get(roverId));
|
clearTimeout(idleTimers.get(roverId));
|
||||||
idleTimers.delete(roverId);
|
idleTimers.delete(roverId);
|
||||||
|
idleDisarmed.delete(roverId);
|
||||||
turnEvents.emit('queue', { roverId });
|
turnEvents.emit('queue', { roverId });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -179,6 +196,7 @@ function advanceTurn(roverId) {
|
|||||||
idleDeadlines.delete(roverId);
|
idleDeadlines.delete(roverId);
|
||||||
clearTimeout(idleTimers.get(roverId));
|
clearTimeout(idleTimers.get(roverId));
|
||||||
idleTimers.delete(roverId);
|
idleTimers.delete(roverId);
|
||||||
|
idleDisarmed.delete(roverId);
|
||||||
turnEvents.emit('queue', { roverId });
|
turnEvents.emit('queue', { roverId });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -186,6 +204,7 @@ function advanceTurn(roverId) {
|
|||||||
const nextIdx = idx === -1 ? 0 : (idx + 1) % queue.queue.length;
|
const nextIdx = idx === -1 ? 0 : (idx + 1) % queue.queue.length;
|
||||||
queue.current = queue.queue[nextIdx];
|
queue.current = queue.queue[nextIdx];
|
||||||
setActiveDriver(roverId, queue.current);
|
setActiveDriver(roverId, queue.current);
|
||||||
|
idleDisarmed.set(roverId, false);
|
||||||
sendAlert({ color: COLORS.info, title: 'Turn switch', message: `${queue.current} now controls ${roverId}` });
|
sendAlert({ color: COLORS.info, title: 'Turn switch', message: `${queue.current} now controls ${roverId}` });
|
||||||
stopRover(roverId);
|
stopRover(roverId);
|
||||||
scheduleNextTurn(roverId);
|
scheduleNextTurn(roverId);
|
||||||
@@ -246,7 +265,10 @@ function removeDriverCompletely(roverId, socketId) {
|
|||||||
function recordActivity(roverId, socketId) {
|
function recordActivity(roverId, socketId) {
|
||||||
const queue = driverQueues.get(roverId);
|
const queue = driverQueues.get(roverId);
|
||||||
if (!queue || queue.current !== socketId) return;
|
if (!queue || queue.current !== socketId) return;
|
||||||
scheduleIdleTimer(roverId);
|
idleDisarmed.set(roverId, true);
|
||||||
|
clearTimeout(idleTimers.get(roverId));
|
||||||
|
idleDeadlines.delete(roverId);
|
||||||
|
turnEvents.emit('queue', { roverId });
|
||||||
}
|
}
|
||||||
|
|
||||||
modeEvents.on('change', (mode) => {
|
modeEvents.on('change', (mode) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user