blob: 45d39dd4bce1a40af038ba216ad12cb4f67fb20c [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
* All rights reserved.
*
* 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.
*/
#ifdef MATTER_DM_PLUGIN_SWITCH_SERVER
#include "SwitchEventHandler.h"
#include <app-common/zap-generated/attributes/Accessors.h>
#include <app/clusters/switch-server/switch-server.h>
#include <app/server/Server.h>
#include <app/util/att-storage.h>
#include <app/util/attribute-storage.h>
#include <platform/PlatformManager.h>
#include "chef-descriptor-namespace.h"
#include "chef-rpc-actions-worker.h"
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
using namespace chip::app::Clusters::Switch;
using namespace chip::DeviceLayer;
using namespace chip::rpc;
using namespace chip::app;
class SwitchActionsDelegate : public chip::app::ActionsDelegate
{
public:
SwitchActionsDelegate(ClusterId clusterId, SwitchEventHandler * eventHandler) :
ActionsDelegate(clusterId), mEventHandler(eventHandler){};
~SwitchActionsDelegate() override{};
void AttributeWriteHandler(chip::EndpointId endpointId, chip::AttributeId attributeId, std::vector<uint32_t> args) override;
void CommandHandler(chip::EndpointId endpointId, chip::AttributeId attributeId, std::vector<uint32_t> args) override{};
void EventHandler(chip::EndpointId endpointId, chip::EventId eventId, std::vector<uint32_t> args) override;
private:
SwitchEventHandler * mEventHandler;
};
void SwitchActionsDelegate::AttributeWriteHandler(chip::EndpointId endpointId, chip::AttributeId attributeId,
std::vector<uint32_t> args)
{
if (args.empty())
{
ChipLogError(NotSpecified, "Queue is empty ");
return;
}
switch (attributeId)
{
case Switch::Attributes::NumberOfPositions::Id: {
uint8_t data = static_cast<uint8_t>(args[0]);
app::Clusters::Switch::Attributes::NumberOfPositions::Set(endpointId, data);
}
break;
case Switch::Attributes::CurrentPosition::Id: {
uint8_t data = static_cast<uint8_t>(args[0]);
app::Clusters::Switch::Attributes::CurrentPosition::Set(endpointId, data);
}
break;
case Switch::Attributes::MultiPressMax::Id: {
uint8_t data = static_cast<uint8_t>(args[0]);
app::Clusters::Switch::Attributes::MultiPressMax::Set(endpointId, data);
}
break;
default:
break;
}
}
void SwitchActionsDelegate::EventHandler(chip::EndpointId endpointId, chip::EventId eventId, std::vector<uint32_t> args)
{
if (args.empty())
{
ChipLogError(NotSpecified, "Queue is empty ");
return;
}
switch (eventId)
{
case Events::SwitchLatched::Id: {
uint8_t newPosition = static_cast<uint8_t>(args[0]);
mEventHandler->OnSwitchLatched(endpointId, newPosition);
}
break;
case Events::InitialPress::Id: {
uint8_t newPosition = static_cast<uint8_t>(args[0]);
mEventHandler->OnInitialPress(endpointId, newPosition);
}
break;
case Events::LongPress::Id: {
uint8_t newPosition = static_cast<uint8_t>(args[0]);
mEventHandler->OnLongPress(endpointId, newPosition);
}
break;
case Events::ShortRelease::Id: {
uint8_t previousPosition = static_cast<uint8_t>(args[0]);
mEventHandler->OnShortRelease(endpointId, previousPosition);
}
break;
case Events::LongRelease::Id: {
uint8_t previousPosition = static_cast<uint8_t>(args[0]);
mEventHandler->OnLongRelease(endpointId, previousPosition);
}
break;
case Events::MultiPressOngoing::Id: {
if (args.size() < 2)
{
ChipLogError(NotSpecified, "MultiPressOngoing has too few arguments");
return;
}
uint8_t newPosition = static_cast<uint8_t>(args[0]);
uint8_t currentNumberOfPressesCounted = static_cast<uint8_t>(args[1]);
mEventHandler->OnMultiPressOngoing(endpointId, newPosition, currentNumberOfPressesCounted);
}
break;
case Events::MultiPressComplete::Id: {
if (args.size() < 2)
{
ChipLogError(NotSpecified, "MultiPressComplete has too few arguments");
return;
}
uint8_t previousPosition = static_cast<uint8_t>(args[0]);
uint8_t totalNumberOfPressesCounted = static_cast<uint8_t>(args[1]);
mEventHandler->OnMultiPressComplete(endpointId, previousPosition, totalNumberOfPressesCounted);
}
break;
default:
break;
}
};
const Clusters::Descriptor::Structs::SemanticTagStruct::Type gLatchingSwitch[] = {
{ .namespaceID = kNamespaceCommonLevel,
.tag = kTagCommonLow,
.label = chip::Optional<chip::app::DataModel::Nullable<chip::CharSpan>>(
{ chip::app::DataModel::MakeNullable(chip::CharSpan("Low", 3)) }) },
{ .namespaceID = kNamespaceCommonLevel,
.tag = kTagCommonMedium,
.label = chip::Optional<chip::app::DataModel::Nullable<chip::CharSpan>>(
{ chip::app::DataModel::MakeNullable(chip::CharSpan("Medium", 6)) }) },
{ .namespaceID = kNamespaceCommonLevel,
.tag = kTagCommonHigh,
.label = chip::Optional<chip::app::DataModel::Nullable<chip::CharSpan>>(
{ chip::app::DataModel::MakeNullable(chip::CharSpan("High", 4)) }) }
};
static SwitchEventHandler * gSwitchEventHandler = new SwitchEventHandler();
static SwitchActionsDelegate * gSwitchActionsDelegate = new SwitchActionsDelegate(Clusters::Switch::Id, gSwitchEventHandler);
void emberAfSwitchClusterInitCallback(EndpointId endpointId)
{
ChipLogProgress(Zcl, "Chef: emberAfSwitchClusterInitCallback");
ChefRpcActionsWorker::Instance().RegisterRpcActionsDelegate(Clusters::Switch::Id, gSwitchActionsDelegate);
SetTagList(/* endpoint= */ 1, Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(gLatchingSwitch));
}
#endif // MATTER_DM_PLUGIN_SWITCH_SERVER