Round every heading readout through one shared helper

The transit, ALPR, vessel, CCTV and flight/military context fixes each
wrapped 359.5° to north with an inline Math.round(x) % 360. They now call
roundHeadingDegrees in src/data/headingDegrees.js, which also wraps negative
and multi-turn bearings. normalizeHeading moves there with it, and
cockpitMath re-exports it so existing imports keep working. It now adds a
turn only to a negative remainder, so a bearing just under half a degree
keeps its precision.

The awareness, Local ADS-B, cockpit wind, cockpit heading and Street Level
readouts use the same helper. The Cockpit's TRACK ACQUIRED signal rounded
without wrapping and could read COURSE 360°; it now uses
formatHeadingReadout, which shows --- for a track that is not finite.
This commit is contained in:
Sameh Khamis committed 2026-11-01 21:41:49 -08:00
1 parent e200e46695
commit 0e90a03de7
21 files changed
+128 -36

No files matched your search

+2 -1
View File
@@ -1180,5 +1180,6 @@
"src/testSupport/hudReadouts.mjs",
"src/ui/stores/firstRun.js",
"src/firstRunLauncherView.test.mjs",
"src/firstRunCopy.js"
"src/firstRunCopy.js",
"src/data/headingDegrees.test.mjs"
]
+14
View File
@@ -745,6 +745,7 @@
"cctv-controls": {
"exports": ["./ui/cctv"],
"modules": [
"src/data/headingDegrees.js",
"src/ui/cctv.js",
"src/ui/cctvBindings.js",
"src/ui/cctvCalibration.js",
@@ -814,6 +815,7 @@
"./ui/cockpit/vision"
],
"modules": [
"src/data/headingDegrees.js",
"src/ui/cockpit.js",
"src/ui/cockpitBriefing.js",
"src/ui/cockpitBriefPages.js",
@@ -883,6 +885,7 @@
"ui-shell": {
"exports": ["./ui/shell"],
"modules": [
"src/data/headingDegrees.js",
"src/i18n/marker.js",
"src/ui/mobileShell.js",
"src/exclusiveSurfaces.js",
@@ -1253,6 +1256,7 @@
"civil-flights": {
"exports": ["./layers/flights"],
"modules": [
"src/data/headingDegrees.js",
"src/i18n/marker.js",
"src/cyberSonar.js",
"src/data/aircraftClass.js",
@@ -1315,6 +1319,7 @@
"military-flights": {
"exports": ["./layers/military"],
"modules": [
"src/data/headingDegrees.js",
"src/i18n/marker.js",
"src/cyberSonar.js",
"src/data/aircraftClass.js",
@@ -1400,6 +1405,7 @@
"vessel-layer": {
"exports": ["./layers/vessels"],
"modules": [
"src/data/headingDegrees.js",
"src/layers/vessels/cards.js",
"src/layers/vessels/evidence.js",
"src/layers/vessels/index.js",
@@ -1645,6 +1651,7 @@
"awareness-layer": {
"exports": ["./layers/awareness"],
"modules": [
"src/data/headingDegrees.js",
"src/i18n/marker.js",
"src/cyberSonar.js",
"src/cockpitMath.js",
@@ -1783,6 +1790,7 @@
"cctv-layer": {
"exports": ["./layers/cctv"],
"modules": [
"src/data/headingDegrees.js",
"src/data/cctvCards.js",
"src/data/cctvGizmo.js",
"src/data/cctvLod.js",
@@ -1911,6 +1919,7 @@
"alpr-cameras": {
"exports": ["./layers/alpr"],
"modules": [
"src/data/headingDegrees.js",
"src/layers/alpr/index.js",
"src/layers/alpr/model.js",
"src/layers/alpr/policy.js",
@@ -2189,6 +2198,7 @@
"./standalone/catalog"
],
"modules": [
"src/data/headingDegrees.js",
"src/ui/placeNames.js",
"src/cyberSonarScene.js",
"src/cyberSonar.js",
@@ -3163,6 +3173,7 @@
"application-layer-construction": {
"exports": ["./application/layers"],
"modules": [
"src/data/headingDegrees.js",
"src/cyberSonar.js",
"src/data/approxDistance.js",
"src/data/bhoteKoshiEvent.js",
@@ -4319,6 +4330,7 @@
"transit-standalone": {
"exports": ["./layers/transit/standalone"],
"modules": [
"src/data/headingDegrees.js",
"src/cyberSonar.js",
"src/celestialRing.js",
"src/data/approxDistance.js",
@@ -4396,6 +4408,7 @@
"transit-layer": {
"exports": ["./layers/transit"],
"modules": [
"src/data/headingDegrees.js",
"src/data/iconOrientation.js",
"src/data/inputOwnership.js",
"src/data/transitFeeds.js",
@@ -4623,6 +4636,7 @@
"tools": {
"exports": ["./tools"],
"modules": [
"src/data/headingDegrees.js",
"src/tools/index.js",
"src/tools/catalog.js",
"src/tools/schema.js",