From 980886837aa7002069648fecbe82134fbba1df77 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Wed, 14 Dec 2022 18:56:07 -0500 Subject: [PATCH] [IC-Device] Add Accessor class for ClientMonitoring Cluster (#23909) * Add Accessor class for ClientMonitoring Cluster * restyle changes * Resolve comments and failures * restyler * Replace singleton pattern with factory logic * Change nbre entries per fabric to 1 * Apply suggestions from code review Co-authored-by: Boris Zbarsky * replace response sender with commandhandler * Fix spelling mistakes Co-authored-by: Tennessee Carmel-Veilleux * Change return value for IM status Co-authored-by: Boris Zbarsky Co-authored-by: Tennessee Carmel-Veilleux --- .../client-monitoring-server.cpp | 55 ++++++++++++-- .../ClientMonitoringRegistrationTable.cpp | 75 +++++++++++++++++++ .../util/ClientMonitoringRegistrationTable.h | 51 +++++++++++++ src/lib/core/CHIPConfig.h | 10 +++ 4 files changed, 185 insertions(+), 6 deletions(-) create mode 100644 src/app/util/ClientMonitoringRegistrationTable.cpp create mode 100644 src/app/util/ClientMonitoringRegistrationTable.h diff --git a/src/app/clusters/client-monitoring-server/client-monitoring-server.cpp b/src/app/clusters/client-monitoring-server/client-monitoring-server.cpp index 02cc4bfcb9ae85..aedfc3864f6b7a 100644 --- a/src/app/clusters/client-monitoring-server/client-monitoring-server.cpp +++ b/src/app/clusters/client-monitoring-server/client-monitoring-server.cpp @@ -19,34 +19,77 @@ #include #include +#include #include +#include +#include #include #include #include using namespace chip; +using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::ClientMonitoring; +namespace { + +/** + * @brief Implementation of attribute access for ClientMonitoring cluster + */ +class ClientMonitoringAttributeAccess : public app::AttributeAccessInterface +{ +public: + ClientMonitoringAttributeAccess() : AttributeAccessInterface(MakeOptional(kRootEndpointId), ClientMonitoring::Id) {} + + CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override + { + VerifyOrDie(aPath.mClusterId == ClientMonitoring::Id); + + switch (aPath.mAttributeId) + { + case ClientMonitoring::Attributes::ExpectedClients::Id: + // TODO : Implement Client monitoring registration table + return CHIP_IM_GLOBAL_STATUS(UnsupportedRead); + + default: + break; + } + + return CHIP_NO_ERROR; + } + + CHIP_ERROR Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder) override + { + return CHIP_IM_GLOBAL_STATUS(UnsupportedWrite); + } +}; + +ClientMonitoringAttributeAccess gAttribute; + +} // namespace + /** * @brief Client Monitoring Cluster RegisterClientMonitoring Command callback (from client) */ bool emberAfClientMonitoringClusterRegisterClientMonitoringCallback( - app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath, + CommandHandler * commandObj, const ConcreteCommandPath & commandPath, const Commands::RegisterClientMonitoring::DecodableType & commandData) { - emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_UNSUPPORTED_COMMAND); + commandObj->AddStatus(commandPath, Protocols::InteractionModel::Status::UnsupportedCommand); return false; } /** * @brief Client Monitoring Cluster StayAwakeRequest Command callback (from client) */ -bool emberAfClientMonitoringClusterStayAwakeRequestCallback(app::CommandHandler * commandObj, - const chip::app::ConcreteCommandPath & commandPath, +bool emberAfClientMonitoringClusterStayAwakeRequestCallback(CommandHandler * commandObj, const ConcreteCommandPath & commandPath, const Commands::StayAwakeRequest::DecodableType & commandData) { - emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_UNSUPPORTED_COMMAND); + commandObj->AddStatus(commandPath, Protocols::InteractionModel::Status::UnsupportedCommand); return false; } -void MatterClientMonitoringPluginServerInitCallback() {} +void MatterClientMonitoringPluginServerInitCallback() +{ + registerAttributeAccessOverride(&gAttribute); +} diff --git a/src/app/util/ClientMonitoringRegistrationTable.cpp b/src/app/util/ClientMonitoringRegistrationTable.cpp new file mode 100644 index 00000000000000..efdccf01467d1e --- /dev/null +++ b/src/app/util/ClientMonitoringRegistrationTable.cpp @@ -0,0 +1,75 @@ +/** + * + * Copyright (c) 2022 Project CHIP Authors + * + * 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 "ClientMonitoringRegistrationTable.h" + +namespace chip { + +/********************************************************** + * Attributes Definition + *********************************************************/ + +/********************************************************** + * ClientMonitoringRegistrationTable Implementation + *********************************************************/ + +ClientMonitoringRegistrationTable::ClientMonitoringRegistrationTable(FabricIndex fabricIndex) +{ + this->LoadFromStorage(fabricIndex); +} + +void ClientMonitoringRegistrationTable::LoadFromStorage(FabricIndex fabricIndex) +{ + // TODO: Implement load from NVM logic +} + +void ClientMonitoringRegistrationTable::SaveToStorage() +{ + // Store to NVM based of class attributes +} + +NodeId ClientMonitoringRegistrationTable::getClientNodeId() +{ + return mRegisteredClient.clientNodeId; +} + +uint64_t ClientMonitoringRegistrationTable::getICid() +{ + return mRegisteredClient.ICid; +} + +FabricIndex ClientMonitoringRegistrationTable::getFaricIndex() +{ + return mRegisteredClient.fabricIndex; +} + +void ClientMonitoringRegistrationTable::setClientNodeId(NodeId clientNodeId) +{ + mRegisteredClient.clientNodeId = clientNodeId; +} + +void ClientMonitoringRegistrationTable::setICid(uint64_t ICid) +{ + mRegisteredClient.ICid = ICid; +} + +void ClientMonitoringRegistrationTable::setFabricIndex(FabricIndex fabric) +{ + mRegisteredClient.fabricIndex = fabric; +} + +} // namespace chip diff --git a/src/app/util/ClientMonitoringRegistrationTable.h b/src/app/util/ClientMonitoringRegistrationTable.h new file mode 100644 index 00000000000000..a495f96ba0bc58 --- /dev/null +++ b/src/app/util/ClientMonitoringRegistrationTable.h @@ -0,0 +1,51 @@ +/** + * + * Copyright (c) 2022 Project CHIP Authors + * + * 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. + */ + +#pragma once + +#include +#include +#include +#include + +namespace chip { +class ClientMonitoringRegistrationTable +{ +public: + using MonitoringRegistrationStruct = chip::app::Clusters::ClientMonitoring::Structs::MonitoringRegistration::Type; + + ClientMonitoringRegistrationTable(FabricIndex fabricIndex); + ~ClientMonitoringRegistrationTable(){}; + + void SaveToStorage(); + + // Getter + NodeId getClientNodeId(); + uint64_t getICid(); + FabricIndex getFaricIndex(); + + // Setter + void setClientNodeId(NodeId clientNodeId); + void setICid(uint64_t ICid); + void setFabricIndex(FabricIndex fabric); + +private: + void LoadFromStorage(FabricIndex fabricIndex); + MonitoringRegistrationStruct mRegisteredClient; +}; + +} // namespace chip diff --git a/src/lib/core/CHIPConfig.h b/src/lib/core/CHIPConfig.h index 3dec51ea121746..399df9452263c4 100644 --- a/src/lib/core/CHIPConfig.h +++ b/src/lib/core/CHIPConfig.h @@ -1326,6 +1326,16 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; #ifndef CHIP_CONFIG_NUM_CD_KEY_SLOTS #define CHIP_CONFIG_NUM_CD_KEY_SLOTS 5 #endif // CHIP_CONFIG_NUM_CD_KEY_SLOTS + +/** + * @def CHIP_CONFIG_MAX_CLIENT_REG_PER_FABRIC + * + * @brief Defines the number of clients that can register for monitoring with a server + * see ClientMonitoring cluster for specification + */ +#ifndef CHIP_CONFIG_MAX_CLIENT_REG_PER_FABRIC +#define CHIP_CONFIG_MAX_CLIENT_REG_PER_FABRIC 1 +#endif // CHIP_CONFIG_MAX_CLIENT_REG_PER_FABRIC /** * @} */