Skip to content

Commit

Permalink
[IC-Device] Add Accessor class for ClientMonitoring Cluster (#23909)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>

* replace response sender with commandhandler

* Fix spelling mistakes

Co-authored-by: Tennessee Carmel-Veilleux <[email protected]>

* Change return value for IM status

Co-authored-by: Boris Zbarsky <[email protected]>
Co-authored-by: Tennessee Carmel-Veilleux <[email protected]>
  • Loading branch information
3 people authored and pull[bot] committed Mar 24, 2023
1 parent 94331de commit 0b8da29
Show file tree
Hide file tree
Showing 4 changed files with 185 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,34 +19,77 @@

#include <app-common/zap-generated/af-structs.h>
#include <app-common/zap-generated/attributes/Accessors.h>
#include <app/AttributeAccessInterface.h>
#include <app/CommandHandler.h>
#include <app/ConcreteAttributePath.h>
#include <app/util/ClientMonitoringRegistrationTable.h>
#include <app/util/af-event.h>
#include <app/util/af.h>
#include <app/util/attribute-storage.h>

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);
}
75 changes: 75 additions & 0 deletions src/app/util/ClientMonitoringRegistrationTable.cpp
Original file line number Diff line number Diff line change
@@ -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
51 changes: 51 additions & 0 deletions src/app/util/ClientMonitoringRegistrationTable.h
Original file line number Diff line number Diff line change
@@ -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 <app-common/zap-generated/cluster-objects.h>
#include <lib/core/CHIPConfig.h>
#include <lib/support/CodeUtils.h>
#include <platform/CHIPDeviceConfig.h>

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
10 changes: 10 additions & 0 deletions src/lib/core/CHIPConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
/**
* @}
*/

0 comments on commit 0b8da29

Please sign in to comment.