- {logs.length === 0 ? (
-
No log entries yet.
- ) : (
- logs
- .slice()
- .reverse()
- .map((entry) => (
-
- {entry.timestamp}{' '}
- [{entry.level}]{' '}
- {entry.label && [{entry.label}]}{' '}
- {entry.message}
-
- ))
- )}
+
+
+ Telemetry
+ {updated ? `Updated ${updated}` : 'Waiting...'}
-
+
+ {entries.map(([label, value]) => (
+
+ {label}
+ {value}
+
+ ))}
+
+
);
}
-function formatSensors(sensors = {}) {
- return Object.entries(sensors).map(([key, value]) => ({
- key,
- value: typeof value === 'object' ? JSON.stringify(value) : value,
- }));
+function CurrentDriverBadge({ roverId, session }) {
+ const activeDriverId = session?.activeDrivers?.[roverId] || null;
+ const user = (session?.users || []).find((entry) => entry.socketId === activeDriverId);
+ const label = user?.nickname || (activeDriverId ? activeDriverId.slice(0, 6) : 'No driver');
+ const mode = session?.mode;
+ const turnInfo = session?.turnQueues?.[roverId];
+ const driverText = mode === 'turns' && turnInfo?.current ? `Driver: ${label} (turns)` : `Driver: ${label}`;
+
+ return (
+
+ {driverText}
+
+ );
}
-function RoverSpectatorCard({ rover, frame, videoInfo }) {
- const sensorList = formatSensors(frame?.sensors);
+function RoverSpectatorCard({ rover, frame, videoInfo, session }) {
return (
-
);
}
+function RoverRow({ roster, frames, videoSources, session }) {
+ if (roster.length === 0) {
+ return
No rovers registered.
;
+ }
+ return (
+
+ {roster.map((rover) => (
+
+ ))}
+
+ );
+}
+
+function SecondaryRow() {
+ return (
+
+ );
+}
+
+function LogsRow() {
+ return (
+
+
+
+ );
+}
+
export default function SpectatorApp() {
- const { connected, session, logs } = useSession();
+ const { connected, session } = useSession();
const spectatorReady = useSpectatorMode();
const frames = useTelemetryFrames();
const roster = session?.roster ?? [];
const videoSources = useVideoRequests(roster.map((rover) => rover.id));
+ const blocked = session?.mode === 'lockdown';
const status = useMemo(
- () => ({ connected, ready: spectatorReady, rosterCount: roster.length }),
- [connected, spectatorReady, roster.length],
+ () => ({ connected, ready: spectatorReady, rosterCount: roster.length, mode: session?.mode, blocked }),
+ [blocked, connected, roster.length, session?.mode, spectatorReady],
);
return (
-
-
-
-
- {roster.length === 0 ? (
- No rovers registered.
- ) : (
- roster.map((rover) => (
-
- ))
- )}
-
-
-
-
+
+
+
+
+ Spectator Console
+ Live rover telemetry & logs. This view is read-only.
+
+ {blocked && (
+ Lockdown active. Spectator view will resume automatically when access returns.
+ )}
+
+
+
+
+
+
+
);
}