Improve transponder display and add combined signal quality indicator

**Transponder Display Improvements:**
- Simplified transponder capability labels to be more concise
- "Level 2+ Transponder" → "Level 2+"
- "Enhanced Transponder" → "Enhanced"
- "Alert/Emergency Status" → "Alert/Emergency"
- Removes redundant "Transponder" suffix for cleaner popup display

**New Signal Quality Feature:**
- Added SignalQuality field combining NACp, NACv, and SIL into human-readable assessment
- Quality levels: "Excellent", "Good", "Fair", "Poor" based on aviation standards
- Prioritizes surveillance integrity (SIL) then position accuracy (NACp)
- Automatically calculated when operational status messages (TC 31) are received
- Displayed in aircraft popup when available

**Signal Quality Algorithm:**
- **Excellent**: High integrity (SIL ≥ 2) with precise position (NACp ≥ 9)
- **Good**: Good integrity with moderate accuracy OR very high accuracy
- **Fair**: Some integrity with basic accuracy OR high accuracy without integrity
- **Poor**: Low but usable quality indicators
- **Empty**: No quality data available

**Frontend Enhancements:**
- Added "Signal Quality" row to aircraft popup
- Only displays when quality data is available
- Clean integration with existing popup layout
- Shows alongside transponder information

**Data Quality Context:**
- NACp: Position accuracy (0-11, higher = more precise location)
- NACv: Velocity accuracy (0-4, higher = more precise speed/heading)
- SIL: Surveillance integrity (0-3, higher = more reliable data)

This gives users a quick understanding of data reliability without needing
to interpret technical NACp/NACv/SIL values directly.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ole-Morten Duesund 2025-08-24 19:31:46 +02:00
commit 304b13a904
3 changed files with 77 additions and 5 deletions

View file

@ -134,6 +134,7 @@ func (a *AircraftState) MarshalJSON() ([]byte, error) {
SIL uint8 `json:"SIL"`
TransponderCapability string `json:"TransponderCapability"`
TransponderLevel uint8 `json:"TransponderLevel"`
SignalQuality string `json:"SignalQuality"`
SelectedAltitude int `json:"SelectedAltitude"`
SelectedHeading float64 `json:"SelectedHeading"`
BaroSetting float64 `json:"BaroSetting"`
@ -180,6 +181,7 @@ func (a *AircraftState) MarshalJSON() ([]byte, error) {
SIL: a.Aircraft.SIL,
TransponderCapability: a.Aircraft.TransponderCapability,
TransponderLevel: a.Aircraft.TransponderLevel,
SignalQuality: a.Aircraft.SignalQuality,
SelectedAltitude: a.Aircraft.SelectedAltitude,
SelectedHeading: a.Aircraft.SelectedHeading,
BaroSetting: a.Aircraft.BaroSetting,