#pragma once #include "esp_idf_platform.h" #include "ets_memory_loader.h" #include "knx/bau07B0.h" #include "knx/cemi_frame.h" #include #include #include #include #include #include class GroupObject; namespace gateway::openknx { class TpuartUartInterface; class EtsDeviceRuntime { public: using CemiFrameSender = std::function; using GroupWriteHandler = std::function; using GroupObjectWriteHandler = std::function; using FunctionPropertyHandler = std::function* response)>; EtsDeviceRuntime(std::string nvs_namespace, uint16_t fallback_individual_address, uint16_t tunnel_client_address = 0, std::unique_ptr tp_uart_interface = nullptr); ~EtsDeviceRuntime(); uint16_t individualAddress() const; uint16_t tunnelClientAddress() const; bool configured() const; bool programmingMode() const; void setProgrammingMode(bool enabled); void toggleProgrammingMode(); EtsMemorySnapshot snapshot() const; // Accessors for OpenKNX integration (DIB construction, IP parameter object). DeviceObject& deviceObject(); Platform& platform(); void setFunctionPropertyHandlers(FunctionPropertyHandler command_handler, FunctionPropertyHandler state_handler); void setGroupWriteHandler(GroupWriteHandler handler); void setGroupObjectWriteHandler(GroupObjectWriteHandler handler); void setBusFrameSender(CemiFrameSender sender); void setNetworkInterface(esp_netif_t* netif); bool hasTpUart() const; bool enableTpUart(bool enabled = true); bool tpUartOnline() const; bool transmitTpFrame(const uint8_t* data, size_t len); bool handleTunnelFrame(const uint8_t* data, size_t len, CemiFrameSender sender); bool handleBusFrame(const uint8_t* data, size_t len); bool emitGroupValue(uint16_t group_object_number, const uint8_t* data, size_t len, CemiFrameSender sender); void loop(); private: static bool HandleOutboundCemiFrame(CemiFrame& frame, void* context); static void EmitTunnelFrame(CemiFrame& frame, void* context); static void HandleSecureGroupWrite(uint16_t group_address, const uint8_t* data, uint8_t data_length, void* context); static void HandleGroupObjectWrite(GroupObject& ko); static bool HandleFunctionPropertyCommand(uint8_t object_index, uint8_t property_id, uint8_t length, uint8_t* data, uint8_t* result_data, uint8_t& result_length); static bool HandleFunctionPropertyState(uint8_t object_index, uint8_t property_id, uint8_t length, uint8_t* data, uint8_t* result_data, uint8_t& result_length); static uint16_t DefaultTunnelClientAddress(uint16_t individual_address); static bool DispatchFunctionProperty(FunctionPropertyHandler* handler, uint8_t object_index, uint8_t property_id, uint8_t length, uint8_t* data, uint8_t* result_data, uint8_t& result_length); void installGroupObjectCallbacks(); bool shouldConsumeTunnelFrame(CemiFrame& frame) const; bool shouldConsumeBusFrame(CemiFrame& frame) const; std::string nvs_namespace_; std::unique_ptr tp_uart_interface_; EspIdfPlatform platform_; Bau07B0 device_; CemiFrameSender sender_; CemiFrameSender bus_frame_sender_; GroupWriteHandler group_write_handler_; GroupObjectWriteHandler group_object_write_handler_; FunctionPropertyHandler command_handler_; FunctionPropertyHandler state_handler_; bool suppress_group_object_write_callback_{false}; uint16_t group_object_callback_count_{0}; }; } // namespace gateway::openknx