From c31fffec20ad449ed5664b72f3bb152e5cb4f2f7 Mon Sep 17 00:00:00 2001 From: legop3 Date: Wed, 29 Apr 2026 19:31:51 -0400 Subject: [PATCH] glogar --- server/src/services/commandService/index.js | 24 +++++++++++-------- server/src/services/idleService/index.js | 26 +++++++++++++++++---- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/server/src/services/commandService/index.js b/server/src/services/commandService/index.js index ddcdb5b6..a5b9f239 100644 --- a/server/src/services/commandService/index.js +++ b/server/src/services/commandService/index.js @@ -94,20 +94,24 @@ io.on('connection', (socket) => { throw new Error('Not your turn or no control'); } const driveDirect = payload?.driveDirect; - if (type === 'drive' && driveDirect && !isAdminSocket) { - const safeDrive = roverManager.applyPrivateDriveSafety(roverId, socket, driveDirect); - if (safeDrive) { - payload.driveDirect = safeDrive; + if (type === 'drive' && driveDirect) { + if (!isAdminSocket) { + const safeDrive = roverManager.applyPrivateDriveSafety(roverId, socket, driveDirect); + if (safeDrive) { + payload.driveDirect = safeDrive; + } } const left = Number(payload?.driveDirect?.left); const right = Number(payload?.driveDirect?.right); const speed = Math.max(Math.abs(left), Math.abs(right)); - const blockedUntil = driveCooldowns.get(roverId); - if (blockedUntil && Date.now() < blockedUntil && speed > 0) { - const reason = isLockdownAdmin(socket) - ? 'Drive blocked: cooldown' - : 'Drive blocked: safety cooldown'; - throw new Error(reason); + if (!isAdminSocket) { + const blockedUntil = driveCooldowns.get(roverId); + if (blockedUntil && Date.now() < blockedUntil && speed > 0) { + const reason = isLockdownAdmin(socket) + ? 'Drive blocked: cooldown' + : 'Drive blocked: safety cooldown'; + throw new Error(reason); + } } if (speed > 0) { let direction = 'turn'; diff --git a/server/src/services/idleService/index.js b/server/src/services/idleService/index.js index 91778cce..3debe0bd 100644 --- a/server/src/services/idleService/index.js +++ b/server/src/services/idleService/index.js @@ -4,19 +4,32 @@ const logger = require('../../globals/logger').child('idleService'); const { getActiveDrivers, turnEvents } = require('../turnService'); const roverManager = require('../roverManager'); +const { getRecentDriveActivity } = require('../commandService'); const { IDLE_TIMEOUT_MS } = require('./constants'); const { runtime } = require('./state'); const { runIdleActions } = require('./actions'); -function getActiveDriverCount() { +function getActivitySnapshot() { const active = getActiveDrivers(); const turnCount = active && typeof active === 'object' ? Object.keys(active).length : 0; - if (turnCount > 0) return turnCount; + const activeByTurn = turnCount; + let liveCount = 0; roverManager.rovers.forEach((record) => { if (record?.drivers?.size > 0) liveCount += 1; }); - return liveCount; + const activeByRoverDrivers = liveCount; + + const recentDriveEvents = getRecentDriveActivity(IDLE_TIMEOUT_MS, { excludeAdmins: false }); + const activeByRecentDrive = recentDriveEvents.length; + + const totalActive = Math.max(activeByTurn, activeByRoverDrivers, activeByRecentDrive); + return { + activeByTurn, + activeByRoverDrivers, + activeByRecentDrive, + totalActive, + }; } function clearIdleTimer() { @@ -33,7 +46,9 @@ function scheduleIdleTimer() { runtime.timer = setTimeout(async () => { runtime.timer = null; runtime.deadlineAt = null; - if (getActiveDriverCount() > 0) { + const activity = getActivitySnapshot(); + if (activity.totalActive > 0) { + logger.info('Idle automation skipped; active control detected', activity); return; } runtime.lastTriggeredAt = Date.now(); @@ -48,7 +63,8 @@ function scheduleIdleTimer() { } function refreshIdleState() { - if (getActiveDriverCount() > 0) { + const activity = getActivitySnapshot(); + if (activity.totalActive > 0) { clearIdleTimer(); return; }