mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
// state
|
|
// Purpose: Defines the state module and the helpers/state used by this service unit.
|
|
// Scope: Keeps runtime behavior unchanged while isolating responsibilities into a clear module boundary.
|
|
const EventEmitter = require('events');
|
|
|
|
const driverQueues = new Map();
|
|
const activeDrivers = new Map();
|
|
const turnEvents = new EventEmitter();
|
|
const turnDeadlines = new Map();
|
|
const idleDeadlines = new Map();
|
|
const idleTimers = new Map();
|
|
const idleSkips = new Map();
|
|
const idleDisarmed = new Map();
|
|
|
|
function ensureQueue(roverId) {
|
|
if (!driverQueues.has(roverId)) {
|
|
driverQueues.set(roverId, {
|
|
queue: [],
|
|
current: null,
|
|
timer: null,
|
|
/*
|
|
Admin force-control is intentionally modeled as a queue pause instead of
|
|
a queue replacement. That keeps every regular driver's relative place
|
|
intact while making the admin takeover immune to normal turn rotation.
|
|
*/
|
|
pausedByAdminSocketId: null,
|
|
});
|
|
}
|
|
return driverQueues.get(roverId);
|
|
}
|
|
|
|
function setActiveDriver(roverId, socketId) {
|
|
if (!socketId) {
|
|
activeDrivers.delete(roverId);
|
|
} else {
|
|
activeDrivers.set(roverId, socketId);
|
|
}
|
|
turnEvents.emit('activeDriver', { roverId, socketId });
|
|
}
|
|
|
|
function getActiveDrivers() {
|
|
const map = {};
|
|
activeDrivers.forEach((socketId, roverId) => {
|
|
map[roverId] = socketId;
|
|
});
|
|
return map;
|
|
}
|
|
|
|
module.exports = {
|
|
driverQueues,
|
|
activeDrivers,
|
|
turnEvents,
|
|
turnDeadlines,
|
|
idleDeadlines,
|
|
idleTimers,
|
|
idleSkips,
|
|
idleDisarmed,
|
|
ensureQueue,
|
|
setActiveDriver,
|
|
getActiveDrivers,
|
|
};
|