forked from project-chip/connectedhomeip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathServerClusterInterface.h
164 lines (147 loc) · 8.28 KB
/
ServerClusterInterface.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
* Copyright (c) 2025 Project CHIP Authors
* All rights reserved.
*
* 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/AttributeValueDecoder.h>
#include <app/AttributeValueEncoder.h>
#include <app/CommandHandler.h>
#include <app/ConcreteClusterPath.h>
#include <app/data-model-provider/ActionReturnStatus.h>
#include <app/data-model-provider/MetadataList.h>
#include <app/data-model-provider/MetadataTypes.h>
#include <app/data-model-provider/OperationTypes.h>
#include <lib/core/CHIPError.h>
#include <lib/core/DataModelTypes.h>
#include <lib/support/BitFlags.h>
namespace chip {
namespace app {
/// Handles cluster interactions for a specific cluster id.
///
/// A `ServerClusterInterface` instance is associated with a single endpointId and represents
/// a cluster that exists at a given `endpointId/clusterId` path.
///
/// Provides metadata as well as interaction processing (attribute read/write and command handling).
class ServerClusterInterface
{
public:
virtual ~ServerClusterInterface() = default;
///////////////////////////////////// Cluster Metadata Support //////////////////////////////////////////////////
/// The path to this cluster instance.
///
/// This path (endpointid,clusterid) is expected to remain constant once the server
/// cluster interface is in use.
[[nodiscard]] virtual ConcreteClusterPath GetPath() const = 0;
/// Gets the data version for this cluster instance.
///
/// Every cluster instance must have a data version.
///
/// SPEC - 7.10.3. Cluster Data Version
/// A cluster data version is a metadata increment-only counter value, maintained for each cluster instance.
/// [...]
/// A cluster data version SHALL increment or be set (wrap) to zero if incrementing would exceed its
/// maximum value. A cluster data version SHALL be maintained for each cluster instance.
/// [...]
/// A cluster data version SHALL be incremented if any attribute data changes.
[[nodiscard]] virtual DataVersion GetDataVersion() const = 0;
[[nodiscard]] virtual BitFlags<DataModel::ClusterQualityFlags> GetClusterFlags() const = 0;
///////////////////////////////////// Attribute Support ////////////////////////////////////////////////////////
/// Indicates the start/end of a series of list operations. This function will be called either before the first
/// Write operation or after the last one of a series of consecutive attribute data values received for the same attribute.
///
/// 1) This function will be called if the client tries to set a nullable list attribute to null.
/// 2) This function will only be called at the beginning and end of a series of consecutive attribute data
/// blocks for the same attribute, no matter what list operations those data blocks represent.
/// 3) The opType argument indicates the type of notification (Start, Failure, Success).
virtual void ListAttributeWriteNotification(const ConcreteAttributePath & aPath, DataModel::ListWriteOperation opType) {}
/// Reads the value of an existing attribute.
///
/// ReadAttribute MUST be done on an "existent" attribute path: only on attributes that are
/// returned in an `Attributes` call for this cluster. ReadAttribute is not expected to perform
/// that verification; the caller is responsible for it.
///
/// `request.path` is expected to have `GetClusterId` as the cluster id as well as an attribute that is
/// included in an `Attributes` call.
///
/// This MUST HANDLE the following global attributes:
/// - FeatureMap::Id
/// - ClusterRevision::Id
///
/// This function WILL NOT be called for attributes that can be derived from cluster metadata.
/// Specifically this WILL NOT be called (and does not need to implement handling for) the
/// following attribute IDs:
/// - AcceptedCommandList::Id
/// - AttributeList::Id
/// - GeneratedCommandList::Id
virtual DataModel::ActionReturnStatus ReadAttribute(const DataModel::ReadAttributeRequest & request,
AttributeValueEncoder & encoder) = 0;
/// Writes a value to an existing attribute.
///
/// WriteAttribute MUST be done on an "existent" attribute path: only on attributes that are
/// returned in an `Attributes` call for this cluster. WriteAttribute is not expected to perform
/// that verification; the caller is responsible for it.
///
/// `request.path` is expected to have `GetClusterId` as the cluster id as well as an attribute that is
/// included in a `Attributes` call.
virtual DataModel::ActionReturnStatus WriteAttribute(const DataModel::WriteAttributeRequest & request,
AttributeValueDecoder & decoder) = 0;
/// Retrieves the list of attributes supported by this cluster.
///
/// Attribute list MUST contain global attributes.
///
/// Specifically these attributes MUST always exist in the list for all clusters:
/// - ClusterRevision::Id
/// - FeatureMap::Id
/// - AcceptedCommandList::Id
/// - AttributeList::Id
/// - GeneratedCommandList::Id
/// See SPEC 7.13 Global Elements: `Global Attributes` table
virtual CHIP_ERROR Attributes(const ConcreteClusterPath & path,
DataModel::ListBuilder<DataModel::AttributeEntry> & builder) = 0;
///////////////////////////////////// Command Support /////////////////////////////////////////////////////////
/// Handles the invocation of a command.
///
/// `handler` is used to send back the response.
/// - returning `nullopt` means that return value was placed in handler directly.
/// This includes cases where command handling and value return will be done asynchronously.
/// - returning a value other than Success implies an error reply (error and data are mutually exclusive)
///
/// InvokeCommand MUST be done on an "existent" attribute path: only on commands that are
/// returned in an `AcceptedCommand` call for this cluster.
///
/// Return value expectations:
/// - if a response has been placed into `handler` then std::nullopt MUST be returned. In particular
/// note that CHIP_NO_ERROR is NOT the same as std::nullopt:
/// > CHIP_NO_ERROR means handler had no status set and we expect the caller to AddStatus(success)
/// > std::nullopt means that handler has added an appropriate data/status response
/// - if a value is returned (not nullopt) then the handler response MUST NOT be filled. The caller
/// will then issue `handler->AddStatus(request.path, <return_value>->GetStatusCode())`. This is a
/// convenience to make writing Invoke calls easier.
virtual std::optional<DataModel::ActionReturnStatus>
InvokeCommand(const DataModel::InvokeRequest & request, chip::TLV::TLVReader & input_arguments, CommandHandler * handler) = 0;
/// Retrieves a list of commands accepted by this cluster.
///
/// Returning `CHIP_NO_ERROR` without adding anything to the `builder` list is expected
/// if no commands are supported by the cluster.
virtual CHIP_ERROR AcceptedCommands(const ConcreteClusterPath & path,
DataModel::ListBuilder<DataModel::AcceptedCommandEntry> & builder) = 0;
/// Retrieves a list of commands generated by this cluster.
///
/// Returning `CHIP_NO_ERROR` without adding anything to the `builder` list is expected
/// if no commands are generated by processing accepted commands.
virtual CHIP_ERROR GeneratedCommands(const ConcreteClusterPath & path, DataModel::ListBuilder<CommandId> & builder) = 0;
};
} // namespace app
} // namespace chip