roverdometer

This commit is contained in:
legop3
2026-06-19 16:37:47 -04:00
parent 39bb53104e
commit 3bad454e0d
13 changed files with 726 additions and 32 deletions
+18
View File
@@ -5,6 +5,7 @@ const io = require('../../globals/io');
const logger = require('../../globals/logger').child('roverManager');
const { sendAlert } = require('../alertService');
const { parseSensorFrame } = require('../../helpers/sensorDecoder');
const odometerService = require('../odometerService');
const { MODES, getMode } = require('../modeManager');
const { isAdmin, isLockdownAdmin, roleEvents } = require('../roleService');
const { publishEvent } = require('../eventBus');
@@ -174,6 +175,7 @@ const sensorPipeline = createSensorPipeline({
ALERT_COLOR,
sendAlert,
publishEvent,
processOdometerFrame: odometerService.processSensorFrame,
isPrivateRecord,
isPrivateOpen,
getPrivateSafety,
@@ -197,6 +199,11 @@ function canReplayRoverId(roverId, socket = null) {
return socket ? isRoverVisibleToSocket(record, socket) : false;
}
function getOdometersForSocket(socket) {
const visibleIds = getRosterForSocket(socket).map((entry) => entry.id);
return odometerService.getSnapshots(visibleIds);
}
roleEvents.on('change', ({ socket, role }) => {
if (role === 'spectator') {
enableSpectator(socket);
@@ -231,6 +238,16 @@ registerSocketHandlers({
setPrivateOpen,
lockRover,
setPrivateSafety,
getOdometersForSocket,
});
odometerService.odometerEvents.on('update', ({ roverId, odometer }) => {
io.sockets.sockets.forEach((socket) => {
const record = rovers.get(String(roverId));
if (isRoverVisibleToSocket(record, socket)) {
socket.volatile.emit('odometer:update', { roverId, odometer });
}
});
});
setInterval(tickPrivateAutoClose, PRIVATE_AUTO_CLOSE_TICK_MS);
@@ -262,4 +279,5 @@ module.exports = {
canRequestControl,
applyPrivateDriveSafety,
canReplayRoverId,
getOdometersForSocket,
};
@@ -29,6 +29,7 @@ function createSensorPipeline(deps) {
ALERT_COLOR,
sendAlert,
publishEvent,
processOdometerFrame,
isPrivateRecord,
isPrivateOpen,
getPrivateSafety,
@@ -364,6 +365,9 @@ function createSensorPipeline(deps) {
const decoded = parseSensorFrame(frame.data);
record.lastSensor = { raw: frame, decoded };
record.batteryState = computeBatteryState(record, decoded);
if (typeof processOdometerFrame === 'function') {
processOdometerFrame(roverId, decoded);
}
updateMovement(record, decoded);
const hasDockInfo = decoded?.chargingSources != null;
if (hasDockInfo) {
@@ -28,6 +28,7 @@ function registerSocketHandlers(deps) {
setPrivateOpen,
lockRover,
setPrivateSafety,
getOdometersForSocket,
} = deps;
io.on('connection', (socket) => {
@@ -177,6 +178,14 @@ function registerSocketHandlers(deps) {
cb({ success: true });
}
function handleOdometerSubscribe(_, cb = () => {}) {
try {
cb({ success: true, odometers: getOdometersForSocket(socket) });
} catch (err) {
cb({ error: err.message });
}
}
socket.on('requestControl', handleRequestControl);
socket.on('session:requestControl', handleRequestControl);
socket.on('releaseControl', handleReleaseControl);
@@ -187,6 +196,7 @@ function registerSocketHandlers(deps) {
socket.on('session:privateSafety:set', handlePrivateSafetySet);
socket.on('subscribeAll', handleSubscribeAll);
socket.on('session:subscribeAll', handleSubscribeAll);
socket.on('odometer:subscribe', handleOdometerSubscribe);
socket.on('disconnecting', () => {
logger.info('Socket disconnecting', socket.id);