| /* |
| * |
| * 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 "ShellCommands.h" |
| #include "LightSwitch.h" |
| #include <platform/CHIPDeviceLayer.h> |
| |
| #include "BindingHandler.h" |
| |
| #ifdef CONFIG_CHIP_LIB_SHELL |
| |
| using namespace chip; |
| using namespace chip::app; |
| |
| namespace SwitchCommands { |
| using Shell::Engine; |
| using Shell::shell_command_t; |
| using Shell::streamer_get; |
| using Shell::streamer_printf; |
| |
| Engine sShellSwitchSubCommands; |
| Engine sShellSwitchOnOffSubCommands; |
| Engine sShellSwitchGroupsSubCommands; |
| Engine sShellSwitchGroupsOnOffSubCommands; |
| |
| static CHIP_ERROR SwitchHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| static CHIP_ERROR SwitchCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return SwitchHelpHandler(argc, argv); |
| } |
| return sShellSwitchSubCommands.ExecCommand(argc, argv); |
| } |
| |
| static CHIP_ERROR TableCommandHelper(int argc, char ** argv) |
| { |
| BindingHandler::GetInstance().PrintBindingTable(); |
| return CHIP_NO_ERROR; |
| } |
| |
| namespace Unicast { |
| |
| static CHIP_ERROR OnOffHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchOnOffSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| static CHIP_ERROR OnOffCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return OnOffHelpHandler(argc, argv); |
| } |
| return sShellSwitchOnOffSubCommands.ExecCommand(argc, argv); |
| } |
| |
| static CHIP_ERROR OnCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::On::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| |
| static CHIP_ERROR OffCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::Off::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| |
| static CHIP_ERROR ToggleCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::Toggle::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| } // namespace Unicast |
| |
| namespace Group { |
| |
| CHIP_ERROR SwitchHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchGroupsSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR SwitchCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return SwitchHelpHandler(argc, argv); |
| } |
| |
| return sShellSwitchGroupsSubCommands.ExecCommand(argc, argv); |
| } |
| |
| static CHIP_ERROR OnOffHelpHandler(int argc, char ** argv) |
| { |
| sShellSwitchGroupsOnOffSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr); |
| return CHIP_NO_ERROR; |
| } |
| |
| static CHIP_ERROR OnOffCommandHandler(int argc, char ** argv) |
| { |
| if (argc == 0) |
| { |
| return OnOffHelpHandler(argc, argv); |
| } |
| |
| return sShellSwitchGroupsOnOffSubCommands.ExecCommand(argc, argv); |
| } |
| |
| CHIP_ERROR OnCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::On::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| data->IsGroup = true; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR OffCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::Off::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| data->IsGroup = true; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| |
| CHIP_ERROR ToggleCommandHandler(int argc, char ** argv) |
| { |
| BindingHandler::BindingData * data = Platform::New<BindingHandler::BindingData>(); |
| data->EndpointId = LightSwitch::GetInstance().GetLightSwitchEndpointId(); |
| data->CommandId = Clusters::OnOff::Commands::Toggle::Id; |
| data->ClusterId = Clusters::OnOff::Id; |
| data->IsGroup = true; |
| |
| DeviceLayer::PlatformMgr().ScheduleWork(BindingHandler::SwitchWorkerHandler, reinterpret_cast<intptr_t>(data)); |
| return CHIP_NO_ERROR; |
| } |
| |
| } // namespace Group |
| |
| void RegisterSwitchCommands() |
| { |
| static const shell_command_t sSwitchSubCommands[] = { |
| { &SwitchHelpHandler, "help", "Switch commands" }, |
| { &Unicast::OnOffCommandHandler, "onoff", "Usage: switch onoff [on|off|toggle]" }, |
| { &Group::SwitchCommandHandler, "groups", "Usage: switch groups onoff [on|off|toggle]" }, |
| { &TableCommandHelper, "table", "Print a binding table" } |
| }; |
| |
| static const shell_command_t sSwitchOnOffSubCommands[] = { |
| { &Unicast::OnOffHelpHandler, "help", "Usage : switch ononff [on|off|toggle]" }, |
| { &Unicast::OnCommandHandler, "on", "Sends on command to bound lighting app" }, |
| { &Unicast::OffCommandHandler, "off", "Sends off command to bound lighting app" }, |
| { &Unicast::ToggleCommandHandler, "toggle", "Sends toggle command to bound lighting app" } |
| }; |
| |
| static const shell_command_t sSwitchGroupsSubCommands[] = { |
| { &Group::SwitchHelpHandler, "help", "switch a group of bounded lightning apps" }, |
| { &Group::OnOffCommandHandler, "onoff", "Usage: switch groups onoff [on|off|toggle]" } |
| }; |
| |
| static const shell_command_t sSwichGroupsOnOffSubCommands[] = { |
| { &Group::OnOffHelpHandler, "help", "Usage: switch groups onoff [on|off|toggle]" }, |
| { &Group::OnCommandHandler, "on", "Sends on command to bound Group" }, |
| { &Group::OffCommandHandler, "off", "Sends off command to bound Group" }, |
| { &Group::ToggleCommandHandler, "toggle", "Sends toggle command to bound Group" } |
| }; |
| |
| static const shell_command_t sSwitchCommand = { &SwitchCommandHandler, "switch", |
| "Light-switch commands. Usage: switch [onoff|groups]" }; |
| |
| sShellSwitchGroupsOnOffSubCommands.RegisterCommands(sSwichGroupsOnOffSubCommands, ArraySize(sSwichGroupsOnOffSubCommands)); |
| sShellSwitchOnOffSubCommands.RegisterCommands(sSwitchOnOffSubCommands, ArraySize(sSwitchOnOffSubCommands)); |
| sShellSwitchGroupsSubCommands.RegisterCommands(sSwitchGroupsSubCommands, ArraySize(sSwitchGroupsSubCommands)); |
| sShellSwitchSubCommands.RegisterCommands(sSwitchSubCommands, ArraySize(sSwitchSubCommands)); |
| |
| Engine::Root().RegisterCommands(&sSwitchCommand, 1); |
| } |
| |
| } // namespace SwitchCommands |
| #endif |