lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
AppConfig.hpp File Reference

Схема собственного deployment-конфига lacteApp — каждый путь, сетевой адрес/порт, адрес на шине, настройка устройства и интервал, которые раньше были захардкоженным литералом в App.cpp/LacteApp.cpp/Model.h, названы и имеют значение по умолчанию, равное этому самому прежнему значению, так что загрузка (или отсутствие) файла конфига ничего не меняет в текущем поведении. More...

#include <config.hpp>
#include <tuple>
Include dependency graph for AppConfig.hpp:

Go to the source code of this file.

Namespaces

namespace  lacte
namespace  lacte::config

Typedefs

template<typename T>
using lacte::config::ConfigField = insitech::config::FieldSpec<T>

Variables

constexpr ConfigField< const char * > lacte::config::K_APP_NAME
constexpr ConfigField< const char * > lacte::config::K_APP_DESCRIPTION
constexpr ConfigField< const char * > lacte::config::K_APP_DIR
constexpr ConfigField< const char * > lacte::config::K_BUS_MULTICAST_GROUP
constexpr ConfigField< int64_t > lacte::config::K_BUS_MULTICAST_PORT
constexpr ConfigField< int64_t > lacte::config::K_SHARED_BUS_ADDRESS
constexpr ConfigField< const char * > lacte::config::K_LOG_DIR
constexpr ConfigField< int64_t > lacte::config::K_LOG_MIN_LEVEL
constexpr ConfigField< const char * > lacte::config::K_MODEL_BUS_NODE_NAME
constexpr ConfigField< const char * > lacte::config::K_DB_BUS_NODE_NAME
constexpr ConfigField< const char * > lacte::config::K_NAND_DISK_PATH
constexpr ConfigField< const char * > lacte::config::K_PL2303_SYSFS_PATH
constexpr ConfigField< const char * > lacte::config::K_DEVICE_NAME
constexpr ConfigField< const char * > lacte::config::K_FRAMEBUFFER_PATH
constexpr ConfigField< const char * > lacte::config::K_TOUCH_PATH
constexpr ConfigField< const char * > lacte::config::K_HMI_UART_PATH
constexpr ConfigField< const char * > lacte::config::K_DB_NAME
constexpr ConfigField< const char * > lacte::config::K_FIRMWARE_GLOB
constexpr ConfigField< const char * > lacte::config::K_USB_VID_PID
constexpr ConfigField< int64_t > lacte::config::K_MODEL_BUS_ADDRESS
constexpr ConfigField< int64_t > lacte::config::K_UI_BUS_ADDRESS
constexpr ConfigField< int64_t > lacte::config::K_DB_BUS_ADDRESS
constexpr ConfigField< int64_t > lacte::config::K_MODEL_UI_NOTIFIER_ADDRESS
constexpr ConfigField< int64_t > lacte::config::K_UART_BAUD_RATE
constexpr ConfigField< const char * > lacte::config::K_UI_MODE
constexpr ConfigField< int64_t > lacte::config::K_CHECK_UPDATE_INTERVAL_MS
constexpr ConfigField< int64_t > lacte::config::K_BOARD_ONLINE_TIMEOUT_MS
constexpr ConfigField< int64_t > lacte::config::K_HMI_UART_BAUD_RATE
constexpr ConfigField< int64_t > lacte::config::K_FRAME_TIME_MS
constexpr ConfigField< int64_t > lacte::config::K_VNC_PORT
constexpr ConfigField< const char * > lacte::config::K_VNC_PASSWORD
constexpr auto lacte::config::K_ALL_FIELDS

Detailed Description

Схема собственного deployment-конфига lacteApp — каждый путь, сетевой адрес/порт, адрес на шине, настройка устройства и интервал, которые раньше были захардкоженным литералом в App.cpp/LacteApp.cpp/Model.h, названы и имеют значение по умолчанию, равное этому самому прежнему значению, так что загрузка (или отсутствие) файла конфига ничего не меняет в текущем поведении.

