/* * * Copyright (c) 2021 Project CHIP Authors * Copyright (c) 2019 Google LLC. * 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 #include #include using namespace chip::Shell; static CHIP_ERROR AppCommandHelpHandler(int argc, char * argv[]); static CHIP_ERROR AppCommandLockHandler(int argc, char * argv[]); static CHIP_ERROR AppCommandDispatch(int argc, char * argv[]); static chip::Shell::Engine sAppSubcommands; chip::EndpointId endpointId = DOOR_LOCK_SERVER_ENDPOINT; void RegisterAppShellCommands(void) { static const shell_command_t sAppSubCommands[] = { { .cmd_func = AppCommandHelpHandler, .cmd_name = "help", .cmd_help = "Usage: app ", }, { .cmd_func = AppCommandLockHandler, .cmd_name = "lock", .cmd_help = "Usage: app lock [on|off|toggle]", }, }; static const shell_command_t sAppCommand = { .cmd_func = AppCommandDispatch, .cmd_name = "app", .cmd_help = "App commands", }; sAppSubcommands.RegisterCommands(sAppSubCommands, ArraySize(sAppSubCommands)); Engine::Root().RegisterCommands(&sAppCommand, 1); } CHIP_ERROR AppCommandHelpHandler(int argc, char * argv[]) { sAppSubcommands.ForEachCommand(PrintCommandHelp, nullptr); return CHIP_NO_ERROR; } CHIP_ERROR AppCommandLockHandler(int argc, char * argv[]) { if (argc == 0) { streamer_printf(streamer_get(), "The lock is %s\n", LockMgr().NextState() ? "unlocked" : "locked"); } else if (strcmp(argv[0], "on") == 0) { streamer_printf(streamer_get(), "Lock ...\n"); LockMgr().InitiateAction(AppEvent::kEventType_app, LockManager::LOCK_ACTION); } else if (strcmp(argv[0], "off") == 0) { streamer_printf(streamer_get(), "Unlock ...\n"); LockMgr().InitiateAction(AppEvent::kEventType_app, LockManager::UNLOCK_ACTION); } else if (strcmp(argv[0], "toggle") == 0) { streamer_printf(streamer_get(), "Toggling the lock ...\n"); if (LockMgr().NextState()) LockMgr().InitiateAction(AppEvent::kEventType_app, LockManager::LOCK_ACTION); else LockMgr().InitiateAction(AppEvent::kEventType_app, LockManager::UNLOCK_ACTION); } else if (strcmp(argv[0], "open") == 0) { streamer_printf(streamer_get(), "open ...\n"); LockMgr().SetDoorState(endpointId, DoorStateEnum::kDoorOpen); } else if (strcmp(argv[0], "close") == 0) { streamer_printf(streamer_get(), "close ...\n"); LockMgr().SetDoorState(endpointId, DoorStateEnum::kDoorClosed); } else { return CHIP_ERROR_INVALID_ARGUMENT; } return CHIP_NO_ERROR; } CHIP_ERROR AppCommandDispatch(int argc, char * argv[]) { if (argc == 0) { AppCommandHelpHandler(argc, argv); return CHIP_NO_ERROR; } return sAppSubcommands.ExecCommand(argc, argv); }