| /* |
| * |
| * Copyright (c) 2021 Project CHIP Authors |
| * |
| * 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. |
| */ |
| |
| // THIS FILE IS GENERATED BY ZAP |
| |
| #include <stdint.h> |
| |
| #include "app/util/util.h" |
| #include "call-command-handler.h" |
| #include "callback.h" |
| #include <app/common/gen/af-structs.h> |
| #include <app/common/gen/cluster-id.h> |
| #include <app/common/gen/command-id.h> |
| |
| using namespace chip; |
| |
| EmberAfStatus emberAfAccountLoginClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfApplicationBasicClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfApplicationLauncherClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfAudioOutputClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfBarrierControlClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfBasicClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfBindingClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfBridgedDeviceBasicClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfColorControlClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfContentLaunchClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfDescriptorClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfDoorLockClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfEthernetNetworkDiagnosticsClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfFixedLabelClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfGeneralCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfGeneralDiagnosticsClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfGroupKeyManagementClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfGroupsClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfIdentifyClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfKeypadInputClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfLevelControlClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfLowPowerClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfMediaInputClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfMediaPlaybackClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfNetworkCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfOnOffClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfOperationalCredentialsClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfPumpConfigurationAndControlClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfRelativeHumidityMeasurementClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfScenesClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfSoftwareDiagnosticsClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfSwitchClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfTvChannelClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfTargetNavigatorClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfTemperatureMeasurementClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfTestClusterClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfThermostatClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfTrustedRootCertificatesClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfWakeOnLanClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| EmberAfStatus emberAfWindowCoveringClusterClientCommandParse(EmberAfClusterCommand * cmd); |
| |
| static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific) |
| { |
| if (wasHandled) |
| { |
| return EMBER_ZCL_STATUS_SUCCESS; |
| } |
| else if (mfgSpecific) |
| { |
| return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND; |
| } |
| else if (clusterExists) |
| { |
| return EMBER_ZCL_STATUS_UNSUP_COMMAND; |
| } |
| else |
| { |
| return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER; |
| } |
| } |
| |
| // Main command parsing controller. |
| EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd) |
| { |
| EmberAfStatus result = status(false, false, cmd->mfgSpecific); |
| if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT && |
| emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode)) |
| { |
| switch (cmd->apsFrame->clusterId) |
| { |
| case ZCL_ACCOUNT_LOGIN_CLUSTER_ID: |
| result = emberAfAccountLoginClusterClientCommandParse(cmd); |
| break; |
| case ZCL_APPLICATION_BASIC_CLUSTER_ID: |
| // No commands are enabled for cluster Application Basic |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_APPLICATION_LAUNCHER_CLUSTER_ID: |
| result = emberAfApplicationLauncherClusterClientCommandParse(cmd); |
| break; |
| case ZCL_AUDIO_OUTPUT_CLUSTER_ID: |
| // No commands are enabled for cluster Audio Output |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_BARRIER_CONTROL_CLUSTER_ID: |
| // No commands are enabled for cluster Barrier Control |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_BASIC_CLUSTER_ID: |
| // No commands are enabled for cluster Basic |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_BINDING_CLUSTER_ID: |
| // No commands are enabled for cluster Binding |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_BRIDGED_DEVICE_BASIC_CLUSTER_ID: |
| // No commands are enabled for cluster Bridged Device Basic |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_COLOR_CONTROL_CLUSTER_ID: |
| // No commands are enabled for cluster Color Control |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_CONTENT_LAUNCH_CLUSTER_ID: |
| result = emberAfContentLaunchClusterClientCommandParse(cmd); |
| break; |
| case ZCL_DESCRIPTOR_CLUSTER_ID: |
| // No commands are enabled for cluster Descriptor |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_DOOR_LOCK_CLUSTER_ID: |
| result = emberAfDoorLockClusterClientCommandParse(cmd); |
| break; |
| case ZCL_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_ID: |
| // No commands are enabled for cluster Ethernet Network Diagnostics |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_FIXED_LABEL_CLUSTER_ID: |
| // No commands are enabled for cluster Fixed Label |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_GENERAL_COMMISSIONING_CLUSTER_ID: |
| result = emberAfGeneralCommissioningClusterClientCommandParse(cmd); |
| break; |
| case ZCL_GENERAL_DIAGNOSTICS_CLUSTER_ID: |
| // No commands are enabled for cluster General Diagnostics |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_GROUP_KEY_MANAGEMENT_CLUSTER_ID: |
| // No commands are enabled for cluster Group Key Management |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_GROUPS_CLUSTER_ID: |
| result = emberAfGroupsClusterClientCommandParse(cmd); |
| break; |
| case ZCL_IDENTIFY_CLUSTER_ID: |
| result = emberAfIdentifyClusterClientCommandParse(cmd); |
| break; |
| case ZCL_KEYPAD_INPUT_CLUSTER_ID: |
| result = emberAfKeypadInputClusterClientCommandParse(cmd); |
| break; |
| case ZCL_LEVEL_CONTROL_CLUSTER_ID: |
| // No commands are enabled for cluster Level Control |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_LOW_POWER_CLUSTER_ID: |
| // No commands are enabled for cluster Low Power |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_MEDIA_INPUT_CLUSTER_ID: |
| // No commands are enabled for cluster Media Input |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_MEDIA_PLAYBACK_CLUSTER_ID: |
| result = emberAfMediaPlaybackClusterClientCommandParse(cmd); |
| break; |
| case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID: |
| result = emberAfNetworkCommissioningClusterClientCommandParse(cmd); |
| break; |
| case ZCL_ON_OFF_CLUSTER_ID: |
| // No commands are enabled for cluster On/off |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_OPERATIONAL_CREDENTIALS_CLUSTER_ID: |
| result = emberAfOperationalCredentialsClusterClientCommandParse(cmd); |
| break; |
| case ZCL_PUMP_CONFIG_CONTROL_CLUSTER_ID: |
| // No commands are enabled for cluster Pump Configuration and Control |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_ID: |
| // No commands are enabled for cluster Relative Humidity Measurement |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_SCENES_CLUSTER_ID: |
| result = emberAfScenesClusterClientCommandParse(cmd); |
| break; |
| case ZCL_SOFTWARE_DIAGNOSTICS_CLUSTER_ID: |
| // No commands are enabled for cluster Software Diagnostics |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_SWITCH_CLUSTER_ID: |
| // No commands are enabled for cluster Switch |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_TV_CHANNEL_CLUSTER_ID: |
| result = emberAfTvChannelClusterClientCommandParse(cmd); |
| break; |
| case ZCL_TARGET_NAVIGATOR_CLUSTER_ID: |
| result = emberAfTargetNavigatorClusterClientCommandParse(cmd); |
| break; |
| case ZCL_TEMP_MEASUREMENT_CLUSTER_ID: |
| // No commands are enabled for cluster Temperature Measurement |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_TEST_CLUSTER_ID: |
| result = emberAfTestClusterClusterClientCommandParse(cmd); |
| break; |
| case ZCL_THERMOSTAT_CLUSTER_ID: |
| // No commands are enabled for cluster Thermostat |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_TRUSTED_ROOT_CERTIFICATES_CLUSTER_ID: |
| // No commands are enabled for cluster Trusted Root Certificates |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_WAKE_ON_LAN_CLUSTER_ID: |
| // No commands are enabled for cluster Wake on LAN |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| case ZCL_WINDOW_COVERING_CLUSTER_ID: |
| // No commands are enabled for cluster Window Covering |
| result = status(false, true, cmd->mfgSpecific); |
| break; |
| default: |
| // Unrecognized cluster ID, error status will apply. |
| break; |
| } |
| } |
| else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER && |
| emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode)) |
| { |
| switch (cmd->apsFrame->clusterId) |
| { |
| default: |
| // Unrecognized cluster ID, error status will apply. |
| break; |
| } |
| } |
| return result; |
| } |
| |
| // Cluster specific command parsing |
| |
| EmberAfStatus emberAfAccountLoginClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_GET_SETUP_PIN_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t * setupPIN; |
| |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| setupPIN = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfAccountLoginClusterGetSetupPINResponseCallback(nullptr, setupPIN); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfApplicationLauncherClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_LAUNCH_APP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint8_t * data; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| data = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfApplicationLauncherClusterLaunchAppResponseCallback(nullptr, status, data); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfContentLaunchClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_LAUNCH_CONTENT_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t * data; |
| uint8_t contentLaunchStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| data = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(data) + 1u); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| contentLaunchStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfContentLaunchClusterLaunchContentResponseCallback(nullptr, data, contentLaunchStatus); |
| break; |
| } |
| case ZCL_LAUNCH_URL_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t * data; |
| uint8_t contentLaunchStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| data = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(data) + 1u); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| contentLaunchStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfContentLaunchClusterLaunchURLResponseCallback(nullptr, data, contentLaunchStatus); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfDoorLockClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_CLEAR_ALL_PINS_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearAllPinsResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_ALL_RFIDS_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearAllRfidsResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearHolidayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_PIN_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearPinResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_RFID_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearRfidResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearWeekdayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_CLEAR_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterClearYeardayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_GET_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t scheduleId; |
| uint8_t status; |
| uint32_t localStartTime; |
| uint32_t localEndTime; |
| uint8_t operatingModeDuringHoliday; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 4) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 4); |
| if (cmd->bufLen < payloadOffset + 4) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| localEndTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 4); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| operatingModeDuringHoliday = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetHolidayScheduleResponseCallback(nullptr, scheduleId, status, localStartTime, |
| localEndTime, operatingModeDuringHoliday); |
| break; |
| } |
| case ZCL_GET_LOG_RECORD_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint16_t logEntryId; |
| uint32_t timestamp; |
| uint8_t eventType; |
| uint8_t source; |
| uint8_t eventIdOrAlarmCode; |
| uint16_t userId; |
| uint8_t * pin; |
| |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| logEntryId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 4) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| timestamp = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 4); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| eventType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| source = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| eventIdOrAlarmCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| pin = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetLogRecordResponseCallback(nullptr, logEntryId, timestamp, eventType, source, |
| eventIdOrAlarmCode, userId, pin); |
| break; |
| } |
| case ZCL_GET_PIN_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint16_t userId; |
| uint8_t userStatus; |
| uint8_t userType; |
| uint8_t * pin; |
| |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| pin = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetPinResponseCallback(nullptr, userId, userStatus, userType, pin); |
| break; |
| } |
| case ZCL_GET_RFID_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint16_t userId; |
| uint8_t userStatus; |
| uint8_t userType; |
| uint8_t * rfid; |
| |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| rfid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetRfidResponseCallback(nullptr, userId, userStatus, userType, rfid); |
| break; |
| } |
| case ZCL_GET_USER_TYPE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint16_t userId; |
| uint8_t userType; |
| |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetUserTypeResponseCallback(nullptr, userId, userType); |
| break; |
| } |
| case ZCL_GET_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t scheduleId; |
| uint16_t userId; |
| uint8_t status; |
| uint8_t daysMask; |
| uint8_t startHour; |
| uint8_t startMinute; |
| uint8_t endHour; |
| uint8_t endMinute; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| daysMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| startHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| startMinute = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| endHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| endMinute = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetWeekdayScheduleResponseCallback(nullptr, scheduleId, userId, status, daysMask, |
| startHour, startMinute, endHour, endMinute); |
| break; |
| } |
| case ZCL_GET_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t scheduleId; |
| uint16_t userId; |
| uint8_t status; |
| uint32_t localStartTime; |
| uint32_t localEndTime; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| scheduleId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 4) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 4); |
| if (cmd->bufLen < payloadOffset + 4) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| localEndTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterGetYeardayScheduleResponseCallback(nullptr, scheduleId, userId, status, |
| localStartTime, localEndTime); |
| break; |
| } |
| case ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterLockDoorResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetHolidayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_PIN_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetPinResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_RFID_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetRfidResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_USER_TYPE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetUserTypeResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_WEEKDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetWeekdayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_SET_YEARDAY_SCHEDULE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterSetYeardayScheduleResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_UNLOCK_DOOR_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterUnlockDoorResponseCallback(nullptr, status); |
| break; |
| } |
| case ZCL_UNLOCK_WITH_TIMEOUT_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfDoorLockClusterUnlockWithTimeoutResponseCallback(nullptr, status); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfGeneralCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_ARM_FAIL_SAFE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGeneralCommissioningClusterArmFailSafeResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGeneralCommissioningClusterCommissioningCompleteResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_SET_REGULATORY_CONFIG_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGeneralCommissioningClusterSetRegulatoryConfigResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfGroupsClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_ADD_GROUP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGroupsClusterAddGroupResponseCallback(nullptr, status, groupId); |
| break; |
| } |
| case ZCL_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t capacity; |
| uint8_t groupCount; |
| /* TYPE WARNING: array array defaults to */ uint8_t * groupList; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| capacity = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| groupList = cmd->buffer + payloadOffset; |
| |
| wasHandled = emberAfGroupsClusterGetGroupMembershipResponseCallback(nullptr, capacity, groupCount, groupList); |
| break; |
| } |
| case ZCL_REMOVE_GROUP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGroupsClusterRemoveGroupResponseCallback(nullptr, status, groupId); |
| break; |
| } |
| case ZCL_VIEW_GROUP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| uint8_t * groupName; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfGroupsClusterViewGroupResponseCallback(nullptr, status, groupId, groupName); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfIdentifyClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_IDENTIFY_QUERY_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint16_t timeout; |
| |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| timeout = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfIdentifyClusterIdentifyQueryResponseCallback(nullptr, timeout); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfKeypadInputClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_SEND_KEY_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfKeypadInputClusterSendKeyResponseCallback(nullptr, status); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfMediaPlaybackClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_MEDIA_FAST_FORWARD_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaFastForwardResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_NEXT_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaNextResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_PAUSE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaPauseResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_PLAY_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaPlayResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_PREVIOUS_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaPreviousResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_REWIND_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaRewindResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_SKIP_BACKWARD_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaSkipBackwardResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_SKIP_FORWARD_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaSkipForwardResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_SKIP_SEEK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaSkipSeekResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_START_OVER_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaStartOverResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| case ZCL_MEDIA_STOP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t mediaPlaybackStatus; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| mediaPlaybackStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfMediaPlaybackClusterMediaStopResponseCallback(nullptr, mediaPlaybackStatus); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfNetworkCommissioningClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterDisableNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterEnableNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| /* TYPE WARNING: array array defaults to */ uint8_t * wifiScanResults; |
| /* TYPE WARNING: array array defaults to */ uint8_t * threadScanResults; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(debugText) + 1u); |
| wifiScanResults = cmd->buffer + payloadOffset; |
| threadScanResults = cmd->buffer + payloadOffset; |
| |
| wasHandled = emberAfNetworkCommissioningClusterScanNetworksResponseCallback(nullptr, errorCode, debugText, |
| wifiScanResults, threadScanResults); |
| break; |
| } |
| case ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| case ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t errorCode; |
| uint8_t * debugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| errorCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkResponseCallback(nullptr, errorCode, debugText); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfOperationalCredentialsClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_OP_CSR_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| chip::ByteSpan CSR; |
| chip::ByteSpan CSRNonce; |
| chip::ByteSpan VendorReserved1; |
| chip::ByteSpan VendorReserved2; |
| chip::ByteSpan VendorReserved3; |
| chip::ByteSpan Signature; |
| |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| CSR = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| payloadOffset = static_cast<uint16_t>(payloadOffset + CSR.size() + 1u); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| CSRNonce = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| payloadOffset = static_cast<uint16_t>(payloadOffset + CSRNonce.size() + 1u); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| VendorReserved1 = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| payloadOffset = static_cast<uint16_t>(payloadOffset + VendorReserved1.size() + 1u); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| VendorReserved2 = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| payloadOffset = static_cast<uint16_t>(payloadOffset + VendorReserved2.size() + 1u); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| VendorReserved3 = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| payloadOffset = static_cast<uint16_t>(payloadOffset + VendorReserved3.size() + 1u); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| { |
| uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| Signature = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); |
| } |
| |
| wasHandled = emberAfOperationalCredentialsClusterOpCSRResponseCallback(nullptr, CSR, CSRNonce, VendorReserved1, |
| VendorReserved2, VendorReserved3, Signature); |
| break; |
| } |
| case ZCL_OP_CERT_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t StatusCode; |
| uint64_t FabricIndex; |
| uint8_t * DebugText; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| StatusCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 8) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| FabricIndex = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 8); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| DebugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfOperationalCredentialsClusterOpCertResponseCallback(nullptr, StatusCode, FabricIndex, DebugText); |
| break; |
| } |
| case ZCL_SET_FABRIC_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| chip::FabricId FabricId; |
| |
| if (cmd->bufLen < payloadOffset + 8) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| FabricId = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfOperationalCredentialsClusterSetFabricResponseCallback(nullptr, FabricId); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfScenesClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_ADD_SCENE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| uint8_t sceneId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfScenesClusterAddSceneResponseCallback(nullptr, status, groupId, sceneId); |
| break; |
| } |
| case ZCL_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint8_t capacity; |
| uint16_t groupId; |
| uint8_t sceneCount; |
| /* TYPE WARNING: array array defaults to */ uint8_t * sceneList; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| capacity = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (status == 0) |
| { |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| } |
| else |
| { |
| sceneCount = UINT8_MAX; |
| } |
| if (status == 0) |
| { |
| sceneList = cmd->buffer + payloadOffset; |
| } |
| else |
| { |
| sceneList = NULL; |
| } |
| |
| wasHandled = |
| emberAfScenesClusterGetSceneMembershipResponseCallback(nullptr, status, capacity, groupId, sceneCount, sceneList); |
| break; |
| } |
| case ZCL_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfScenesClusterRemoveAllScenesResponseCallback(nullptr, status, groupId); |
| break; |
| } |
| case ZCL_REMOVE_SCENE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| uint8_t sceneId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfScenesClusterRemoveSceneResponseCallback(nullptr, status, groupId, sceneId); |
| break; |
| } |
| case ZCL_STORE_SCENE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| uint8_t sceneId; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfScenesClusterStoreSceneResponseCallback(nullptr, status, groupId, sceneId); |
| break; |
| } |
| case ZCL_VIEW_SCENE_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint16_t groupId; |
| uint8_t sceneId; |
| uint16_t transitionTime; |
| uint8_t * sceneName; |
| /* TYPE WARNING: array array defaults to */ uint8_t * extensionFieldSets; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (status == 0) |
| { |
| if (cmd->bufLen < payloadOffset + 2) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 2); |
| } |
| else |
| { |
| transitionTime = UINT16_MAX; |
| } |
| if (status == 0) |
| { |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| sceneName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(sceneName) + 1u); |
| } |
| else |
| { |
| sceneName = NULL; |
| } |
| if (status == 0) |
| { |
| extensionFieldSets = cmd->buffer + payloadOffset; |
| } |
| else |
| { |
| extensionFieldSets = NULL; |
| } |
| |
| wasHandled = emberAfScenesClusterViewSceneResponseCallback(nullptr, status, groupId, sceneId, transitionTime, sceneName, |
| extensionFieldSets); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfTvChannelClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_CHANGE_CHANNEL_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| /* TYPE WARNING: array array defaults to */ uint8_t * ChannelMatch; |
| uint8_t ErrorType; |
| |
| ChannelMatch = cmd->buffer + payloadOffset; |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| ErrorType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfTvChannelClusterChangeChannelResponseCallback(nullptr, ChannelMatch, ErrorType); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfTargetNavigatorClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_NAVIGATE_TARGET_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t status; |
| uint8_t * data; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| payloadOffset = static_cast<uint16_t>(payloadOffset + 1); |
| if (cmd->bufLen < payloadOffset + 1u) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| data = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfTargetNavigatorClusterNavigateTargetResponseCallback(nullptr, status, data); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |
| EmberAfStatus emberAfTestClusterClusterClientCommandParse(EmberAfClusterCommand * cmd) |
| { |
| bool wasHandled = false; |
| |
| if (!cmd->mfgSpecific) |
| { |
| switch (cmd->commandId) |
| { |
| case ZCL_TEST_SPECIFIC_RESPONSE_COMMAND_ID: { |
| uint16_t payloadOffset = cmd->payloadStartIndex; |
| uint8_t returnValue; |
| |
| if (cmd->bufLen < payloadOffset + 1) |
| { |
| return EMBER_ZCL_STATUS_MALFORMED_COMMAND; |
| } |
| returnValue = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); |
| |
| wasHandled = emberAfTestClusterClusterTestSpecificResponseCallback(nullptr, returnValue); |
| break; |
| } |
| default: { |
| // Unrecognized command ID, error status will apply. |
| break; |
| } |
| } |
| } |
| return status(wasHandled, true, cmd->mfgSpecific); |
| } |