add turns queue to user list panel

This commit is contained in:
legop3
2025-11-22 13:37:30 -05:00
parent ef8d1f021b
commit 2d07a3ca4c
7 changed files with 121 additions and 19 deletions
+6 -1
View File
@@ -5,7 +5,7 @@ const { getMode, modeEvents } = require('./modeManager');
const roverManager = require('./roverManager');
const { managerEvents } = roverManager;
const assignmentService = require('./assignmentService');
const { getActiveDrivers, turnEvents } = require('./turnService');
const { getActiveDrivers, getTurnQueues, turnEvents } = require('./turnService');
const { getRoomCameras, roomCameraEvents } = require('./roomCameraService');
const { getState: getHomeAssistantState, homeAssistantEvents } = require('./homeAssistantService');
const { getNickname, nicknameEvents } = require('./nicknameService');
@@ -34,6 +34,7 @@ function buildSession(socket) {
roster: roverManager.getRoster(),
assignment: assignmentService.describeAssignment(socket?.id || ''),
activeDrivers: getActiveDrivers(),
turnQueues: getTurnQueues(),
roomCameras: getRoomCameras(),
homeAssistant: getHomeAssistantState(),
users,
@@ -99,6 +100,10 @@ turnEvents.on('activeDriver', () => {
logger.info('Active driver change; syncing all clients');
syncAll();
});
turnEvents.on('queue', () => {
logger.info('Turn queue change; syncing all clients');
syncAll();
});
roomCameraEvents.on('update', () => {
logger.info('Room camera change detected; syncing all clients');
+27
View File
@@ -7,6 +7,7 @@ const driverQueues = new Map(); // roverId -> { queue: [], current: socketId, ti
const activeDrivers = new Map();
const TURN_DURATION_MS = 60 * 1000;
const turnEvents = new EventEmitter();
const turnDeadlines = new Map(); // roverId -> timestamp when current driver expires
function driverAdded(roverId, socketId, force) {
const queue = ensureQueue(roverId);
@@ -35,6 +36,7 @@ function cleanupRover(roverId) {
}
driverQueues.delete(roverId);
activeDrivers.delete(roverId);
turnDeadlines.delete(roverId);
}
function canDrive(roverId, socket) {
@@ -60,6 +62,8 @@ function syncState(roverId) {
queue.current = queue.queue[0] || null;
setActiveDriver(roverId, queue.current);
clearTimeout(queue.timer);
turnDeadlines.delete(roverId);
turnEvents.emit('queue', { roverId });
return;
}
if (!queue.current) {
@@ -67,13 +71,17 @@ function syncState(roverId) {
}
setActiveDriver(roverId, queue.current);
scheduleNextTurn(roverId);
turnEvents.emit('queue', { roverId });
}
function scheduleNextTurn(roverId) {
const queue = driverQueues.get(roverId);
if (!queue) return;
clearTimeout(queue.timer);
const deadline = Date.now() + TURN_DURATION_MS;
turnDeadlines.set(roverId, deadline);
queue.timer = setTimeout(() => advanceTurn(roverId), TURN_DURATION_MS);
turnEvents.emit('queue', { roverId });
}
function advanceTurn(roverId) {
@@ -82,6 +90,8 @@ function advanceTurn(roverId) {
if (queue.queue.length === 0) {
clearTimeout(queue.timer);
setActiveDriver(roverId, null);
turnDeadlines.delete(roverId);
turnEvents.emit('queue', { roverId });
return;
}
const mode = getMode();
@@ -89,6 +99,8 @@ function advanceTurn(roverId) {
queue.current = queue.queue[0] || null;
setActiveDriver(roverId, queue.current);
clearTimeout(queue.timer);
turnDeadlines.delete(roverId);
turnEvents.emit('queue', { roverId });
return;
}
const idx = queue.queue.findIndex((id) => id === queue.current);
@@ -117,6 +129,20 @@ function getActiveDrivers() {
return map;
}
function getTurnQueues() {
const mode = getMode();
const payload = {};
driverQueues.forEach((queue, roverId) => {
payload[roverId] = {
mode,
queue: Array.from(queue.queue),
current: queue.current,
deadline: turnDeadlines.get(roverId) || null,
};
});
return payload;
}
function stopRover(roverId) {
try {
const { issueCommand } = require('./commandService');
@@ -138,4 +164,5 @@ module.exports = {
canDrive,
getActiveDrivers,
turnEvents,
getTurnQueues,
};