| /* |
| * |
| * 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. |
| */ |
| |
| #include "BindingHandler.h" |
| #include "ColorControlCommands.h" |
| #include "IdentifyCommand.h" |
| #include "LevelControlCommands.h" |
| #include "OnOffCommands.h" |
| #include "ThermostatCommands.h" |
| #include "app/clusters/bindings/BindingManager.h" |
| #include "app/server/Server.h" |
| #include "controller/InvokeInteraction.h" |
| #include "controller/ReadInteraction.h" |
| #include "platform/CHIPDeviceLayer.h" |
| #include <app/clusters/bindings/bindings.h> |
| #include <lib/support/CodeUtils.h> |
| |
| #if CONFIG_ENABLE_CHIP_SHELL |
| #include "lib/shell/Engine.h" |
| #include "lib/shell/commands/Help.h" |
| #endif // ENABLE_CHIP_SHELL |
| |
| using namespace chip; |
| using namespace chip::app; |
| |
| #if CONFIG_ENABLE_CHIP_SHELL |
| using Shell::Engine; |
| using Shell::shell_command_t; |
| using Shell::streamer_get; |
| using Shell::streamer_printf; |
| |
| Engine sShellSwitchSubCommands; |
| Engine sShellSwitchGroupsSubCommands; |
| Engine sShellSwitchBindingSubCommands; |
| #endif // defined(ENABLE_CHIP_SHELL) |
| |
| namespace { |
| void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device, void * context) |
| { |
| VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); |
| BindingCommandData * data = static_cast<BindingCommandData *>(context); |
| |
| if (data->isReadAttribute) |
| { |
| // It should always enter here if isReadAttribute is true |
| if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) |
| { |
| switch (data->clusterId) |
| { |
| case Clusters::Identify::Id: |
| ProcessIdentifyUnicastBindingRead(data, binding, peer_device); |
| break; |
| case Clusters::OnOff::Id: |
| ProcessOnOffUnicastBindingRead(data, binding, peer_device); |
| break; |
| case Clusters::LevelControl::Id: |
| ProcessLevelControlUnicastBindingRead(data, binding, peer_device); |
| break; |
| case Clusters::ColorControl::Id: |
| ProcessColorControlUnicastBindingRead(data, binding, peer_device); |
| break; |
| case Clusters::Thermostat::Id: |
| ProcessThermostatUnicastBindingRead(data, binding, peer_device); |
| break; |
| } |
| } |
| } |
| else |
| { |
| if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) |
| { |
| switch (data->clusterId) |
| { |
| case Clusters::Identify::Id: |
| ProcessIdentifyGroupBindingCommand(data, binding); |
| break; |
| case Clusters::OnOff::Id: |
| ProcessOnOffGroupBindingCommand(data, binding); |
| break; |
| case Clusters::LevelControl::Id: |
| ProcessColorControlGroupBindingCommand(data, binding); |
| break; |
| case Clusters::ColorControl::Id: |
| ProcessColorControlGroupBindingCommand(data, binding); |
| break; |
| case Clusters::Thermostat::Id: |
| ProcessThermostatGroupBindingCommand(data, binding); |
| break; |
| } |
| } |
| else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) |
| { |
| switch (data->clusterId) |
| { |
| case Clusters::Identify::Id: |
| ProcessIdentifyUnicastBindingCommand(data, binding, peer_device); |
| break; |
| case Clusters::OnOff::Id: |
| ProcessOnOffUnicastBindingCommand(data, binding, peer_device); |
| break; |
| case Clusters::LevelControl::Id: |
| ProcessLevelControlUnicastBindingCommand(data, binding, peer_device); |
| break; |
| case Clusters::ColorControl::Id: |
| ProcessColorControlUnicastBindingCommand(data, binding, peer_device); |
| break; |
| case Clusters::Thermostat::Id: |
| ProcessThermostatUnicastBindingCommand(data, binding, peer_device); |
| break; |
| } |
| } |
| } |
| } |
| |
| void LightSwitchContextReleaseHandler(void * context) |
| { |
| VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "Invalid context for Light switch context release handler")); |
| |
| Platform::Delete(static_cast<BindingCommandData *>(context)); |
| } |
| |
| void InitBindingHandlerInternal(intptr_t arg) |
| { |
| auto & server = chip::Server::GetInstance(); |
| chip::BindingManager::GetInstance().Init( |
| { &server.GetFabricTable(), server.GetCASESessionManager(), &server.GetPersistentStorage() }); |
| chip::BindingManager::GetInstance().RegisterBoundDeviceChangedHandler(LightSwitchChangedHandler); |
| chip::BindingManager::GetInstance().RegisterBoundDeviceContextReleaseHandler(LightSwitchContextReleaseHandler); |
| } |
| |
| #if CONFIG_ENABLE_CHIP_SHELL |
| |
| /******************************************************** |
| * Switch shell functions |
| *********************************************************/ |
| |
| CHIP_ERROR SwitchHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR SwitchCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return SwitchHelpHandler(argc, argv); |
| } |
| |
| return sShellSwitchSubCommands.ExecCommand(argc, argv); |
| } |
| |
| /******************************************************** |
| * bind switch shell functions |
| *********************************************************/ |
| |
| CHIP_ERROR BindingHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchBindingSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR BindingSwitchCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return BindingHelpHandler(argc, argv); |
| } |
| |
| return sShellSwitchBindingSubCommands.ExecCommand(argc, argv); |
| } |
| |
| CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) |
| { |
| VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); |
| |
| EmberBindingTableEntry * entry = Platform::New<EmberBindingTableEntry>(); |
| entry->type = MATTER_MULTICAST_BINDING; |
| entry->fabricIndex = atoi(argv[0]); |
| entry->groupId = atoi(argv[1]); |
| entry->local = 1; // Hardcoded to endpoint 1 for now |
| entry->clusterId.emplace(6); // Hardcoded to OnOff cluster for now |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingWorkerFunction, reinterpret_cast<intptr_t>(entry)); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) |
| { |
| VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); |
| |
| EmberBindingTableEntry * entry = Platform::New<EmberBindingTableEntry>(); |
| entry->type = MATTER_UNICAST_BINDING; |
| entry->fabricIndex = atoi(argv[0]); |
| entry->nodeId = atoi(argv[1]); |
| entry->local = 1; // Hardcoded to endpoint 1 for now |
| entry->remote = atoi(argv[2]); |
| entry->clusterId.emplace(6); // Hardcode to OnOff cluster for now |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingWorkerFunction, reinterpret_cast<intptr_t>(entry)); |
| return CHIP_NO_ERROR; |
| } |
| |
| /******************************************************** |
| * Groups switch shell functions |
| *********************************************************/ |
| |
| CHIP_ERROR GroupsHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchGroupsSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR GroupsSwitchCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return GroupsHelpHandler(argc, argv); |
| } |
| |
| return sShellSwitchGroupsSubCommands.ExecCommand(argc, argv); |
| } |
| |
| /** |
| * @brief configures switch matter shell |
| * |
| */ |
| static void RegisterSwitchCommands() |
| { |
| |
| static const shell_command_t sSwitchSubCommands[] = { |
| { &SwitchHelpHandler, "help", "Usage: switch <subcommand>" }, |
| { &IdentifySwitchCommandHandler, "identify", " Usage: switch identify <subcommand>" }, |
| { &OnOffSwitchCommandHandler, "onoff", " Usage: switch onoff <subcommand>" }, |
| { &LevelControlSwitchCommandHandler, "levelcontrol", " Usage: switch levlecontrol <subcommand>" }, |
| { &ColorControlSwitchCommandHandler, "colorcontrol", " Usage: switch colorcontrol <subcommand>" }, |
| { &ThermostatSwitchCommandHandler, "thermostat", " Usage: switch thermostat <subcommand>" }, |
| { &GroupsSwitchCommandHandler, "groups", "Usage: switch groups <subcommand>" }, |
| { &BindingSwitchCommandHandler, "binding", "Usage: switch binding <subcommand>" } |
| }; |
| |
| static const shell_command_t sSwitchIdentifySubCommands[] = { |
| { &IdentifyHelpHandler, "help", "Usage: switch identify <subcommand>" }, |
| { &IdentifyCommandHandler, "identify", "identify Usage: switch identify identify" }, |
| { &TriggerEffectSwitchCommandHandler, "triggereffect", "triggereffect Usage: switch identify triggereffect" }, |
| { &IdentifyRead, "read", "Usage : switch identify read <attribute>" } |
| }; |
| |
| static const shell_command_t sSwitchIdentifyReadSubCommands[] = { |
| { &IdentifyReadHelpHandler, "help", "Usage : switch identify read <attribute>" }, |
| { &IdentifyReadAttributeList, "attlist", "Read attribute list" }, |
| { &IdentifyReadIdentifyTime, "identifytime", "Read identifytime attribute" }, |
| { &IdentifyReadIdentifyType, "identifytype", "Read identifytype attribute" }, |
| }; |
| |
| static const shell_command_t sSwitchOnOffSubCommands[] = { |
| { &OnOffHelpHandler, "help", "Usage: switch ononff <subcommand>" }, |
| { &OnSwitchCommandHandler, "on", "on Usage: switch onoff on" }, |
| { &OffSwitchCommandHandler, "off", "off Usage: switch onoff off" }, |
| { &ToggleSwitchCommandHandler, "toggle", "toggle Usage: switch onoff toggle" }, |
| { &OffWithEffectSwitchCommandHandler, "offWE", "off-with-effect Usage: switch onoff offWE <EffectId> <EffectVariant>" }, |
| { &OnWithRecallGlobalSceneSwitchCommandHandler, "onWRGS", "on-with-recall-global-scene Usage: switch onoff onWRGS" }, |
| { &OnWithTimedOffSwitchCommandHandler, "onWTO", |
| "on-with-timed-off Usage: switch onoff onWTO <OnOffControl> <OnTime> <OffWaitTime>" }, |
| { &OnOffRead, "read", "Usage : switch onoff read <attribute>" } |
| }; |
| |
| static const shell_command_t sSwitchOnOffReadSubCommands[] = { |
| { &OnOffReadHelpHandler, "help", "Usage : switch ononff read <attribute>" }, |
| { &OnOffReadAttributeList, "attlist", "Read attribute list" }, |
| { &OnOffReadOnOff, "onoff", "Read onoff attribute" }, |
| { &OnOffReadGlobalSceneControl, "GSC", "Read GlobalSceneControl attribute" }, |
| { &OnOffReadOnTime, "ontime", "Read ontime attribute" }, |
| { &OnOffReadOffWaitTime, "offwaittime", "Read offwaittime attribute" }, |
| { &OnOffReadStartUpOnOff, "SOO", "Read startuponoff attribute" }, |
| }; |
| |
| static const shell_command_t sSwitchLevelControlSubCommands[] = { |
| { &LevelControlHelpHandler, "help", "Usage: switch levelcontrol <subcommand>" }, |
| { &MoveToLevelSwitchCommandHandler, "movetolevel", |
| "movetolevel Usage: switch levelcontrol movetolevel <level> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveSwitchCommandHandler, "move", |
| "move Usage: switch levelcontrol move <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &StepSwitchCommandHandler, "step", |
| "step Usage: switch levelcontrol step <stepmode> <stepsize> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &StopSwitchCommandHandler, "stop", "step Usage: switch levelcontrol stop <optionsmask> <optionsoverride>" }, |
| { &MoveToLevelWithOnOffSwitchCommandHandler, "MTLWOO", |
| "movetolevelwithonoff Usage: switch levelcontrol MTLWOO <level> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveWithOnOffSwitchCommandHandler, "MWOO", |
| "movewithonoff Usage: switch levelcontrol MWOO <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &StepWithOnOffSwitchCommandHandler, "stepWOO", |
| "stepwithonoff Usage: switch levelcontrol stepWOO <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &StopWithOnOffSwitchCommandHandler, "stopWOO", |
| "stopwithonoff Usage: switch levelcontrol stopWOO <optionsmask> <optionsoverride>" }, |
| { &LevelControlRead, "read", "Usage : switch levelcontrol read <attribute>" } |
| }; |
| |
| static const shell_command_t sSwitchLevelControlReadSubCommands[] = { |
| { &LevelControlReadHelpHandler, "help", "Usage : switch levelcontrol read <attribute>" }, |
| { &LevelControlReadAttributeList, "attlist", "Read attribute list" }, |
| { &LevelControlReadCurrentLevel, "currentlevel", "Read currentlevel attribute" }, |
| { &LevelControlReadRemainingTime, "remainingtime", "Read remainingtime attribute" }, |
| { &LevelControlReadMinLevel, "minlevel", "Read minlevel attribute" }, |
| { &LevelControlReadMaxLevel, "maxlevel", "Read maxlevel attribute" }, |
| { &LevelControlReadCurrentFrequency, "currentfrequency", "Read currentfrequency attribute" }, |
| { &LevelControlReadMinFrequency, "minfrequency", "Read minfrequency attribute" }, |
| { &LevelControlReadMaxFrequency, "maxfrequency", "Read maxfrequency attribute" }, |
| { &LevelControlReadOptions, "options", "Read options attribute" }, |
| { &LevelControlReadOnOffTransitionTime, "OOTT", "Read onofftransitiontime attribute" }, |
| { &LevelControlReadOnLevel, "onlevel", "Read onlevel attribute" }, |
| { &LevelControlReadOnTransitionTime, "OnTT", "Read ontransitiontime attribute" }, |
| { &LevelControlReadOffTransitionTime, "OffTT", "Read offtransitiontime attribute" }, |
| { &LevelControlReadDefaultMoveRate, "DMR", "Read defaultmoverate attribute" }, |
| { &LevelControlReadStartUpCurrentLevel, "SUCL", "Read startupcurrentlevel attribute" }, |
| }; |
| |
| static const shell_command_t sSwitchColorControlSubCommands[] = { |
| { &ColorControlHelpHandler, "help", "Usage: switch colorcontrol <subcommand>" }, |
| { &MoveToHueCommandHandler, "movetohue", |
| "movetohue Usage: switch colorcontrol movetohue <hue> <direction> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveHueCommandHandler, "movehue", |
| "movehue Usage: switch colorcontrol movehue <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &StepHueCommandHandler, "stephue", |
| "stephue Usage: switch colorcontrol stephue <stepmode> <stepsize> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveToSaturationCommandHandler, "movetosat", |
| "movetosaturation Usage: switch colorcontrol movetosat <saturation> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveSaturationCommandHandler, "movesat", |
| "movesaturation Usage: switch colorcontrol movesat <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &StepSaturationCommandHandler, "stepsat", |
| "stepsaturation Usage: switch colorcontrol stepsat <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &MoveToHueAndSaturationCommandHandler, "movetoHS", |
| "movetohueandsaturation Usage: switch colorcontrol movetoHS <hue> <saturation> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &MoveToColorCommandHandler, "movetocolor", |
| "movetocolor Usage: switch colorcontrol movetocolor <colorx> <colory> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveColorCommandHandler, "movecolor", |
| "movecolor Usage: switch colorcontrol movecolor <ratex> <ratey> <optionsmask> <optionsoverride>" }, |
| { &StepColorCommandHandler, "stepcolor", |
| "stepcolor Usage: switch colorcontrol stepcolor <stepx> <stepy> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &MoveToColorTemperatureCommandHandler, "movetoCT", |
| "movetocolortemperature Usage: switch colorcontrol movetoCT <colortempmireds> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &EnhancedMoveToHueCommandHandler, "Emovetohue", |
| "enhancedmovetohue Usage: switch colorcontrol Emovetohue <enhancedhue> <direction> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &EnhancedMoveHueCommandHandler, "Emovehue", |
| "enhancedmovehue Usage: switch colorcontrol Emovehue <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &EnhancedStepHueCommandHandler, "Estephue", |
| "enhancedstephue Usage: switch colorcontrol Estephue <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &EnhancedMoveToHueAndSaturationCommandHandler, "EmovetoHS", |
| "enhancedmovetohueandsaturation Usage: switch colorcontrol EmovetoHS <enhancedhue> <saturation> <transitiontime> " |
| "<optionsmask> <optionsoverride>" }, |
| { &ColorLoopSetCommandHandler, "colorloopset", |
| "colorloopset Usage: switch colorcontrol colorloopset <updateflags> <action> <direction> <time> <starhue> <optionsmask> " |
| "<optionsoverride>" }, |
| { &StopMoveStepCommandHandler, "stopmovestep", |
| "stopmovestep Usage: switch colorcontrol stopmovestep <optionsmask> <optionsoverride>" }, |
| { &MoveColorTemperatureCommandHandler, "moveCT", |
| "movecolortemperature Usage: switch colorcontrol moveCT <movemode> <rate> <colortempminmireds> <colortempmaxmireds> " |
| "<optionsmask> <optionsoverride>" }, |
| { &StepColorTemperatureCommandHandler, "stepCT", |
| "stepcolortemperature Usage: switch colorcontrol stepCT <stepmode> <stepsize> <transitiontime> <colortempminmireds> " |
| "<colortempmaxmireds> <optionsmask> <optionsoverride>" }, |
| { &ColorControlRead, "read", "Usage : switch colorcontrol read <attribute>" } |
| }; |
| |
| static const shell_command_t sSwitchColorControlReadSubCommands[] = { |
| // fill in read color control attributes commands |
| { &ColorControlReadHelpHandler, "help", "Usage : switch colorcontrol read <attribute>" }, |
| { &ColorControlReadAttributeList, "attlist", "Read attribute list" }, |
| { &ColorControlReadCurrentHue, "currenthue", "Read currenthue attribute" }, |
| { &ColorControlReadCurrentSaturation, "currentsat", "Read currentsaturaion attribute" }, |
| { &ColorControlReadRemainingTime, "remaintime", "Read remainingtime attribute" }, |
| { &ColorControlReadCurrentX, "current-x", "Read current-x attribute" }, |
| { &ColorControlReadCurrentY, "current-y", "Read current-y attribute" }, |
| { &ColorControlReadDriftCompensation, "driftcomp", "Read driftcompensation attribute" }, |
| { &ColorControlReadCompensationText, "comptext", "Read compensationtext attribute" }, |
| { &ColorControlReadColorTemperature, "colortemp", "Read colortemperature attribute" }, |
| { &ColorControlReadColorMode, "colormode", "Read colormode attribute" }, |
| { &ColorControlReadOptions, "options", "Read options attribute" }, |
| { &ColorControlReadNumberOfPrimaries, "noofprimaries", "Read numberofprimaries attribute" }, |
| { &ColorControlReadPrimary1X, "primary1x", "Read primary1x attribute" }, |
| { &ColorControlReadPrimary1Y, "primary1y", "Read primary1y attribute" }, |
| { &ColorControlReadPrimary1Intensity, "primary1intensity", "Read primary1intensity attribute" }, |
| { &ColorControlReadPrimary2X, "primary2x", "Read primary2x attribute" }, |
| { &ColorControlReadPrimary2Y, "primary2y", "Read primary2y attribute" }, |
| { &ColorControlReadPrimary2Intensity, "primary2intensity", "Read primary2intensity attribute" }, |
| { &ColorControlReadPrimary3X, "primary3x", "Read primary3x attribute" }, |
| { &ColorControlReadPrimary3Y, "primary3y", "Read primary3y attribute" }, |
| { &ColorControlReadPrimary3Intensity, "primary3intensity", "Read primary3intensity attribute" }, |
| { &ColorControlReadPrimary4X, "primary4x", "Read primary4x attribute" }, |
| { &ColorControlReadPrimary4Y, "primary4y", "Read primary4y attribute" }, |
| { &ColorControlReadPrimary4Intensity, "primary4intensity", "Read primary4intensity attribute" }, |
| { &ColorControlReadPrimary5X, "primary5x", "Read primary5x attribute" }, |
| { &ColorControlReadPrimary5Y, "primary5y", "Read primary5y attribute" }, |
| { &ColorControlReadPrimary5Intensity, "primary5intensity", "Read primary5intensity attribute" }, |
| { &ColorControlReadPrimary6X, "primary6x", "Read primary6x attribute" }, |
| { &ColorControlReadPrimary6Y, "primary6y", "Read primary6y attribute" }, |
| { &ColorControlReadPrimary6Intensity, "primary6intensity", "Read primary6intensity attribute" }, |
| { &ColorControlReadWhitePointX, "whitepointx", "Read whitepointx attribute" }, |
| { &ColorControlReadWhitePointY, "whitepointy", "Read whitepointy attribute" }, |
| { &ColorControlReadColorPointRX, "colorpointrx", "Read colorpointrx attribute" }, |
| { &ColorControlReadColorPointRY, "colorpointry", "Read colorpointry attribute" }, |
| { &ColorControlReadColorPointRIntensity, "colorpointrintensity", "Read colorpointrintensity attribute" }, |
| { &ColorControlReadColorPointGX, "colorpointgx", "Read colorpointgx attribute" }, |
| { &ColorControlReadColorPointGY, "colorpointgy", "Read colorpointgy attribute" }, |
| { &ColorControlReadColorPointGIntensity, "colorpointgintensity", "Read colorpointgintensity attribute" }, |
| { &ColorControlReadColorPointBX, "colorpointbx", "Read colorpointbx attribute" }, |
| { &ColorControlReadColorPointBY, "colorpointby", "Read colorpointby attribute" }, |
| { &ColorControlReadColorPointBIntensity, "colorpointbintensity", "Read colorpointbintensity attribute" }, |
| { &ColorControlReadEnhancedCurrentHue, "Ecurrenthue", "Read enhancedcurrenthue attribute" }, |
| { &ColorControlReadEnhancedColorMode, "Ecolormode", "Read enhancedcolormode attribute" }, |
| { &ColorControlReadColorLoopActive, "colorloopactive", "Read colorloopactive attribute" }, |
| { &ColorControlReadColorLoopDirection, "colorloopdirection", "Read colorloopdirection attribute" }, |
| { &ColorControlReadColorLoopTime, "colorlooptime", "Read colorlooptime attribute" }, |
| { &ColorControlReadColorLoopStartEnhancedHue, "colorloopstartenhancedhue", "Read colorloopstartenhancedHue attribute" }, |
| { &ColorControlReadColorLoopStoredEnhancedHue, "colorloopstoredenhancedhue", "Read colorloopstoredenhancedHue attribute" }, |
| { &ColorControlReadColorCapabilities, "colorcapabilities", "Read colorcapabilities attribute" }, |
| { &ColorControlReadColorTempPhysicalMinMireds, "colortempphyminmireds", "Read colortempphysicalminmireds attribute" }, |
| { &ColorControlReadColorTempPhysicalMaxMireds, "colortempphymaxmireds", "Read colortempphysicalmaxmireds attribute" }, |
| { &ColorControlReadCoupleColorTempToLevelMinMireds, "CCTTMM", "Read couplecolortemptolevelminmireds attribute" }, |
| { &ColorControlReadStartUpColorTemperatureMireds, "SUCTM", "Read startupcolortempmireds attribute" }, |
| }; |
| |
| static const shell_command_t sSwitchThermostatSubCommands[] = { |
| { &ThermostatHelpHandler, "help", "Usage: switch thermostat <subcommand>" }, |
| { &SetpointRaiseLowerSwitchCommandHandler, "SPRL", "setpointraiselower Usage: switch thermostat SPRL <mode> <amount>" }, |
| { &ThermostatRead, "read", "Usage : switch thermostat read <attribute>" } |
| }; |
| |
| static const shell_command_t sSwitchThermostatReadSubCommands[] = { |
| { &ThermostatReadHelpHandler, "help", "Usage : switch thermostat read <attribute>" }, |
| { &ThermostatReadAttributeList, "attlist", "Read attribute list" }, |
| { &ThermostatReadLocalTemperature, "localtemp", "Read localtemperature attribute" }, |
| { &ThermostatReadAbsMinHeatSetpointLimit, "absminHSL", "Read absminheatsetpointlimit attribute" }, |
| { &ThermostatReadAbsMaxHeatSetpointLimit, "absmaxHSL", "Read absmaxheatsetpointlimit attribute" }, |
| { &ThermostatReadAbsMinCoolSetpointLimit, "absminCSL", "Read absmincoolsetpointlimit attribute" }, |
| { &ThermostatReadAbsMaxCoolSetpointLimit, "absmaxCSL", "Read absmaxcoolsetpointlimit attribute" }, |
| { &ThermostatReadPiCoolingDemand, "picoolingdemand", "Read picoolingdemand attribute" }, |
| { &ThermostatReadPiHeatingDemand, "piheatingdemand", "Read piheatingdemand attribute" }, |
| { &ThermostatReadOccupiedCoolingSetpoint, "OCS", "Read occupiedcoolingsetpoint attribute" }, |
| { &ThermostatReadOccupiedHeatingSetpoint, "OHS", "Read occupiedheatingsetpoint attribute" }, |
| { &ThermostatReadMinHeatSetpointLimit, "minHSL", "Read minheatsetpointlimit attribute" }, |
| { &ThermostatReadMaxHeatSetpointLimit, "maxHSL", "Read maxheatsetpointlimit attribute" }, |
| { &ThermostatReadMinCoolSetpointLimit, "minCSL", "Read mincoolsetpointlimit attribute" }, |
| { &ThermostatReadMaxCoolSetpointLimit, "maxCSL", "Read maxcoolsetpointlimit attribute" }, |
| { &ThermostatReadControlSequenceOfOperation, "CSOP", "Read controlsequenceofoperation attribute" }, |
| { &ThermostatReadSystemMode, "systemmode", "Read systemmode attribute" }, |
| }; |
| |
| static const shell_command_t sSwitchGroupsSubCommands[] = { |
| { &GroupsHelpHandler, "help", "Usage: switch groups <subcommand>" }, |
| { &GroupsOnOffSwitchCommandHandler, "onoff", "Usage: switch groups onoff <subcommand>" }, |
| { &GroupsLevelControlSwitchCommandHandler, "levelcontrol", "Usage: switch groups levelcontrol <subcommand>" }, |
| { &GroupsColorControlSwitchCommandHandler, "colorcontrol", "Usage: switch groups colorcontrol <subcommand>" }, |
| { &GroupsThermostatSwitchCommandHandler, "thermostat", "Usage: switch groups thermostat <subcommand>" }, |
| }; |
| |
| static const shell_command_t sSwitchGroupsIdentifySubCommands[] = { |
| { &GroupsIdentifyHelpHandler, "help", "Usage: switch groups onoff <subcommand>" }, |
| { &GroupIdentifyCommandHandler, "identify", "Sends identify command to bound group" }, |
| { &GroupTriggerEffectSwitchCommandHandler, "triggereffect", "Sends triggereffect command to group" }, |
| }; |
| |
| static const shell_command_t sSwitchGroupsOnOffSubCommands[] = { |
| { &GroupsOnOffHelpHandler, "help", "Usage: switch groups onoff <subcommand>" }, |
| { &GroupOnSwitchCommandHandler, "on", "Sends on command to bound group" }, |
| { &GroupOffSwitchCommandHandler, "off", "Sends off command to bound group" }, |
| { &GroupToggleSwitchCommandHandler, "toggle", "Sends toggle command to group" }, |
| { &GroupOffWithEffectSwitchCommandHandler, "offWE", "Sends off-with-effect command to group" }, |
| { &GroupOnWithRecallGlobalSceneSwitchCommandHandler, "onWRGS", "Sends on-with-recall-global-scene command to group" }, |
| { &GroupOnWithTimedOffSwitchCommandHandler, "onWTO", "Sends on-with-timed-off command to group" } |
| }; |
| |
| static const shell_command_t sSwitchGroupsLevelControlSubCommands[] = { |
| { &GroupsLevelControlHelpHandler, "help", "Usage: switch groupos levelcontrol <subcommand>" }, |
| { &GroupsMoveToLevelSwitchCommandHandler, "movetolevel", |
| "movetolevel Usage: switch groups levelcontrol movetolevel <level> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &GroupsMoveSwitchCommandHandler, "move", |
| "move Usage: switch groups levelcontrol move <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepSwitchCommandHandler, "step", |
| "step Usage: switch groups levelcontrol step <stepmode> <stepsize> <transitiontime> <optionsmask> <optionsoverride>" }, |
| { &GroupsStopSwitchCommandHandler, "stop", "step Usage: switch groups levelcontrol stop <optionsmask> <optionsoverride>" }, |
| { &GroupsMoveToLevelWithOnOffSwitchCommandHandler, "MTLWOO", |
| "movetolevelwithonoff Usage: switch groups levelcontrol MTLWOO <level> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveWithOnOffSwitchCommandHandler, "MWOO", |
| "movewithonoff Usage: switch groups levelcontrol MWOO <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepWithOnOffSwitchCommandHandler, "stepWOO", |
| "stepwithonoff Usage: switch groups levelcontrol stepWOO <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsStopWithOnOffSwitchCommandHandler, "stopWOO", |
| "stopwithonoff Usage: switch groups levelcontrol stopWOO <optionsmask> <optionsoverride>" }, |
| }; |
| |
| static const shell_command_t sSwitchGroupsColorControlSubCommands[] = { |
| { &GroupsColorControlHelpHandler, "help", "Usage: switch groups colorcontrol <subcommand>" }, |
| { &GroupsMoveToHueCommandHandler, "movetohue", |
| "movetohue Usage: switch groups colorcontrol movetohue <hue> <direction> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveHueCommandHandler, "movehue", |
| "movehue Usage: switch groups colorcontrol movehue <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepHueCommandHandler, "stephue", |
| "stephue Usage: switch groups colorcontrol stephue <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveToSaturationCommandHandler, "movetosat", |
| "movetosaturation Usage: switch groups colorcontrol movetosat <saturation> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveSaturationCommandHandler, "movesat", |
| "movesaturation Usage: switch groups colorcontrol movesat <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepSaturationCommandHandler, "stepsat", |
| "stepsaturation Usage: switch groups colorcontrol stepsat <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveToHueAndSaturationCommandHandler, "movetoHS", |
| "movetohueandsaturation Usage: switch groups colorcontrol movetoHS <hue> <saturation> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveToColorCommandHandler, "movetocolor", |
| "movetocolor Usage: switch groups colorcontrol movetocolor <colorx> <colory> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveColorCommandHandler, "movecolor", |
| "movecolor Usage: switch groups colorcontrol movecolor <ratex> <ratey> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepColorCommandHandler, "stepcolor", |
| "stepcolor Usage: switch groups colorcontrol stepcolor <stepx> <stepy> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsMoveToColorTemperatureCommandHandler, "movetoCT", |
| "movetocolortemperature Usage: switch groups colorcontrol movetoCT <colortempmireds> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsEnhancedMoveToHueCommandHandler, "Emovetohue", |
| "enhancedmovetohue Usage: switch groups colorcontrol Emovetohue <enhancedhue> <direction> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsEnhancedMoveHueCommandHandler, "Emovehue", |
| "enhancedmovehue Usage: switch groups colorcontrol Emovehue <movemode> <rate> <optionsmask> <optionsoverride>" }, |
| { &GroupsEnhancedStepHueCommandHandler, "Estephue", |
| "enhancedstephue Usage: switch gropus colorcontrol Estephue <stepmode> <stepsize> <transitiontime> <optionsmask> " |
| "<optionsoverride>" }, |
| { &GroupsEnhancedMoveToHueAndSaturationCommandHandler, "EmovetoHS", |
| "enhancedmovetohueandsaturation Usage: switch groups colorcontrol EmovetoHS <enhancedhue> <saturation> <transitiontime> " |
| "<optionsmask> <optionsoverride>" }, |
| { &GroupsColorLoopSetCommandHandler, "colorloopset", |
| "colorloopset Usage: switch groups colorcontrol colorloopset <updateflags> <action> <direction> <time> <starhue> " |
| "<optionsmask> <optionsoverride>" }, |
| { &GroupsStopMoveStepCommandHandler, "stopmovestep", |
| "stopmovestep Usage: switch groups colorcontrol stopmovestep <optionsmask> <optionsoverride>" }, |
| { &GroupsMoveColorTemperatureCommandHandler, "moveCT", |
| "movecolortemperature Usage: switch groups colorcontrol moveCT <movemode> <rate> <colortempminmireds> " |
| "<colortempmaxmireds> <optionsmask> <optionsoverride>" }, |
| { &GroupsStepColorTemperatureCommandHandler, "stepCT", |
| "stepcolortemperature Usage: switch groups colorcontrol stepCT <stepmode> <stepsize> <transitiontime> " |
| "<colortempminmireds> <colortempmaxmireds> <optionsmask> <optionsoverride>" }, |
| }; |
| |
| static const shell_command_t sSwitchGroupsThermostatSubCommands[] = { |
| { &GroupsThermostatHelpHandler, "help", "Usage: switch groups thermostat <subcommand>" }, |
| { &GroupsSetpointRaiseLowerSwitchCommandHandler, "SPRL", |
| "setpointraiselower Usage: switch groups thermostat SPRL <mode> <amount>" }, |
| }; |
| |
| static const shell_command_t sSwitchBindingSubCommands[] = { |
| { &BindingHelpHandler, "help", "Usage: switch binding <subcommand>" }, |
| { &BindingGroupBindCommandHandler, "group", "Usage: switch binding group <fabric index> <group id>" }, |
| { &BindingUnicastBindCommandHandler, "unicast", "Usage: switch binding unicast <fabric index> <node id> <endpoint>" } |
| }; |
| |
| static const shell_command_t sSwitchCommand = { &SwitchCommandHandler, "switch", |
| "Light-switch commands. Usage: switch <subcommand>" }; |
| |
| // Register groups command |
| sShellSwitchGroupsIdentifySubCommands.RegisterCommands(sSwitchGroupsIdentifySubCommands, |
| ArraySize(sSwitchGroupsIdentifySubCommands)); |
| sShellSwitchGroupsOnOffSubCommands.RegisterCommands(sSwitchGroupsOnOffSubCommands, ArraySize(sSwitchGroupsOnOffSubCommands)); |
| sShellSwitchGroupsLevelControlSubCommands.RegisterCommands(sSwitchGroupsLevelControlSubCommands, |
| ArraySize(sSwitchGroupsLevelControlSubCommands)); |
| sShellSwitchGroupsColorControlSubCommands.RegisterCommands(sSwitchGroupsColorControlSubCommands, |
| ArraySize(sSwitchGroupsColorControlSubCommands)); |
| sShellSwitchGroupsThermostatSubCommands.RegisterCommands(sSwitchGroupsThermostatSubCommands, |
| ArraySize(sSwitchGroupsThermostatSubCommands)); |
| |
| // Register commands |
| sShellSwitchIdentifySubCommands.RegisterCommands(sSwitchIdentifySubCommands, ArraySize(sSwitchIdentifySubCommands)); |
| sShellSwitchIdentifyReadSubCommands.RegisterCommands(sSwitchIdentifyReadSubCommands, ArraySize(sSwitchIdentifyReadSubCommands)); |
| sShellSwitchOnOffSubCommands.RegisterCommands(sSwitchOnOffSubCommands, ArraySize(sSwitchOnOffSubCommands)); |
| sShellSwitchOnOffReadSubCommands.RegisterCommands(sSwitchOnOffReadSubCommands, ArraySize(sSwitchOnOffReadSubCommands)); |
| sShellSwitchLevelControlSubCommands.RegisterCommands(sSwitchLevelControlSubCommands, ArraySize(sSwitchLevelControlSubCommands)); |
| sShellSwitchLevelControlReadSubCommands.RegisterCommands(sSwitchLevelControlReadSubCommands, |
| ArraySize(sSwitchLevelControlReadSubCommands)); |
| sShellSwitchColorControlSubCommands.RegisterCommands(sSwitchColorControlSubCommands, ArraySize(sSwitchColorControlSubCommands)); |
| sShellSwitchColorControlReadSubCommands.RegisterCommands(sSwitchColorControlReadSubCommands, |
| ArraySize(sSwitchColorControlReadSubCommands)); |
| sShellSwitchThermostatSubCommands.RegisterCommands(sSwitchThermostatSubCommands, ArraySize(sSwitchThermostatSubCommands)); |
| sShellSwitchThermostatReadSubCommands.RegisterCommands(sSwitchThermostatReadSubCommands, |
| ArraySize(sSwitchThermostatReadSubCommands)); |
| sShellSwitchGroupsSubCommands.RegisterCommands(sSwitchGroupsSubCommands, ArraySize(sSwitchGroupsSubCommands)); |
| sShellSwitchBindingSubCommands.RegisterCommands(sSwitchBindingSubCommands, ArraySize(sSwitchBindingSubCommands)); |
| sShellSwitchSubCommands.RegisterCommands(sSwitchSubCommands, ArraySize(sSwitchSubCommands)); |
| |
| Engine::Root().RegisterCommands(&sSwitchCommand, 1); |
| } |
| #endif // ENABLE_CHIP_SHELL |
| |
| } // namespace |
| |
| /******************************************************** |
| * Switch functions |
| *********************************************************/ |
| |
| void SwitchWorkerFunction(intptr_t context) |
| { |
| VerifyOrReturn(context != 0, ChipLogError(NotSpecified, "SwitchWorkerFunction - Invalid work data")); |
| |
| BindingCommandData * data = reinterpret_cast<BindingCommandData *>(context); |
| BindingManager::GetInstance().NotifyBoundClusterChanged(data->localEndpointId, data->clusterId, static_cast<void *>(data)); |
| } |
| |
| void BindingWorkerFunction(intptr_t context) |
| { |
| VerifyOrReturn(context != 0, ChipLogError(NotSpecified, "BindingWorkerFunction - Invalid work data")); |
| |
| EmberBindingTableEntry * entry = reinterpret_cast<EmberBindingTableEntry *>(context); |
| AddBindingEntry(*entry); |
| |
| Platform::Delete(entry); |
| } |
| |
| CHIP_ERROR InitBindingHandler() |
| { |
| // The initialization of binding manager will try establishing connection with unicast peers |
| // so it requires the Server instance to be correctly initialized. Post the init function to |
| // the event queue so that everything is ready when initialization is conducted. |
| chip::DeviceLayer::PlatformMgr().ScheduleWork(InitBindingHandlerInternal); |
| #if CONFIG_ENABLE_CHIP_SHELL |
| RegisterSwitchCommands(); |
| #endif |
| return CHIP_NO_ERROR; |
| } |