This is a project for a museum to demonstrate a simulation of a 1940's to 1960's vintage radar, including the Chain Home radar from early World War 2, marine radar, and air traffic control radar The project will be implemented on a Geekom A8 Max 32 GB RAM AMD Ryzen 9 8945HS w/ Radeon 780M Graphics We need to render to the Radeon 780M Graphics GPU Tech Stack: We are using C++20, OpenGL 4.3 Core, GLFW, GLAD, FreeType, GDAL (libgdal-dev) Compiler: is g++ (Ubuntu 15.2.0-4ubuntu4) 15.2.0 FreeType is the text type we use GDAL is used for reading the LIDAR/ENC chart files GLFW (graphics library framework) open-source, multi-platform library used to manage windows GLAD (Multi-Language GL/GLES/WGL/GLX Loader-Generator) Loads the pointers to OpenGL functions (like glDrawArrays or glCompileShader) PostgreSQL is installed. Database: radar. User: radar. Password: radar. User has full privileges on database radar. Table is target_data. Operating system details: Distributor ID: Ubuntu Description: Ubuntu 25.10 Release: 25.10 Codename: questing Use cmake for building. [DIRECTIVE: GPU ROBUSTNESS PROTOCOL] Debug Callback: Enable GL_DEBUG_OUTPUT and glDebugMessageCallback to capture driver-level warnings and errors in real-time. I will be using SSH from Windows to write code and check with claude. You may compile the code during an SSH session. Please do not try to run the code during SSH session. I will run the code while physically using the Geekom. Please add MIT license header to each file Please add Author: Mark Allyn to each file Use snake_case for variables and PascalCase for classes use #pragma once Use // for single line comments use /* */ for multiple block comments spanning multiple lines avoid using auto Summary of project: This is a museum exhibit displaying and providing interaction of vintage 1940's, 1950's, and 1960's radars. A key objective is to provide interaction and viewing of the frustrations of using radars in that era. The different radars are: Scopes in the right panel 1. A-scope for Chain Home Radar in the 1940's (first radar and could be tricky) 2. A-scope for marine radar in the 1950's (Before PPI radar); was a bit tedious to operate 3. PPI scope for marine traffic control (uses beam sweeping in all 360 degrees of rotation); Easier to use than a scope 4. PPI scope for air traffic control; similar to PPI scope for marine, but with different range 5. PPI scope on board a boat. Shows how movement of a boat affects the radar display 6. Precision Approach Radar (Two scopes; one showing horizontal movement of a plane in the glide path toward the runway, and the other showing vertical movement of a plane as it glides vertically down to the runway). Both scopes will be seen if this is selected. Please note that these scopes will not appear all at once. The selection of which scope the visitor sees is done by pressing a forward control and a reverse control to go around the loop of scopes. Also, please note that the state of the controls of each scope is independent of any other scope. Furthermore, the controls will reset when a scope is exited and then re-entered. The Text window in the left panel for descriptions of the scopes and a listing of controls Controls to affect the behavior of the scopes; (these first implemented using keyboard strokes; later when physical controls are completed, the keyboard controls will be removed) The controls will affect state variables that will be sent to the shaders as uniforms. There will be three abstracts for scopes: 1. A Scope - sweep on horizontal axis. A pulse will appear for a return. The distance from the left hand side to the pulse is the range. The height of the pulse is the strength of the return signal. The bearing is determined by manual control. The basic controls for both A Scopes include: Intensity (the overall brightness of the entire display). Sensitivity (the strength of the signal amplification of the receiver). This has nothing to do with the brightness of the pulses. This only affects the height of the pulse and the height of any noise floor. Chain Home A Scope Because the receiving antennas are very large (about 100 feet), the operator cannot physically move them. Therefore, the bearing is determined through a process called radio direction finding (RDF) using a specialized instrument known as a Radiogoniometer. The receiver towers (which were separate from the transmitter towers) featured two sets of dipole antennas mounted at right angles to one another—essentially one oriented North-South and the other East-West. The signals from these two perpendicular antennas were fed into a Radiogoniometer located in the receiver hut. Inside the device there are two fixed coils (field coils) that were mounted at right angles matching the orientation of the outdoor antennas. A third coil, the search coil, is mounted on a rotating shaft inside the two field coils. The operator would physically turn a knob to rotate the search coil. The relative strength of the signal in each antenna depended on the angle of the incoming wave. For example, a target directly to the North would produce a maximum signal in the North-South antenna and zero in the East-West antenna. The operator would look for a null point (a signal or pip weaker than the noise floor). At that point, the operator would read the bearing from a calibrated scale attached to the radiogoniometer knob. We can simulate the radiogoniometer knob that would affect the null point depending on the bearing of a target. The museum visitor could experience seeing different null points for each target. Since we do not have a physical calibrated knob, we can put the bearing as a text indicator below the A Scope. The range is 200 miles. There is also a selection for the pulse repetition frequency (PRF). A switch was used to select one of two PRFs. One is 50 pulses per second and the other is 25 pulses per second. This selection should also be indicated in the status text below the scope. We need to have a keyboard selection to cycle this selection as well as a switch on the control panel. There is a glass or plastic graticule that is etched with vertical lines representing range. This is edge-lit with incandescent lamps. Because of natural drift of period electronic components, they needed an electronic calibration, or strobe. This is a crystal oscillator which is steady and precise. The pip generated by this circuit can be moved via knob or keyboard keys and its position is indicated on the text status line below the scope. The operator aligns this pip with a target pip in order to get an accurate range to the target. Marine A Scope Marine radar frequencies allowed the use of much smaller antennas; dishes or horns. Those antennas would be mounted on the shaft of a servo motor. The servo motor would be driven by another servo that is attached to the bearing control knob on the radar console. The bearing is on a calibrated dial on the bearing control knob. We can simulate the bearing knob that would affect the simulated pointing of the dish antenna. The museum visitor could experience seeing different pips appear as they rotate the antenna toward them. Likewise the pips would disappear as the antenna is rotated away. The range is indicated at how far the pip is from the left hand side of the scope which is the location of the radar transmitter. If the target goes further away, the pip will move to the right. If the target comes close to you, the pip will move left. This pip has a finite rise time as the transmitter starts. The width is set by the modulator stage in the transmitter. Following the width, the pip has a finite fall time as the transmitter stops. This creates a curved waveform; not just a line. Here is some information on the pulse width for these old A Scope Marine Radars. There is a switch that selects two pulse widths. Option 1 is Short Pulse (0.1 microsecond) for harbor navigation and Option 2 is Long Pulse (1 microsecond) for open sea detection. We need to implement this control. Perhaps a single keyboard key or single physical button. Range and range lines on graticule Please note that the graticules are plastic overlays over the screen. They need to be removed and replaced when the operator changes the maximum range. This can be simulated with the graticule being lifted toward the top of the scope as it is removed. Then the new graticule would be slid down until it covers the scope. The graticule will be edge-lit with an incandescent lamp. Here is a table of the available ranges and what markings will be on the plastic graticule. 1. 1.5 miles; markers every 0.25 miles 2. 3.0 miles; markers every 0.5 miles 3. 6.0 miles; markers every 1.0 miles 4. 12.0 miles; markers every 2.0 miles There would be four available plastic overlays. Range can be selected with two keyboard keys or two buttons on the panel, and is indicated in the text status panel below the scope. Please note that the range setting and the pulse width are separate controls. There are two reasons. 1. Target discrimination and detection. Short pulse results in better range resolution while a longer pulse width results in better detection of distant and weak targets. 2. Magnetron Duty Cycle. Too much time with long pulse width can put a strain on the magnetron. 2. PPI Scope - still being worked 3. PAR Scope - still being worked