Просто объявления полей плюс один кортеж, перечисляющий их все — сама механика (построение Config/ConfigStore из этого кортежа, загрузка и самовосстановление файла, аксессоры AsStr()/AsInt()) живёт в Libraries/config/config.hpp/config_store.hpp; в этом файле нет собственного кода, кроме kAllFields. main() (см. App.cpp) строит insitech::AppConfig<kAllFields>/AppContext (см. собственный doc-комментарий файла Libraries/app_control/AppContext.h) напрямую из этих полей - kAllFields ОБЯЗАН включать поле для каждого ключа, который собственный doc-комментарий того файла перечисляет как ОБЯЗАТЕЛЬНЫЙ (app_name/app_description/app_dir/bus_multicast_group/ bus_multicast_port/shared_bus_address/log_dir/log_min_level) - AppConfig<kAllFields> проверяет это через static_assert во время компиляции, так что забытое поле ломает сборку с именованным полем/типом в ошибке, а не рантайм-сюрпризом. config.AsStr(kFoo)/config.AsInt(kFoo) типобезопасно проверяются на этапе компиляции против собственного объявленного типа каждого поля — никогда не пишите имя поля как сырой строковый литерал в месте вызова.

app_dir/log_dir, оба обязательные, заменяют собой то, что раньше было ЧЕТЫРЬМЯ отдельными полями (cache_path, bin_path, nand_disk_path, nand_lacte_path) - сознательно сохраняя их ТОЧНЫЕ исторические значения по умолчанию (а не урезая их до общего родителя + добавленного app_name, как работает собственное соглашение log_dir-для-файла-логгера в AppContext.h): директория поиска прошивки при обновлении и расположение базы данных не должны меняться только потому, что эта схема была приведена в порядок - свободно перемещаться может только кэш времени выполнения платы (см. kLacteRuntimeCacheFileName в Model.h), поскольку ничто не зависит от того, что его точный путь переживёт рефакторинг.

  • app_dir (по умолчанию /usr/local/daemon/lacte - старое значение bin_path, и старое значение cache_path тоже, они всегда были идентичны) - используется НАПРЯМУЮ (без добавления /<app_name>) как: директория поиска файла прошивки (старая роль bin_path - см. LacteApp::TryToUpdate()), директория базы данных (db_name теперь живёт здесь, см. kDbName ниже), и директория кэша времени выполнения платы (kLacteRuntimeCacheFileName в Model.h).
  • log_dir (по умолчанию /mnt/nand_disk_ext/lacte/ - не изменилось по сравнению с прежним, и это же старое значение nand_lacte_path, они всегда были идентичны) - роль НЕ ИЗМЕНИЛАСЬ: собственный (большой, часто выгружаемый вовне - например, копируемый на USB-флешку) файл app.log диагностического логгера живёт под log_dir/<app_name>/ (см. собственный конструктор AppContext.h - не затронут этим рефакторингом), и он же дублирует роль ВТОРИЧНОЙ директории поиска прошивки (используется НАПРЯМУЮ, заменяя старое отдельное поле nand_lacte_path, которое всегда хранило это же самое значение).

nand_disk_path (голый КОРЕНЬ точки монтирования NAND, например /mnt/nand_disk_ext - на один уровень выше log_dir) сознательно остаётся ОТДЕЛЬНЫМ полем: это по-настоящему другое значение, чем собственное значение log_dir (корень точки монтирования против поддиректории этого приложения под ним), и Bootstrap() в App.cpp нужен именно этот корень для проверки через IsMounted() - объединение его с log_dir проверяло бы неверный (на один уровень слишком глубокий) путь против /proc/self/mounts и незаметно сломало бы проверку монтирования на реальном железе.

Порядок расположения:

  1. Обязательные поля - именно те, что требует собственный doc-комментарий AppContext.h (и его static_assertы); собраны вместе и идут первыми, чтобы этот жёсткий контракт схемы с AppContext был виден с первого взгляда, а не разбросан по тематическим секциям, к которым иначе относилось бы каждое поле.
  2. Имена - строки идентичности/подписи, ещё не охваченные выше.
  3. Пути - пути файловой системы/устройств, ещё не охваченные выше.
  4. Всё остальное - адреса/порты, настройки протокола устройства, интервалы. Поле никогда не встречается дважды - например, app_name/app_dir/ log_dir одновременно "обязательные" И в противном случае были бы "именем"/"путём", но каждое живёт только в ПЕРВОЙ секции, под которую подпадает.

Сознательно опущено: LacteApp::BUFFER_SIZE/bus::kBusBufferSize — они задают размер статических массивов фиксированной длины, используемых как non-type template параметры insitech::bus::Hub<RX, TX>, определяются во время компиляции, а не осмысленно "переконфигурируемы" значением, загружаемым в рантайме.

Definition in file AppConfig.hpp.