blob: df21ba8e42e3427e6bef25d154e5c7cd94d54de3 [file] [log] [blame]
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2018 Nest Labs, Inc.
* 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 <optional>
#if defined(ENABLE_CHIP_SHELL)
#include "BindingHandler.h"
#include "ShellCommands.h"
#include <app/clusters/bindings/BindingManager.h>
#include <lib/shell/Engine.h>
#include <lib/shell/commands/Help.h>
#include <platform/CHIPDeviceLayer.h>
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
namespace LightSwitchCommands {
using Shell::Engine;
using Shell::shell_command_t;
using Shell::streamer_get;
using Shell::streamer_printf;
Engine sShellSwitchSubCommands;
Engine sShellSwitchOnOffSubCommands;
Engine sShellSwitchLevelControlSubCommands;
Engine sShellSwitchGroupsSubCommands;
Engine sShellSwitchGroupsOnOffSubCommands;
Engine sShellSwitchGroupsLevelControlSubCommands;
Engine sShellSwitchBindingSubCommands;
/********************************************************
* 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);
}
/********************************************************
* OnOff switch shell functions
*********************************************************/
CHIP_ERROR OnOffHelpHandler(int argc, char ** argv)
{
sShellSwitchOnOffSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
return CHIP_NO_ERROR;
}
CHIP_ERROR OnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc == 0)
{
return OnOffHelpHandler(argc, argv);
}
return sShellSwitchOnOffSubCommands.ExecCommand(argc, argv);
}
CHIP_ERROR OnSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::On::Id;
data->clusterId = Clusters::OnOff::Id;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR OffSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::Off::Id;
data->clusterId = Clusters::OnOff::Id;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR ToggleSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::Toggle::Id;
data->clusterId = Clusters::OnOff::Id;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
/********************************************************
* 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);
Binding::TableEntry * entry =
Platform::New<Binding::TableEntry>(atoi(argv[0]), atoi(argv[1]), 1, std::make_optional<ClusterId>(6));
TEMPORARY_RETURN_IGNORED 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);
Binding::TableEntry * entry =
Platform::New<Binding::TableEntry>(atoi(argv[0]), atoi(argv[1]), 1, atoi(argv[2]), std::make_optional<ClusterId>(6));
TEMPORARY_RETURN_IGNORED 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);
}
/********************************************************
* Groups OnOff switch shell functions
*********************************************************/
CHIP_ERROR GroupsOnOffHelpHandler(int argc, char ** argv)
{
sShellSwitchGroupsOnOffSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc == 0)
{
return GroupsOnOffHelpHandler(argc, argv);
}
return sShellSwitchGroupsOnOffSubCommands.ExecCommand(argc, argv);
}
CHIP_ERROR GroupOnSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::On::Id;
data->clusterId = Clusters::OnOff::Id;
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupOffSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::Off::Id;
data->clusterId = Clusters::OnOff::Id;
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupToggleSwitchCommandHandler(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::OnOff::Commands::Toggle::Id;
data->clusterId = Clusters::OnOff::Id;
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
/********************************************************
* LevelControl switch shell functions
*********************************************************/
CHIP_ERROR LevelControlHelpHandler(int argc, char ** argv)
{
sShellSwitchLevelControlSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlSwitchCommandHandler(int argc, char ** argv)
{
if (argc == 0)
{
return LevelControlHelpHandler(argc, argv);
}
return sShellSwitchLevelControlSubCommands.ExecCommand(argc, argv);
}
CHIP_ERROR MoveToLevelSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveToLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::MoveToLevel{};
char * endPtr;
if (auto * moveToLevel = std::get_if<BindingCommandData::MoveToLevel>(&data->commandData))
{
moveToLevel->level = static_cast<uint8_t>(strtol(argv[0], &endPtr, 10));
moveToLevel->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[1], &endPtr, 10));
moveToLevel->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
moveToLevel->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR MoveSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Move::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::Move{};
char * endPtr;
if (auto * move = std::get_if<BindingCommandData::Move>(&data->commandData))
{
move->moveMode = static_cast<Clusters::LevelControl::MoveModeEnum>(strtol(argv[0], &endPtr, 10));
move->rate = static_cast<DataModel::Nullable<uint8_t>>(strtol(argv[1], &endPtr, 10));
move->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
move->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR StepSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 5)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Step::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Step{};
if (auto * step = std::get_if<BindingCommandData::Step>(&data->commandData))
{
step->stepMode = static_cast<Clusters::LevelControl::StepModeEnum>(strtol(argv[0], &endPtr, 10));
step->stepSize = static_cast<uint8_t>(strtol(argv[1], &endPtr, 10));
step->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[2], &endPtr, 10));
step->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
step->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[4], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR StopSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 2)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Stop::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Stop{};
if (auto * stop = std::get_if<BindingCommandData::Stop>(&data->commandData))
{
stop->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[0], &endPtr, 10));
stop->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[1], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR MoveToLevelWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::MoveToLevel{};
char * endPtr;
if (auto * moveToLevel = std::get_if<BindingCommandData::MoveToLevel>(&data->commandData))
{
moveToLevel->level = static_cast<uint8_t>(strtol(argv[0], &endPtr, 10));
moveToLevel->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[1], &endPtr, 10));
moveToLevel->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
moveToLevel->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR MoveWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::Move{};
char * endPtr;
if (auto * move = std::get_if<BindingCommandData::Move>(&data->commandData))
{
move->moveMode = static_cast<Clusters::LevelControl::MoveModeEnum>(strtol(argv[0], &endPtr, 10));
move->rate = static_cast<DataModel::Nullable<uint8_t>>(strtol(argv[1], &endPtr, 10));
move->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
move->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR StepWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 5)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::StepWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Step{};
if (auto * step = std::get_if<BindingCommandData::Step>(&data->commandData))
{
step->stepMode = static_cast<Clusters::LevelControl::StepModeEnum>(strtol(argv[0], &endPtr, 10));
step->stepSize = static_cast<uint8_t>(strtol(argv[1], &endPtr, 10));
step->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[2], &endPtr, 10));
step->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
step->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[4], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR StopWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 2)
{
return LevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::StopWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Stop{};
if (auto * stop = std::get_if<BindingCommandData::Stop>(&data->commandData))
{
stop->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[0], &endPtr, 10));
stop->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[1], &endPtr, 10));
}
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
#if 0
/********************************************************
* LevelControl Read switch shell functions
*********************************************************/
CHIP_ERROR LevelControlReadHelpHandler(int argc, char ** argv)
{
sShellSwitchLevelControlReadSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlRead(int argc, char ** argv)
{
if (argc == 0)
{
return LevelControlReadHelpHandler(argc, argv);
}
return sShellSwitchLevelControlReadSubCommands.ExecCommand(argc, argv);
}
CHIP_ERROR LevelControlReadAttributeList(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::AttributeList::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadCurrentLevel(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::CurrentLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadRemainingTime(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::RemainingTime::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadMinLevel(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::MinLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadMaxLevel(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::MaxLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadCurrentFrequency(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::CurrentFrequency::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadMinFrequency(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::MinFrequency::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadMaxFrequency(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::MaxFrequency::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadOptions(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::Options::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadOnOffTransitionTime(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::OnOffTransitionTime::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadOnLevel(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::OnLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadOnTransitionTime(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::OnTransitionTime::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadOffTransitionTime(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::OffTransitionTime::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadDefaultMoveRate(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::DefaultMoveRate::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR LevelControlReadStartUpCurrentLevel(int argc, char ** argv)
{
BindingCommandData * data = Platform::New<BindingCommandData>();
data->attributeId = Clusters::LevelControl::Attributes::StartUpCurrentLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->isReadAttribute = true;
DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
#endif // commenting the read functions
/********************************************************
* Groups LevelControl switch shell functions
*********************************************************/
CHIP_ERROR GroupsLevelControlHelpHandler(int argc, char ** argv)
{
sShellSwitchGroupsLevelControlSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsLevelControlSwitchCommandHandler(int argc, char ** argv)
{
if (argc == 0)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
return sShellSwitchGroupsLevelControlSubCommands.ExecCommand(argc, argv);
}
CHIP_ERROR GroupsMoveToLevelSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveToLevel::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::MoveToLevel{};
char * endPtr;
if (auto * moveToLevel = std::get_if<BindingCommandData::MoveToLevel>(&data->commandData))
{
moveToLevel->level = static_cast<uint8_t>(strtol(argv[0], &endPtr, 10));
moveToLevel->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[1], &endPtr, 10));
moveToLevel->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
moveToLevel->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsMoveSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Move::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::Move{};
char * endPtr;
if (auto * move = std::get_if<BindingCommandData::Move>(&data->commandData))
{
move->moveMode = static_cast<Clusters::LevelControl::MoveModeEnum>(strtol(argv[0], &endPtr, 10));
move->rate = static_cast<DataModel::Nullable<uint8_t>>(strtol(argv[1], &endPtr, 10));
move->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
move->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsStepSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 5)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Step::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Step{};
if (auto * step = std::get_if<BindingCommandData::Step>(&data->commandData))
{
step->stepMode = static_cast<Clusters::LevelControl::StepModeEnum>(strtol(argv[0], &endPtr, 10));
step->stepSize = static_cast<uint8_t>(strtol(argv[1], &endPtr, 10));
step->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[2], &endPtr, 10));
step->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
step->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[4], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsStopSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 2)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::Stop::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Stop{};
if (auto * stop = std::get_if<BindingCommandData::Stop>(&data->commandData))
{
stop->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[0], &endPtr, 10));
stop->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[1], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsMoveToLevelWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::MoveToLevel{};
char * endPtr;
if (auto * moveToLevel = std::get_if<BindingCommandData::MoveToLevel>(&data->commandData))
{
moveToLevel->level = static_cast<uint8_t>(strtol(argv[0], &endPtr, 10));
moveToLevel->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[1], &endPtr, 10));
moveToLevel->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
moveToLevel->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsMoveWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 4)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::MoveWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
data->commandData = BindingCommandData::Move{};
char * endPtr;
if (auto * move = std::get_if<BindingCommandData::Move>(&data->commandData))
{
move->moveMode = static_cast<Clusters::LevelControl::MoveModeEnum>(strtol(argv[0], &endPtr, 10));
move->rate = static_cast<DataModel::Nullable<uint8_t>>(strtol(argv[1], &endPtr, 10));
move->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[2], &endPtr, 10));
move->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsStepWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 5)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::StepWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Step{};
if (auto * step = std::get_if<BindingCommandData::Step>(&data->commandData))
{
step->stepMode = static_cast<Clusters::LevelControl::StepModeEnum>(strtol(argv[0], &endPtr, 10));
step->stepSize = static_cast<uint8_t>(strtol(argv[1], &endPtr, 10));
step->transitionTime = DataModel::Nullable<uint16_t>(strtol(argv[2], &endPtr, 10));
step->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[3], &endPtr, 10));
step->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[4], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
CHIP_ERROR GroupsStopWithOnOffSwitchCommandHandler(int argc, char ** argv)
{
if (argc != 2)
{
return GroupsLevelControlHelpHandler(argc, argv);
}
BindingCommandData * data = Platform::New<BindingCommandData>();
data->commandId = Clusters::LevelControl::Commands::StopWithOnOff::Id;
data->clusterId = Clusters::LevelControl::Id;
char * endPtr;
data->commandData = BindingCommandData::Stop{};
if (auto * stop = std::get_if<BindingCommandData::Stop>(&data->commandData))
{
stop->optionsMask = chip::BitMask<OptionsBitmap>(strtol(argv[0], &endPtr, 10));
stop->optionsOverride = chip::BitMask<OptionsBitmap>(strtol(argv[1], &endPtr, 10));
}
data->isGroup = true;
TEMPORARY_RETURN_IGNORED DeviceLayer::PlatformMgr().ScheduleWork(SwitchWorkerFunction, reinterpret_cast<intptr_t>(data));
return CHIP_NO_ERROR;
}
/**
* @brief configures switch matter shell
*/
void RegisterSwitchCommands()
{
static const shell_command_t sSwitchSubCommands[] = {
{ &SwitchHelpHandler, "help", "Usage: switch <subcommand>" },
{ &OnOffSwitchCommandHandler, "onoff", " Usage: switch onoff <subcommand>" },
{ &LevelControlSwitchCommandHandler, "levelcontrol", " Usage: switch levelcontrol <subcommand>" },
{ &GroupsSwitchCommandHandler, "groups", "Usage: switch groups <subcommand>" },
{ &BindingSwitchCommandHandler, "binding", "Usage: switch binding <subcommand>" }
};
static const shell_command_t sSwitchOnOffSubCommands[] = {
{ &OnOffHelpHandler, "help", "Usage : switch ononff <subcommand>" },
{ &OnSwitchCommandHandler, "on", "Sends on command to bound lighting app" },
{ &OffSwitchCommandHandler, "off", "Sends off command to bound lighting app" },
{ &ToggleSwitchCommandHandler, "toggle", "Sends toggle command to bound lighting app" }
};
static const shell_command_t sSwitchLevelControlSubCommands[] = {
{ &LevelControlHelpHandler, "help", "Usage: switch levelcontrol <subcommand>" },
{ &MoveToLevelSwitchCommandHandler, "move-to-level",
"Usage: switch levelcontrol move-to-level <level> <transitiontime> <optionsmask> <optionsoverride>" },
{ &MoveSwitchCommandHandler, "move", "Usage: switch levelcontrol move <movemode> <rate> <optionsmask> <optionsoverride>" },
{ &StepSwitchCommandHandler, "step",
"Usage: switch levelcontrol step <stepmode> <stepsize> <transitiontime> <optionsmask> <optionsoverride>" },
{ &StopSwitchCommandHandler, "stop", "step Usage: switch levelcontrol stop <optionsmask> <optionsoverride>" },
{ &MoveToLevelWithOnOffSwitchCommandHandler, "move-to-level-with-on-off",
"Usage: switch levelcontrol move-with-to-level-with-on-off <level> <transitiontime> <optionsmask> <optionsoverride>" },
{ &MoveWithOnOffSwitchCommandHandler, "move-with-on-off",
"Usage: switch levelcontrol move-with-on-off <movemode> <rate> <optionsmask> <optionsoverride>" },
{ &StepWithOnOffSwitchCommandHandler, "step-with-on-off",
"Usage: switch levelcontrol step-with-on-off <stepmode> <stepsize> <transitiontime> <optionsmask> "
"<optionsoverride>" },
{ &StopWithOnOffSwitchCommandHandler, "stop-with-on-off",
"Usage: switch levelcontrol stop-with-on-off <optionsmask> <optionsoverride>" },
};
static const shell_command_t sSwitchGroupsSubCommands[] = { { &GroupsHelpHandler, "help", "Usage: switch groups <subcommand>" },
{ &GroupsOnOffSwitchCommandHandler, "onoff",
"Usage: switch groups onoff <subcommand>" } };
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" }
};
static const shell_command_t sSwitchGroupsLevelControlSubCommands[] = {
{ &GroupsLevelControlHelpHandler, "help", "Usage: switch groups levelcontrol <subcommand>" },
{ &GroupsMoveToLevelSwitchCommandHandler, "move-to-level",
"Usage: switch groups levelcontrol move-to-level <level> <transitiontime> <optionsmask> <optionsoverride>" },
{ &GroupsMoveSwitchCommandHandler, "move",
"Usage: switch groups levelcontrol move <movemode> <rate> <optionsmask> <optionsoverride>" },
{ &GroupsStepSwitchCommandHandler, "step",
"Usage: switch groups levelcontrol step <stepmode> <stepsize> <transitiontime> <optionsmask> <optionsoverride>" },
{ &GroupsStopSwitchCommandHandler, "stop", "step Usage: switch groups levelcontrol stop <optionsmask> <optionsoverride>" },
{ &GroupsMoveToLevelWithOnOffSwitchCommandHandler, "move-to-level-with-on-off",
"Usage: switch groups levelcontrol move-with-to-level-with-on-off <level> <transitiontime> <optionsmask> "
"<optionsoverride>" },
{ &GroupsMoveWithOnOffSwitchCommandHandler, "move-with-on-off",
"Usage: switch groups levelcontrol move-with-on-off <movemode> <rate> <optionsmask> <optionsoverride>" },
{ &GroupsStepWithOnOffSwitchCommandHandler, "step-with-on-off",
"Usage: switch groups levelcontrol step-with-on-off <stepmode> <stepsize> <transitiontime> <optionsmask> "
"<optionsoverride>" },
{ &GroupsStopWithOnOffSwitchCommandHandler, "stop-with-on-off",
"Usage: switch groups levelcontrol stop-with-on-off <optionsmask> <optionsoverride>" },
};
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 group <fabric index> <node id> <endpoint>" }
};
static const shell_command_t sSwitchCommand = { &SwitchCommandHandler, "switch",
"Light-switch commands. Usage: switch <subcommand>" };
sShellSwitchGroupsOnOffSubCommands.RegisterCommands(sSwitchGroupsOnOffSubCommands,
MATTER_ARRAY_SIZE(sSwitchGroupsOnOffSubCommands));
sShellSwitchGroupsLevelControlSubCommands.RegisterCommands(sSwitchGroupsLevelControlSubCommands,
MATTER_ARRAY_SIZE(sSwitchGroupsLevelControlSubCommands));
sShellSwitchOnOffSubCommands.RegisterCommands(sSwitchOnOffSubCommands, MATTER_ARRAY_SIZE(sSwitchOnOffSubCommands));
sShellSwitchLevelControlSubCommands.RegisterCommands(sSwitchLevelControlSubCommands,
MATTER_ARRAY_SIZE(sSwitchLevelControlSubCommands));
sShellSwitchGroupsSubCommands.RegisterCommands(sSwitchGroupsSubCommands, MATTER_ARRAY_SIZE(sSwitchGroupsSubCommands));
sShellSwitchBindingSubCommands.RegisterCommands(sSwitchBindingSubCommands, MATTER_ARRAY_SIZE(sSwitchBindingSubCommands));
sShellSwitchSubCommands.RegisterCommands(sSwitchSubCommands, MATTER_ARRAY_SIZE(sSwitchSubCommands));
Engine::Root().RegisterCommands(&sSwitchCommand, 1);
}
} // namespace LightSwitchCommands
#endif // ENABLE_CHIP_SHELL