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 result = emberAfBasicClusterServerCommandParse(cmd);
77 case ZCL_LEVEL_CONTROL_CLUSTER_ID:
78 result = emberAfLevelControlClusterServerCommandParse(cmd);
80 case ZCL_ON_OFF_CLUSTER_ID:
81 result = emberAfOnOffClusterServerCommandParse(cmd);
84 // Unrecognized cluster ID, error status will apply.
91 // Cluster specific command parsing
93 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd)
95 bool wasHandled = false;
97 if (!cmd->mfgSpecific)
99 switch (cmd->commandId)
101 case ZCL_RESET_TO_FACTORY_DEFAULTS_COMMAND_ID: {
102 wasHandled = emberAfBasicClusterResetToFactoryDefaultsCallback();
106 // Unrecognized command ID, error status will apply.
111 return status(wasHandled, true, cmd->mfgSpecific);
113 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd)
115 bool wasHandled = false;
117 if (!cmd->mfgSpecific)
119 switch (cmd->commandId)
121 case ZCL_MOVE_COMMAND_ID: {
122 uint16_t payloadOffset = cmd->payloadStartIndex;
126 uint8_t optionOverride;
128 if (cmd->bufLen < payloadOffset + 1)
130 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
132 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
133 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
134 if (cmd->bufLen < payloadOffset + 1)
136 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
138 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
139 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
140 if (cmd->bufLen < payloadOffset + 1)
142 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
144 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
145 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
146 if (cmd->bufLen < payloadOffset + 1)
148 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
150 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
152 wasHandled = emberAfLevelControlClusterMoveCallback(moveMode, rate, optionMask, optionOverride);
155 case ZCL_MOVE_TO_LEVEL_COMMAND_ID: {
156 uint16_t payloadOffset = cmd->payloadStartIndex;
158 uint16_t transitionTime;
160 uint8_t optionOverride;
162 if (cmd->bufLen < payloadOffset + 1)
164 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
166 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
167 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
168 if (cmd->bufLen < payloadOffset + 2)
170 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
172 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
173 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
174 if (cmd->bufLen < payloadOffset + 1)
176 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
178 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
179 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
180 if (cmd->bufLen < payloadOffset + 1)
182 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
184 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
186 wasHandled = emberAfLevelControlClusterMoveToLevelCallback(level, transitionTime, optionMask, optionOverride);
189 case ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID: {
190 uint16_t payloadOffset = cmd->payloadStartIndex;
192 uint16_t transitionTime;
194 if (cmd->bufLen < payloadOffset + 1)
196 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
198 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
199 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
200 if (cmd->bufLen < payloadOffset + 2)
202 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
204 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
206 wasHandled = emberAfLevelControlClusterMoveToLevelWithOnOffCallback(level, transitionTime);
209 case ZCL_MOVE_WITH_ON_OFF_COMMAND_ID: {
210 uint16_t payloadOffset = cmd->payloadStartIndex;
214 if (cmd->bufLen < payloadOffset + 1)
216 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
218 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
219 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
220 if (cmd->bufLen < payloadOffset + 1)
222 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
224 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
226 wasHandled = emberAfLevelControlClusterMoveWithOnOffCallback(moveMode, rate);
229 case ZCL_STEP_COMMAND_ID: {
230 uint16_t payloadOffset = cmd->payloadStartIndex;
233 uint16_t transitionTime;
235 uint8_t optionOverride;
237 if (cmd->bufLen < payloadOffset + 1)
239 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
241 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
242 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
243 if (cmd->bufLen < payloadOffset + 1)
245 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
247 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
248 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
249 if (cmd->bufLen < payloadOffset + 2)
251 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
253 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
254 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
255 if (cmd->bufLen < payloadOffset + 1)
257 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
259 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
260 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
261 if (cmd->bufLen < payloadOffset + 1)
263 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
265 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
267 wasHandled = emberAfLevelControlClusterStepCallback(stepMode, stepSize, transitionTime, optionMask, optionOverride);
270 case ZCL_STEP_WITH_ON_OFF_COMMAND_ID: {
271 uint16_t payloadOffset = cmd->payloadStartIndex;
274 uint16_t transitionTime;
276 if (cmd->bufLen < payloadOffset + 1)
278 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
280 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
281 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
282 if (cmd->bufLen < payloadOffset + 1)
284 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
286 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
287 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
288 if (cmd->bufLen < payloadOffset + 2)
290 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
292 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
294 wasHandled = emberAfLevelControlClusterStepWithOnOffCallback(stepMode, stepSize, transitionTime);
297 case ZCL_STOP_COMMAND_ID: {
298 uint16_t payloadOffset = cmd->payloadStartIndex;
300 uint8_t optionOverride;
302 if (cmd->bufLen < payloadOffset + 1)
304 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
306 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
307 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
308 if (cmd->bufLen < payloadOffset + 1)
310 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
312 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
314 wasHandled = emberAfLevelControlClusterStopCallback(optionMask, optionOverride);
317 case ZCL_STOP_WITH_ON_OFF_COMMAND_ID: {
318 wasHandled = emberAfLevelControlClusterStopWithOnOffCallback();
322 // Unrecognized command ID, error status will apply.
327 return status(wasHandled, true, cmd->mfgSpecific);
329 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
331 bool wasHandled = false;
333 if (!cmd->mfgSpecific)
335 switch (cmd->commandId)
337 case ZCL_OFF_COMMAND_ID: {
338 wasHandled = emberAfOnOffClusterOffCallback();
341 case ZCL_ON_COMMAND_ID: {
342 wasHandled = emberAfOnOffClusterOnCallback();
345 case ZCL_TOGGLE_COMMAND_ID: {
346 wasHandled = emberAfOnOffClusterToggleCallback();
350 // Unrecognized command ID, error status will apply.
355 return status(wasHandled, true, cmd->mfgSpecific);