stateful night vision rework

This commit is contained in:
legop3
2026-01-28 13:45:01 -05:00
parent f3cc73f178
commit 7e850dab22
20 changed files with 384 additions and 176 deletions
+24 -1
View File
@@ -37,6 +37,7 @@ function ensureRecord(id) {
locked: false,
lockReason: null,
batteryState: null,
nightVisionState: null,
room: `rover:${id}`,
lastSeen: Date.now(),
lastMovementAt: Date.now(),
@@ -57,6 +58,13 @@ function upsertRover(meta, ws) {
record.meta = meta;
record.ws = ws;
record.lastSeen = Date.now();
if (record.nightVisionState == null && meta?.nightVision?.enabled) {
const ledOn = Boolean(meta.nightVision.initialOn);
record.nightVisionState = {
nightVisionOn: !ledOn,
updatedAt: Date.now(),
};
}
rovers.set(id, record);
spectatorSockets.forEach((socketId) => {
const sock = io.sockets.sockets.get(socketId);
@@ -143,7 +151,9 @@ function getRoster() {
media: record.meta?.media,
cameraServo: record.meta?.cameraServo,
audio: record.meta?.audio,
nightVision: record.meta?.nightVision,
nightVision: record.meta?.nightVision
? { ...record.meta.nightVision, state: record.nightVisionState }
: record.meta?.nightVision,
locked: record.locked,
lockReason: record.lockReason,
lastSeen: record.lastSeen,
@@ -154,6 +164,18 @@ function broadcastRoster() {
io.emit('rovers', getRoster());
}
function setNightVisionState(roverId, nightVisionOn) {
const record = rovers.get(roverId);
if (!record) return;
if (typeof nightVisionOn !== 'boolean') return;
record.nightVisionState = {
nightVisionOn,
updatedAt: Date.now(),
};
broadcastRoster();
managerEvents.emit('rover', { roverId, action: 'nightVision', record });
}
function computeBatteryState(record, sensors) {
if (!record) return null;
if (!sensors) return record.batteryState;
@@ -557,6 +579,7 @@ module.exports = {
lockRover,
getRoster,
broadcastRoster,
setNightVisionState,
handleSensorFrame,
requestControl,
releaseControl,