mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 17:40:46 -04:00
63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
const roverWSS = require('../globals/ws');
|
|
const logger = require('../globals/logger').child('roverConnection');
|
|
const roverManager = require('./roverManager');
|
|
const { sendAlert, COLORS } = require('./alertService');
|
|
const { handleAck } = require('./commandService');
|
|
|
|
function handleMessage(roverId, msg) {
|
|
switch (msg.type) {
|
|
case 'hello':
|
|
roverManager.upsertRover(msg, this);
|
|
sendAlert({ color: COLORS.info, title: 'Rover Connected', message: roverId });
|
|
break;
|
|
case 'sensor':
|
|
roverManager.handleSensorFrame(roverId, msg);
|
|
break;
|
|
case 'event':
|
|
sendAlert({ color: COLORS.info, title: `${roverId} event`, message: msg.event });
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
roverWSS.on('connection', (ws) => {
|
|
let roverId = null;
|
|
ws.on('message', (raw) => {
|
|
let msg;
|
|
try {
|
|
msg = JSON.parse(raw.toString());
|
|
} catch (err) {
|
|
logger.warn('Invalid rover message', err.message);
|
|
return;
|
|
}
|
|
if (msg.type === 'hello') {
|
|
roverId = msg.name;
|
|
logger.info('Received rover hello', {
|
|
roverId,
|
|
keys: Object.keys(msg),
|
|
cameraServo: msg.cameraServo,
|
|
});
|
|
roverManager.upsertRover(msg, ws);
|
|
roverManager.broadcastRoster();
|
|
sendAlert({ color: COLORS.success, title: 'Rover Online', message: roverId });
|
|
return;
|
|
}
|
|
if (!roverId) return;
|
|
if (msg.type === 'sensor') {
|
|
roverManager.handleSensorFrame(roverId, msg);
|
|
} else if (msg.type === 'ack') {
|
|
handleAck(msg);
|
|
} else if (msg.type === 'event') {
|
|
sendAlert({ color: COLORS.info, title: `${roverId}`, message: msg.event });
|
|
}
|
|
});
|
|
|
|
ws.on('close', () => {
|
|
if (roverId) {
|
|
roverManager.removeRover(roverId);
|
|
sendAlert({ color: COLORS.warn, title: 'Rover Offline', message: roverId });
|
|
}
|
|
});
|
|
});
|