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 "app/util/util.h"
24 #include "call-command-handler.h"
26 #include "cluster-id.h"
27 #include "command-id.h"
31 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
34 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
36 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
40 return EMBER_ZCL_STATUS_SUCCESS;
44 return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
46 else if (clusterExists)
48 return EMBER_ZCL_STATUS_UNSUP_COMMAND;
52 return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
56 // Main command parsing controller.
57 EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
59 EmberAfStatus result = status(false, false, cmd->mfgSpecific);
60 if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
61 emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
63 switch (cmd->apsFrame->clusterId)
66 // Unrecognized cluster ID, error status will apply.
70 else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
71 emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
73 switch (cmd->apsFrame->clusterId)
75 case ZCL_BASIC_CLUSTER_ID:
76 // No commands are enabled for cluster Basic
77 result = status(false, true, cmd->mfgSpecific);
79 case ZCL_LEVEL_CONTROL_CLUSTER_ID:
80 result = emberAfLevelControlClusterServerCommandParse(cmd);
82 case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
83 result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
85 case ZCL_ON_OFF_CLUSTER_ID:
86 result = emberAfOnOffClusterServerCommandParse(cmd);
89 // Unrecognized cluster ID, error status will apply.
96 // Cluster specific command parsing
98 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd)
100 bool wasHandled = false;
102 if (!cmd->mfgSpecific)
104 switch (cmd->commandId)
106 case ZCL_MOVE_COMMAND_ID: {
107 uint16_t payloadOffset = cmd->payloadStartIndex;
111 uint8_t optionOverride;
113 if (cmd->bufLen < payloadOffset + 1)
115 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
117 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
118 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
119 if (cmd->bufLen < payloadOffset + 1)
121 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
123 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
124 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
125 if (cmd->bufLen < payloadOffset + 1)
127 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
129 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
130 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
131 if (cmd->bufLen < payloadOffset + 1)
133 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
135 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
137 wasHandled = emberAfLevelControlClusterMoveCallback(moveMode, rate, optionMask, optionOverride);
140 case ZCL_MOVE_TO_LEVEL_COMMAND_ID: {
141 uint16_t payloadOffset = cmd->payloadStartIndex;
143 uint16_t transitionTime;
145 uint8_t optionOverride;
147 if (cmd->bufLen < payloadOffset + 1)
149 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
151 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
152 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
153 if (cmd->bufLen < payloadOffset + 2)
155 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
157 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
158 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
159 if (cmd->bufLen < payloadOffset + 1)
161 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
163 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
164 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
165 if (cmd->bufLen < payloadOffset + 1)
167 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
169 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
171 wasHandled = emberAfLevelControlClusterMoveToLevelCallback(level, transitionTime, optionMask, optionOverride);
174 case ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID: {
175 uint16_t payloadOffset = cmd->payloadStartIndex;
177 uint16_t transitionTime;
179 if (cmd->bufLen < payloadOffset + 1)
181 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
183 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
184 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
185 if (cmd->bufLen < payloadOffset + 2)
187 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
189 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
191 wasHandled = emberAfLevelControlClusterMoveToLevelWithOnOffCallback(level, transitionTime);
194 case ZCL_MOVE_WITH_ON_OFF_COMMAND_ID: {
195 uint16_t payloadOffset = cmd->payloadStartIndex;
199 if (cmd->bufLen < payloadOffset + 1)
201 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
203 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
204 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
205 if (cmd->bufLen < payloadOffset + 1)
207 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
209 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
211 wasHandled = emberAfLevelControlClusterMoveWithOnOffCallback(moveMode, rate);
214 case ZCL_STEP_COMMAND_ID: {
215 uint16_t payloadOffset = cmd->payloadStartIndex;
218 uint16_t transitionTime;
220 uint8_t optionOverride;
222 if (cmd->bufLen < payloadOffset + 1)
224 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
226 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
227 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
228 if (cmd->bufLen < payloadOffset + 1)
230 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
232 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
233 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
234 if (cmd->bufLen < payloadOffset + 2)
236 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
238 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
239 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
240 if (cmd->bufLen < payloadOffset + 1)
242 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
244 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
245 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
246 if (cmd->bufLen < payloadOffset + 1)
248 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
250 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
252 wasHandled = emberAfLevelControlClusterStepCallback(stepMode, stepSize, transitionTime, optionMask, optionOverride);
255 case ZCL_STEP_WITH_ON_OFF_COMMAND_ID: {
256 uint16_t payloadOffset = cmd->payloadStartIndex;
259 uint16_t transitionTime;
261 if (cmd->bufLen < payloadOffset + 1)
263 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
265 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
266 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
267 if (cmd->bufLen < payloadOffset + 1)
269 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
271 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
272 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
273 if (cmd->bufLen < payloadOffset + 2)
275 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
277 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
279 wasHandled = emberAfLevelControlClusterStepWithOnOffCallback(stepMode, stepSize, transitionTime);
282 case ZCL_STOP_COMMAND_ID: {
283 uint16_t payloadOffset = cmd->payloadStartIndex;
285 uint8_t optionOverride;
287 if (cmd->bufLen < payloadOffset + 1)
289 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
291 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
292 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
293 if (cmd->bufLen < payloadOffset + 1)
295 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
297 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
299 wasHandled = emberAfLevelControlClusterStopCallback(optionMask, optionOverride);
302 case ZCL_STOP_WITH_ON_OFF_COMMAND_ID: {
303 wasHandled = emberAfLevelControlClusterStopWithOnOffCallback();
307 // Unrecognized command ID, error status will apply.
312 return status(wasHandled, true, cmd->mfgSpecific);
314 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
316 bool wasHandled = false;
318 if (!cmd->mfgSpecific)
320 switch (cmd->commandId)
322 case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
323 uint16_t payloadOffset = cmd->payloadStartIndex;
324 chip::ByteSpan operationalDataset;
328 if (cmd->bufLen < payloadOffset + 1u)
330 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
333 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
334 operationalDataset = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
336 payloadOffset = static_cast<uint16_t>(payloadOffset + operationalDataset.size() + 1u);
337 if (cmd->bufLen < payloadOffset + 8)
339 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
341 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
342 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
343 if (cmd->bufLen < payloadOffset + 4)
345 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
347 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
349 wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
352 case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
353 uint16_t payloadOffset = cmd->payloadStartIndex;
355 chip::ByteSpan credentials;
359 if (cmd->bufLen < payloadOffset + 1u)
361 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
364 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
365 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
367 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
368 if (cmd->bufLen < payloadOffset + 1u)
370 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
373 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
374 credentials = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
376 payloadOffset = static_cast<uint16_t>(payloadOffset + credentials.size() + 1u);
377 if (cmd->bufLen < payloadOffset + 8)
379 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
381 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
382 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
383 if (cmd->bufLen < payloadOffset + 4)
385 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
387 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
389 wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
392 case ZCL_DISABLE_NETWORK_COMMAND_ID: {
393 uint16_t payloadOffset = cmd->payloadStartIndex;
394 chip::ByteSpan networkID;
398 if (cmd->bufLen < payloadOffset + 1u)
400 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
403 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
404 networkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
406 payloadOffset = static_cast<uint16_t>(payloadOffset + networkID.size() + 1u);
407 if (cmd->bufLen < payloadOffset + 8)
409 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
411 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
412 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
413 if (cmd->bufLen < payloadOffset + 4)
415 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
417 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
419 wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
422 case ZCL_ENABLE_NETWORK_COMMAND_ID: {
423 uint16_t payloadOffset = cmd->payloadStartIndex;
424 chip::ByteSpan networkID;
428 if (cmd->bufLen < payloadOffset + 1u)
430 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
433 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
434 networkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
436 payloadOffset = static_cast<uint16_t>(payloadOffset + networkID.size() + 1u);
437 if (cmd->bufLen < payloadOffset + 8)
439 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
441 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
442 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
443 if (cmd->bufLen < payloadOffset + 4)
445 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
447 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
449 wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
452 case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
453 uint16_t payloadOffset = cmd->payloadStartIndex;
456 if (cmd->bufLen < payloadOffset + 4)
458 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
460 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
462 wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
465 case ZCL_REMOVE_NETWORK_COMMAND_ID: {
466 uint16_t payloadOffset = cmd->payloadStartIndex;
467 chip::ByteSpan NetworkID;
471 if (cmd->bufLen < payloadOffset + 1u)
473 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
476 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
477 NetworkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
479 payloadOffset = static_cast<uint16_t>(payloadOffset + NetworkID.size() + 1u);
480 if (cmd->bufLen < payloadOffset + 8)
482 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
484 Breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
485 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
486 if (cmd->bufLen < payloadOffset + 4)
488 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
490 TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
492 wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
495 case ZCL_SCAN_NETWORKS_COMMAND_ID: {
496 uint16_t payloadOffset = cmd->payloadStartIndex;
501 if (cmd->bufLen < payloadOffset + 1u)
503 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
506 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
507 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
509 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
510 if (cmd->bufLen < payloadOffset + 8)
512 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
514 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
515 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
516 if (cmd->bufLen < payloadOffset + 4)
518 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
520 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
522 wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
525 case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
526 uint16_t payloadOffset = cmd->payloadStartIndex;
527 chip::ByteSpan operationalDataset;
531 if (cmd->bufLen < payloadOffset + 1u)
533 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
536 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
537 operationalDataset = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
539 payloadOffset = static_cast<uint16_t>(payloadOffset + operationalDataset.size() + 1u);
540 if (cmd->bufLen < payloadOffset + 8)
542 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
544 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
545 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
546 if (cmd->bufLen < payloadOffset + 4)
548 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
550 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
552 wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
555 case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
556 uint16_t payloadOffset = cmd->payloadStartIndex;
558 chip::ByteSpan credentials;
562 if (cmd->bufLen < payloadOffset + 1u)
564 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
567 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
568 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
570 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
571 if (cmd->bufLen < payloadOffset + 1u)
573 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
576 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
577 credentials = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
579 payloadOffset = static_cast<uint16_t>(payloadOffset + credentials.size() + 1u);
580 if (cmd->bufLen < payloadOffset + 8)
582 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
584 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
585 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
586 if (cmd->bufLen < payloadOffset + 4)
588 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
590 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
592 wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
596 // Unrecognized command ID, error status will apply.
601 return status(wasHandled, true, cmd->mfgSpecific);
603 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
605 bool wasHandled = false;
607 if (!cmd->mfgSpecific)
609 switch (cmd->commandId)
611 case ZCL_OFF_COMMAND_ID: {
612 wasHandled = emberAfOnOffClusterOffCallback();
615 case ZCL_ON_COMMAND_ID: {
616 wasHandled = emberAfOnOffClusterOnCallback();
619 case ZCL_TOGGLE_COMMAND_ID: {
620 wasHandled = emberAfOnOffClusterToggleCallback();
624 // Unrecognized command ID, error status will apply.
629 return status(wasHandled, true, cmd->mfgSpecific);