fix(voice): leave out an unreported altitude instead of saying 0 feet

select_nearest_aircraft passes altitudeM: null for an airborne contact
without a barometric altitude (military rows from adsb.lol can lack
alt_baro). The speech builder coerced it with Number(), and Number(null)
is 0, so the reply said "..., 0 feet." and the voice card showed
"Altitude 0 feet". Read the altitude only when it is a finite number,
so an unknown one is left out as the builder already intends.
This commit is contained in:
Aditya committed 2026-10-27 15:54:36 +05:30
1 parent 15de9d738c
commit ea1b0d8d55
3 files changed
+19 -3

No files matched your search

+2
View File
@@ -5115,6 +5115,8 @@ and unreachable upstream (502/504) separately from road geometry.
cannot race the nearest-aircraft query ahead of layer enablement. A healthy fallback feed is cannot race the nearest-aircraft query ahead of layer enablement. A healthy fallback feed is
queried normally and its source is returned with the selection; fallback with queried normally and its source is returned with the selection; fallback with
no airborne records remains an honest no-data result, not an enable failure. no airborne records remains an honest no-data result, not an enable failure.
The spoken reply and the card leave out an altitude the feed did not report
rather than reading it as 0 feet.
- Voice treats the parent Context panel and Contacts as separate intents. An - Voice treats the parent Context panel and Contacts as separate intents. An
explicit request to open Context expands only `global-context-panel`; it does explicit request to open Context expands only `global-context-panel`; it does
not choose a mode. An explicit request to open Contacts expands that parent not choose a mode. An explicit request to open Contacts expands that parent
+3 -3
View File
@@ -74,9 +74,9 @@ function listPhrase(items) {
} }
function feetRounded(meters) { function feetRounded(meters) {
const value = Number(meters); // A missing altitude is unknown, not sea level: Number(null) is 0.
return Number.isFinite(value) return Number.isFinite(meters)
? Math.round((value * 3.28084) / 100) * 100 ? Math.round((meters * 3.28084) / 100) * 100
: null; : null;
} }
+14
View File
@@ -217,6 +217,20 @@ test('nearest-aircraft results name the aircraft, distance and altitude briefly'
assert.equal(stale.say, 'Selected AAL1, 3.3 km from Austin, stale.'); assert.equal(stale.say, 'Selected AAL1, 3.3 km from Austin, stale.');
}); });
test('nearest-aircraft results leave out an altitude the feed did not report', () => {
// gevActions sends `altitudeM: null` for an airborne military contact
// without a barometric altitude; that is unknown, not sea level.
const unknown = envelope('select_nearest_aircraft', {
ok: true,
location: 'Ramstein',
layerId: 'military',
feed: { state: 'nominal' },
aircraft: { callsign: 'RCH123', altitudeM: null, distanceKm: 8.2 },
});
assert.equal(unknown.say, 'Selected RCH123, 8.2 km from Ramstein.');
assert.deepEqual(unknown.display.lines, ['8.2\u00a0km from Ramstein']);
});
test('frame_overhead keeps the essential scope audible and lists referents', () => { test('frame_overhead keeps the essential scope audible and lists referents', () => {
const framed = envelope('frame_overhead', { const framed = envelope('frame_overhead', {
ok: true, ok: true,