Merge pull request #1452 from Rohilalala/fix/e-transit-heading-north

fix(transit): show a reported 359.6° bearing as hdg 0°, not hdg 360°
This commit is contained in:
Sameh Khamis authored and GitHub committed 2026-11-01 21:04:18 -08:00
commit 07094d9be2
4 files changed
+22 -2

No files matched your search

@@ -0,0 +1,3 @@
- Show a transit vehicle's reported bearing of 359.5° or more as 0°. The
selected-vehicle card rounded it without wrapping, so a bus heading 359.6°
read "reported hdg 360°" (Aditya, @Rohilalala, #1452).
+3 -1
View File
@@ -4488,7 +4488,9 @@ to 0.45 at two minutes, 0.20 at ten minutes and 0.08 at fifteen minutes.
display delay and newest-report age, reported speed/stop, vehicle ID, and display delay and newest-report age, reported speed/stop, vehicle ID, and
available trail duration. Report age is rounded to whole seconds and stays in seconds while that rounded available trail duration. Report age is rounded to whole seconds and stays in seconds while that rounded
count is below 90; otherwise it shows completed minutes calculated from the count is below 90; otherwise it shows completed minutes calculated from the
rounded second count. Its anchor follows the rendered marker; text is rounded second count. The reported heading wraps after rounding to whole
degrees, so a bearing of 359.5° or more reads `hdg 0°` rather than `hdg 360°`.
Its anchor follows the rendered marker; text is
checked at 4 Hz and published when it changes. DETECT labels retain route, checked at 4 Hz and published when it changes. DETECT labels retain route,
mode and motion, with the selected label suppressed beside its fuller card. mode and motion, with the selected label suppressed beside its fuller card.
Candidate membership changes on revisions, coalesced at 4 Hz; paints read Candidate membership changes on revisions, coalesced at 4 Hz; paints read
+4 -1
View File
@@ -405,9 +405,12 @@ export function buildTransitSelectionCopy(
reportedMotion.push( reportedMotion.push(
t('reported {speed} km/h', { speed: Math.round(record.speedMps * 3.6) }), t('reported {speed} km/h', { speed: Math.round(record.speedMps * 3.6) }),
); );
// 359.5° and above rounds to north; modulo keeps it from printing 360°.
if (Number.isFinite(record.bearing)) if (Number.isFinite(record.bearing))
reportedMotion.push( reportedMotion.push(
t('reported hdg {heading}°', { heading: Math.round(record.bearing) }), t('reported hdg {heading}°', {
heading: Math.round(record.bearing) % 360,
}),
); );
// The operator's own claim, kept as a REPORT rather than as the live state. // The operator's own claim, kept as a REPORT rather than as the live state.
// It describes the moment of the report, which the display may not have // It describes the moment of the report, which the display may not have
+12
View File
@@ -43,6 +43,18 @@ test('the selection card calls a Toronto 501 a streetcar', () => {
assert.doesNotMatch(copy.details.join(' | '), /Tram/); assert.doesNotMatch(copy.details.join(' | '), /Tram/);
}); });
test('the selection card reads a bearing that rounds to north as hdg 0°', () => {
const hdg = (bearing) =>
buildTransitSelectionCopy(
ttc(),
{ id: '4400', routeId: '501', timestamp: 0, bearing },
'tram',
0,
).details.find((line) => line.includes('hdg'));
assert.equal(hdg(359.4), 'reported hdg 359°');
assert.equal(hdg(359.6), 'reported hdg 0°');
});
test('detection labels carry the operator vocabulary within the field width', () => { test('detection labels carry the operator vocabulary within the field width', () => {
const klass = transitDetectionClass('tram', ttc()); const klass = transitDetectionClass('tram', ttc());
assert.equal(klass, 'STREETCAR TTC'); assert.equal(klass, 'STREETCAR TTC');