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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -11,8 +11,8 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
<title>Multi Roomba Rover</title>
<script type="module" crossorigin src="/assets/index-sxx9hCHI.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-VF8LslAQ.css">
<script type="module" crossorigin src="/assets/index-DCabXYAC.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-lg9md4T4.css">
</head>
<body>
<div id="root"></div>
@@ -17,6 +17,10 @@ function handleMessage(roverId, msg) {
roverManager.handleSensorFrame(roverId, msg);
break;
case 'event':
if (msg.event === 'nightVision.state' && typeof msg.data?.nightVisionOn === 'boolean') {
roverManager.setNightVisionState(roverId, msg.data.nightVisionOn);
break;
}
sendAlert({ color: ALERT_COLOR, title: `${roverId} event`, message: msg.event });
break;
default:
@@ -69,7 +73,11 @@ roverWSS.on('connection', (ws) => {
} else if (msg.type === 'ack') {
handleAck(msg);
} else if (msg.type === 'event') {
sendAlert({ color: ALERT_COLOR, title: `${roverId}`, message: msg.event });
if (msg.event === 'nightVision.state' && typeof msg.data?.nightVisionOn === 'boolean') {
roverManager.setNightVisionState(roverId, msg.data.nightVisionOn);
} else {
sendAlert({ color: ALERT_COLOR, title: `${roverId}`, message: msg.event });
}
}
});
+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,