Frequency Changes - msupino/NavigationApp GitHub Wiki

๐Ÿ‡ฎ๐Ÿ‡ฑ ืขื‘ืจื™ืช

Frequency Changes

NavAid can mark reporting points where an ATC frequency change is expected and can attach an editable frequency callout to matching route waypoints.

View-layer toggle

Use Map โ†’ Show/Add Freq Changes.

  • The layer is on by default.
  • A frequency change is announced by its lightning callout, which carries the frequency. The red ring the points once wore is off (commChangeRings): a ringed circle now means a hotspot.
  • A frequency-change point carries the chart's magenta dot (commChangeDot, commChangeDotColor), on the CVFR and Low Alt charts alike.
  • Zoomed out, the ring, arrow and text can shrink with the other chart symbols, and the layer can be hidden below a zoom of its own (commChangeMinZoom). See The map.
  • Turning the layer off hides the linked callouts without deleting route data.
  • Turning it back on restores existing callouts and seeds missing callouts for matching route waypoints.

Lightning callouts

When a route waypoint is snapped to, or within about 18 px of, a known comm-change point, NavAid creates a large black lightning-style callout:

  • The pointed end sits outside the waypoint circle so the waypoint remains selectable independently.
  • The far tail can be dragged around the waypoint to rotate the callout and move it nearer or farther.
  • The call sign is drawn above the line and the frequency below it, aligned to the callout rotation.
  • Deleting the route waypoint deletes its linked frequency callout.
  • Deleting the frequency callout does not delete the route waypoint.
  • Moving the waypoint away from the known comm-change location removes the linked callout.

These callouts are saved inside navaid.route as note entries tagged with cc, plus editable freqName and freq fields.

Which station: by the leg actually flown

A point served by two stations names the one for the direction flown, from the waypoint drawn next (its routeHints). That holds even when the published corridor to that waypoint crosses another comm-change point on the way โ€” NMASD southbound (next NITZA, via ZDAFA) is Hagav North 128.35, northbound (next ZASHD) Palmachim 135.55. Before October 2026 the corridor's in-between point cut the look-ahead short, and southbound fell to Palmachim, the frequency already in use since TYONA.

Reversing a route

Reverse works every callout out again for the new direction, because the station a point calls depends on which way it is flown (reversing LLIB โ†’ LLHZ gives ZMGID Pluto East, not the southbound Pluto West). A station you picked by hand stays exactly as you chose it.

When no callout is seeded

A callout marks a radio call you actually make, so two cases stay silent:

  • The frequency is already in effect from an earlier point on the route โ€” however many waypoints back that was. Crossing another point served by the same station calls for nothing on the radio. A callout you hand-edited counts as what is in effect, exactly as it reads on screen; suppressing one by hand hides the note, not the frequency, so later points still compare against it. This applies where the station at the point is certain: a direction hint matches the leg flown, or the point publishes only one station. At a point with several stations and no matching hint the app's pick is a guess, and it is shown rather than hidden.
  • The turning point โ€” you leave on the frequency you arrived on, so none is seeded and none can be added there: Add frequency change is dimmed with that reason on it, and Z does nothing.

Inspector

Select a frequency callout to edit it in the inspector.

Field Meaning
Waypoint The reporting point / route waypoint name.
Call sign Dropdown of allowed call signs for that waypoint.
Frequency Editable frequency. Choosing a call sign fills the default primary frequency, but you can override it. A Default row shows the catalog default whenever the current value differs, and a โ†ป button resets the field back to that default.

The frequency field is a validated numeric MHz input: it accepts 118.000 โ€“ 136.975 (3-digit MHz, up to 3 decimals) and flags anything out of range as invalid instead of saving it.

In Hebrew, call-sign choices use the Hebrew label from the catalog when available.

A frequency a NOTAM changed

When an active NOTAM states a new frequency in so many words, NavAid uses it. Not in a row beside the published one โ€” in the field's own row, ringed red:

Primary     125.60  โ†ป      โ† ringed; title: NOTAM C1574/26 ยท AIP 122.20
Clearance   118.55  โ†ป      โ† ringed; title: NOTAM C1574/26 ยท AIP 121.70

Two rows for one frequency is two answers to one question, and the pilot has to work out which to call. One row, ringed, is the answer โ€” marked as not the published one. The published value is not lost: it is in the row's tooltip, beside the NOTAM id.

It behaves like every other frequency in the app. Type over it, reset it โ€” and reset returns to the frequency in force, not the one the NOTAM superseded.

It can create a row that has none. Haifa publishes no clearance frequency at all, so there is nothing to substitute into; A0685/26 installed one and the row simply appears, its tooltip reading NOTAM A0685/26 ยท not published in the AIP.

It follows the call sign, not the panel. The airfield inspector is not where a pilot reads the frequency they are about to call โ€” a waypoint's comm-change is, and it seeds itself from the airfield's call sign. So the change is applied at the call sign's template, and everything follows from one definition: the waypoint inspector, the Freq column, the map callouts, the airfield row, and every reset button among them. With C1574/26 in force, Bnei Dror and Deror offer 125.60, ringed, not 122.20.

Nothing is stored. The value is computed each time the panel is drawn, so when the NOTAM leaves the feed the frequency returns to the AIP's on its own โ€” no file to edit back, no stale number outliving the reason it was true. That is the difference between this and copying the number into airfields.json, which is what used to happen and went stale within weeks: A0680/26's 121.80 was replaced by A0685/26's 127.80 and only a person reading the feed would have known.

