blob: 0785c147d5a616c0fa9bb3a04b98fea66c07283c [file] [log] [blame]
Paul Westbrookc18c7cf2015-10-27 06:38:59 -07001// Copyright 2015 The Weave Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Johan Euphrosine3fb474e2015-10-29 15:23:53 -07005#include "examples/daemon/common/daemon.h"
6
Paul Westbrookc18c7cf2015-10-27 06:38:59 -07007#include <weave/device.h>
8#include <weave/enum_to_string.h>
9
10#include <base/bind.h>
11#include <base/memory/weak_ptr.h>
12
13namespace weave {
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070014namespace lockstate {
15enum class LockState { kUnlocked, kLocked, kPartiallyLocked };
16
17const weave::EnumToStringMap<LockState>::Map kLockMapMethod[] = {
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070018 {LockState::kLocked, "locked"},
19 {LockState::kUnlocked, "unlocked"},
20 {LockState::kPartiallyLocked, "partiallyLocked"}};
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070021} // namespace lockstate
22
23template <>
24EnumToStringMap<lockstate::LockState>::EnumToStringMap()
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070025 : EnumToStringMap(lockstate::kLockMapMethod) {}
26} // namespace weave
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070027
Alex Vakulenkod6db0492015-12-07 16:55:19 -080028namespace {
29
30const char kTraits[] = R"({
31 "lock": {
32 "commands": {
33 "setConfig": {
34 "minimalRole": "user",
35 "parameters": {
36 "lockedState": {
37 "type": "string",
38 "enum": [ "locked", "unlocked" ]
39 }
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080040 },
41 "errors": ["batteryTooLow", "jammed", "lockingNotSupported"]
Alex Vakulenkod6db0492015-12-07 16:55:19 -080042 }
43 },
44 "state": {
45 "lockedState": {
46 "type": "string",
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080047 "enum": [ "locked", "unlocked", "partiallyLocked" ],
48 "isRequired": true
Alex Vakulenkod6db0492015-12-07 16:55:19 -080049 },
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080050 "isLockingSupported": {
51 "type": "boolean",
52 "isRequired": true
53 }
Alex Vakulenkod6db0492015-12-07 16:55:19 -080054 }
55 }
56})";
57
58const char kDefaultState[] = R"({
59 "lock":{"isLockingSupported": true}
60})";
61
62const char kComponent[] = "lock";
63
64} // anonymous namespace
65
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070066// LockHandler is a command handler example that shows
67// how to handle commands for a Weave lock.
68class LockHandler {
69 public:
70 LockHandler() = default;
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070071 void Register(weave::Device* device) {
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070072 device_ = device;
73
Alex Vakulenkod6db0492015-12-07 16:55:19 -080074 device->AddTraitDefinitionsFromJson(kTraits);
75 CHECK(device->AddComponent(kComponent, {"lock"}, nullptr));
Vitaly Buka34668e72015-12-15 14:46:47 -080076 CHECK(
77 device->SetStatePropertiesFromJson(kComponent, kDefaultState, nullptr));
Alex Vakulenkod6db0492015-12-07 16:55:19 -080078 UpdateLockState();
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070079
Alex Vakulenkod6db0492015-12-07 16:55:19 -080080 device->AddCommandHandler(kComponent, "lock.setConfig",
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070081 base::Bind(&LockHandler::OnLockSetConfig,
82 weak_ptr_factory_.GetWeakPtr()));
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070083 }
84
85 private:
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070086 void OnLockSetConfig(const std::weak_ptr<weave::Command>& command) {
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070087 auto cmd = command.lock();
88 if (!cmd)
89 return;
90 LOG(INFO) << "received command: " << cmd->GetName();
Vitaly Bukac4305602015-11-24 23:33:09 -080091 const auto& params = cmd->GetParameters();
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070092 std::string requested_state;
Vitaly Bukac4305602015-11-24 23:33:09 -080093 if (params.GetString("lockedState", &requested_state)) {
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070094 LOG(INFO) << cmd->GetName() << " state: " << requested_state;
95
Johan Euphrosine3fb474e2015-10-29 15:23:53 -070096 weave::lockstate::LockState new_lock_status;
Paul Westbrookc18c7cf2015-10-27 06:38:59 -070097
98 if (!weave::StringToEnum(requested_state, &new_lock_status)) {
99 // Invalid lock state was specified.
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700100 weave::ErrorPtr error;
101 weave::Error::AddTo(&error, FROM_HERE, "example",
102 "invalid_parameter_value", "Invalid parameters");
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700103 cmd->Abort(error.get(), nullptr);
104 return;
105 }
106
107 if (new_lock_status != lock_state_) {
108 lock_state_ = new_lock_status;
109
110 LOG(INFO) << "Lock is now: " << requested_state;
111 UpdateLockState();
112 }
113 cmd->Complete({}, nullptr);
114 return;
115 }
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700116 weave::ErrorPtr error;
117 weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
118 "Invalid parameters");
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700119 cmd->Abort(error.get(), nullptr);
120 }
121
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700122 void UpdateLockState() {
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700123 std::string updated_state = weave::EnumToString(lock_state_);
Alex Vakulenkod6db0492015-12-07 16:55:19 -0800124 device_->SetStateProperty(kComponent, "lock.lockedState",
125 base::StringValue{updated_state}, nullptr);
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700126 }
127
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700128 weave::Device* device_{nullptr};
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700129
130 // Simulate the state of the light.
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700131 weave::lockstate::LockState lock_state_{weave::lockstate::LockState::kLocked};
Paul Westbrookc18c7cf2015-10-27 06:38:59 -0700132 base::WeakPtrFactory<LockHandler> weak_ptr_factory_{this};
133};
134
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700135int main(int argc, char** argv) {
136 Daemon::Options opts;
Paul Westbrook04e628f2015-12-08 18:33:21 -0800137 opts.model_id_ = "AOAAA";
Johan Euphrosine3fb474e2015-10-29 15:23:53 -0700138 if (!opts.Parse(argc, argv)) {
139 Daemon::Options::ShowUsage(argv[0]);
140 return 1;
141 }
142 Daemon daemon{opts};
143 LockHandler handler;
144 handler.Register(daemon.GetDevice());
145 daemon.Run();
146 return 0;
147}