/* * * 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 #include #include #include #include #include #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 args) override; void CommandHandler(chip::EndpointId endpointId, chip::AttributeId attributeId, std::vector args) override{}; void EventHandler(chip::EndpointId endpointId, chip::EventId eventId, std::vector args) override; private: SwitchEventHandler * mEventHandler; }; void SwitchActionsDelegate::AttributeWriteHandler(chip::EndpointId endpointId, chip::AttributeId attributeId, std::vector args) { if (args.empty()) { ChipLogError(NotSpecified, "Queue is empty "); return; } switch (attributeId) { case Switch::Attributes::NumberOfPositions::Id: { uint8_t data = static_cast(args[0]); app::Clusters::Switch::Attributes::NumberOfPositions::Set(endpointId, data); } break; case Switch::Attributes::CurrentPosition::Id: { uint8_t data = static_cast(args[0]); app::Clusters::Switch::Attributes::CurrentPosition::Set(endpointId, data); } break; case Switch::Attributes::MultiPressMax::Id: { uint8_t data = static_cast(args[0]); app::Clusters::Switch::Attributes::MultiPressMax::Set(endpointId, data); } break; default: break; } } void SwitchActionsDelegate::EventHandler(chip::EndpointId endpointId, chip::EventId eventId, std::vector args) { if (args.empty()) { ChipLogError(NotSpecified, "Queue is empty "); return; } switch (eventId) { case Events::SwitchLatched::Id: { uint8_t newPosition = static_cast(args[0]); mEventHandler->OnSwitchLatched(endpointId, newPosition); } break; case Events::InitialPress::Id: { uint8_t newPosition = static_cast(args[0]); mEventHandler->OnInitialPress(endpointId, newPosition); } break; case Events::LongPress::Id: { uint8_t newPosition = static_cast(args[0]); mEventHandler->OnLongPress(endpointId, newPosition); } break; case Events::ShortRelease::Id: { uint8_t previousPosition = static_cast(args[0]); mEventHandler->OnShortRelease(endpointId, previousPosition); } break; case Events::LongRelease::Id: { uint8_t previousPosition = static_cast(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(args[0]); uint8_t currentNumberOfPressesCounted = static_cast(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(args[0]); uint8_t totalNumberOfPressesCounted = static_cast(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::MakeNullable(chip::CharSpan("Low", 3)) }) }, { .namespaceID = kNamespaceCommonLevel, .tag = kTagCommonMedium, .label = chip::Optional>( { chip::app::DataModel::MakeNullable(chip::CharSpan("Medium", 6)) }) }, { .namespaceID = kNamespaceCommonLevel, .tag = kTagCommonHigh, .label = chip::Optional>( { 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(gLatchingSwitch)); } #endif // MATTER_DM_PLUGIN_SWITCH_SERVER