lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
AppConfig.hpp
Go to the documentation of this file.
1
89#pragma once
90
91#include <config.hpp>
92#include <tuple>
93
94namespace lacte::config {
95template <typename T>
96using ConfigField = insitech::config::FieldSpec<T>;
97
98// =============================================================================
99// Обязательные поля - в точности список REQUIRED FIELDS из собственного
100// doc-комментария AppContext.h (см. doc-комментарий этого файла).
101// static_assert'ы AppConfig<kAllFields> проверяют, что каждое из них
102// существует, под этим точным ключом/типом - собраны вместе, первыми,
103// чтобы этот контракт был виден как единое целое, а не разбросан по
104// тематическим секциям ниже.
105// =============================================================================
106
107// (см. App.cpp::main()'s AppContext, AppContext::app_name/app_description)
109 "app_name",
110 "This app's own name - its Logger label, its bus identity's name, and "
111 "ConsoleApp's own CLI --help header/single-instance lock file name "
112 "(read straight off AppContext::app_name, not a separate copy)",
113 "lacte_app"};
115 "app_description", "Human-readable one-line app description (CLI --help)",
116 "some description"};
117// Базовая директория для собственных операционных данных этого приложения
118// - см. собственный doc-комментарий этого файла о том, что именно здесь
119// живёт (поиск прошивки, база данных, кэш платы) и почему используется
120// НАПРЯМУЮ, без добавленного app_name - заменяет/поглощает bin_path И
121// cache_path (их старые значения по умолчанию уже были идентичны).
123 "app_dir",
124 "Base directory for this app's own data (firmware-file search "
125 "directory, database, board cache - see this file's own doc comment) "
126 "- used as-is, deliberately kept at its historical value",
127 "/usr/local/daemon/lacte"};
129 "bus_multicast_group", "Multicast group every bus participant joins",
130 "239.255.19.31"};
132 "bus_multicast_port", "Multicast port every bus participant joins", 47761};
134 "shared_bus_address",
135 "This process's ONE shared insitech::bus::Hub<RX,TX> node's own "
136 "address (see AppContext::bus) - distinct from every "
137 "participant's own client address below (kModelBusAddress/kUiBusAddress/"
138 "kDbBusAddress), which each builds its own client onto this same node.",
139 100};
140// Читается напрямую AppContext (см. Libraries/app_control/AppContext.h -
141// REQUIRED FIELDS) для построения собственного файла диагностического
142// логгера - роль и значение НЕ ИЗМЕНИЛИСЬ (см. собственный doc-комментарий
143// этого файла): всё тот же большой, выгружаемый вовне лог, сознательно
144// отделённый от операционных данных app_dir. Также дублирует роль
145// вторичной директории поиска прошивки (см. LacteApp::TryToUpdate()),
146// заменяя старое отдельное поле nand_lacte_path (всегда хранившее то же
147// самое значение, что и это).
149 "log_dir",
150 "Directory the diagnostic logger's own (large) file lives under, in "
151 "an app_name subdirectory - also the secondary firmware-search "
152 "directory (used as-is) - NOT this app's own operational data "
153 "(database, cache), see app_dir for that",
154 "/mnt/nand_disk_ext/lacte/"};
155// Читается напрямую AppContext (см. Libraries/app_control/AppContext.h -
156// REQUIRED FIELDS) сразу после построения `logger`, чтобы применяться с
157// самой первой записанной строки - собственная опция CLI --log-level
158// LacteApp (см. LacteApp.cpp) переопределяет это заново, позже, как только
159// CLI11 разберёт argv.
161 "log_min_level",
162 "Minimum severity level written to the log (0=TRACE, 1=INFO, "
163 "2=WARNING, 3=ERROR)",
164 1};
165
166// =============================================================================
167// Имена - строки идентичности/подписи, ещё не перечисленные выше.
168// =============================================================================
169
170// -- Имена идентичности узлов Hub (см. собственное анонсируемое имя
171// AppContext::bus, производное от kAppName - эти же поля для СОБСТВЕННЫХ
172// узлов клиентов ДРУГИХ участников, см. секцию "Network / bus transport"
173// ниже про их адреса) --
175 "model_bus_node_name", "Identity name for the Model's bus node",
176 "lacte-model"};
178 "db_bus_node_name", "Identity name for AppDb's own bus node", "lacte-db"};
179// Здесь нет kLogBusAddress/kLogBusNodeName: каждое приложение, унаследованное
180// от ConsoleApp, уже получает собственный insitech::Logger, бесплатно
181// подключённый слушать шину (см. собственный конструктор AppContext) по
182// адресу insitech::Logger::kDefaultAddress - это ЕДИНСТВЕННЫЙ источник
183// истины для адреса слушателя логов, а не поле конфига для каждого
184// приложения отдельно.
185// Здесь также нет kSharedBusNodeName: собственное анонсируемое имя
186// идентичности узла общей шины выводится напрямую из ЗНАЧЕНИЯ kAppName во
187// время сборки контекста (см. собственный конструктор AppContext в
188// Libraries/app_control/AppContext.h) - не второе, отдельно
189// конфигурируемое имя для того же самого, по сути, вопроса "кто это",
190// на который kAppName уже отвечает.
191
192// =============================================================================
193// Пути - пути файловой системы и устройств, ещё не перечисленные выше.
194// =============================================================================
195
196// Голый КОРЕНЬ точки монтирования NAND (на один уровень выше log_dir) -
197// см. собственный doc-комментарий этого файла о том, почему это остаётся
198// отдельным полем от log_dir (проверке IsMounted() в App.cpp::Bootstrap()
199// нужно именно это значение, а не собственное, на уровень глубже, значение
200// log_dir).
202 "nand_disk_path",
203 "Mount point checked before using the NAND firmware directory "
204 "(log_dir) - the bare mount root, one level up from log_dir itself",
205 "/mnt/nand_disk_ext"};
207 "pl2303_sysfs_path",
208 "sysfs new_id file used to bind the pl2303 UART driver to the board's "
209 "VID:PID",
210 "/sys/bus/usb-serial/drivers/pl2303/new_id"};
211
212// -- Пути устройств (см. LacteApp.cpp::RunImpl(), ui/framebuffer/
213// FramebufferUi.cpp) - device_name, несмотря на своё имя ключа,
214// идентифицирует, как ОТКРЫТЬ устройство платы (путь либо VID:PID) точно
215// так же, как пути framebuffer/touch/HMI ниже идентифицируют свои
216// устройства; см. kUsbVidPid (в "Всё остальное" ниже) для ДРУГОЙ цели -
217// регистрации в драйвере ядра, которой служит именно то поле --
219 "device_name", "Board UART device path or VID:PID", "067b:23a3"};
220// Читается только когда ui_mode равен "fb" - та же категория, что и
221// device_name выше (путь узла устройства, который реальному
222// развёртыванию может понадобиться изменить без пересборки), только для
223// аппаратуры дисплея/тачскрина/HMI вместо платы.
225 "framebuffer_path", "Framebuffer device node the 'fb' UI renders to",
226 "/dev/fb0"};
228 "touch_path", "Touchscreen input device node the 'fb' UI reads",
229 "/dev/input/event1"};
231 "hmi_uart_path",
232 "UART device node the 'fb' UI's HMI/back-board protocol uses",
233 "/dev/ptyhmi-sniff"};
234
235// =============================================================================
236// Всё остальное - адреса/порты, настройки протокола устройства, интервалы.
237// =============================================================================
238
239// Только ИМЯ ФАЙЛА базы данных - живёт напрямую под app_dir (см. собственный
240// doc-комментарий этого файла) - раньше было db_path (голое "./lacte.db",
241// относительно CWD - фактически оказывалось в директории app_dir только
242// потому, что она исторически И БЫЛА рабочей директорией этого процесса в
243// production; теперь явное, а не случайное, то же самое итоговое место).
245 "db_name", "SQLite database file name (lives directly under app_dir)",
246 "lacte.db"};
248 "firmware_glob", "Glob TryToUpdate() scans app_dir/log_dir with", "*.bin"};
250 "usb_vid_pid",
251 "Board's USB VID:PID, space-separated (sysfs new_id's own format) — "
252 "written to pl2303_sysfs_path so the board's UART shows up as a device "
253 "node at all. Distinct from device_name: that one names how to *open* "
254 "the device (a path, or the same VID:PID colon-separated), this one is "
255 "only ever used to register it with the kernel driver",
256 "067b 23a3"};
257
258// -- Сеть / транспорт шины (см. App.cpp::main(), ModelBusClient.hpp/
259// UiBusClient.hpp) - bus_multicast_group/_port/shared_bus_address -
260// обязательные поля, см. секцию выше; это - собственные адреса клиентов
261// ДРУГИХ участников на том же общем узле --
263 "model_bus_address",
264 "This process's bus node address for the Model "
265 "(bus::kModelBusAddress)",
266 1};
268 "ui_bus_address",
269 "Hub node address a UI process/thread uses (bus::kUiBusAddress)", 2};
271 "db_bus_address",
272 "Hub node address AppDb's own internal bus node uses (kDbBusAddress "
273 "in LacteApp.cpp)",
274 3};
276 "model_ui_notifier_address",
277 "Hub node address the Model's second client (a UiBusClient - see "
278 "Model::ConnectBus()) uses purely to push UiCommand/BoardSnapshotEvent "
279 "to the UI - distinct from kModelBusAddress since one client can't be "
280 "registered at two addresses.",
281 4};
282// -- Настройки устройства платы / протокола (см. LacteApp.cpp::RunImpl()) --
284 "uart_baud_rate", "Board UART baud rate", 115200};
286 "ui_mode", "'fb' (framebuffer), 'console', or 'no' (headless)", "fb"};
288 "check_update_interval_ms",
289 "How often to poll app_dir/log_dir for a new firmware file", 30000};
291 "board_online_timeout_ms",
292 "How long without an info packet before Model reports the board "
293 "offline",
294 3000};
295
296// -- Тайминги Framebuffer UI (см. ui/framebuffer/FramebufferUi.cpp) --
298 "hmi_uart_baud_rate", "Baud rate for hmi_uart_path", 115200};
300 "frame_time_ms", "Target frame time in ms the 'fb' UI's GUI loop runs at",
301 30};
302
303// -- VNC (RFB) mirror server (см. ui/framebuffer/vnc/RfbServer.hpp) --
305 "vnc_port", "TCP port the 'fb' UI's VNC (RFB) mirror server listens on",
306 5900};
308 "vnc_password",
309 "Classic VNC (RFB DES challenge-response) password, up to 8 characters "
310 "(a real protocol limit, not a bug) - typed manually into the VNC "
311 "viewer at connect time, same as any other VNC server. Empty "
312 "(default) disables the VNC server entirely - there is no "
313 "unauthenticated fallback.",
314 ""};
315
316// Все поля выше, собранные воедино один раз — единственный аргумент,
317// который нужен `Config`/`ConfigStore` для построения всей схемы lacteApp
318// (см. App.cpp::main()).
319inline constexpr auto K_ALL_FIELDS = std::tie(
320 // Обязательные поля
323 // Имена
325 // Пути
328 // Всё остальное
334} // namespace lacte::config
constexpr ConfigField< int64_t > K_BOARD_ONLINE_TIMEOUT_MS
constexpr ConfigField< const char * > K_FIRMWARE_GLOB
insitech::config::FieldSpec< T > ConfigField
Definition AppConfig.hpp:96
constexpr ConfigField< int64_t > K_BUS_MULTICAST_PORT
constexpr ConfigField< const char * > K_TOUCH_PATH
constexpr ConfigField< int64_t > K_HMI_UART_BAUD_RATE
constexpr ConfigField< const char * > K_APP_NAME
constexpr ConfigField< int64_t > K_UI_BUS_ADDRESS
constexpr ConfigField< int64_t > K_UART_BAUD_RATE
constexpr ConfigField< int64_t > K_MODEL_BUS_ADDRESS
constexpr ConfigField< const char * > K_MODEL_BUS_NODE_NAME
constexpr ConfigField< const char * > K_UI_MODE
constexpr ConfigField< int64_t > K_MODEL_UI_NOTIFIER_ADDRESS
constexpr ConfigField< const char * > K_DB_NAME
constexpr ConfigField< const char * > K_USB_VID_PID
constexpr ConfigField< const char * > K_DEVICE_NAME
constexpr ConfigField< const char * > K_NAND_DISK_PATH
constexpr ConfigField< int64_t > K_LOG_MIN_LEVEL
constexpr ConfigField< const char * > K_DB_BUS_NODE_NAME
constexpr ConfigField< const char * > K_FRAMEBUFFER_PATH
constexpr ConfigField< const char * > K_APP_DESCRIPTION
constexpr ConfigField< const char * > K_LOG_DIR
constexpr auto K_ALL_FIELDS
constexpr ConfigField< const char * > K_APP_DIR
constexpr ConfigField< int64_t > K_SHARED_BUS_ADDRESS
constexpr ConfigField< int64_t > K_VNC_PORT
constexpr ConfigField< const char * > K_BUS_MULTICAST_GROUP
constexpr ConfigField< const char * > K_VNC_PASSWORD
constexpr ConfigField< int64_t > K_CHECK_UPDATE_INTERVAL_MS
constexpr ConfigField< int64_t > K_FRAME_TIME_MS
constexpr ConfigField< const char * > K_PL2303_SYSFS_PATH
constexpr ConfigField< const char * > K_HMI_UART_PATH
constexpr ConfigField< int64_t > K_DB_BUS_ADDRESS