mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-15 17:12:59 -04:00
removeremove
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -78,7 +78,7 @@
|
|||||||
<script defer src="https://analytics.otter.land/script.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land"></script>
|
<script defer src="https://analytics.otter.land/script.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land"></script>
|
||||||
<script defer src="https://analytics.otter.land/recorder.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land" data-sample-rate="0.15" data-mask-level="moderate" data-max-duration="300000"></script>
|
<script defer src="https://analytics.otter.land/recorder.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land" data-sample-rate="0.15" data-mask-level="moderate" data-max-duration="300000"></script>
|
||||||
<title>Roomba Rover</title>
|
<title>Roomba Rover</title>
|
||||||
<script type="module" crossorigin src="/assets/index-CNhxRpdM.js"></script>
|
<script type="module" crossorigin src="/assets/index-D_nIHtoI.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-CxLsehkZ.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-CxLsehkZ.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -32,10 +32,6 @@ function formatDistance(mm) {
|
|||||||
return `${Math.round(value)} mm`;
|
return `${Math.round(value)} mm`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatCount(value) {
|
|
||||||
return Number.isFinite(Number(value)) ? String(Math.round(Number(value))) : '--';
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatAge(timestamp, now) {
|
function formatAge(timestamp, now) {
|
||||||
const value = Number(timestamp);
|
const value = Number(timestamp);
|
||||||
if (!Number.isFinite(value)) return '--';
|
if (!Number.isFinite(value)) return '--';
|
||||||
@@ -113,10 +109,6 @@ export default function OdometerPanel() {
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<OdometerSummary odometer={primary} rover={primaryRover} now={now} />
|
<OdometerSummary odometer={primary} rover={primaryRover} now={now} />
|
||||||
<div className="grid gap-0.5 md:grid-cols-2">
|
|
||||||
<EncoderDetails odometer={primary} />
|
|
||||||
<CalibrationDetails odometer={primary} now={now} />
|
|
||||||
</div>
|
|
||||||
<RoverOdometerList rows={visibleRows} primaryRoverId={primaryRoverId} />
|
<RoverOdometerList rows={visibleRows} primaryRoverId={primaryRoverId} />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
@@ -126,17 +118,15 @@ export default function OdometerPanel() {
|
|||||||
|
|
||||||
function OdometerSummary({ odometer, rover, now }) {
|
function OdometerSummary({ odometer, rover, now }) {
|
||||||
const status = odometer?.status || 'waiting';
|
const status = odometer?.status || 'waiting';
|
||||||
const statusReason = odometer?.statusReason || 'waiting for encoder sample';
|
const ignoredSamples = Number(odometer?.ignoredSamples) || 0;
|
||||||
return (
|
return (
|
||||||
<div className="space-y-0.5">
|
<div className="space-y-0.5">
|
||||||
<div className="text-sm font-semibold text-slate-200">{roverLabel(rover)}</div>
|
<div className="text-sm font-semibold text-slate-200">{roverLabel(rover)}</div>
|
||||||
<div className="grid grid-cols-2 gap-0.5 md:grid-cols-3">
|
<div className="grid grid-cols-2 gap-0.5 md:grid-cols-3">
|
||||||
<Metric label="Total distance" value={formatDistance(odometer?.totalMm)} />
|
<Metric label="Total distance" value={formatDistance(odometer?.totalMm)} />
|
||||||
<Metric label="Session distance" value={formatDistance(odometer?.sessionMm)} />
|
|
||||||
<Metric label="Last update" value={formatAge(odometer?.updatedAt, now)} />
|
<Metric label="Last update" value={formatAge(odometer?.updatedAt, now)} />
|
||||||
<Metric label="Status" value={status} />
|
<Metric label="Status" value={status} />
|
||||||
<Metric label="Reason" value={statusReason} />
|
{ignoredSamples > 0 ? <Metric label="Ignored samples" value={String(ignoredSamples)} /> : null}
|
||||||
<Metric label="Calibration" value={`${Number(odometer?.calibrationMultiplier || 1).toFixed(3)}x`} />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -151,34 +141,6 @@ function Metric({ label, value }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function EncoderDetails({ odometer }) {
|
|
||||||
const delta = odometer?.lastDelta || null;
|
|
||||||
return (
|
|
||||||
<DetailCard title="Wheel encoders">
|
|
||||||
<ValueRow label="Left count" value={formatCount(odometer?.lastLeftCount)} />
|
|
||||||
<ValueRow label="Right count" value={formatCount(odometer?.lastRightCount)} />
|
|
||||||
<ValueRow label="Left delta" value={formatCount(delta?.leftCounts)} />
|
|
||||||
<ValueRow label="Right delta" value={formatCount(delta?.rightCounts)} />
|
|
||||||
<ValueRow label="Center delta" value={formatDistance(delta?.distanceMm)} />
|
|
||||||
<ValueRow label="Rollover events" value={formatCount(odometer?.rolloverEvents)} />
|
|
||||||
<ValueRow label="Ignored samples" value={formatCount(odometer?.ignoredSamples)} />
|
|
||||||
</DetailCard>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function CalibrationDetails({ odometer, now }) {
|
|
||||||
return (
|
|
||||||
<DetailCard title="Conversion">
|
|
||||||
<ValueRow label="Source" value="wheel encoders" />
|
|
||||||
<ValueRow label="Wheel diameter" value={`${formatCount(odometer?.wheelDiameterMm)} mm`} />
|
|
||||||
<ValueRow label="Counts per rev" value={formatCount(odometer?.countsPerRevolution)} />
|
|
||||||
<ValueRow label="Base mm per count" value={Number(odometer?.rawMmPerCount || 0).toFixed(4)} />
|
|
||||||
<ValueRow label="Active mm per count" value={Number(odometer?.mmPerCount || 0).toFixed(4)} />
|
|
||||||
<ValueRow label="Last sample" value={formatAge(odometer?.lastSampleAt, now)} />
|
|
||||||
</DetailCard>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function RoverOdometerList({ rows, primaryRoverId }) {
|
function RoverOdometerList({ rows, primaryRoverId }) {
|
||||||
if (!rows.length) return null;
|
if (!rows.length) return null;
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user