3 * Copyright (c) 2021 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 // THIS FILE IS GENERATED BY ZAP
22 #include "af-structs.h"
23 #include "call-command-handler.h"
25 #include "cluster-id.h"
26 #include "command-id.h"
31 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
35 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
39 return EMBER_ZCL_STATUS_SUCCESS;
43 return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
45 else if (clusterExists)
47 return EMBER_ZCL_STATUS_UNSUP_COMMAND;
51 return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
55 // Main command parsing controller.
56 EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
58 EmberAfStatus result = status(false, false, cmd->mfgSpecific);
59 if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
60 emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
62 switch (cmd->apsFrame->clusterId)
65 // Unrecognized cluster ID, error status will apply.
69 else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
70 emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
72 switch (cmd->apsFrame->clusterId)
74 case ZCL_BASIC_CLUSTER_ID:
75 // No commands are enabled for cluster Basic
76 result = status(false, true, cmd->mfgSpecific);
78 case ZCL_LEVEL_CONTROL_CLUSTER_ID:
79 result = emberAfLevelControlClusterServerCommandParse(cmd);
81 case ZCL_ON_OFF_CLUSTER_ID:
82 result = emberAfOnOffClusterServerCommandParse(cmd);
85 // Unrecognized cluster ID, error status will apply.
92 // Cluster specific command parsing
94 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd)
96 bool wasHandled = false;
98 if (!cmd->mfgSpecific)
100 switch (cmd->commandId)
102 case ZCL_MOVE_COMMAND_ID: {
103 uint16_t payloadOffset = cmd->payloadStartIndex;
107 uint8_t optionOverride;
109 if (cmd->bufLen < payloadOffset + 1)
111 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
113 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
114 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
115 if (cmd->bufLen < payloadOffset + 1)
117 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
119 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
120 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
121 if (cmd->bufLen < payloadOffset + 1)
123 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
125 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
126 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
127 if (cmd->bufLen < payloadOffset + 1)
129 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
131 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
133 wasHandled = emberAfLevelControlClusterMoveCallback(moveMode, rate, optionMask, optionOverride);
136 case ZCL_MOVE_TO_LEVEL_COMMAND_ID: {
137 uint16_t payloadOffset = cmd->payloadStartIndex;
139 uint16_t transitionTime;
141 uint8_t optionOverride;
143 if (cmd->bufLen < payloadOffset + 1)
145 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
147 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
148 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
149 if (cmd->bufLen < payloadOffset + 2)
151 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
153 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
154 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
155 if (cmd->bufLen < payloadOffset + 1)
157 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
159 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
160 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
161 if (cmd->bufLen < payloadOffset + 1)
163 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
165 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
167 wasHandled = emberAfLevelControlClusterMoveToLevelCallback(level, transitionTime, optionMask, optionOverride);
170 case ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID: {
171 uint16_t payloadOffset = cmd->payloadStartIndex;
173 uint16_t transitionTime;
175 if (cmd->bufLen < payloadOffset + 1)
177 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
179 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
180 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
181 if (cmd->bufLen < payloadOffset + 2)
183 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
185 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
187 wasHandled = emberAfLevelControlClusterMoveToLevelWithOnOffCallback(level, transitionTime);
190 case ZCL_MOVE_WITH_ON_OFF_COMMAND_ID: {
191 uint16_t payloadOffset = cmd->payloadStartIndex;
195 if (cmd->bufLen < payloadOffset + 1)
197 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
199 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
200 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
201 if (cmd->bufLen < payloadOffset + 1)
203 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
205 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
207 wasHandled = emberAfLevelControlClusterMoveWithOnOffCallback(moveMode, rate);
210 case ZCL_STEP_COMMAND_ID: {
211 uint16_t payloadOffset = cmd->payloadStartIndex;
214 uint16_t transitionTime;
216 uint8_t optionOverride;
218 if (cmd->bufLen < payloadOffset + 1)
220 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
222 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
223 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
224 if (cmd->bufLen < payloadOffset + 1)
226 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
228 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
229 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
230 if (cmd->bufLen < payloadOffset + 2)
232 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
234 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
235 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
236 if (cmd->bufLen < payloadOffset + 1)
238 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
240 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
241 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
242 if (cmd->bufLen < payloadOffset + 1)
244 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
246 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
248 wasHandled = emberAfLevelControlClusterStepCallback(stepMode, stepSize, transitionTime, optionMask, optionOverride);
251 case ZCL_STEP_WITH_ON_OFF_COMMAND_ID: {
252 uint16_t payloadOffset = cmd->payloadStartIndex;
255 uint16_t transitionTime;
257 if (cmd->bufLen < payloadOffset + 1)
259 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
261 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
262 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
263 if (cmd->bufLen < payloadOffset + 1)
265 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
267 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
268 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
269 if (cmd->bufLen < payloadOffset + 2)
271 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
273 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
275 wasHandled = emberAfLevelControlClusterStepWithOnOffCallback(stepMode, stepSize, transitionTime);
278 case ZCL_STOP_COMMAND_ID: {
279 uint16_t payloadOffset = cmd->payloadStartIndex;
281 uint8_t optionOverride;
283 if (cmd->bufLen < payloadOffset + 1)
285 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
287 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
288 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
289 if (cmd->bufLen < payloadOffset + 1)
291 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
293 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
295 wasHandled = emberAfLevelControlClusterStopCallback(optionMask, optionOverride);
298 case ZCL_STOP_WITH_ON_OFF_COMMAND_ID: {
299 wasHandled = emberAfLevelControlClusterStopWithOnOffCallback();
303 // Unrecognized command ID, error status will apply.
308 return status(wasHandled, true, cmd->mfgSpecific);
310 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
312 bool wasHandled = false;
314 if (!cmd->mfgSpecific)
316 switch (cmd->commandId)
318 case ZCL_OFF_COMMAND_ID: {
319 wasHandled = emberAfOnOffClusterOffCallback();
322 case ZCL_ON_COMMAND_ID: {
323 wasHandled = emberAfOnOffClusterOnCallback();
326 case ZCL_TOGGLE_COMMAND_ID: {
327 wasHandled = emberAfOnOffClusterToggleCallback();
331 // Unrecognized command ID, error status will apply.
336 return status(wasHandled, true, cmd->mfgSpecific);