/* * * Copyright (c) 2020 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. */ #include "AllClustersCommandDelegate.h" #include "WindowCoveringManager.h" #include "air-quality-instance.h" #include "dishwasher-mode.h" #include "include/tv-callbacks.h" #include "laundry-washer-controls-delegate-impl.h" #include "laundry-washer-mode.h" #include "operational-state-delegate-impl.h" #include "resource-monitoring-delegates.h" #include "rvc-modes.h" #include "tcc-mode.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace chip; using namespace chip::app; using namespace chip::DeviceLayer; namespace { constexpr const char kChipEventFifoPathPrefix[] = "/tmp/chip_all_clusters_fifo_"; LowPowerManager sLowPowerManager; NamedPipeCommands sChipNamedPipeCommands; AllClustersCommandDelegate sAllClustersCommandDelegate; Clusters::WindowCovering::WindowCoveringManager sWindowCoveringManager; Clusters::TemperatureControl::AppSupportedTemperatureLevelsDelegate sAppSupportedTemperatureLevelsDelegate; // Please refer to https://github.com/CHIP-Specifications/connectedhomeip-spec/blob/master/src/namespaces constexpr const uint8_t kNamespaceCommon = 7; // Common Number Namespace: 7, tag 0 (Zero) constexpr const uint8_t kTagCommonZero = 0; // Common Number Namespace: 7, tag 1 (One) constexpr const uint8_t kTagCommonOne = 1; // Common Number Namespace: 7, tag 2 (Two) constexpr const uint8_t kTagCommonTwo = 2; constexpr const uint8_t kNamespacePosition = 8; // Common Position Namespace: 8, tag: 0 (Left) constexpr const uint8_t kTagPositionLeft = 0; // Common Position Namespace: 8, tag: 1 (Right) constexpr const uint8_t kTagPositionRight = 1; // Common Position Namespace: 8, tag: 3 (Bottom) constexpr const uint8_t kTagPositionBottom = 3; const Clusters::Descriptor::Structs::SemanticTagStruct::Type gEp0TagList[] = { { .namespaceID = kNamespaceCommon, .tag = kTagCommonZero }, { .namespaceID = kNamespacePosition, .tag = kTagPositionBottom } }; const Clusters::Descriptor::Structs::SemanticTagStruct::Type gEp1TagList[] = { { .namespaceID = kNamespaceCommon, .tag = kTagCommonOne }, { .namespaceID = kNamespacePosition, .tag = kTagPositionLeft } }; const Clusters::Descriptor::Structs::SemanticTagStruct::Type gEp2TagList[] = { { .namespaceID = kNamespaceCommon, .tag = kTagCommonTwo }, { .namespaceID = kNamespacePosition, .tag = kTagPositionRight } }; } // namespace #ifdef EMBER_AF_PLUGIN_DISHWASHER_ALARM_SERVER extern void MatterDishwasherAlarmServerInit(); #endif void OnIdentifyStart(::Identify *) { ChipLogProgress(Zcl, "OnIdentifyStart"); } void OnIdentifyStop(::Identify *) { ChipLogProgress(Zcl, "OnIdentifyStop"); } void OnTriggerEffect(::Identify * identify) { switch (identify->mCurrentEffectIdentifier) { case Clusters::Identify::EffectIdentifierEnum::kBlink: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBlink"); break; case Clusters::Identify::EffectIdentifierEnum::kBreathe: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kBreathe"); break; case Clusters::Identify::EffectIdentifierEnum::kOkay: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kOkay"); break; case Clusters::Identify::EffectIdentifierEnum::kChannelChange: ChipLogProgress(Zcl, "Clusters::Identify::EffectIdentifierEnum::kChannelChange"); break; default: ChipLogProgress(Zcl, "No identifier effect"); return; } } static Identify gIdentify0 = { chip::EndpointId{ 0 }, OnIdentifyStart, OnIdentifyStop, Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator, OnTriggerEffect, }; static Identify gIdentify1 = { chip::EndpointId{ 1 }, OnIdentifyStart, OnIdentifyStop, Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator, OnTriggerEffect, }; namespace { class ExampleDeviceInstanceInfoProvider : public DeviceInstanceInfoProvider { public: void Init(DeviceInstanceInfoProvider * defaultProvider) { mDefaultProvider = defaultProvider; } CHIP_ERROR GetVendorName(char * buf, size_t bufSize) override { return mDefaultProvider->GetVendorName(buf, bufSize); } CHIP_ERROR GetVendorId(uint16_t & vendorId) override { return mDefaultProvider->GetVendorId(vendorId); } CHIP_ERROR GetProductName(char * buf, size_t bufSize) override { return mDefaultProvider->GetProductName(buf, bufSize); } CHIP_ERROR GetProductId(uint16_t & productId) override { return mDefaultProvider->GetProductId(productId); } CHIP_ERROR GetPartNumber(char * buf, size_t bufSize) override { return mDefaultProvider->GetPartNumber(buf, bufSize); } CHIP_ERROR GetProductURL(char * buf, size_t bufSize) override { return mDefaultProvider->GetPartNumber(buf, bufSize); } CHIP_ERROR GetProductLabel(char * buf, size_t bufSize) override { return mDefaultProvider->GetProductLabel(buf, bufSize); } CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override { return mDefaultProvider->GetSerialNumber(buf, bufSize); } CHIP_ERROR GetManufacturingDate(uint16_t & year, uint8_t & month, uint8_t & day) override { return mDefaultProvider->GetManufacturingDate(year, month, day); } CHIP_ERROR GetHardwareVersion(uint16_t & hardwareVersion) override { return mDefaultProvider->GetHardwareVersion(hardwareVersion); } CHIP_ERROR GetHardwareVersionString(char * buf, size_t bufSize) override { return mDefaultProvider->GetHardwareVersionString(buf, bufSize); } CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) override { return mDefaultProvider->GetRotatingDeviceIdUniqueId(uniqueIdSpan); } CHIP_ERROR GetProductFinish(Clusters::BasicInformation::ProductFinishEnum * finish) override; CHIP_ERROR GetProductPrimaryColor(Clusters::BasicInformation::ColorEnum * primaryColor) override; private: DeviceInstanceInfoProvider * mDefaultProvider; }; CHIP_ERROR ExampleDeviceInstanceInfoProvider::GetProductFinish(Clusters::BasicInformation::ProductFinishEnum * finish) { // Our example device claims to have a Satin finish for now. We can make // this configurable as needed. *finish = Clusters::BasicInformation::ProductFinishEnum::kSatin; return CHIP_NO_ERROR; } CHIP_ERROR ExampleDeviceInstanceInfoProvider::GetProductPrimaryColor(Clusters::BasicInformation::ColorEnum * primaryColor) { // Our example device claims to have a nice purple color for now. We can // make this configurable as needed. *primaryColor = Clusters::BasicInformation::ColorEnum::kPurple; return CHIP_NO_ERROR; } ExampleDeviceInstanceInfoProvider gExampleDeviceInstanceInfoProvider; } // namespace void ApplicationInit() { std::string path = kChipEventFifoPathPrefix + std::to_string(getpid()); if (sChipNamedPipeCommands.Start(path, &sAllClustersCommandDelegate) != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "Failed to start CHIP NamedPipeCommands"); sChipNamedPipeCommands.Stop(); } auto * defaultProvider = GetDeviceInstanceInfoProvider(); if (defaultProvider != &gExampleDeviceInstanceInfoProvider) { gExampleDeviceInstanceInfoProvider.Init(defaultProvider); SetDeviceInstanceInfoProvider(&gExampleDeviceInstanceInfoProvider); } #ifdef EMBER_AF_PLUGIN_DISHWASHER_ALARM_SERVER MatterDishwasherAlarmServerInit(); #endif Clusters::TemperatureControl::SetInstance(&sAppSupportedTemperatureLevelsDelegate); SetTagList(/* endpoint= */ 0, Span(gEp0TagList)); SetTagList(/* endpoint= */ 1, Span(gEp1TagList)); SetTagList(/* endpoint= */ 2, Span(gEp2TagList)); } void ApplicationShutdown() { // These may have been initialised via the emberAfXxxClusterInitCallback methods. We need to destroy them before shutdown. Clusters::DishwasherMode::Shutdown(); Clusters::LaundryWasherMode::Shutdown(); Clusters::RvcCleanMode::Shutdown(); Clusters::RvcRunMode::Shutdown(); Clusters::RefrigeratorAndTemperatureControlledCabinetMode::Shutdown(); Clusters::HepaFilterMonitoring::Shutdown(); Clusters::ActivatedCarbonFilterMonitoring::Shutdown(); Clusters::AirQuality::Shutdown(); Clusters::OperationalState::Shutdown(); Clusters::RvcOperationalState::Shutdown(); if (sChipNamedPipeCommands.Stop() != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "Failed to stop CHIP NamedPipeCommands"); } } using namespace chip::app::Clusters::LaundryWasherControls; void emberAfLaundryWasherControlsClusterInitCallback(EndpointId endpoint) { LaundryWasherControlsServer::SetDefaultDelegate(endpoint, &LaundryWasherControlDelegate::getLaundryWasherControlDelegate()); } void emberAfLowPowerClusterInitCallback(EndpointId endpoint) { ChipLogProgress(NotSpecified, "Setting LowPower default delegate to global manager"); Clusters::LowPower::SetDefaultDelegate(endpoint, &sLowPowerManager); } void emberAfWindowCoveringClusterInitCallback(chip::EndpointId endpoint) { sWindowCoveringManager.Init(endpoint); Clusters::WindowCovering::SetDefaultDelegate(endpoint, &sWindowCoveringManager); Clusters::WindowCovering::ConfigStatusUpdateFeatures(endpoint); }