petr.polezhaev
b84bd8d555
ha(H1): исправления по ревью — жизненный цикл сессии, самодостаточный wheel
...
- C1: единственный владелец stop+destroy — reader-поток; close() только
выставляет флаг и ждёт; повторный close и close из колбэка безопасны
(регресс-тесты; TSan на close с мёртвым модулем — 0 гонок)
- M1: wheel собирается с bundled mbedtls (нет внешней soname mbedcrypto);
попутно исправлена bundled-ветка CMake (-lSTATIC)
- C-API: счётчики потерянных событий/логов, лог-кольцо без union-балласта,
атомарные fn/ctx лог-синка
- provision: валидация формата облачных ответов; CLI: человеческие ошибки
(exit 2), --out с правами 0600, console_script pyfglair
- упаковка: MANIFEST.in (sdist с C++-исходниками), очистка stale .so,
readme в метаданных; find_library без ложных .bak
- тесты: close-сценарии, доставка логов, ошибки CLI/provision, C-API очередь
2026-09-29 11:48:32 +03:00
petr.polezhaev
0292404756
ha(H1): pyfglair — cffi-ядро (очередь событий), wheel, CLI discover/monitor
...
- CMake: shared-таргет fgl-aircon-shared (FGL_BUILD_SHARED, PIC, SOVERSION)
- C-API: fgl_prop_raw_range + кольцевые очереди событий/логов
(fgl_session_poll/wait_events, fgl_log_poll/wait_events): прямые колбэки
из потоков ядра со стеком 8 КБ небезопасны для интерпретатора Python
- pyfglair: _corebuild (cmake->wheel), _cffi (ABI), Session (reader-поток ->
loop.call_soon_threadsafe), templates (интроспекция C-таблиц), provision
(aiohttp), CLI discover/monitor + esphome-secrets
- setup.py/pyproject: платформенный wheel py3-none-linux_x86_64 с .so
- tests/pyfglair: templates, provision (мок-облако), session + CLI против
mock_ac.py; scripts/py-ci.sh; ci.sh запускает python-часть
2026-09-29 11:31:57 +03:00
petr.polezhaev
fa1718f405
core(M3): aircon-слой — шаблоны A/B/F, конверсии+override, публичный API + C-API
...
- include/fgl-aircon: types.hpp (Prop/State/Error/Value/Template/
Conversion-linear-custom/PropOverride/Config с задокументированными
lifetime-контрактами), templates.hpp (PropInfo-таблицы, интроспекция,
конверсии c контрактом Linear num/den!=0), session.hpp (Session:
set_int/bool/string, get_prop, batch, cached, set_log_sink с контрактом),
c_api.h (extern "C" для cffi/pyfglair).
- src/aircon: tables.cpp (шаблоны A=33/B=20/F=34 по PROTOCOL §8.2,
template_detect + template_is_known; конверсии: default тождественно,
DisplayTemperature raw 0.01°C(+5000)→API 0.1°C; linear с инверсией
raw=(api-offset)*den/num и насыщением __builtin_*_overflow; custom fn;
af_*_swing base_type integer, kind bool), session.cpp (маппинг имя↔Prop,
коэрсинг int-push к kBool по таблице, кэш со спинлоком, оптимистичный кэш,
валидация overrides: терминатор/linear/custom_fn), c_api.cpp (шейм,
static_assert'ы на все enum-значения, fgl_template_detect -1 для
неизвестных).
- ayla: set_property_string (Command.str_value, coalescing копирует строку
в т.ч. в batch-ветке); kMaxQueue 48 + static_assert (полный батч A=33);
commit_batch всегда ставит notify; oversized-строка дропает событие
(кэш не затирается); max_queue default 40.
- tests/aircon: test_tables (составы/атрибуты/дубли/template_detect/
swings-integer), test_convert (default/linear/custom/диапазоны/насыщение
в обе стороны/UB-экстремумы), aircon_runner + test_aircon_mock
(маппинг+конверсии+batch=1-notify с ожиданием async REG; SET+кэш+
RO/не-шаблон отказы+клэмпинг raw 450 на модуле; C-API smoke).
- Прибор AP-WC1E: полный батч шаблона A одним notify — 28 int/bool свойств
(DisplayTemperature 7000→200=20.0°C, DeviceCapabilities=5119), boolean SET
(JSON true) принят, RO/клэмп/NOTMPL отказы корректны.
- CI: 10/10 ×3 стабильно (3 полных прогона); ESP-IDF esp32 build complete.
Ревью независимым агентом: 3 круга — B1 kMaxQueue<батча, B2 linear div/0,
B3 c_api контракт -1, B4 batch-строки, BL1 INT64_MIN negation UB,
BL2 DisplayTemperature экстремумы, flake aircon_mock — всё закрыто;
APPROVED (условие круга 3: фикс + зелёный CI ×3).
2026-09-28 20:16:54 +03:00