# ironicbadger/esp32-plane-radar architecture

> Architecture diagram of the GitHub repository ironicbadger/esp32-plane-radar, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ironicbadger/esp32-plane-radar
- Repository: https://github.com/ironicbadger/esp32-plane-radar

## Overview

Plane Radar is ESP32 firmware that guides the user from Wi-Fi setup to a live, location-centered aircraft radar. The main loop manages connectivity and refresh timing, fetches ADS-B traffic, enriches aircraft details, and refreshes the display; settings persist across reboots, while weather and local time feed the footer. The README also documents browser-based configuration, range controls, runway overlays, and authenticated OTA. Those documented capabilities are included, though unsampled service implementations are represented only at their supported source paths; uncertain internal wiring is omitted.

Main entry points: [`src/main.cpp`](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/main.cpp) (Firmware loop), [`src/ui/radar_display.cpp`](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/radar_display.cpp) (Radar renderer), [`src/services/wifi_setup.cpp`](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/wifi_setup.cpp) (Wi-Fi portal), [`src/services/radar_location.cpp`](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/radar_location.cpp) (Radar location)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_orchestration["Device workflow"]
  node_main["Firmware loop<br/>[main.cpp]"]
end

subgraph group_setup["Setup and settings"]
  node_wifi["Wi-Fi portal<br/>[wifi_setup.cpp]"]
  node_location["Radar location<br/>[radar_location.cpp]"]
  node_settings["Display settings"]
  node_ota["OTA updates<br/>[ota_update.cpp]"]
  node_nvs[("Device preferences")]
end

subgraph group_services["Live data services"]
  node_adsb["ADS-B client<br/>[adsb_client.cpp]"]
  node_enrichment["Flight enrichment<br/>[adsb_client.cpp]"]
  node_weather["Weather and time<br/>[weather_time.cpp]"]
end

subgraph group_presentation["Radar presentation"]
  node_range["Range presets<br/>[radar_range.cpp]"]
  node_radar["Radar renderer<br/>[radar_display.cpp]"]
  node_runways["Runway overlay<br/>[runway_overlay.cpp]"]
  node_airportdata["Airport data"]
  node_display["Display driver<br/>[display.cpp]"]
  node_font["Display fonts<br/>[display_font.cpp]"]
  node_status["Status screens<br/>[status_screens.cpp]"]
end

node_user(("Device user"))
node_adsbfi["adsb.fi"]
node_adsbdb["ADSBDB"]
node_openmeteo["Open-Meteo"]
node_ntp["NTP time"]
node_browser(("Browser"))

node_user -->|"powers and controls"| node_main
node_main -->|"connects and polls"| node_wifi
node_main -->|"initializes and reads"| node_location
node_main -->|"initializes"| node_settings
node_main -->|"initializes and advances"| node_range
node_main -->|"checks update state"| node_ota
node_main -->|"fetches and enriches"| node_adsb
node_main -->|"starts and refreshes"| node_weather
node_main -->|"draws and refreshes"| node_radar
node_main -->|"shows setup status"| node_status
node_browser -->|"configures device"| node_wifi
node_wifi -->|"saves coordinates"| node_location
node_wifi -->|"saves options"| node_settings
node_wifi -->|"saves runway option"| node_range
node_wifi -->|"sets password"| node_ota
node_wifi -->|"persists configuration"| node_nvs
node_location -->|"reads and writes"| node_nvs
node_settings -->|"reads and writes"| node_nvs
node_range -->|"persists preset"| node_nvs
node_adsb -->|"requests traffic"| node_adsbfi
node_adsb -->|"queues aircraft details"| node_enrichment
node_enrichment -->|"looks up routes and types"| node_adsbdb
node_adsb -->|"provides aircraft list"| node_radar
node_enrichment -->|"updates aircraft details"| node_radar
node_location -->|"supplies center"| node_adsb
node_range -->|"supplies fetch radius"| node_adsb
node_weather -->|"fetches conditions"| node_openmeteo
node_weather -->|"synchronizes clock"| node_ntp
node_location -->|"supplies coordinates"| node_weather
node_weather -->|"provides footer data"| node_radar
node_settings -->|"supplies display options"| node_radar
node_range -->|"supplies active scale"| node_radar
node_radar -->|"draws overlay"| node_runways
node_runways -->|"reads airport and runway data"| node_airportdata
node_location -->|"supplies radar center"| node_runways
node_range -->|"supplies radius"| node_runways
node_settings -->|"supplies overlay and text options"| node_runways
node_radar -->|"renders frames"| node_display
node_status -->|"renders screens"| node_display
node_radar -->|"selects text rendering"| node_font
node_runways -->|"selects label rendering"| node_font
node_ota -->|"reads credentials"| node_nvs

