blob: 9f5307dba6d7536c4d0a2bb48de99ce2fca58a72 [file] [log] [blame]
#ifndef SRC_APP_CLUSTERS_SAMPLE_MEI_CLUSTER_SERVER_SERVER_H_
#define SRC_APP_CLUSTERS_SAMPLE_MEI_CLUSTER_SERVER_SERVER_H_
#include <app-common/zap-generated/cluster-objects.h>
#include <app/AttributeAccessInterface.h>
#include <app/CommandHandlerInterface.h>
#include <app/ConcreteCommandPath.h>
#include <app/util/af-types.h>
#include <app/util/basic-types.h>
#include <app/util/config.h>
#include <lib/support/Span.h>
#include <platform/CHIPDeviceConfig.h>
#ifdef ZCL_USING_SAMPLE_MEI_CLUSTER_SERVER
#define SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS \
(EMBER_AF_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT)
#else
#define SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT
#endif /* ZCL_USING_SAMPLE_MEI_CLUSTER_SERVER */
static constexpr size_t kNumSupportedEndpoints = SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS;
namespace chip {
namespace app {
namespace Clusters {
namespace SampleMei {
// *****************************************************************************
// SampleMeiContent has the stateful attributes of the cluster: its endpoint
// and attributes
class SampleMeiContent
{
public:
EndpointId endpoint;
uint32_t pingCount;
// Attribute List
bool flipflop; /* Attributes::FlipFlop::Id */
SampleMeiContent(EndpointId endpoint);
SampleMeiContent();
};
// *****************************************************************************
// SampleMeiServer implements both Attributes and Commands
class SampleMeiServer : public AttributeAccessInterface, public CommandHandlerInterface
{
public:
// Register on all endpoints.
SampleMeiServer() :
AttributeAccessInterface(Optional<EndpointId>::Missing(), SampleMei::Id),
CommandHandlerInterface(Optional<EndpointId>(), Id)
{}
static SampleMeiServer & Instance();
// Currently not used, but should be called from a whole-cluster shutdown
// callback once cluster lifecycle is clearer
void Shutdown();
// Attributes
CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
CHIP_ERROR Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder) override;
// Commands
void InvokeCommand(HandlerContext & ctx) override;
// Attribute storage
#if SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS > 0
SampleMeiContent content[kNumSupportedEndpoints];
#else
SampleMeiContent * content = nullptr;
#endif
size_t GetNumSupportedEndpoints() const;
CHIP_ERROR RegisterEndpoint(EndpointId endpointId);
CHIP_ERROR UnregisterEndpoint(EndpointId endpointId);
private:
// both return std::numeric_limits<size_t>::max() for not found
size_t EndpointIndex(EndpointId endpointId) const;
size_t NextEmptyIndex() const;
};
} // namespace SampleMei
} // namespace Clusters
} // namespace app
} // namespace chip
#endif // SRC_APP_CLUSTERS_SAMPLE_MEI_CLUSTER_SERVER_SERVER_H_