Files
fgl-aircon/CMakeLists.txt
T
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

112 lines
3.6 KiB
CMake

cmake_minimum_required(VERSION 3.16)
if(ESP_PLATFORM)
# ---------------------------------------------------------------------------
# Сборка как компонента ESP-IDF (корень репозитория = компонент; имя
# компонента = имя каталога, из которого он подключён).
# ВАЖНО: cmake_minimum_required должен остаться до этой ветки, project()
# для IDF-сборки не вызывается.
# ---------------------------------------------------------------------------
idf_component_register(
SRCS
"src/ayla/crypto.cpp"
"src/ayla/envelope.cpp"
"src/ayla/httpc.cpp"
"src/ayla/httpd.cpp"
"src/ayla/log.cpp"
"src/ayla/session.cpp"
"src/aircon/c_api.cpp"
"src/aircon/session.cpp"
"src/aircon/tables.cpp"
"src/ayla/platform/esp-idf/platform.cpp"
INCLUDE_DIRS
"include"
PRIV_INCLUDE_DIRS
"."
"src"
PRIV_REQUIRES
lwip
esp_timer
esp_hw_support
pthread
mbedtls
)
target_compile_options(${COMPONENT_LIB} PRIVATE
-Wall -Wextra -Werror
-fno-exceptions -fno-rtti
)
target_compile_features(${COMPONENT_LIB} PUBLIC cxx_std_20)
else()
# ---------------------------------------------------------------------------
# Обычная (POSIX) сборка: статическая библиотека + тесты.
# ---------------------------------------------------------------------------
project(fgl-aircon VERSION 0.1.0 LANGUAGES CXX)
option(FGL_BUILD_TESTS "Build tests" ON)
option(FGL_BUNDLED_MBEDTLS "Fetch and build Mbed TLS instead of system" OFF)
# ---- mbedtls ----
if(NOT FGL_BUNDLED_MBEDTLS)
find_path(MBEDTLS_INCLUDE_DIR mbedtls/aes.h
HINTS /usr/include/mbedtls3 /usr/include
)
find_library(MBEDTLS_CRYPTO_LIB
NAMES mbedcrypto-3 mbedcrypto
)
if(NOT MBEDTLS_INCLUDE_DIR OR NOT MBEDTLS_CRYPTO_LIB)
message(STATUS "System Mbed TLS not found - falling back to bundled")
set(FGL_BUNDLED_MBEDTLS ON)
endif()
endif()
if(FGL_BUNDLED_MBEDTLS)
include(FetchContent)
FetchContent_Declare(mbedtls
GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
GIT_TAG v3.6.2
GIT_SHALLOW TRUE
)
set(ENABLE_PROGRAMS OFF CACHE BOOL "" FORCE)
set(ENABLE_TESTING OFF CACHE BOOL "" FORCE)
set(USE_SHARED_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
set(USE_STATIC_MBEDTLS_LIBRARY ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(mbedtls)
set(FGL_MBEDTLS_TARGET mbedcrypto STATIC)
set(FGL_MBEDTLS_INCLUDE_DIR "")
else()
set(FGL_MBEDTLS_TARGET "${MBEDTLS_CRYPTO_LIB}")
set(FGL_MBEDTLS_INCLUDE_DIR "${MBEDTLS_INCLUDE_DIR}")
endif()
add_library(fgl-aircon STATIC
src/ayla/crypto.cpp
src/ayla/envelope.cpp
src/ayla/httpc.cpp
src/ayla/httpd.cpp
src/ayla/log.cpp
src/ayla/session.cpp
src/aircon/c_api.cpp
src/aircon/session.cpp
src/aircon/tables.cpp
src/ayla/platform/posix/platform.cpp
)
target_include_directories(fgl-aircon
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}"
"${FGL_MBEDTLS_INCLUDE_DIR}"
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src"
)
target_link_libraries(fgl-aircon PUBLIC ${FGL_MBEDTLS_TARGET})
target_compile_features(fgl-aircon PUBLIC cxx_std_20)
target_compile_options(fgl-aircon PRIVATE
-Wall -Wextra -Werror
-fno-exceptions -fno-rtti
)
if(FGL_BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
endif()