blob: 2c1b69e4777c43c88e82019a47fe2c2e0880c499 [file] [log] [blame]
/**
*
* Copyright (c) 2020 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.
*/
#include "scenes-client.h"
#include <app/CommandHandler.h>
#include <app/util/af.h>
#include <app-common/zap-generated/command-id.h>
using namespace chip;
bool emberAfScenesClusterAddSceneResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId,
uint8_t sceneId)
{
return emberAfPluginScenesClientParseAddSceneResponse(emberAfCurrentCommand(), status, groupId, sceneId);
}
bool emberAfScenesClusterViewSceneResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId,
uint8_t sceneId, uint16_t transitionTime, uint8_t * sceneName,
uint8_t * extensionFieldSets)
{
return emberAfPluginScenesClientParseViewSceneResponse(emberAfCurrentCommand(), status, groupId, sceneId, transitionTime,
sceneName, extensionFieldSets);
}
bool emberAfScenesClusterRemoveSceneResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId,
uint8_t sceneId)
{
emberAfScenesClusterPrintln("RX: RemoveSceneResponse 0x%x, 0x%2x, 0x%x", status, groupId, sceneId);
emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_SUCCESS);
return true;
}
bool emberAfScenesClusterRemoveAllScenesResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId)
{
emberAfScenesClusterPrintln("RX: RemoveAllScenesResponse 0x%x, 0x%2x", status, groupId);
emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_SUCCESS);
return true;
}
bool emberAfScenesClusterStoreSceneResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId,
uint8_t sceneId)
{
emberAfScenesClusterPrintln("RX: StoreSceneResponse 0x%x, 0x%2x, 0x%x", status, groupId, sceneId);
emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_SUCCESS);
return true;
}
bool emberAfScenesClusterGetSceneMembershipResponseCallback(app::CommandHandler * commandObj, uint8_t status, uint8_t capacity,
GroupId groupId, uint8_t sceneCount, uint8_t * sceneList)
{
emberAfScenesClusterPrint("RX: GetSceneMembershipResponse 0x%x, 0x%x, 0x%2x", status, capacity, groupId);
// Scene count and the scene list only appear in the payload if the status is
// SUCCESS.
if (status == EMBER_ZCL_STATUS_SUCCESS)
{
uint8_t i;
emberAfScenesClusterPrint(", 0x%x,", sceneCount);
for (i = 0; i < sceneCount; i++)
{
emberAfScenesClusterPrint(" [0x%x]", sceneList[i]);
}
}
emberAfScenesClusterPrintln("%s", "");
emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_SUCCESS);
return true;
}
bool emberAfPluginScenesClientParseAddSceneResponse(const EmberAfClusterCommand * cmd, uint8_t status, GroupId groupId,
uint8_t sceneId)
{
bool enhanced = (cmd->commandId == ZCL_ENHANCED_ADD_SCENE_COMMAND_ID);
emberAfScenesClusterPrintln("RX: %pAddSceneResponse 0x%x, 0x%2x, 0x%x", (enhanced ? "Enhanced" : ""), status, groupId, sceneId);
emberAfSendDefaultResponse(cmd, EMBER_ZCL_STATUS_SUCCESS);
return true;
}
bool emberAfPluginScenesClientParseViewSceneResponse(const EmberAfClusterCommand * cmd, uint8_t status, GroupId groupId,
uint8_t sceneId, uint16_t transitionTime, const uint8_t * sceneName,
const uint8_t * extensionFieldSets)
{
bool enhanced = (cmd->commandId == ZCL_ENHANCED_VIEW_SCENE_COMMAND_ID);
emberAfScenesClusterPrint("RX: %pViewSceneResponse 0x%x, 0x%2x, 0x%x", (enhanced ? "Enhanced" : ""), status, groupId, sceneId);
// Transition time, scene name, and the extension field sets only appear in
// the payload if the status is SUCCESS.
if (status == EMBER_ZCL_STATUS_SUCCESS)
{
uint16_t extensionFieldSetsLen =
static_cast<uint16_t>(emberAfCurrentCommand()->bufLen -
(emberAfCurrentCommand()->payloadStartIndex + sizeof(status) + sizeof(groupId) + sizeof(sceneId) +
sizeof(transitionTime) + emberAfStringLength(sceneName) + 1));
uint16_t extensionFieldSetsIndex = 0;
emberAfScenesClusterPrint(", 0x%2x, \"", transitionTime);
emberAfScenesClusterPrintString(sceneName);
emberAfScenesClusterPrint("\",");
// Each extension field set contains at least a two-byte cluster id and a
// one-byte length.
while (extensionFieldSetsIndex + 3 <= extensionFieldSetsLen)
{
ClusterId clusterId;
uint8_t length;
clusterId = emberAfGetInt16u(extensionFieldSets, extensionFieldSetsIndex, extensionFieldSetsLen);
extensionFieldSetsIndex = static_cast<uint16_t>(extensionFieldSetsIndex + 2);
length = emberAfGetInt8u(extensionFieldSets, extensionFieldSetsIndex, extensionFieldSetsLen);
extensionFieldSetsIndex++;
emberAfScenesClusterPrint(" [0x%2x 0x%x ", clusterId, length);
if (extensionFieldSetsIndex + length <= extensionFieldSetsLen)
{
emberAfScenesClusterPrintBuffer(extensionFieldSets + extensionFieldSetsIndex, length, false);
}
emberAfScenesClusterPrint("]");
emberAfScenesClusterFlush();
extensionFieldSetsIndex = static_cast<uint16_t>(extensionFieldSetsIndex + length);
}
}
emberAfScenesClusterPrintln("%s", "");
emberAfSendDefaultResponse(cmd, EMBER_ZCL_STATUS_SUCCESS);
return true;
}