Libraries/HueEmulator/src/include/Hue/Device.h
Go to the documentation of this file.
1 /****
2  * Device.h
3  *
4  * Copyright 2019 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the HueEmulator Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  ****/
19 
20 #pragma once
21 
23 #include <WString.h>
24 #include <BitManipulations.h>
25 #include <ArduinoJson6.h>
26 #include <Data/BitSet.h>
27 
28 #define HUE_ERROR_CODE_MAP(XX) \
29  XX(1, UnauthorizedUser, "unauthorized user") \
30  XX(3, ResourceNotAvailable, "resource, <resource>, not available") \
31  XX(4, MethodNotAvailable, "method, <method_name>, not available for resource, <resource>") \
32  XX(6, ParameterNotAvailable, "parameter, <parameter>, not available") \
33  XX(101, LinkButtonNotPressed, "link button not pressed") \
34  XX(901, InternalError, "Internal error, <error_code>")
35 
36 namespace Hue
37 {
38 #define HUE_DEVICE_ATTR_MAP(XX) \
39  XX(on) \
40  XX(bri) \
41  XX(ct) \
42  XX(hue) \
43  XX(sat)
44 
45 #define HUE_COLORMODE_MAP(XX) \
46  XX(none) \
47  XX(hs) \
48  XX(ct) \
49  XX(xy)
50 
51 enum class Error {
52 #define XX(code, tag, desc) tag = code,
54 #undef XX
55 };
56 
60 enum class Status {
64  success,
78  pending,
85  error,
86 };
87 
89 JsonObject createSuccess(JsonDocument& result);
90 JsonObject createError(JsonDocument& result, const String& path, Error error, String description);
91 
92 class Device : public UPnP::Item
93 {
94 public:
95  using ID = uint32_t;
96 
97  enum class Attribute {
98 #define XX(t) t,
100 #undef XX
101  };
102 
104 
105  enum class ColorMode {
106 #define XX(t) t,
108 #undef XX
109  };
110 
117  using Callback = Delegate<void(Status status, int errorCode)>;
118 
125  class Enumerator : public UPnP::Enumerator<Device, Enumerator>
126  {
127  public:
133  virtual Device* find(Device::ID id);
134 
140  virtual Device* find(const String& name);
141  };
142 
143  virtual ~Device()
144  {
145  }
146 
147  virtual ID getId() const = 0;
148 
149  virtual String getName() const = 0;
150 
159  virtual Status setAttribute(Attribute attr, unsigned value, Callback callback) = 0;
160 
167  virtual bool getAttribute(Attribute attr, unsigned& value) const = 0;
168 
178  virtual String getUniqueId() const;
179 
180  virtual ColorMode getColorMode() const
181  {
182  return ColorMode::none;
183  }
184 
185  virtual void getInfo(JsonObject json);
186 
190  bool operator==(const Device& dev) const
191  {
192  return getId() == dev.getId();
193  }
194 
195  bool operator==(const String& name) const
196  {
197  return this->getName() == name;
198  }
199 
200  bool operator==(ID id) const
201  {
202  return getId() == id;
203  }
204 };
205 
208 bool fromString(const char* tag, Device::Attribute& attr);
210 
211 } // namespace Hue
#define HUE_COLORMODE_MAP(XX)
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:45
#define HUE_DEVICE_ATTR_MAP(XX)
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:38
#define HUE_ERROR_CODE_MAP(XX)
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:28
Manage a set of bit values using enumeration.
Definition: BitSet.h:45
Definition: Delegate.h:20
Abstract class to manage a list of devices.
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:126
virtual Device * find(const String &name)
Lookup device by name.
virtual Device * find(Device::ID id)
Lookup device by ID.
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:93
ColorMode
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:105
uint32_t ID
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:95
virtual ~Device()
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:143
virtual bool getAttribute(Attribute attr, unsigned &value) const =0
Get the (cached) device attribute value.
bool operator==(ID id) const
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:200
virtual String getUniqueId() const
Returns the unique device ID string.
Attribute
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:97
bool operator==(const Device &dev) const
Two devices are considered equal if they have the same ID.
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:190
virtual Status setAttribute(Attribute attr, unsigned value, Callback callback)=0
Set a device attribute.
virtual ID getId() const =0
virtual String getName() const =0
bool operator==(const String &name) const
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:195
virtual void getInfo(JsonObject json)
virtual ColorMode getColorMode() const
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:180
The String class.
Definition: WString.h:137
Abstract class to enumerate items.
Definition: Enumerator.h:38
Definition: Item.h:39
Json json
Definition: Bridge.h:30
bool fromString(const char *tag, Device::Attribute &attr)
Error
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:51
XX(code, tag, desc)
String toString(Error error)
JsonObject createError(JsonDocument &result, const String &path, Error error, String description)
JsonObject createSuccess(JsonDocument &result)
Status
Status of a setAttribute request.
Definition: Libraries/HueEmulator/src/include/Hue/Device.h:60
@ success
The action was performed immediately without error.
@ pending
The action was accepted but requires further processing.
@ error
Action could not be completed.