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 emberAfApplicationBasicClusterClientCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfBarrierControlClusterClientCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfBasicClusterClientCommandParse(EmberAfClusterCommand * cmd);
34 EmberAfStatus emberAfBindingClusterClientCommandParse(EmberAfClusterCommand * cmd);
35 EmberAfStatus emberAfColorControlClusterClientCommandParse(EmberAfClusterCommand * cmd);
36 EmberAfStatus emberAfDoorLockClusterClientCommandParse(EmberAfClusterCommand * cmd);
37 EmberAfStatus emberAfGeneralCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd);
38 EmberAfStatus emberAfGroupsClusterClientCommandParse(EmberAfClusterCommand * cmd);
39 EmberAfStatus emberAfIdentifyClusterClientCommandParse(EmberAfClusterCommand * cmd);
40 EmberAfStatus emberAfLevelControlClusterClientCommandParse(EmberAfClusterCommand * cmd);
41 EmberAfStatus emberAfLowPowerClusterClientCommandParse(EmberAfClusterCommand * cmd);
42 EmberAfStatus emberAfOnOffClusterClientCommandParse(EmberAfClusterCommand * cmd);
43 EmberAfStatus emberAfScenesClusterClientCommandParse(EmberAfClusterCommand * cmd);
44 EmberAfStatus emberAfTemperatureMeasurementClusterClientCommandParse(EmberAfClusterCommand * cmd);
46 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
50 return EMBER_ZCL_STATUS_SUCCESS;
54 return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
56 else if (clusterExists)
58 return EMBER_ZCL_STATUS_UNSUP_COMMAND;
62 return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
66 // Main command parsing controller.
67 EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
69 EmberAfStatus result = status(false, false, cmd->mfgSpecific);
70 if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
71 emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
73 switch (cmd->apsFrame->clusterId)
75 case ZCL_APPLICATION_BASIC_CLUSTER_ID:
76 // No commands are enabled for cluster Application Basic
77 result = status(false, true, cmd->mfgSpecific);
79 case ZCL_BARRIER_CONTROL_CLUSTER_ID:
80 // No commands are enabled for cluster Barrier Control
81 result = status(false, true, cmd->mfgSpecific);
83 case ZCL_BASIC_CLUSTER_ID:
84 // No commands are enabled for cluster Basic
85 result = status(false, true, cmd->mfgSpecific);
87 case ZCL_BINDING_CLUSTER_ID:
88 // No commands are enabled for cluster Binding
89 result = status(false, true, cmd->mfgSpecific);
91 case ZCL_COLOR_CONTROL_CLUSTER_ID:
92 // No commands are enabled for cluster Color Control
93 result = status(false, true, cmd->mfgSpecific);
95 case ZCL_DOOR_LOCK_CLUSTER_ID:
96 result = emberAfDoorLockClusterClientCommandParse(cmd);
98 case ZCL_GENERAL_COMMISSIONING_CLUSTER_ID:
99 result = emberAfGeneralCommissioningClusterClientCommandParse(cmd);
101 case ZCL_GROUPS_CLUSTER_ID:
102 result = emberAfGroupsClusterClientCommandParse(cmd);
104 case ZCL_IDENTIFY_CLUSTER_ID:
105 result = emberAfIdentifyClusterClientCommandParse(cmd);
107 case ZCL_LEVEL_CONTROL_CLUSTER_ID:
108 // No commands are enabled for cluster Level Control
109 result = status(false, true, cmd->mfgSpecific);
111 case ZCL_LOW_POWER_CLUSTER_ID:
112 // No commands are enabled for cluster Low Power
113 result = status(false, true, cmd->mfgSpecific);
115 case ZCL_ON_OFF_CLUSTER_ID:
116 // No commands are enabled for cluster On/off
117 result = status(false, true, cmd->mfgSpecific);
119 case ZCL_SCENES_CLUSTER_ID:
120 result = emberAfScenesClusterClientCommandParse(cmd);
122 case ZCL_TEMP_MEASUREMENT_CLUSTER_ID:
123 // No commands are enabled for cluster Temperature Measurement
124 result = status(false, true, cmd->mfgSpecific);
127 // Unrecognized cluster ID, error status will apply.
131 else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
132 emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
134 switch (cmd->apsFrame->clusterId)
137 // Unrecognized cluster ID, error status will apply.
144 // Cluster specific command parsing
146 EmberAfStatus emberAfDoorLockClusterClientCommandParse(EmberAfClusterCommand * cmd)
148 bool wasHandled = false;
150 if (!cmd->mfgSpecific)
152 switch (cmd->commandId)
154 case ZCL_CLEAR_ALL_PINS_RESPONSE_COMMAND_ID: {
155 uint16_t payloadOffset = cmd->payloadStartIndex;
158 if (cmd->bufLen < payloadOffset + 1)
160 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
162 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
164 wasHandled = emberAfDoorLockClusterClearAllPinsResponseCallback(status);
167 case ZCL_CLEAR_ALL_RFIDS_RESPONSE_COMMAND_ID: {
168 uint16_t payloadOffset = cmd->payloadStartIndex;
171 if (cmd->bufLen < payloadOffset + 1)
173 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
175 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
177 wasHandled = emberAfDoorLockClusterClearAllRfidsResponseCallback(status);
180 case ZCL_CLEAR_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
181 uint16_t payloadOffset = cmd->payloadStartIndex;
184 if (cmd->bufLen < payloadOffset + 1)
186 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
188 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
190 wasHandled = emberAfDoorLockClusterClearHolidayScheduleResponseCallback(status);
193 case ZCL_CLEAR_PIN_RESPONSE_COMMAND_ID: {
194 uint16_t payloadOffset = cmd->payloadStartIndex;
197 if (cmd->bufLen < payloadOffset + 1)
199 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
201 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
203 wasHandled = emberAfDoorLockClusterClearPinResponseCallback(status);
206 case ZCL_CLEAR_RFID_RESPONSE_COMMAND_ID: {
207 uint16_t payloadOffset = cmd->payloadStartIndex;
210 if (cmd->bufLen < payloadOffset + 1)
212 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
214 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
216 wasHandled = emberAfDoorLockClusterClearRfidResponseCallback(status);
219 case ZCL_CLEAR_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
220 uint16_t payloadOffset = cmd->payloadStartIndex;
223 if (cmd->bufLen < payloadOffset + 1)
225 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
227 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
229 wasHandled = emberAfDoorLockClusterClearWeekdayScheduleResponseCallback(status);
232 case ZCL_CLEAR_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
233 uint16_t payloadOffset = cmd->payloadStartIndex;
236 if (cmd->bufLen < payloadOffset + 1)
238 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
240 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
242 wasHandled = emberAfDoorLockClusterClearYeardayScheduleResponseCallback(status);
245 case ZCL_GET_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
246 uint16_t payloadOffset = cmd->payloadStartIndex;
249 uint32_t localStartTime;
250 uint32_t localEndTime;
251 uint8_t operatingModeDuringHoliday;
253 if (cmd->bufLen < payloadOffset + 1)
255 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
257 scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
258 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
259 if (cmd->bufLen < payloadOffset + 1)
261 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
263 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
264 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
265 if (cmd->bufLen < payloadOffset + 4)
267 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
269 localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
270 payloadOffset = static_cast<uint16_t>(payloadOffset + 4);
271 if (cmd->bufLen < payloadOffset + 4)
273 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
275 localEndTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
276 payloadOffset = static_cast<uint16_t>(payloadOffset + 4);
277 if (cmd->bufLen < payloadOffset + 1)
279 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
281 operatingModeDuringHoliday = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
283 wasHandled = emberAfDoorLockClusterGetHolidayScheduleResponseCallback(scheduleId, status, localStartTime, localEndTime,
284 operatingModeDuringHoliday);
287 case ZCL_GET_LOG_RECORD_RESPONSE_COMMAND_ID: {
288 uint16_t payloadOffset = cmd->payloadStartIndex;
293 uint8_t eventIdOrAlarmCode;
297 if (cmd->bufLen < payloadOffset + 2)
299 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
301 logEntryId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
302 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
303 if (cmd->bufLen < payloadOffset + 4)
305 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
307 timestamp = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
308 payloadOffset = static_cast<uint16_t>(payloadOffset + 4);
309 if (cmd->bufLen < payloadOffset + 1)
311 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
313 eventType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
314 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
315 if (cmd->bufLen < payloadOffset + 1)
317 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
319 source = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
320 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
321 if (cmd->bufLen < payloadOffset + 1)
323 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
325 eventIdOrAlarmCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
326 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
327 if (cmd->bufLen < payloadOffset + 2)
329 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
331 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
332 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
333 if (cmd->bufLen < payloadOffset + 1u)
335 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
337 pin = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
339 wasHandled = emberAfDoorLockClusterGetLogRecordResponseCallback(logEntryId, timestamp, eventType, source,
340 eventIdOrAlarmCode, userId, pin);
343 case ZCL_GET_PIN_RESPONSE_COMMAND_ID: {
344 uint16_t payloadOffset = cmd->payloadStartIndex;
350 if (cmd->bufLen < payloadOffset + 2)
352 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
354 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
355 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
356 if (cmd->bufLen < payloadOffset + 1)
358 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
360 userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
361 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
362 if (cmd->bufLen < payloadOffset + 1)
364 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
366 userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
367 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
368 if (cmd->bufLen < payloadOffset + 1u)
370 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
372 pin = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
374 wasHandled = emberAfDoorLockClusterGetPinResponseCallback(userId, userStatus, userType, pin);
377 case ZCL_GET_RFID_RESPONSE_COMMAND_ID: {
378 uint16_t payloadOffset = cmd->payloadStartIndex;
384 if (cmd->bufLen < payloadOffset + 2)
386 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
388 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
389 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
390 if (cmd->bufLen < payloadOffset + 1)
392 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
394 userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
395 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
396 if (cmd->bufLen < payloadOffset + 1)
398 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
400 userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
401 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
402 if (cmd->bufLen < payloadOffset + 1u)
404 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
406 rfid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
408 wasHandled = emberAfDoorLockClusterGetRfidResponseCallback(userId, userStatus, userType, rfid);
411 case ZCL_GET_USER_TYPE_RESPONSE_COMMAND_ID: {
412 uint16_t payloadOffset = cmd->payloadStartIndex;
416 if (cmd->bufLen < payloadOffset + 2)
418 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
420 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
421 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
422 if (cmd->bufLen < payloadOffset + 1)
424 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
426 userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
428 wasHandled = emberAfDoorLockClusterGetUserTypeResponseCallback(userId, userType);
431 case ZCL_GET_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
432 uint16_t payloadOffset = cmd->payloadStartIndex;
442 if (cmd->bufLen < payloadOffset + 1)
444 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
446 scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
447 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
448 if (cmd->bufLen < payloadOffset + 2)
450 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
452 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
453 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
454 if (cmd->bufLen < payloadOffset + 1)
456 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
458 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
459 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
460 if (cmd->bufLen < payloadOffset + 1)
462 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
464 daysMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
465 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
466 if (cmd->bufLen < payloadOffset + 1)
468 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
470 startHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
471 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
472 if (cmd->bufLen < payloadOffset + 1)
474 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
476 startMinute = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
477 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
478 if (cmd->bufLen < payloadOffset + 1)
480 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
482 endHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
483 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
484 if (cmd->bufLen < payloadOffset + 1)
486 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
488 endMinute = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
490 wasHandled = emberAfDoorLockClusterGetWeekdayScheduleResponseCallback(scheduleId, userId, status, daysMask, startHour,
491 startMinute, endHour, endMinute);
494 case ZCL_GET_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
495 uint16_t payloadOffset = cmd->payloadStartIndex;
499 uint32_t localStartTime;
500 uint32_t localEndTime;
502 if (cmd->bufLen < payloadOffset + 1)
504 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
506 scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
507 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
508 if (cmd->bufLen < payloadOffset + 2)
510 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
512 userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
513 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
514 if (cmd->bufLen < payloadOffset + 1)
516 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
518 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
519 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
520 if (cmd->bufLen < payloadOffset + 4)
522 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
524 localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
525 payloadOffset = static_cast<uint16_t>(payloadOffset + 4);
526 if (cmd->bufLen < payloadOffset + 4)
528 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
530 localEndTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
533 emberAfDoorLockClusterGetYeardayScheduleResponseCallback(scheduleId, userId, status, localStartTime, localEndTime);
536 case ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID: {
537 uint16_t payloadOffset = cmd->payloadStartIndex;
540 if (cmd->bufLen < payloadOffset + 1)
542 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
544 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
546 wasHandled = emberAfDoorLockClusterLockDoorResponseCallback(status);
549 case ZCL_SET_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
550 uint16_t payloadOffset = cmd->payloadStartIndex;
553 if (cmd->bufLen < payloadOffset + 1)
555 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
557 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
559 wasHandled = emberAfDoorLockClusterSetHolidayScheduleResponseCallback(status);
562 case ZCL_SET_PIN_RESPONSE_COMMAND_ID: {
563 uint16_t payloadOffset = cmd->payloadStartIndex;
566 if (cmd->bufLen < payloadOffset + 1)
568 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
570 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
572 wasHandled = emberAfDoorLockClusterSetPinResponseCallback(status);
575 case ZCL_SET_RFID_RESPONSE_COMMAND_ID: {
576 uint16_t payloadOffset = cmd->payloadStartIndex;
579 if (cmd->bufLen < payloadOffset + 1)
581 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
583 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
585 wasHandled = emberAfDoorLockClusterSetRfidResponseCallback(status);
588 case ZCL_SET_USER_TYPE_RESPONSE_COMMAND_ID: {
589 uint16_t payloadOffset = cmd->payloadStartIndex;
592 if (cmd->bufLen < payloadOffset + 1)
594 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
596 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
598 wasHandled = emberAfDoorLockClusterSetUserTypeResponseCallback(status);
601 case ZCL_SET_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
602 uint16_t payloadOffset = cmd->payloadStartIndex;
605 if (cmd->bufLen < payloadOffset + 1)
607 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
609 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
611 wasHandled = emberAfDoorLockClusterSetWeekdayScheduleResponseCallback(status);
614 case ZCL_SET_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: {
615 uint16_t payloadOffset = cmd->payloadStartIndex;
618 if (cmd->bufLen < payloadOffset + 1)
620 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
622 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
624 wasHandled = emberAfDoorLockClusterSetYeardayScheduleResponseCallback(status);
627 case ZCL_UNLOCK_DOOR_RESPONSE_COMMAND_ID: {
628 uint16_t payloadOffset = cmd->payloadStartIndex;
631 if (cmd->bufLen < payloadOffset + 1)
633 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
635 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
637 wasHandled = emberAfDoorLockClusterUnlockDoorResponseCallback(status);
640 case ZCL_UNLOCK_WITH_TIMEOUT_RESPONSE_COMMAND_ID: {
641 uint16_t payloadOffset = cmd->payloadStartIndex;
644 if (cmd->bufLen < payloadOffset + 1)
646 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
648 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
650 wasHandled = emberAfDoorLockClusterUnlockWithTimeoutResponseCallback(status);
654 // Unrecognized command ID, error status will apply.
659 return status(wasHandled, true, cmd->mfgSpecific);
661 EmberAfStatus emberAfGeneralCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd)
663 bool wasHandled = false;
665 if (!cmd->mfgSpecific)
667 switch (cmd->commandId)
669 case ZCL_ARM_FAIL_SAFE_RESPONSE_COMMAND_ID: {
670 uint16_t payloadOffset = cmd->payloadStartIndex;
674 if (cmd->bufLen < payloadOffset + 1)
676 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
678 errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
679 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
680 if (cmd->bufLen < payloadOffset + 1u)
682 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
684 debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
686 wasHandled = emberAfGeneralCommissioningClusterArmFailSafeResponseCallback(errorCode, debugText);
689 case ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID: {
690 uint16_t payloadOffset = cmd->payloadStartIndex;
694 if (cmd->bufLen < payloadOffset + 1)
696 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
698 errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
699 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
700 if (cmd->bufLen < payloadOffset + 1u)
702 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
704 debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
706 wasHandled = emberAfGeneralCommissioningClusterCommissioningCompleteResponseCallback(errorCode, debugText);
709 case ZCL_SET_FABRIC_RESPONSE_COMMAND_ID: {
710 uint16_t payloadOffset = cmd->payloadStartIndex;
714 if (cmd->bufLen < payloadOffset + 1)
716 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
718 errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
719 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
720 if (cmd->bufLen < payloadOffset + 1u)
722 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
724 debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
726 wasHandled = emberAfGeneralCommissioningClusterSetFabricResponseCallback(errorCode, debugText);
730 // Unrecognized command ID, error status will apply.
735 return status(wasHandled, true, cmd->mfgSpecific);
737 EmberAfStatus emberAfGroupsClusterClientCommandParse(EmberAfClusterCommand * cmd)
739 bool wasHandled = false;
741 if (!cmd->mfgSpecific)
743 switch (cmd->commandId)
745 case ZCL_ADD_GROUP_RESPONSE_COMMAND_ID: {
746 uint16_t payloadOffset = cmd->payloadStartIndex;
750 if (cmd->bufLen < payloadOffset + 1)
752 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
754 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
755 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
756 if (cmd->bufLen < payloadOffset + 2)
758 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
760 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
762 wasHandled = emberAfGroupsClusterAddGroupResponseCallback(status, groupId);
765 case ZCL_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID: {
766 uint16_t payloadOffset = cmd->payloadStartIndex;
769 /* TYPE WARNING: array array defaults to */ uint8_t * groupList;
771 if (cmd->bufLen < payloadOffset + 1)
773 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
775 capacity = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
776 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
777 if (cmd->bufLen < payloadOffset + 1)
779 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
781 groupCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
782 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
783 groupList = cmd->buffer + payloadOffset;
785 wasHandled = emberAfGroupsClusterGetGroupMembershipResponseCallback(capacity, groupCount, groupList);
788 case ZCL_REMOVE_GROUP_RESPONSE_COMMAND_ID: {
789 uint16_t payloadOffset = cmd->payloadStartIndex;
793 if (cmd->bufLen < payloadOffset + 1)
795 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
797 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
798 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
799 if (cmd->bufLen < payloadOffset + 2)
801 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
803 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
805 wasHandled = emberAfGroupsClusterRemoveGroupResponseCallback(status, groupId);
808 case ZCL_VIEW_GROUP_RESPONSE_COMMAND_ID: {
809 uint16_t payloadOffset = cmd->payloadStartIndex;
814 if (cmd->bufLen < payloadOffset + 1)
816 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
818 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
819 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
820 if (cmd->bufLen < payloadOffset + 2)
822 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
824 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
825 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
826 if (cmd->bufLen < payloadOffset + 1u)
828 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
830 groupName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
832 wasHandled = emberAfGroupsClusterViewGroupResponseCallback(status, groupId, groupName);
836 // Unrecognized command ID, error status will apply.
841 return status(wasHandled, true, cmd->mfgSpecific);
843 EmberAfStatus emberAfIdentifyClusterClientCommandParse(EmberAfClusterCommand * cmd)
845 bool wasHandled = false;
847 if (!cmd->mfgSpecific)
849 switch (cmd->commandId)
851 case ZCL_IDENTIFY_QUERY_RESPONSE_COMMAND_ID: {
852 uint16_t payloadOffset = cmd->payloadStartIndex;
855 if (cmd->bufLen < payloadOffset + 2)
857 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
859 timeout = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
861 wasHandled = emberAfIdentifyClusterIdentifyQueryResponseCallback(timeout);
865 // Unrecognized command ID, error status will apply.
870 return status(wasHandled, true, cmd->mfgSpecific);
872 EmberAfStatus emberAfScenesClusterClientCommandParse(EmberAfClusterCommand * cmd)
874 bool wasHandled = false;
876 if (!cmd->mfgSpecific)
878 switch (cmd->commandId)
880 case ZCL_ADD_SCENE_RESPONSE_COMMAND_ID: {
881 uint16_t payloadOffset = cmd->payloadStartIndex;
886 if (cmd->bufLen < payloadOffset + 1)
888 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
890 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
891 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
892 if (cmd->bufLen < payloadOffset + 2)
894 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
896 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
897 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
898 if (cmd->bufLen < payloadOffset + 1)
900 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
902 sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
904 wasHandled = emberAfScenesClusterAddSceneResponseCallback(status, groupId, sceneId);
907 case ZCL_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID: {
908 uint16_t payloadOffset = cmd->payloadStartIndex;
913 /* TYPE WARNING: array array defaults to */ uint8_t * sceneList;
915 if (cmd->bufLen < payloadOffset + 1)
917 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
919 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
920 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
921 if (cmd->bufLen < payloadOffset + 1)
923 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
925 capacity = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
926 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
927 if (cmd->bufLen < payloadOffset + 2)
929 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
931 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
932 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
935 if (cmd->bufLen < payloadOffset + 1)
937 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
939 sceneCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
940 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
944 sceneCount = UINT8_MAX;
948 sceneList = cmd->buffer + payloadOffset;
955 wasHandled = emberAfScenesClusterGetSceneMembershipResponseCallback(status, capacity, groupId, sceneCount, sceneList);
958 case ZCL_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID: {
959 uint16_t payloadOffset = cmd->payloadStartIndex;
963 if (cmd->bufLen < payloadOffset + 1)
965 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
967 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
968 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
969 if (cmd->bufLen < payloadOffset + 2)
971 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
973 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
975 wasHandled = emberAfScenesClusterRemoveAllScenesResponseCallback(status, groupId);
978 case ZCL_REMOVE_SCENE_RESPONSE_COMMAND_ID: {
979 uint16_t payloadOffset = cmd->payloadStartIndex;
984 if (cmd->bufLen < payloadOffset + 1)
986 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
988 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
989 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
990 if (cmd->bufLen < payloadOffset + 2)
992 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
994 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
995 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
996 if (cmd->bufLen < payloadOffset + 1)
998 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1000 sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
1002 wasHandled = emberAfScenesClusterRemoveSceneResponseCallback(status, groupId, sceneId);
1005 case ZCL_STORE_SCENE_RESPONSE_COMMAND_ID: {
1006 uint16_t payloadOffset = cmd->payloadStartIndex;
1011 if (cmd->bufLen < payloadOffset + 1)
1013 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1015 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
1016 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
1017 if (cmd->bufLen < payloadOffset + 2)
1019 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1021 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
1022 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
1023 if (cmd->bufLen < payloadOffset + 1)
1025 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1027 sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
1029 wasHandled = emberAfScenesClusterStoreSceneResponseCallback(status, groupId, sceneId);
1032 case ZCL_VIEW_SCENE_RESPONSE_COMMAND_ID: {
1033 uint16_t payloadOffset = cmd->payloadStartIndex;
1037 uint16_t transitionTime;
1038 uint8_t * sceneName;
1039 /* TYPE WARNING: array array defaults to */ uint8_t * extensionFieldSets;
1041 if (cmd->bufLen < payloadOffset + 1)
1043 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1045 status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
1046 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
1047 if (cmd->bufLen < payloadOffset + 2)
1049 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1051 groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
1052 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
1053 if (cmd->bufLen < payloadOffset + 1)
1055 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1057 sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
1058 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
1061 if (cmd->bufLen < payloadOffset + 2)
1063 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1065 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
1066 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
1070 transitionTime = UINT16_MAX;
1074 if (cmd->bufLen < payloadOffset + 1u)
1076 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
1078 sceneName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
1079 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(sceneName) + 1u);
1087 extensionFieldSets = cmd->buffer + payloadOffset;
1091 extensionFieldSets = NULL;
1094 wasHandled = emberAfScenesClusterViewSceneResponseCallback(status, groupId, sceneId, transitionTime, sceneName,
1095 extensionFieldSets);
1099 // Unrecognized command ID, error status will apply.
1104 return status(wasHandled, true, cmd->mfgSpecific);