From f556c0ce8a46a3c346860dc29c9b3518f0393402 Mon Sep 17 00:00:00 2001 From: Lazar Kovacic Date: Fri, 2 Jul 2021 18:53:12 +0200 Subject: [PATCH] Updated the PR per latest comments --- .../linux/include/tv-callbacks.cpp | 16 - examples/chip-tool/commands/tests/Commands.h | 78 + .../ApplicationLauncherManager.cpp | 11 +- .../audio-output/AudioOutputManager.cpp | 5 - .../keypad-input/KeypadInputManager.cpp | 5 - .../include/low-power/LowPowerManager.cpp | 7 - .../include/media-input/MediaInputManager.cpp | 5 +- .../TargetNavigatorManager.cpp | 11 +- .../include/tv-channel/TvChannelManager.cpp | 6 - .../account-login-server.cpp | 26 +- .../application-basic-server.cpp | 16 - .../application-launcher-server.cpp | 26 +- .../application-launcher-server.h | 21 +- .../audio-output-server.cpp | 20 +- .../keypad-input-server.cpp | 20 +- .../low-power-server/low-power-server.cpp | 16 - .../media-input-server/media-input-server.cpp | 27 +- .../media-playback-server.cpp | 31 +- .../media-playback-server.h | 16 - .../target-navigator-server.cpp | 19 +- .../target-navigator-server.h | 21 +- .../tv-channel-server/tv-channel-server.cpp | 6 +- .../tests/suites/TV_AccountLoginCluster.yaml | 5 + .../tests/suites/TV_MediaPlaybackCluster.yaml | 44 + .../chip/application-launcher-cluster.xml | 4 +- .../data_model/gen/call-command-handler.cpp | 2039 +++++++++++++++++ 26 files changed, 2207 insertions(+), 294 deletions(-) create mode 100644 src/controller/data_model/gen/call-command-handler.cpp diff --git a/examples/all-clusters-app/linux/include/tv-callbacks.cpp b/examples/all-clusters-app/linux/include/tv-callbacks.cpp index b479ac6779bd2e..79a6ee8413daac 100644 --- a/examples/all-clusters-app/linux/include/tv-callbacks.cpp +++ b/examples/all-clusters-app/linux/include/tv-callbacks.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for TV stubs diff --git a/examples/chip-tool/commands/tests/Commands.h b/examples/chip-tool/commands/tests/Commands.h index 44e4cafe772503..4788e1bd4cac1f 100644 --- a/examples/chip-tool/commands/tests/Commands.h +++ b/examples/chip-tool/commands/tests/Commands.h @@ -1688,6 +1688,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -1757,6 +1764,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -1826,6 +1840,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -1895,6 +1916,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -1964,6 +1992,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2033,6 +2068,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2102,6 +2144,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2171,6 +2220,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2242,6 +2298,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2314,6 +2377,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } @@ -2384,6 +2454,13 @@ class TV_MediaPlaybackCluster : public TestCommand return; } + if (mediaPlaybackStatus != 0) + { + ChipLogError(chipTool, "Error: Value mismatch. Expected: '%s'", "0"); + runner->SetCommandExitStatus(CHIP_ERROR_INTERNAL); + return; + } + runner->NextTest(); } }; @@ -15004,6 +15081,7 @@ void registerCommandsTests(Commands & commands) make_unique(), make_unique(), make_unique(), + make_unique(), }; commands.Register(clusterName, clusterCommands); diff --git a/examples/tv-app/linux/include/application-launcher/ApplicationLauncherManager.cpp b/examples/tv-app/linux/include/application-launcher/ApplicationLauncherManager.cpp index 10b1871e71ad59..056669bbd73226 100644 --- a/examples/tv-app/linux/include/application-launcher/ApplicationLauncherManager.cpp +++ b/examples/tv-app/linux/include/application-launcher/ApplicationLauncherManager.cpp @@ -17,12 +17,7 @@ */ #include "ApplicationLauncherManager.h" -#include #include -#include -#include -#include -#include #include #include @@ -49,9 +44,9 @@ ApplicationLauncherResponse applicationLauncherClusterLaunchApp(EmberAfApplicati { // TODO: Insert your code ApplicationLauncherResponse response; - char testData[] = "data"; - response.data = (uint8_t *) testData; - response.status = EMBER_ZCL_APPLICATION_LAUNCHER_STATUS_SUCCESS; + const char * testData = "data"; + response.data = (uint8_t *) testData; + response.status = EMBER_ZCL_APPLICATION_LAUNCHER_STATUS_SUCCESS; // TODO: Update once storing a structure attribute is supported // emberAfWriteServerAttribute(endpoint, ZCL_APPLICATION_LAUNCH_CLUSTER_ID, ZCL_APPLICATION_LAUNCHER_CURRENT_APP_APPLICATION_ID, // (uint8_t *) &application, ZCL_STRUCT_ATTRIBUTE_TYPE); diff --git a/examples/tv-app/linux/include/audio-output/AudioOutputManager.cpp b/examples/tv-app/linux/include/audio-output/AudioOutputManager.cpp index 8fbd7856693ab0..0c0331dedd5c6d 100644 --- a/examples/tv-app/linux/include/audio-output/AudioOutputManager.cpp +++ b/examples/tv-app/linux/include/audio-output/AudioOutputManager.cpp @@ -18,11 +18,6 @@ #include "AudioOutputManager.h" -#include -#include -#include -#include -#include #include #include #include diff --git a/examples/tv-app/linux/include/keypad-input/KeypadInputManager.cpp b/examples/tv-app/linux/include/keypad-input/KeypadInputManager.cpp index 7bd49fc94071da..58a39ab91bb6b4 100644 --- a/examples/tv-app/linux/include/keypad-input/KeypadInputManager.cpp +++ b/examples/tv-app/linux/include/keypad-input/KeypadInputManager.cpp @@ -18,11 +18,6 @@ #include "KeypadInputManager.h" -#include -#include -#include -#include -#include #include #include diff --git a/examples/tv-app/linux/include/low-power/LowPowerManager.cpp b/examples/tv-app/linux/include/low-power/LowPowerManager.cpp index a4fff8ff02393f..97016d4b01a74f 100644 --- a/examples/tv-app/linux/include/low-power/LowPowerManager.cpp +++ b/examples/tv-app/linux/include/low-power/LowPowerManager.cpp @@ -18,13 +18,6 @@ #include "LowPowerManager.h" -#include -#include -#include -#include -#include -#include - bool lowPowerClusterSleep() { // TODO: Insert code here diff --git a/examples/tv-app/linux/include/media-input/MediaInputManager.cpp b/examples/tv-app/linux/include/media-input/MediaInputManager.cpp index 48542edaaa5070..610defa80816a0 100644 --- a/examples/tv-app/linux/include/media-input/MediaInputManager.cpp +++ b/examples/tv-app/linux/include/media-input/MediaInputManager.cpp @@ -16,10 +16,7 @@ */ #include "MediaInputManager.h" -#include -#include -#include -#include + #include #include #include diff --git a/examples/tv-app/linux/include/target-navigator/TargetNavigatorManager.cpp b/examples/tv-app/linux/include/target-navigator/TargetNavigatorManager.cpp index df249a8902e046..2e69bbcbb9efdc 100644 --- a/examples/tv-app/linux/include/target-navigator/TargetNavigatorManager.cpp +++ b/examples/tv-app/linux/include/target-navigator/TargetNavigatorManager.cpp @@ -16,12 +16,7 @@ */ #include "TargetNavigatorManager.h" -#include #include -#include -#include -#include -#include #include #include #include @@ -63,8 +58,8 @@ TargetNavigatorResponse targetNavigatorClusterNavigateTarget(uint8_t target, std { // TODO: Insert code here TargetNavigatorResponse response; - char testData[] = "data response"; - response.data = (uint8_t *) testData; - response.status = EMBER_ZCL_APPLICATION_LAUNCHER_STATUS_SUCCESS; + const char * testData = "data response"; + response.data = (uint8_t *) testData; + response.status = EMBER_ZCL_APPLICATION_LAUNCHER_STATUS_SUCCESS; return response; } diff --git a/examples/tv-app/linux/include/tv-channel/TvChannelManager.cpp b/examples/tv-app/linux/include/tv-channel/TvChannelManager.cpp index 744e4774b82eeb..a9012e7fd58e47 100644 --- a/examples/tv-app/linux/include/tv-channel/TvChannelManager.cpp +++ b/examples/tv-app/linux/include/tv-channel/TvChannelManager.cpp @@ -16,12 +16,6 @@ */ #include "TvChannelManager.h" -#include -#include -#include -#include -#include -#include #include #include #include diff --git a/src/app/clusters/account-login-server/account-login-server.cpp b/src/app/clusters/account-login-server/account-login-server.cpp index 1ac4f2ef3075c2..4df1fbe994f2cc 100644 --- a/src/app/clusters/account-login-server/account-login-server.cpp +++ b/src/app/clusters/account-login-server/account-login-server.cpp @@ -14,23 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Application Launcher plugin, the @@ -65,24 +48,25 @@ void sendResponse(chip::app::Command * command, const char * responseSetupPin) } } -bool emberAfAccountLoginClusterGetSetupPINCallback(chip::app::Command * command, unsigned char * tempAccountIdentifier) +bool emberAfAccountLoginClusterGetSetupPINCallback(chip::app::Command * command, uint8_t * tempAccountIdentifier) { + // TODO: char is not null terminated, verify this code once #7963 gets merged. std::string tempAccountIdentifierString(reinterpret_cast(tempAccountIdentifier)); std::string responseSetupPin = accountLoginClusterGetSetupPin(tempAccountIdentifierString, emberAfCurrentEndpoint()); sendResponse(command, responseSetupPin.c_str()); return true; } -bool emberAfAccountLoginClusterLoginCallback(chip::app::Command * command, unsigned char * tempAccountIdentifier, - unsigned char * tempSetupPin) +bool emberAfAccountLoginClusterLoginCallback(chip::app::Command * command, uint8_t * tempAccountIdentifier, uint8_t * tempSetupPin) { + // TODO: char is not null terminated, verify this code once #7963 gets merged. std::string tempAccountIdentifierString(reinterpret_cast(tempAccountIdentifier)); std::string tempSetupPinString(reinterpret_cast(tempSetupPin)); bool isLoggedIn = accountLoginClusterIsUserLoggedIn(tempAccountIdentifierString, tempSetupPinString); EmberAfStatus status = isLoggedIn ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_NOT_AUTHORIZED; if (!isLoggedIn) { - ChipLogError(Zcl, "User is not authorized. Error:%s", chip::ErrorStr(EMBER_ZCL_STATUS_NOT_AUTHORIZED)); + ChipLogError(Zcl, "User is not authorized."); } emberAfSendImmediateDefaultResponse(status); return true; diff --git a/src/app/clusters/application-basic-server/application-basic-server.cpp b/src/app/clusters/application-basic-server/application-basic-server.cpp index 2b79952c35d281..069f839bcf98f8 100644 --- a/src/app/clusters/application-basic-server/application-basic-server.cpp +++ b/src/app/clusters/application-basic-server/application-basic-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Application Launcher plugin, the diff --git a/src/app/clusters/application-launcher-server/application-launcher-server.cpp b/src/app/clusters/application-launcher-server/application-launcher-server.cpp index d59c91b4910257..a21f1bcb8aa873 100644 --- a/src/app/clusters/application-launcher-server/application-launcher-server.cpp +++ b/src/app/clusters/application-launcher-server/application-launcher-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Application Launcher plugin, the @@ -48,7 +32,7 @@ ApplicationLauncherResponse applicationLauncherClusterLaunchApp(EmberAfApplicationLauncherApp application, std::string data); -bool emberAfApplicationLauncherClusterLaunchAppCallback(chip::app::Command * commandObj, unsigned char *, unsigned char *) +bool emberAfApplicationLauncherClusterLaunchAppCallback(chip::app::Command * commandObj, uint8_t *, uint8_t *) { EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; emberAfSendImmediateDefaultResponse(status); @@ -74,7 +58,7 @@ void sendResponse(chip::app::Command * command, ApplicationLauncherResponse resp } } -EmberAfApplicationLauncherApp getApplicationFromCommand(unsigned short catalogVendorId, unsigned char * applicationId) +EmberAfApplicationLauncherApp getApplicationFromCommand(uint16_t catalogVendorId, uint8_t * applicationId) { EmberAfApplicationLauncherApp application = {}; application.applicationId = applicationId; @@ -82,11 +66,11 @@ EmberAfApplicationLauncherApp getApplicationFromCommand(unsigned short catalogVe return application; } -bool emberAfApplicationLauncherClusterLaunchAppCallback(chip::app::Command * command, unsigned char * requestData, - unsigned short requestApplicationCatalogVendorId, - unsigned char * requestApplicationId) +bool emberAfApplicationLauncherClusterLaunchAppCallback(chip::app::Command * command, uint8_t * requestData, + uint16_t requestApplicationCatalogVendorId, uint8_t * requestApplicationId) { EmberAfApplicationLauncherApp application = getApplicationFromCommand(requestApplicationCatalogVendorId, requestApplicationId); + // TODO: Char is not null terminated, verify this code once #7963 gets merged. std::string reqestDataString(reinterpret_cast(requestData)); ApplicationLauncherResponse response = applicationLauncherClusterLaunchApp(application, reqestDataString); sendResponse(command, response); diff --git a/src/app/clusters/application-launcher-server/application-launcher-server.h b/src/app/clusters/application-launcher-server/application-launcher-server.h index 1cf0c22b3586c6..5c71e3d93fc82a 100644 --- a/src/app/clusters/application-launcher-server/application-launcher-server.h +++ b/src/app/clusters/application-launcher-server/application-launcher-server.h @@ -14,31 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Application Launcher plugin, the *server implementation of the Application Launcher cluster. ******************************************************************************* ******************************************************************************/ -typedef struct _ApplicationLauncherResponse +struct ApplicationLauncherResponse { uint8_t status; uint8_t * data; -} ApplicationLauncherResponse; +}; diff --git a/src/app/clusters/audio-output-server/audio-output-server.cpp b/src/app/clusters/audio-output-server/audio-output-server.cpp index 2e98abeb549007..969b41fffed6a0 100644 --- a/src/app/clusters/audio-output-server/audio-output-server.cpp +++ b/src/app/clusters/audio-output-server/audio-output-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Audio Output plugin, the @@ -44,7 +28,7 @@ bool audioOutputClusterSelectOutput(uint8_t index); bool audioOutputClusterRenameOutput(uint8_t index, uint8_t * name); -bool emberAfAudioOutputClusterRenameOutputCallback(chip::app::Command * command, unsigned char index, uint8_t * name) +bool emberAfAudioOutputClusterRenameOutputCallback(chip::app::Command * command, uint8_t index, uint8_t * name) { bool success = audioOutputClusterRenameOutput(index, name); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; @@ -52,7 +36,7 @@ bool emberAfAudioOutputClusterRenameOutputCallback(chip::app::Command * command, return true; } -bool emberAfAudioOutputClusterSelectOutputCallback(chip::app::Command * command, unsigned char index) +bool emberAfAudioOutputClusterSelectOutputCallback(chip::app::Command * command, uint8_t index) { bool success = audioOutputClusterSelectOutput(index); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; diff --git a/src/app/clusters/keypad-input-server/keypad-input-server.cpp b/src/app/clusters/keypad-input-server/keypad-input-server.cpp index 6bde5852a84b81..1fca897e19851f 100644 --- a/src/app/clusters/keypad-input-server/keypad-input-server.cpp +++ b/src/app/clusters/keypad-input-server/keypad-input-server.cpp @@ -14,23 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Keypad Input plugin, the @@ -48,7 +31,6 @@ EmberAfKeypadInputStatus keypadInputClusterSendKey(EmberAfKeypadInputCecKeyCode static void sendResponse(chip::app::Command * command, EmberAfKeypadInputStatus keypadInputStatus) { - static_assert(std::is_same, uint8_t>::value, "Wrong enum size"); CHIP_ERROR err = CHIP_NO_ERROR; chip::app::CommandPathParams cmdParams = { emberAfCurrentEndpoint(), /* group id */ 0, ZCL_KEYPAD_INPUT_CLUSTER_ID, ZCL_SEND_KEY_RESPONSE_COMMAND_ID, (chip::app::CommandPathFlags::kEndpointIdValid) }; @@ -67,7 +49,7 @@ static void sendResponse(chip::app::Command * command, EmberAfKeypadInputStatus } } -bool emberAfKeypadInputClusterSendKeyCallback(chip::app::Command * command, unsigned char keyCode) +bool emberAfKeypadInputClusterSendKeyCallback(chip::app::Command * command, uint8_t keyCode) { EmberAfKeypadInputStatus status = keypadInputClusterSendKey(static_cast(keyCode)); sendResponse(command, status); diff --git a/src/app/clusters/low-power-server/low-power-server.cpp b/src/app/clusters/low-power-server/low-power-server.cpp index d43ba54f29576b..aaf56bfefc8ea0 100644 --- a/src/app/clusters/low-power-server/low-power-server.cpp +++ b/src/app/clusters/low-power-server/low-power-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Low Power plugin, the diff --git a/src/app/clusters/media-input-server/media-input-server.cpp b/src/app/clusters/media-input-server/media-input-server.cpp index 10ca4367821e7d..eccf01dcd1ed3e 100644 --- a/src/app/clusters/media-input-server/media-input-server.cpp +++ b/src/app/clusters/media-input-server/media-input-server.cpp @@ -14,23 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Media Input plugin, the @@ -53,16 +36,15 @@ bool mediaInputClusterRenameInput(uint8_t input, std::string name); static void storeCurrentInput(chip::EndpointId endpoint, uint8_t currentInput) { - EmberAfStatus status = - emberAfWriteServerAttribute(endpoint, ZCL_MEDIA_INPUT_CLUSTER_ID, ZCL_MEDIA_INPUT_CURRENT_INPUT_ATTRIBUTE_ID, - (uint8_t *) ¤tInput, ZCL_INT8U_ATTRIBUTE_TYPE); + EmberAfStatus status = emberAfWriteServerAttribute( + endpoint, ZCL_MEDIA_INPUT_CLUSTER_ID, ZCL_MEDIA_INPUT_CURRENT_INPUT_ATTRIBUTE_ID, ¤tInput, ZCL_INT8U_ATTRIBUTE_TYPE); if (status != EMBER_ZCL_STATUS_SUCCESS) { ChipLogError(Zcl, "Failed to store media playback attribute."); } } -bool emberAfMediaInputClusterSelectInputCallback(chip::app::Command * command, unsigned char input) +bool emberAfMediaInputClusterSelectInputCallback(chip::app::Command * command, uint8_t input) { bool success = mediaInputClusterSelectInput(input); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; @@ -90,8 +72,9 @@ bool emberAfMediaInputClusterHideInputStatusCallback(chip::app::Command * comman return true; } -bool emberAfMediaInputClusterRenameInputCallback(chip::app::Command * command, unsigned char input, unsigned char * name) +bool emberAfMediaInputClusterRenameInputCallback(chip::app::Command * command, uint8_t input, uint8_t * name) { + // TODO: char is not null terminated, verify this code once #7963 gets merged. std::string nameString(reinterpret_cast(name)); bool success = mediaInputClusterRenameInput(input, nameString); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; diff --git a/src/app/clusters/media-playback-server/media-playback-server.cpp b/src/app/clusters/media-playback-server/media-playback-server.cpp index 3a159987011a95..d86f48c9f4672f 100644 --- a/src/app/clusters/media-playback-server/media-playback-server.cpp +++ b/src/app/clusters/media-playback-server/media-playback-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Media Playback plugin, the @@ -50,13 +34,10 @@ EmberAfMediaPlaybackStatus mediaPlaybackClusterSendMediaPlaybackRequest(MediaPlaybackRequest mediaPlaybackRequest, uint64_t deltaPositionMilliseconds); -uint8_t mediaPlaybackClusterPlaybackState; - static void writePlaybackState(chip::EndpointId endpoint, uint8_t playbackState) { - EmberAfStatus status = - emberAfWriteServerAttribute(endpoint, ZCL_MEDIA_PLAYBACK_CLUSTER_ID, ZCL_MEDIA_PLAYBACK_STATE_ATTRIBUTE_ID, - (uint8_t *) &playbackState, ZCL_INT8U_ATTRIBUTE_TYPE); + EmberAfStatus status = emberAfWriteServerAttribute( + endpoint, ZCL_MEDIA_PLAYBACK_CLUSTER_ID, ZCL_MEDIA_PLAYBACK_STATE_ATTRIBUTE_ID, &playbackState, ZCL_INT8U_ATTRIBUTE_TYPE); if (status != EMBER_ZCL_STATUS_SUCCESS) { ChipLogError(Zcl, "Failed to store media playback attribute."); @@ -66,9 +47,8 @@ static void writePlaybackState(chip::EndpointId endpoint, uint8_t playbackState) static uint8_t readPlaybackStatus(chip::EndpointId endpoint) { uint8_t playbackState; - EmberAfStatus status = - emberAfReadServerAttribute(endpoint, ZCL_MEDIA_PLAYBACK_CLUSTER_ID, ZCL_MEDIA_PLAYBACK_STATE_ATTRIBUTE_ID, - (uint8_t *) &playbackState, sizeof(uint8_t)); + EmberAfStatus status = emberAfReadServerAttribute(endpoint, ZCL_MEDIA_PLAYBACK_CLUSTER_ID, + ZCL_MEDIA_PLAYBACK_STATE_ATTRIBUTE_ID, &playbackState, sizeof(uint8_t)); if (status != EMBER_ZCL_STATUS_SUCCESS) { ChipLogError(Zcl, "Failed to read media playback attribute."); @@ -79,7 +59,7 @@ static uint8_t readPlaybackStatus(chip::EndpointId endpoint) void storeNewPlaybackState(chip::EndpointId endpoint, uint8_t newPlaybackState) { - mediaPlaybackClusterPlaybackState = readPlaybackStatus(endpoint); + uint8_t mediaPlaybackClusterPlaybackState = readPlaybackStatus(endpoint); if (mediaPlaybackClusterPlaybackState == newPlaybackState) { @@ -94,7 +74,6 @@ void storeNewPlaybackState(chip::EndpointId endpoint, uint8_t newPlaybackState) static void sendResponse(chip::app::Command * command, const char * responseName, chip::CommandId commandId, EmberAfMediaPlaybackStatus mediaPlaybackStatus) { - static_assert(std::is_same, uint8_t>::value, "Wrong enum size"); CHIP_ERROR err = CHIP_NO_ERROR; chip::app::CommandPathParams cmdParams = { emberAfCurrentEndpoint(), /* group id */ 0, ZCL_MEDIA_PLAYBACK_CLUSTER_ID, commandId, (chip::app::CommandPathFlags::kEndpointIdValid) }; diff --git a/src/app/clusters/media-playback-server/media-playback-server.h b/src/app/clusters/media-playback-server/media-playback-server.h index f9be35bff5b383..2850f97851b1a7 100644 --- a/src/app/clusters/media-playback-server/media-playback-server.h +++ b/src/app/clusters/media-playback-server/media-playback-server.h @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Media Playback plugin, the diff --git a/src/app/clusters/target-navigator-server/target-navigator-server.cpp b/src/app/clusters/target-navigator-server/target-navigator-server.cpp index c07c3aed645d27..6bb7b2e50c0939 100644 --- a/src/app/clusters/target-navigator-server/target-navigator-server.cpp +++ b/src/app/clusters/target-navigator-server/target-navigator-server.cpp @@ -15,22 +15,6 @@ * limitations under the License. */ -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Target Navigator plugin, the @@ -67,8 +51,9 @@ void sendResponse(chip::app::Command * command, TargetNavigatorResponse response } } -bool emberAfTargetNavigatorClusterNavigateTargetCallback(chip::app::Command * command, unsigned char target, unsigned char * data) +bool emberAfTargetNavigatorClusterNavigateTargetCallback(chip::app::Command * command, uint8_t target, uint8_t * data) { + // TODO: char is not null terminated, verify this code once #7963 gets merged. std::string dataString(reinterpret_cast(data)); TargetNavigatorResponse response = targetNavigatorClusterNavigateTarget(target, dataString); sendResponse(command, response); diff --git a/src/app/clusters/target-navigator-server/target-navigator-server.h b/src/app/clusters/target-navigator-server/target-navigator-server.h index 8c34a24f98c103..9cfb1f06dd6fc7 100644 --- a/src/app/clusters/target-navigator-server/target-navigator-server.h +++ b/src/app/clusters/target-navigator-server/target-navigator-server.h @@ -14,23 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * - * Copyright (c) 2021 Silicon Labs - * - * 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. - */ /**************************************************************************** * @file * @brief Routines for the Target Navigator plugin, the @@ -38,8 +21,8 @@ ******************************************************************************* ******************************************************************************/ -typedef struct _TargetNavigatorResponse +struct TargetNavigatorResponse { uint8_t status; uint8_t * data; -} TargetNavigatorResponse; +}; diff --git a/src/app/clusters/tv-channel-server/tv-channel-server.cpp b/src/app/clusters/tv-channel-server/tv-channel-server.cpp index 652aba27bc3c9f..10db39de675120 100644 --- a/src/app/clusters/tv-channel-server/tv-channel-server.cpp +++ b/src/app/clusters/tv-channel-server/tv-channel-server.cpp @@ -71,6 +71,7 @@ void sendResponse(chip::app::Command * command, EmberAfTvChannelInfo channelInfo bool emberAfTvChannelClusterChangeChannelCallback(chip::app::Command * command, uint8_t * match) { + // TODO: char is not null terminated, verify this code once #7963 gets merged. std::string matchString(reinterpret_cast(match)); // TODO: Enable this once struct as param is supported // EmberAfTvChannelInfo channelInfo = tvChannelClusterChangeChannel(matchString); @@ -79,8 +80,7 @@ bool emberAfTvChannelClusterChangeChannelCallback(chip::app::Command * command, return true; } -bool emberAfTvChannelClusterChangeChannelByNumberCallback(chip::app::Command * command, unsigned short majorNumber, - unsigned short minorNumber) +bool emberAfTvChannelClusterChangeChannelByNumberCallback(chip::app::Command * command, uint16_t majorNumber, uint16_t minorNumber) { bool success = tvChannelClusterChangeChannelByNumber(majorNumber, minorNumber); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; @@ -88,7 +88,7 @@ bool emberAfTvChannelClusterChangeChannelByNumberCallback(chip::app::Command * c return true; } -bool emberAfTvChannelClusterSkipChannelCallback(chip::app::Command * command, unsigned short count) +bool emberAfTvChannelClusterSkipChannelCallback(chip::app::Command * command, uint16_t count) { bool success = tvChannelClusterSkipChannel(count); EmberAfStatus status = success ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; diff --git a/src/app/tests/suites/TV_AccountLoginCluster.yaml b/src/app/tests/suites/TV_AccountLoginCluster.yaml index 06bc8224ad437e..a713295169922b 100644 --- a/src/app/tests/suites/TV_AccountLoginCluster.yaml +++ b/src/app/tests/suites/TV_AccountLoginCluster.yaml @@ -26,6 +26,11 @@ tests: - name: "tempAccountIdentifier" value: "asdf" + # TODO: Enable these once they are able to work + # response: + # values: + # - name: "setupPIN" + # value: "tempPin123" - label: "Login Command" command: "Login" arguments: diff --git a/src/app/tests/suites/TV_MediaPlaybackCluster.yaml b/src/app/tests/suites/TV_MediaPlaybackCluster.yaml index c5326f1008820b..6607a3f21abea5 100644 --- a/src/app/tests/suites/TV_MediaPlaybackCluster.yaml +++ b/src/app/tests/suites/TV_MediaPlaybackCluster.yaml @@ -21,27 +21,59 @@ config: tests: - label: "Media Playback Play Command" command: "MediaPlay" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Pause Command" command: "MediaPause" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Stop Command" command: "MediaStop" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Start Over Command" command: "MediaStartOver" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Previous Command" command: "MediaPrevious" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Next Command" command: "MediaNext" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Rewind Command" command: "MediaRewind" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Fast Forward Command" command: "MediaFastForward" + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Skip Forward Command" command: "MediaSkipForward" @@ -49,6 +81,10 @@ tests: values: - name: "deltaPositionMilliseconds" value: 100 + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Skip Backward Command" command: "MediaSkipBackward" @@ -56,6 +92,10 @@ tests: values: - name: "deltaPositionMilliseconds" value: 100 + response: + values: + - name: "mediaPlaybackStatus" + value: 0 - label: "Media Playback Seek Command" command: "MediaSeek" @@ -63,3 +103,7 @@ tests: values: - name: "position" value: 100 + response: + values: + - name: "mediaPlaybackStatus" + value: 0 diff --git a/src/app/zap-templates/zcl/data-model/chip/application-launcher-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/application-launcher-cluster.xml index 330505e950c31b..462bddb35e47a3 100644 --- a/src/app/zap-templates/zcl/data-model/chip/application-launcher-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/application-launcher-cluster.xml @@ -26,14 +26,14 @@ limitations under the License. This cluster provides an interface for launching content on a media player device such as a TV or Speaker. application launcher list - + catalog vendor id application id Upon receipt, this SHALL launch the specified app with optional data. The TV Device SHALL launch and bring to foreground the identified application in the command if the application is not already launched and in foreground. The TV Device SHALL update state attribute on the Application Basic cluster of the Endpoint corresponding to the launched application. This command returns a Launch Response. - + diff --git a/src/controller/data_model/gen/call-command-handler.cpp b/src/controller/data_model/gen/call-command-handler.cpp new file mode 100644 index 00000000000000..3632e64b90265c --- /dev/null +++ b/src/controller/data_model/gen/call-command-handler.cpp @@ -0,0 +1,2039 @@ +/* + * + * 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 + +#include "app/util/util.h" +#include "callback.h" +#include +#include +#include + +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 emberAfBinaryInputBasicClusterClientCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfBindingClusterClientCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfBridgedDeviceBasicClusterClientCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfColorControlClusterClientCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfContentLauncherClusterClientCommandParse(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 emberAfOtaSoftwareUpdateProviderClusterClientCommandParse(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 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_BINARY_INPUT_BASIC_CLUSTER_ID: + // No commands are enabled for cluster Binary Input (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 = emberAfContentLauncherClusterClientCommandParse(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_OTA_PROVIDER_CLUSTER_ID: + result = emberAfOtaSoftwareUpdateProviderClusterClientCommandParse(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_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(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 emberAfContentLauncherClusterClientCommandParse(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(payloadOffset + emberAfStringLength(data) + 1u); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + contentLaunchStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + + wasHandled = emberAfContentLauncherClusterLaunchContentResponseCallback(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(payloadOffset + emberAfStringLength(data) + 1u); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + contentLaunchStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + + wasHandled = emberAfContentLauncherClusterLaunchURLResponseCallback(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 4); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + localEndTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + timestamp = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 4); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + eventType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + source = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + eventIdOrAlarmCode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userStatus = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userType = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + daysMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + startHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + startMinute = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + endHour = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + localStartTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(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(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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_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 = emberAfMediaPlaybackClusterMediaSeekResponseCallback(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(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(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(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(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + debugText = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(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 emberAfOtaSoftwareUpdateProviderClusterClientCommandParse(EmberAfClusterCommand * cmd) +{ + bool wasHandled = false; + + if (!cmd->mfgSpecific) + { + switch (cmd->commandId) + { + case ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID: { + uint16_t payloadOffset = cmd->payloadStartIndex; + uint8_t action; + uint32_t delayedActionTime; + + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + action = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + delayedActionTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + + wasHandled = + emberAfOtaSoftwareUpdateProviderClusterApplyUpdateRequestResponseCallback(nullptr, action, delayedActionTime); + break; + } + case ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID: { + uint16_t payloadOffset = cmd->payloadStartIndex; + uint8_t status; + uint32_t delayedActionTime; + uint8_t * imageURI; + uint32_t softwareVersion; + chip::ByteSpan updateToken; + uint8_t userConsentNeeded; + chip::ByteSpan metadataForRequestor; + + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + status = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + delayedActionTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 4); + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + imageURI = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + emberAfStringLength(imageURI) + 1u); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + softwareVersion = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 4); + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + { + uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + updateToken = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); + } + payloadOffset = static_cast(payloadOffset + updateToken.size() + 1u); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + userConsentNeeded = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + { + uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + metadataForRequestor = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); + } + + wasHandled = emberAfOtaSoftwareUpdateProviderClusterQueryImageResponseCallback(nullptr, status, delayedActionTime, + imageURI, softwareVersion, updateToken, + userConsentNeeded, metadataForRequestor); + 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(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(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(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(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 8) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + FabricIndex = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + capacity = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(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(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(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(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); +}