|
lacteApp
C++17 service for Lacte hardware
|
Схема собственного deployment-конфига lacteApp — каждый путь, сетевой адрес/порт, адрес на шине, настройка устройства и интервал, которые раньше были захардкоженным литералом в App.cpp/LacteApp.cpp/Model.h, названы и имеют значение по умолчанию, равное этому самому прежнему значению, так что загрузка (или отсутствие) файла конфига ничего не меняет в текущем поведении. More...
#include <config.hpp>#include <tuple>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> |
Схема собственного 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), поскольку ничто не зависит от того, что его точный путь переживёт рефакторинг.
nand_disk_path (голый КОРЕНЬ точки монтирования NAND, например /mnt/nand_disk_ext - на один уровень выше log_dir) сознательно остаётся ОТДЕЛЬНЫМ полем: это по-настоящему другое значение, чем собственное значение log_dir (корень точки монтирования против поддиректории этого приложения под ним), и Bootstrap() в App.cpp нужен именно этот корень для проверки через IsMounted() - объединение его с log_dir проверяло бы неверный (на один уровень слишком глубокий) путь против /proc/self/mounts и незаметно сломало бы проверку монтирования на реальном железе.
Порядок расположения:
Сознательно опущено: LacteApp::BUFFER_SIZE/bus::kBusBufferSize — они задают размер статических массивов фиксированной длины, используемых как non-type template параметры insitech::bus::Hub<RX, TX>, определяются во время компиляции, а не осмысленно "переконфигурируемы" значением, загружаемым в рантайме.
Definition in file AppConfig.hpp.