What is not read

The parser is narrow on purpose, because a mis-parse puts a pilot on the wrong frequency. Each pattern must name its service and its frequency in one match:

NOTAM text Read as
NEW FREQ INSTL FOR CLEARANCE โ€ฆ 127.800MHZ clearance 127.80
TWR FREQ TEMPO CHG TO 125.600MHZ tower 125.60
CLEARANCE (CPT) FREQ CHG TO 118.550MHZ clearance 118.55
TWR FREQ 122.10MHZ U/S nothing
CTC TWR ON 122.100MHZ FOR TAXI nothing
CLEARANCE FREQ 118.550MHZ NOT AVBL nothing
TWR FREQ CHG TO BE PUBLISHED AT A LATER DATE nothing

Anything not matched yields no value and keeps the older behaviour โ€” a pointer badge that names the NOTAM and opens it, so you read and decide:

โš  Frequency NOTAM: C1574/26      โ† opens that NOTAM

The badge is unaffected by any of this, and stays even when a frequency was read.

featureNotamFreqRows in the tuning gist turns the applied frequencies off; the badge remains.

Frequency defaults table

The ๐Ÿ“ก Freq table button in the toolbar Settings section opens a standalone editor for your local frequency defaults โ€” handy when a station's published frequency differs from the shipped catalog.

  • One list, grouped and sorted by ICAO, and within a code by kind: the call sign first, then Clearance and ATIS. Each row is named for its field and its service โ€” Herzliya Tower, Herzliya Clearance โ€” with the ICAO underneath, the way the charts window names a field.
  • The table scrolls sideways on a narrow screen, and says so: a fade appears on whichever side still has more of it. A row with no aerodrome of its own โ€” area control, a VOR โ€” sorts after every airport rather than in among them.
  • Columns are Override, Source, Default โ€” the value in force first, because that is what you read and what you edit, then where it came from, then what the book says it was.
  • A search box and an aerodrome dropdown beside it, the same control the NOTAM list has: every code that has rows, with its count, All first.
  • Type a new MHz value to override a call sign everywhere it is used on the map; overridden rows are highlighted and the override persists in localStorage under navaid.commFreqOverrides.
  • Each row has a โ†ป reset, and Restore originals clears every override at once (call-sign, airfield Clearance/ATIS, and VOR).
  • Overrides are validated against the same 118 โ€“ 136.975 MHz range; invalid entries are marked and not saved.
  • Because overrides are keyed by call sign (not by waypoint), changing one here updates every callout that uses that station.

What a NOTAM changes here

A frequency a NOTAM states outright is the value in force, and the table shows it that way:

Default Source Override
LLHZ Primary 122.20 NOTAM 125.60
LLHZ Clearance 121.70 NOTAM 118.55
LLHA Clearance (none published) NOTAM 127.80
LLBG Clearance 121.55 AIP 121.55
  • Default never moves. A NOTAM is a change in force today, not a new published default โ€” so the column keeps what the AIP or the catalog says, and you can see what the change replaced. Where a NOTAM created the row (Haifa publishes no clearance at all) the column is blank rather than echoing the NOTAM back as if the AIP had said it.
  • Source says where the value in force came from: AIP for anything published โ€” the aerodrome packs, the call-sign catalog, ENR 4.1 for the VORs โ€” or NOTAM, with the id in its tooltip. It is text, so it survives a print or an export. In Hebrew the AIP is ืคืžืดืช.
  • Clicking NOTAM opens that NOTAM, and only that one. The Freq table stays open behind it, so closing the NOTAM puts you back where you were.
  • Reset undoes your edit, not the NOTAM. โ†ป returns the row to the frequency in force, which is the NOTAM's while one is in force.
  • Nothing is stored: when the NOTAM leaves the feed the row returns to the published value on its own, and a row a NOTAM created stops existing.

Data source

The CVFR data lives in docs/data/cvfr-route-graph.json; LSA and helicopter layers use their matching prefixed graphs. Comm-change points are carried on the graph's nodes (commChange plus callSigns) and projected into the shape the app consumes at run time. The graph contains:

  • A call-sign catalog with primary / secondary frequencies.
  • A per-waypoint list of allowed call signs.
  • 52 current comm-change points on the CVFR graph.

The Low Alt (LSA) graph has its own: 28 frequency-change points read off the LSA chart (the legend's black triangle with a magenta dot), with the call signs from the magenta labels at each, so frequencies resolve on Low Alt too. 19 of its points are also marked compulsory.

The repo also keeps human-readable summaries:

Where the callout sits, and when it hides

The callout's label sits away from its waypoint at a fixed angle from the leg's track โ€” -230ยฐ by default (commCalloutAngleDeg, positive is left of track): behind and to the left, clear of the quarter the cumulative-time kite occupies and of the nav kite ahead. Drag a callout and it stays where you put it; the angle only decides where an untouched one starts.

While the waypoint it points at is being dragged, the callout is hidden โ€” its arrow otherwise sweeps a heavy line across the very ground the point is being dragged towards. Dragging the label itself keeps it drawn, because that is the thing being aimed. It returns the moment the drag ends.

Tuning

Open the app with ?tune=1 to preview visual constants without saving them. The frequency-callout constants include the (off by default) ring size, lightning line width, lightning bend positions, lightning rotation, arrow/tail gap, text sizes, text gap, halo settings, and the callout angle above.