3.4 KiB
radar-simulator
Museum exhibit software simulating 1940s–1960s vintage radar systems.
Project overview
This application runs as a full-screen interactive exhibit on a Geekom A8 Max (AMD Ryzen 9 8945HS, Radeon 780M GPU, Ubuntu 25.10). Visitors can explore four historical radar types by cycling through a selection screen and interacting with keyboard controls.
Four radar displays:
| # | Name | Type | Location |
|---|---|---|---|
| 1 | Chain Home | A-scope (WWII, 1940s) | RAF Ventnor, Isle of Wight |
| 2 | Marine A-Scope | A-scope (pre-PPI, manually steered dish) | Community Boating Center, Bellingham Bay WA |
| 3 | Marine Traffic Control | PPI scope | Center of Bellingham Bay WA |
| 4 | Police Boat | PPI scope (moving platform) | Taylor Dock / Boulevard Park, Bellingham Bay WA |
Tech stack
- Language: C++20
- Graphics: OpenGL 4.3 Core, GLFW, GLAD
- Text: FreeType 2
- Maps/LIDAR: GDAL (libgdal-dev)
- Database: PostgreSQL (database: radar, user: radar)
- Build: CMake
Build
mkdir -p build && cd build
cmake ..
make -j$(nproc)
The executable is build/radar_simulator.
Running
# All four radars available
./radar_simulator
# Specific radars only
./radar_simulator chain_home marine_ascope
./radar_simulator marine_traffic police_boat
If only one radar is specified, it auto-activates after 5 seconds.
Screen layout
The window is 1920×1080 and is divided into three areas:
- Left text panel (upper-left, 500 px wide): radar description and keyboard controls
- Status bar (lower-left, 500×250 px): current control values in yellow
- Scope (right side, square, full height): radar display
Keyboard controls
| Key | Action |
|---|---|
| 1 | Step forward in radar selection (or return to selection when operating) |
| 2 | Step backward in radar selection |
| ENTER | Activate selected radar |
| ESC | Exit |
| 3 / 4 | Intensity lower / higher |
| 5 / 6 | Receiver sensitivity lower / higher |
| Q / W | STC sensitivity lower / higher |
| E / R | STC range lower / higher |
| T / Y | Rain noise filter lower / higher (PPI scopes only) |
| U / I | Radiogoniometer left / right (Chain Home only) |
| O / P | Max range step down / up (all except Chain Home) |
| A / S | Range cursor lower / higher (PPI scopes only) |
| D / F | Bearing cursor CCW / CW (PPI scopes only) |
| G / H | Antenna rotation CCW / CW (Marine A-Scope only) |
Component .md files
Each component has a specification and status file:
01_classes.md— class hierarchy (RadarBase + 4 subclasses; stubs built)02_text_description.md— text renderer and left-panel text content (complete)03_setup_and_radar_selection.md— startup, selection loop, main render loop (complete)
Current build state
The initialization and radar-management infrastructure is complete:
- Four stub radar subclasses render description text, keyboard control lists, and current control values in the status bar.
- The scope area shows the radar name with a
[stub]label — no actual radar simulation is drawn yet. - All keyboard controls update CPU globals; uniforms will be pushed to shaders as each scope component is built.
Real radar scope rendering (sweep, targets, graticule, range rings/ticks, terrain, P7 phosphor persistence) will be added one radar at a time.