// Copyright 2024 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace chip::app::Clusters; namespace esp_matter { namespace cluster { static std::unordered_map s_microwave_oven_mode_instances; static std::unordered_map s_operational_state_instances; static uint32_t get_feature_map_value(uint16_t endpoint_id, uint32_t cluster_id) { uint32_t attribute_id = Globals::Attributes::FeatureMap::Id; attribute_t *attribute = attribute::get(endpoint_id, cluster_id, attribute_id); VerifyOrReturnError(attribute, 0); esp_matter_attr_val_t val = esp_matter_invalid(nullptr); VerifyOrReturnError(attribute::get_val_internal(attribute, &val) == ESP_OK, 0); return val.val.u32; } // Cluster-specific optional attributes handlers chip::BitMask get_energy_evse_enabled_optional_attributes(uint16_t endpoint_id) { chip::BitMask optional_attrs = 0; if (endpoint::is_attribute_enabled(endpoint_id, EnergyEvse::Id, EnergyEvse::Attributes::UserMaximumChargeCurrent::Id)) { optional_attrs.Set(EnergyEvse::OptionalAttributes::kSupportsUserMaximumChargingCurrent); } if (endpoint::is_attribute_enabled(endpoint_id, EnergyEvse::Id, EnergyEvse::Attributes::RandomizationDelayWindow::Id)) { optional_attrs.Set(EnergyEvse::OptionalAttributes::kSupportsRandomizationWindow); } if (endpoint::is_attribute_enabled(endpoint_id, EnergyEvse::Id, EnergyEvse::Attributes::ApproximateEVEfficiency::Id)) { optional_attrs.Set(EnergyEvse::OptionalAttributes::kSupportsApproximateEvEfficiency); } return optional_attrs; } chip::BitMask get_power_topology_enabled_optional_attributes(uint16_t endpoint_id) { chip::BitMask optional_attrs = 0; if (endpoint::is_attribute_enabled(endpoint_id, PowerTopology::Id, PowerTopology::Attributes::AvailableEndpoints::Id)) { optional_attrs.Set(PowerTopology::OptionalAttributes::kOptionalAttributeAvailableEndpoints); } if (endpoint::is_attribute_enabled(endpoint_id, PowerTopology::Id, PowerTopology::Attributes::ActiveEndpoints::Id)) { optional_attrs.Set(PowerTopology::OptionalAttributes::kOptionalAttributeActiveEndpoints); } return optional_attrs; } chip::BitMask get_electrical_power_measurement_enabled_optional_attributes(uint16_t endpoint_id) { chip::BitMask optional_attrs = 0; // Check for various optional attributes if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::Ranges::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeRanges); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::Voltage::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeVoltage); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::ActiveCurrent::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeActiveCurrent); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::ReactiveCurrent::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeReactiveCurrent); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::ApparentCurrent::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeApparentCurrent); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::ReactivePower::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeReactivePower); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::ApparentPower::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeApparentPower); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::RMSVoltage::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeRMSVoltage); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::RMSCurrent::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeRMSCurrent); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::RMSPower::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeRMSPower); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::Frequency::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeFrequency); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::PowerFactor::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributePowerFactor); } if (endpoint::is_attribute_enabled(endpoint_id, ElectricalPowerMeasurement::Id, ElectricalPowerMeasurement::Attributes::NeutralCurrent::Id)) { optional_attrs.Set(ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeNeutralCurrent); } return optional_attrs; } // Cluster-specific optional commands handlers chip::BitMask get_energy_evse_enabled_optional_commands(uint16_t endpoint_id) { chip::BitMask optional_cmds = 0; if (endpoint::is_command_enabled(endpoint_id, EnergyEvse::Id, EnergyEvse::Commands::StartDiagnostics::Id)) { optional_cmds.Set(EnergyEvse::OptionalCommands::kSupportsStartDiagnostics); } return optional_cmds; } namespace delegate_cb { void InitModeDelegate(void *delegate, uint16_t endpoint_id, uint32_t cluster_id) { VerifyOrReturn(delegate != nullptr); static ModeBase::Instance * modeInstance = nullptr; ModeBase::Delegate *mode_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, cluster_id); modeInstance = new ModeBase::Instance(mode_delegate, endpoint_id, cluster_id, feature_map); modeInstance->Init(); } void LaundryWasherModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, LaundryWasherMode::Id); } void DishWasherModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, DishwasherMode::Id); } void RefrigeratorAndTCCModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, RefrigeratorAndTemperatureControlledCabinetMode::Id); } void RvcRunModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, RvcRunMode::Id); } void RvcCleanModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, RvcCleanMode::Id); } void WaterHeaterModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, WaterHeaterMode::Id); } void EnergyEvseModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, EnergyEvseMode::Id); } void MicrowaveOvenModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ModeBase::Delegate *mode_delegate = static_cast(delegate); ModeBase::Instance * modeInstance = nullptr; // Create new instance of MicrowaveOvenMode if not found in the map, otherwise use existing instance. if(s_microwave_oven_mode_instances.find(endpoint_id) == s_microwave_oven_mode_instances.end()) { uint32_t feature_map = get_feature_map_value(endpoint_id, MicrowaveOvenMode::Id); modeInstance = new ModeBase::Instance(mode_delegate, endpoint_id, MicrowaveOvenMode::Id, feature_map); s_microwave_oven_mode_instances[endpoint_id] = modeInstance; } else { modeInstance = s_microwave_oven_mode_instances[endpoint_id]; } modeInstance->Init(); } void DeviceEnergyManagementModeDelegateInitCB(void *delegate, uint16_t endpoint_id) { InitModeDelegate(delegate, endpoint_id, DeviceEnergyManagementMode::Id); } void EnergyEvseDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static EnergyEvse::Instance * energyEvseInstance = nullptr; EnergyEvse::Delegate *energy_evse_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, EnergyEvse::Id); chip::BitMask optional_attrs = get_energy_evse_enabled_optional_attributes(endpoint_id); chip::BitMask optional_cmds = get_energy_evse_enabled_optional_commands(endpoint_id); energyEvseInstance = new EnergyEvse::Instance(endpoint_id, *energy_evse_delegate, chip::BitMask(feature_map), optional_attrs, optional_cmds); energyEvseInstance->Init(); } void MicrowaveOvenControlDelegateInitCB(void *delegate, uint16_t endpoint_id) { // Get delegates of MicrowaveOvenMode and OperationalState clusters. cluster_t *cluster = cluster::get(endpoint_id, MicrowaveOvenMode::Id); ModeBase::Delegate *microwave_oven_mode_delegate = static_cast(get_delegate_impl(cluster)); cluster = cluster::get(endpoint_id, OperationalState::Id); OperationalState::Delegate *operational_state_delegate = static_cast(get_delegate_impl(cluster)); VerifyOrReturn(delegate != nullptr && microwave_oven_mode_delegate != nullptr && operational_state_delegate != nullptr); ModeBase::Instance* microwaveOvenModeInstance = nullptr; OperationalState::Instance* operationalStateInstance = nullptr; // Create new instance of MicrowaveOvenMode if not found in the map, otherwise use existing instance. if(s_microwave_oven_mode_instances.find(endpoint_id) == s_microwave_oven_mode_instances.end()) { uint32_t feature_map = get_feature_map_value(endpoint_id, MicrowaveOvenMode::Id); microwaveOvenModeInstance = new ModeBase::Instance(microwave_oven_mode_delegate, endpoint_id, MicrowaveOvenMode::Id, feature_map); s_microwave_oven_mode_instances[endpoint_id] = microwaveOvenModeInstance; } else { microwaveOvenModeInstance = s_microwave_oven_mode_instances[endpoint_id]; } // Create new instance of OperationalState if not found in the map, otherwise use existing instance. if(s_operational_state_instances.find(endpoint_id) == s_operational_state_instances.end()) { operationalStateInstance = new OperationalState::Instance(operational_state_delegate, endpoint_id); s_operational_state_instances[endpoint_id] = operationalStateInstance; } else { operationalStateInstance = s_operational_state_instances[endpoint_id]; } // Create MicrowaveOvenControl instance static MicrowaveOvenControl::Instance * microwaveOvenControlInstance = nullptr; MicrowaveOvenControl::Delegate *microwave_oven_control_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, MicrowaveOvenControl::Id); microwaveOvenControlInstance = new MicrowaveOvenControl::Instance(microwave_oven_control_delegate, endpoint_id, MicrowaveOvenControl::Id, feature_map, *operationalStateInstance, *microwaveOvenModeInstance); microwaveOvenControlInstance->Init(); } void OperationalStateDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static OperationalState::Instance * operationalStateInstance = nullptr; OperationalState::Delegate *operational_state_delegate = static_cast(delegate); // Create new instance of OperationalState if not found in the map, otherwise use existing instance. if(s_operational_state_instances.find(endpoint_id) == s_operational_state_instances.end()) { operationalStateInstance = new OperationalState::Instance(operational_state_delegate, endpoint_id); s_operational_state_instances[endpoint_id] = operationalStateInstance; } else { operationalStateInstance = s_operational_state_instances[endpoint_id]; } operationalStateInstance->Init(); } void FanControlDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); FanControl::Delegate *fan_control_delegate = static_cast(delegate); FanControl::SetDefaultDelegate(endpoint_id, fan_control_delegate); } void HepaFilterMonitoringDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static ResourceMonitoring::Instance * hepaFilterMonitoringInstance = nullptr; ResourceMonitoring::Delegate *resource_monitoring_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, HepaFilterMonitoring::Id); hepaFilterMonitoringInstance = new ResourceMonitoring::Instance(resource_monitoring_delegate, endpoint_id, HepaFilterMonitoring::Id, static_cast(feature_map), ResourceMonitoring::DegradationDirectionEnum::kDown, true); hepaFilterMonitoringInstance->Init(); } void ActivatedCarbonFilterMonitoringDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static ResourceMonitoring::Instance * activatedCarbonFilterMonitoringInstance = nullptr; ResourceMonitoring::Delegate *resource_monitoring_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, ActivatedCarbonFilterMonitoring::Id); activatedCarbonFilterMonitoringInstance = new ResourceMonitoring::Instance(resource_monitoring_delegate, endpoint_id, ActivatedCarbonFilterMonitoring::Id, static_cast(feature_map), ResourceMonitoring::DegradationDirectionEnum::kDown, true); activatedCarbonFilterMonitoringInstance->Init(); } void LaundryDryerControlsDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); LaundryDryerControls::Delegate *laundry_dryer_controls_delegate = static_cast(delegate); LaundryDryerControls::LaundryDryerControlsServer::SetDefaultDelegate(endpoint_id, laundry_dryer_controls_delegate); } void ValveConfigurationAndControlDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ValveConfigurationAndControl::Delegate *valve_configuration_and_control_delegate = static_cast(delegate); ValveConfigurationAndControl::SetDefaultDelegate(endpoint_id, valve_configuration_and_control_delegate); } void DeviceEnergyManagementDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static DeviceEnergyManagement::Instance * deviceEnergyManagementInstance = nullptr; DeviceEnergyManagement::Delegate *device_energy_management_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, DeviceEnergyManagement::Id); deviceEnergyManagementInstance = new DeviceEnergyManagement::Instance(endpoint_id, *device_energy_management_delegate, chip::BitMask(feature_map)); deviceEnergyManagementInstance->Init(); } void DoorLockDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); DoorLock::Delegate *door_lock_delegate = static_cast(delegate); DoorLockServer::Instance().SetDelegate(endpoint_id, door_lock_delegate); } void BooleanStateConfigurationDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); BooleanStateConfiguration::Delegate *boolean_state_configuration_delegate = static_cast(delegate); BooleanStateConfiguration::SetDefaultDelegate(endpoint_id, boolean_state_configuration_delegate); } void TimeSynchronizationDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); TimeSynchronization::Delegate *time_synchronization_delegate = static_cast(delegate); TimeSynchronization::SetDefaultDelegate(time_synchronization_delegate); } void ApplicationBasicDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ApplicationBasic::Delegate *application_basic_delegate = static_cast(delegate); ApplicationBasic::SetDefaultDelegate(endpoint_id, application_basic_delegate); } void PowerTopologyDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static PowerTopology::Instance * powerTopologyInstance = nullptr; PowerTopology::Delegate *power_topology_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, PowerTopology::Id); chip::BitMask optional_attrs = get_power_topology_enabled_optional_attributes(endpoint_id); powerTopologyInstance = new PowerTopology::Instance(endpoint_id, *power_topology_delegate, chip::BitMask(feature_map), optional_attrs); powerTopologyInstance->Init(); } void ElectricalPowerMeasurementDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static ElectricalPowerMeasurement::Instance * electricalPowerMeasurementInstance = nullptr; ElectricalPowerMeasurement::Delegate *electrical_power_measurement_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, ElectricalPowerMeasurement::Id); chip::BitMask optional_attrs = get_electrical_power_measurement_enabled_optional_attributes(endpoint_id); electricalPowerMeasurementInstance = new ElectricalPowerMeasurement::Instance(endpoint_id, *electrical_power_measurement_delegate, chip::BitMask(feature_map), optional_attrs); electricalPowerMeasurementInstance->Init(); } void LaundryWasherControlsDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); LaundryWasherControls::Delegate *laundry_washer_controls_delegate = static_cast(delegate); LaundryWasherControls::LaundryWasherControlsServer::SetDefaultDelegate(endpoint_id, laundry_washer_controls_delegate); } void WindowCoveringDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); WindowCovering::Delegate *window_covering_delegate = static_cast(delegate); WindowCovering::SetDefaultDelegate(endpoint_id, window_covering_delegate); } void DishwasherAlarmDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); DishwasherAlarm::Delegate *dishwasher_alarm_delegate = static_cast(delegate); DishwasherAlarm::SetDefaultDelegate(endpoint_id, dishwasher_alarm_delegate); } void KeypadInputDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); KeypadInput::Delegate *keypad_input_delegate = static_cast(delegate); KeypadInput::SetDefaultDelegate(endpoint_id, keypad_input_delegate); } void ModeSelectDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ModeSelect::SupportedModesManager *supported_modes_manager = static_cast(delegate); ModeSelect::setSupportedModesManager(supported_modes_manager); } void ThreadBorderRouterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id) { assert(delegate != nullptr); /* Get the attribute */ attribute_t *attribute = attribute::get(endpoint_id, ThreadBorderRouterManagement::Id, Globals::Attributes::FeatureMap::Id); assert(attribute != nullptr); /* Update the value if the attribute already exists */ esp_matter_attr_val_t val = esp_matter_invalid(nullptr); attribute::get_val(attribute, &val); bool pan_change_supported = (val.val.u32 & thread_border_router_management::feature::pan_change::get_id()) ? true : false; ThreadBorderRouterManagement::Delegate *thread_br_delegate = static_cast(delegate); assert(thread_br_delegate->GetPanChangeSupported() == pan_change_supported); ThreadBorderRouterManagement::ServerInstance *server_instance = chip::Platform::New(endpoint_id, thread_br_delegate, chip::Server::GetInstance().GetFailSafeContext()); server_instance->Init(); } void ServiceAreaDelegateInitCB(void *delegate, uint16_t endpoint_id) { // TODO: This cluster has two delegates. We need to update existing delegate logic to accommodate multiple delegates. } void WaterHeaterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id) { if(delegate == nullptr) { return; } static WaterHeaterManagement::Instance * wHtrInstance = nullptr; WaterHeaterManagement::Delegate *whtr_delegate = static_cast(delegate); uint32_t feature_map = get_feature_map_value(endpoint_id, WaterHeaterManagement::Id); wHtrInstance = new WaterHeaterManagement::Instance(endpoint_id, *whtr_delegate, chip::BitMask(feature_map)); wHtrInstance->Init(); } void EnergyPreferenceDelegateInitCB(void *delegate, uint16_t endpoint_id) { if(delegate == nullptr) { return; } EnergyPreference::Delegate *energy_preference_delegate = static_cast(delegate); EnergyPreference::SetDelegate(energy_preference_delegate); } void CommissionerControlDelegateInitCB(void *delegate, uint16_t endpoint_id) { if(delegate == nullptr) { return; } CommissionerControl::Delegate *commissioner_control_delegate = static_cast(delegate); CommissionerControl::CommissionerControlServer *commissioner_control_instance = nullptr; commissioner_control_instance = new CommissionerControl::CommissionerControlServer(commissioner_control_delegate, endpoint_id); commissioner_control_instance->Init(); } void ActionsDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); static Actions::ActionsServer *actionsServer = nullptr; Actions::Delegate *actions_delegate = static_cast(delegate); actionsServer = new Actions::ActionsServer(endpoint_id, *actions_delegate); actionsServer->Init(); } void ThermostatDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); Thermostat::Delegate *thermostat_delegate = static_cast(delegate); Thermostat::SetDefaultDelegate(endpoint_id, thermostat_delegate); } void OtaSoftwareUpdateProviderDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); chip::app::Clusters::OTAProvider::SetDelegate(endpoint_id, static_cast(delegate)); } void DiagnosticLogsDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); DiagnosticLogs::DiagnosticLogsProviderDelegate *diagnostic_logs_delegate = static_cast(delegate); DiagnosticLogs::DiagnosticLogsServer::Instance().SetDiagnosticLogsProviderDelegate(endpoint_id, diagnostic_logs_delegate); } void ChimeDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ChimeDelegate *chime_delegate = static_cast(delegate); ChimeServer *chime_server = new ChimeServer(endpoint_id, *chime_delegate); chime_server->Init(); } void ClosureControlDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ClosureControl::DelegateBase *closure_control_delegate = static_cast(delegate); ClosureControl::MatterContext *matter_context = new ClosureControl::MatterContext(endpoint_id); ClosureControl::ClusterLogic *cluster_logic = new ClosureControl::ClusterLogic(*closure_control_delegate, *matter_context); ClosureControl::Interface *server_interface = new ClosureControl::Interface(endpoint_id, *cluster_logic); server_interface->Init(); } void ClosureDimensionDelegateInitCB(void *delegate, uint16_t endpoint_id) { VerifyOrReturn(delegate != nullptr); ClosureDimension::DelegateBase *closure_dimension_delegate = static_cast(delegate); ClosureDimension::MatterContext *matter_context = new ClosureDimension::MatterContext(endpoint_id); ClosureDimension::ClusterLogic *cluster_logic = new ClosureDimension::ClusterLogic(*closure_dimension_delegate, *matter_context); ClosureDimension::Interface *server_interface = new ClosureDimension::Interface(endpoint_id, *cluster_logic); server_interface->Init(); } } // namespace delegate_cb } // namespace cluster } // namespace esp_matter