headlight rework and laser addition

This commit is contained in:
legop3
2026-06-27 15:57:47 -04:00
parent 3c1b1dab6e
commit 8e322ed57b
45 changed files with 596 additions and 373 deletions
@@ -10,7 +10,7 @@ const serverTimezone = config.timezone || null;
const configuredSocials = Array.isArray(config.socials) ? config.socials : null;
const ACTIVITY_SYNC_COOLDOWN_MS = 3000;
const NIGHT_VISION_SYNC_COOLDOWN_MS = 1000;
const GPIO_TOGGLE_SYNC_COOLDOWN_MS = 1000;
const PERIODIC_SYNC_MS = 20000;
module.exports = {
@@ -19,6 +19,6 @@ module.exports = {
serverTimezone,
configuredSocials,
ACTIVITY_SYNC_COOLDOWN_MS,
NIGHT_VISION_SYNC_COOLDOWN_MS,
GPIO_TOGGLE_SYNC_COOLDOWN_MS,
PERIODIC_SYNC_MS,
};
+14 -14
View File
@@ -41,7 +41,7 @@ const {
serverTimezone,
configuredSocials,
ACTIVITY_SYNC_COOLDOWN_MS,
NIGHT_VISION_SYNC_COOLDOWN_MS,
GPIO_TOGGLE_SYNC_COOLDOWN_MS,
PERIODIC_SYNC_MS,
} = require('./constants');
const { getState, setState } = require('./state');
@@ -175,29 +175,29 @@ modeEvents.on('change', () => {
managerEvents.on('rover', (event = {}) => {
const state = getState();
if (event.action === 'nightVision') {
if (event.action === 'headlight' || event.action === 'laser') {
const now = Date.now();
const elapsed = now - state.lastNightVisionSync;
if (elapsed >= NIGHT_VISION_SYNC_COOLDOWN_MS) {
setState({ lastNightVisionSync: now });
logger.info('Night vision update; syncing all clients (immediate)');
const elapsed = now - state.lastGPIOToggleSync;
if (elapsed >= GPIO_TOGGLE_SYNC_COOLDOWN_MS) {
setState({ lastGPIOToggleSync: now });
logger.info('GPIO toggle update; syncing all clients (immediate)');
syncAll();
return;
}
if (!state.pendingNightVisionSync) {
const delay = NIGHT_VISION_SYNC_COOLDOWN_MS - elapsed;
if (!state.pendingGPIOToggleSync) {
const delay = GPIO_TOGGLE_SYNC_COOLDOWN_MS - elapsed;
const timer = setTimeout(() => {
setState({ lastNightVisionSync: Date.now(), pendingNightVisionSync: null });
logger.info('Night vision update; syncing all clients (delayed)');
setState({ lastGPIOToggleSync: Date.now(), pendingGPIOToggleSync: null });
logger.info('GPIO toggle update; syncing all clients (delayed)');
syncAll();
}, delay);
setState({ pendingNightVisionSync: timer });
setState({ pendingGPIOToggleSync: timer });
}
return;
}
if (state.pendingNightVisionSync) {
clearTimeout(state.pendingNightVisionSync);
setState({ pendingNightVisionSync: null });
if (state.pendingGPIOToggleSync) {
clearTimeout(state.pendingGPIOToggleSync);
setState({ pendingGPIOToggleSync: null });
}
logger.info('Rover roster change; syncing all clients');
syncAll();
+8 -8
View File
@@ -3,15 +3,15 @@
// Scope: Keeps runtime behavior unchanged while centralizing mutable session-sync state in one module.
let lastActivitySync = 0;
let pendingActivitySync = null;
let lastNightVisionSync = 0;
let pendingNightVisionSync = null;
let lastGPIOToggleSync = 0;
let pendingGPIOToggleSync = null;
function getState() {
return {
lastActivitySync,
pendingActivitySync,
lastNightVisionSync,
pendingNightVisionSync,
lastGPIOToggleSync,
pendingGPIOToggleSync,
};
}
@@ -22,11 +22,11 @@ function setState(patch = {}) {
if (Object.prototype.hasOwnProperty.call(patch, 'pendingActivitySync')) {
pendingActivitySync = patch.pendingActivitySync;
}
if (Object.prototype.hasOwnProperty.call(patch, 'lastNightVisionSync')) {
lastNightVisionSync = patch.lastNightVisionSync;
if (Object.prototype.hasOwnProperty.call(patch, 'lastGPIOToggleSync')) {
lastGPIOToggleSync = patch.lastGPIOToggleSync;
}
if (Object.prototype.hasOwnProperty.call(patch, 'pendingNightVisionSync')) {
pendingNightVisionSync = patch.pendingNightVisionSync;
if (Object.prototype.hasOwnProperty.call(patch, 'pendingGPIOToggleSync')) {
pendingGPIOToggleSync = patch.pendingGPIOToggleSync;
}
}