click node_main "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/main.cpp"
click node_wifi "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/wifi_setup.cpp"
click node_location "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/radar_location.cpp"
click node_settings "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/display_settings.cpp"
click node_range "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/radar_range.cpp"
click node_ota "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/ota_update.cpp"
click node_adsb "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/adsb_client.cpp"
click node_enrichment "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/adsb_client.cpp"
click node_weather "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/weather_time.cpp"
click node_radar "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/radar_display.cpp"
click node_runways "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/runway_overlay.cpp"
click node_airportdata "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/data/large_airports_data.cpp"
click node_display "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/hardware/display.cpp"
click node_font "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/hardware/display_font.cpp"
click node_status "https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/status_screens.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_user,node_browser toneBlue
class node_wifi,node_location,node_settings,node_ota,node_nvs toneAmber
class node_adsb,node_enrichment,node_weather toneMint
class node_range,node_radar,node_runways,node_airportdata,node_display,node_font,node_status toneRose
class node_adsbfi,node_adsbdb,node_openmeteo,node_ntp toneIndigo
```

## Components

### Device workflow

- [Firmware loop](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/main.cpp): `src/main.cpp`

### Setup and settings

- [Wi-Fi portal](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/wifi_setup.cpp): `src/services/wifi_setup.cpp`
- [Radar location](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/radar_location.cpp): `src/services/radar_location.cpp`
- [Display settings](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/display_settings.cpp): `src/services/display_settings.cpp`
- [OTA updates](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/ota_update.cpp): `src/services/ota_update.cpp`
- **Device preferences**

### Live data services

- [ADS-B client](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/adsb_client.cpp): `src/services/adsb_client.cpp`
- [Flight enrichment](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/adsb_client.cpp): `src/services/adsb_client.cpp`
- [Weather and time](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/services/weather_time.cpp): `src/services/weather_time.cpp`

### Radar presentation

- [Range presets](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/radar_range.cpp): `src/ui/radar_range.cpp`
- [Radar renderer](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/radar_display.cpp): `src/ui/radar_display.cpp`
- [Runway overlay](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/runway_overlay.cpp): `src/ui/runway_overlay.cpp`
- [Airport data](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/data/large_airports_data.cpp): `src/data/large_airports_data.cpp`
- [Display driver](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/hardware/display.cpp): `src/hardware/display.cpp`
- [Display fonts](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/hardware/display_font.cpp): `src/hardware/display_font.cpp`
- [Status screens](https://github.com/ironicbadger/esp32-plane-radar/blob/main/src/ui/status_screens.cpp): `src/ui/status_screens.cpp`

### Other components

- **Device user**
- **adsb.fi**
- **ADSBDB**
- **Open-Meteo**
- **NTP time**
- **Browser**

## Connections

- Device user → Firmware loop: powers and controls
- Firmware loop → Wi-Fi portal: connects and polls
- Firmware loop → Radar location: initializes and reads
- Firmware loop → Display settings: initializes
- Firmware loop → Range presets: initializes and advances
- Firmware loop → OTA updates: checks update state
- Firmware loop → ADS-B client: fetches and enriches
- Firmware loop → Weather and time: starts and refreshes
- Firmware loop → Radar renderer: draws and refreshes
- Firmware loop → Status screens: shows setup status
- Browser → Wi-Fi portal: configures device
- Wi-Fi portal → Radar location: saves coordinates
- Wi-Fi portal → Display settings: saves options
- Wi-Fi portal → Range presets: saves runway option
- Wi-Fi portal → OTA updates: sets password
- Wi-Fi portal → Device preferences: persists configuration
- Radar location → Device preferences: reads and writes
- Display settings → Device preferences: reads and writes
- Range presets → Device preferences: persists preset
- ADS-B client → adsb.fi: requests traffic
- ADS-B client → Flight enrichment: queues aircraft details
- Flight enrichment → ADSBDB: looks up routes and types
- ADS-B client → Radar renderer: provides aircraft list
- Flight enrichment → Radar renderer: updates aircraft details
- Radar location → ADS-B client: supplies center
- Range presets → ADS-B client: supplies fetch radius
- Weather and time → Open-Meteo: fetches conditions
- Weather and time → NTP time: synchronizes clock
- Radar location → Weather and time: supplies coordinates
- Weather and time → Radar renderer: provides footer data
- Display settings → Radar renderer: supplies display options
- Range presets → Radar renderer: supplies active scale
- Radar renderer → Runway overlay: draws overlay
- Runway overlay → Airport data: reads airport and runway data
- Radar location → Runway overlay: supplies radar center
- Range presets → Runway overlay: supplies radius
- Display settings → Runway overlay: supplies overlay and text options
- Radar renderer → Display driver: renders frames
- Status screens → Display driver: renders screens
- Radar renderer → Display fonts: selects text rendering
- Runway overlay → Display fonts: selects label rendering
- OTA updates → Device preferences: reads credentials
