Интерактивное C++ приложение для сбора телеметрии и визуализации перемещений на картах OpenStreetMap.
Проект был отрефакторен и разделен на независимые модули по принципу «Единой ответственности» (Single Responsibility). Это позволяет легко менять один компонент (например, интерфейс), не ломая логику сети или базы данных.
Самый легковесный файл в проекте. Его единственная задача — создать объекты модулей, связать их друг с другом, запустить фоновые потоки и стартовать главный цикл отрисовки графики.
Заменяет глобальные переменные. Это thread-safe контейнер, который хранит векторы с координатами, историю PCI/RSRP и статус приложения. Все модули получают ссылку AppState& и читают/пишут данные через защищенные мьютексы (std::mutex), что исключает состояние гонки (race conditions).
Отвечает за общение с внешним миром (Android-смартфоном).
- Поднимает сервер на сокетах ZeroMQ (
tcp://*:5555). - Принимает JSON-пакеты телеметрии.
- Записывает сырые данные в бэкап-файл
gps_track_log.json. - Распарсенные данные аккуратно складывает в
AppStateи передает вDatabase. - Работает в отдельном фоновом потоке (
std::thread), чтобы не блокировать и не тормозить графический интерфейс.
Инкапсулирует всю логику работы с PostgreSQL (libpq).
- Динамически генерирует безопасные SQL-запросы
INSERTна основе прилетевшего JSON с телеметрией. - Умеет выгружать историю трека из БД в
AppStateдля отрисовки старых маршрутов по кнопке "LOAD TRACK". - Реализует массовый асинхронный импорт накопленного JSON-лога в базу данных.
Обеспечивает работу с картами:
- Асинхронность: Использует
std::asyncдля загрузки картинок в фоне, чтобы интерфейс приложения не "зависал" во время ожидания ответа от серверов OSM. - Curl: Выполняет HTTP-GET запросы за тайлами (
.png). - Кэширование: Сохраняет скачанные тайлы на диск по пути
build/{z}/{x}/{y}.png. При повторном обращении к координатам тайл берется с жесткого диска, экономя трафик. - STB Image & OpenGL: Декодирует
.pngв сырые пиксели (RGBA) и безопасно передает их в главный поток для создания текстуры OpenGL (glGenTextures).
Отвечает исключительно за графику (на базе ImGui и ImPlot).
- Отрисовывает таблицы статуса, кнопки управления, графики уровня сигнала (RSRP).
- Рисует карту OpenStreetMap.
- Автоматически вычисляет, какие тайлы (x, y) сейчас видны на экране (исходя из
ImPlot::GetPlotLimits()), и запрашивает их загрузку/отрисовку уTileManager.
Хелпер с чистыми математическими функциями без сторонних зависимостей. Содержит формулы проекции Меркатора для перевода стандартных GPS-координат (Долгота/Широта) в координаты тайлов OSM (X/Y) на нужный уровень зума и обратно.
Для сборки проекта требуются:
- CMake (>= 3.10)
- OpenGL (GLEW / GLFW или SDL2)
- libCURL (для HTTP запросов к серверу тайлов)
- PostgreSQL (libpq) (для базы данных)
- ZeroMQ (для сокетов)
(Укажи команды для Linux, например: sudo apt install libcurl4-openssl-dev libpq-dev libzmq3-dev)
mkdir build && cd build
cmake ..
make
./MapApp