6e0273f4b4
В прод деплоен gx/cuframes-composer:0.11b-step1 — C++ ядро
работает через ABI shim, старые C-callers (grid_record.c, control.c,
frigate_mqtt.c) использует те же cfc_composer_* функции.
Что в этом коммите:
- src/cpp/composer_c_api.cpp: extern "C" обёртки над cfc::Composer
методами. Полный набор: _create/_destroy/_compose/_add_overlay/
_find_overlay/_set_layout/_current_layout/_add_pool_source/
_set_motion_mode/_get_motion_mode/_motion_pulse/_get_health.
- src/cpp/layouts_c_api.cpp: extern "C" обёртки над template_loader
для cfc_layout_find/_all/_load_file/_reload/_loaded_path/_to_pixels.
- cpp/template_loader: global registry (current_templates / set_*
/ load_into_current) — единый источник истины. Composer и C ABI
shim читают один и тот же mutex-защищённый vector<LayoutTemplate>.
Hot-reload через ZMQ cfc_layout_load_file подхватывается composer'ом
на следующем кадре без рестарта.
- cpp/composer: pick_best_fit, set_layout, maybe_relayout читают
current_templates() вместо локального snapshot.
- cpp/composer: backward-compat overlay list (add_overlay/find_overlay)
+ manual cells support (для C API без motion-mode).
- cpp/composer compose_frame: после Layout.render() рендерит overlays
(CLI text/icon/border + Frigate detbox) поверх.
- Удалены: src/composer.c (заменён composer_c_api.cpp + composer.cpp),
src/layouts.c (заменён layouts_c_api.cpp + template_loader.cpp).
- Оставлено как есть: src/overlay.c (PNG/text/border/detbox CLI overlays
— реализация не меняется, доступ через cfc_overlay_*).
- src/CMakeLists.txt: COMPOSER_SOURCES_C минус composer.c, layouts.c,
COMPOSER_SOURCES_CPP плюс composer_c_api.cpp, layouts_c_api.cpp.
Production smoke (R9-88.23):
[cfc/loader] /opt/templates.json: loaded 7 templates
[cfc/composer] templates loaded: 7 (path='/opt/templates.json')
[cfc/composer] pool+ cam-parking prio=100 / cam-gate_lpr prio=90 / ...
[cfc/composer] motion_mode=1 ttl=45000ms pool=4
[cfc/composer] grow → template='tpl_1' active=1
PASS.
Refs: #195 (Phase 11b C++ refactor).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
36 lines
1.5 KiB
C++
36 lines
1.5 KiB
C++
/* Template loader — JSON → vector<LayoutTemplate> (Phase 11b).
|
|
*
|
|
* Schema см. docker/templates.json. При неудаче возвращает empty vector
|
|
* (caller использует built-in fallback).
|
|
*/
|
|
|
|
#ifndef CUFRAMES_COMPOSER_CPP_TEMPLATE_LOADER_HPP
|
|
#define CUFRAMES_COMPOSER_CPP_TEMPLATE_LOADER_HPP
|
|
|
|
#include "template.hpp"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace cfc {
|
|
|
|
/* Загрузить из файла. Возвращает количество загруженных templates, либо
|
|
* отрицательное число при ошибке (-1=parse, -2=schema, -3=open). */
|
|
int load_templates_from_file(const std::string& path,
|
|
std::vector<LayoutTemplate>& out);
|
|
|
|
/* Встроенный набор fallback templates (Phase 11b base — single, quad). */
|
|
std::vector<LayoutTemplate> builtin_templates();
|
|
|
|
/* Global template registry — единый источник для Composer и cfc_layout_*
|
|
* ABI shim. Заполняется builtin'ами по умолчанию; перезаписывается при
|
|
* load_templates_from_file (если был успех). Thread-safe — composer и
|
|
* control-thread читают, hot-reload пишет под lock. */
|
|
const std::vector<LayoutTemplate>& current_templates();
|
|
void set_current_templates(std::vector<LayoutTemplate> new_templates);
|
|
int load_into_current(const std::string& path);
|
|
|
|
} // namespace cfc
|
|
|
|
#endif /* CUFRAMES_COMPOSER_CPP_TEMPLATE_LOADER_HPP */
|