Commit 2f28783458c773dae5870a12c9763e7bc4443ba4
Committed by
Moritz Wirger
1 parent
2578f2b7
Add documentation for Scene class.
Showing
7 changed files
with
175 additions
and
7 deletions
include/hueplusplus/Hue.h
| @@ -324,7 +324,7 @@ public: | @@ -324,7 +324,7 @@ public: | ||
| 324 | bool scheduleExists(int id) const; | 324 | bool scheduleExists(int id) const; |
| 325 | 325 | ||
| 326 | //! \brief Create a new schedule. | 326 | //! \brief Create a new schedule. |
| 327 | - //! \param params CreateSchedule parameters for the new group. | 327 | + //! \param params CreateSchedule parameters for the new schedule. |
| 328 | //! \returns The new schedule id or 0 if failed. | 328 | //! \returns The new schedule id or 0 if failed. |
| 329 | //! \throws std::system_error when system or socket operations fail | 329 | //! \throws std::system_error when system or socket operations fail |
| 330 | //! \throws HueException when response contains no body | 330 | //! \throws HueException when response contains no body |
| @@ -336,12 +336,37 @@ public: | @@ -336,12 +336,37 @@ public: | ||
| 336 | ///! \name Scenes | 336 | ///! \name Scenes |
| 337 | ///@{ | 337 | ///@{ |
| 338 | 338 | ||
| 339 | + //! \brief Get all scenes on this bridge. | ||
| 340 | + //! \return A vector of references to every Scene. | ||
| 341 | + //! \throws std::system_error when system or socket operations fail | ||
| 342 | + //! \throws HueException when response contains no body | ||
| 343 | + //! \throws HueAPIResponseException when response contains an error | ||
| 344 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 339 | std::vector<std::reference_wrapper<Scene>> getAllScenes(); | 345 | std::vector<std::reference_wrapper<Scene>> getAllScenes(); |
| 340 | 346 | ||
| 347 | + //! \brief Get scene specified by id. | ||
| 348 | + //! \param id ID of the scene. | ||
| 349 | + //! \returns Schedule that can be modified. | ||
| 350 | + //! \throws std::system_error when system or socket operations fail | ||
| 351 | + //! \throws HueException when id does not exist | ||
| 352 | + //! \throws HueAPIResponseException when response contains an error | ||
| 353 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 341 | Scene& getScene(const std::string& id); | 354 | Scene& getScene(const std::string& id); |
| 342 | 355 | ||
| 356 | + | ||
| 357 | + //! \brief Checks whether a scene exists. | ||
| 358 | + //! \param id ID of the scene. | ||
| 359 | + //! \returns true when the scene exists. | ||
| 360 | + //! \note Does not refresh the cached state. | ||
| 343 | bool sceneExists(const std::string& id) const; | 361 | bool sceneExists(const std::string& id) const; |
| 344 | 362 | ||
| 363 | + //! \brief Create a new scene. | ||
| 364 | + //! \param params CreateScene parameters for the new scene. | ||
| 365 | + //! \returns The new scene id or 0 if failed. | ||
| 366 | + //! \throws std::system_error when system or socket operations fail | ||
| 367 | + //! \throws HueException when response contains no body | ||
| 368 | + //! \throws HueAPIResponseException when response contains an error | ||
| 369 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 345 | std::string createScene(const CreateScene& params); | 370 | std::string createScene(const CreateScene& params); |
| 346 | 371 | ||
| 347 | ///@} | 372 | ///@} |
include/hueplusplus/HueLight.h
| @@ -201,6 +201,8 @@ public: | @@ -201,6 +201,8 @@ public: | ||
| 201 | //! \return ColorType containig the color type of the light | 201 | //! \return ColorType containig the color type of the light |
| 202 | virtual ColorType getColorType() const; | 202 | virtual ColorType getColorType() const; |
| 203 | 203 | ||
| 204 | + //! \brief Get gamut space of possible light colors | ||
| 205 | + //! \returns Used gamut, or \ref gamut::maxGamut when unknown. | ||
| 204 | ColorGamut getColorGamut() const; | 206 | ColorGamut getColorGamut() const; |
| 205 | 207 | ||
| 206 | ///@} | 208 | ///@} |
include/hueplusplus/ModelPictures.h
| @@ -30,7 +30,7 @@ namespace hueplusplus | @@ -30,7 +30,7 @@ namespace hueplusplus | ||
| 30 | //! | 30 | //! |
| 31 | //! \note This function will only return the filename without extension, | 31 | //! \note This function will only return the filename without extension, |
| 32 | //! because Philips provides different file types. | 32 | //! because Philips provides different file types. |
| 33 | - //! \param model_id Model Id of a device to get the picture of | 33 | + //! \param modelId Model Id of a device to get the picture of |
| 34 | //! \returns String that either contains the filename of the picture of the device | 34 | //! \returns String that either contains the filename of the picture of the device |
| 35 | //! or an empty string if it was not found. | 35 | //! or an empty string if it was not found. |
| 36 | std::string getPictureOfModel(const std::string& modelId); | 36 | std::string getPictureOfModel(const std::string& modelId); |
include/hueplusplus/ResourceList.h
| @@ -73,7 +73,7 @@ public: | @@ -73,7 +73,7 @@ public: | ||
| 73 | //! \brief Deleted copy constructor | 73 | //! \brief Deleted copy constructor |
| 74 | ResourceList(const ResourceList&) = delete; | 74 | ResourceList(const ResourceList&) = delete; |
| 75 | //! \brief Defaulted move constructor | 75 | //! \brief Defaulted move constructor |
| 76 | - ResourceList(ResourceList&&) noexcept = default; | 76 | + ResourceList(ResourceList&&) = default; |
| 77 | //! \brief Deleted copy assignment | 77 | //! \brief Deleted copy assignment |
| 78 | ResourceList& operator=(const ResourceList&) = delete; | 78 | ResourceList& operator=(const ResourceList&) = delete; |
| 79 | //! \brief Defaulted move assignment | 79 | //! \brief Defaulted move assignment |
| @@ -276,6 +276,10 @@ public: | @@ -276,6 +276,10 @@ public: | ||
| 276 | } | 276 | } |
| 277 | }; | 277 | }; |
| 278 | 278 | ||
| 279 | +//! \brief Handles a group list with the special group 0 | ||
| 280 | +//! \tparam Resource Resource type that is in the list | ||
| 281 | +//! \tparam CreateType Type that provides parameters for creation. | ||
| 282 | +//! Must have a const getRequest() function returning the JSON for the POST request. | ||
| 279 | template <typename Resource, typename CreateType> | 283 | template <typename Resource, typename CreateType> |
| 280 | class GroupResourceList : public CreateableResourceList<Resource, int, CreateType> | 284 | class GroupResourceList : public CreateableResourceList<Resource, int, CreateType> |
| 281 | { | 285 | { |
include/hueplusplus/Scene.h
| @@ -38,30 +38,53 @@ namespace hueplusplus | @@ -38,30 +38,53 @@ namespace hueplusplus | ||
| 38 | class LightState | 38 | class LightState |
| 39 | { | 39 | { |
| 40 | public: | 40 | public: |
| 41 | + //! \brief Create LightState from json | ||
| 42 | + //! \note Use LightStateBuilder for easier creation. | ||
| 41 | explicit LightState(const nlohmann::json& state); | 43 | explicit LightState(const nlohmann::json& state); |
| 42 | 44 | ||
| 45 | + //! \brief Get whether the light is on | ||
| 43 | bool isOn() const; | 46 | bool isOn() const; |
| 44 | 47 | ||
| 48 | + //! \brief Get whether a brightness is stored | ||
| 45 | bool hasBrightness() const; | 49 | bool hasBrightness() const; |
| 50 | + //! \brief Get brightness of the light | ||
| 51 | + //! \returns Stored brightness, or 0 | ||
| 46 | int getBrightness() const; | 52 | int getBrightness() const; |
| 47 | 53 | ||
| 54 | + //! \brief Get whether hue and saturation is stored | ||
| 48 | bool hasHueSat() const; | 55 | bool hasHueSat() const; |
| 56 | + //! \brief Get hue and saturation of the light | ||
| 57 | + //! \returns Stored hue and saturation, or {0,0} if not stored | ||
| 49 | HueSaturation getHueSat() const; | 58 | HueSaturation getHueSat() const; |
| 50 | 59 | ||
| 60 | + //! \brief Get whether xy color is stored | ||
| 51 | bool hasXY() const; | 61 | bool hasXY() const; |
| 62 | + //! \brief Get xy color of the light | ||
| 63 | + //! \returns Stored x,y and brightness, or zeros if not stored | ||
| 52 | XYBrightness getXY() const; | 64 | XYBrightness getXY() const; |
| 53 | 65 | ||
| 66 | + //! \brief Get whether color temperature is stored | ||
| 54 | bool hasCt() const; | 67 | bool hasCt() const; |
| 68 | + //! \brief Get color temperature of the light | ||
| 69 | + //! \returns Stored color temperature in mired, or 0 if not stored | ||
| 55 | int getCt() const; | 70 | int getCt() const; |
| 56 | 71 | ||
| 72 | + //! \brief Get whether effect is stored | ||
| 57 | bool hasEffect() const; | 73 | bool hasEffect() const; |
| 74 | + //! \brief Get whether colorloop effect is active | ||
| 75 | + //! \returns true when colorloop is enabled, false otherwise or if not stored | ||
| 58 | bool getColorloop() const; | 76 | bool getColorloop() const; |
| 59 | 77 | ||
| 78 | + //! \brief Get transition time to this light state | ||
| 79 | + //! \returns Stored transition time or 4 by default | ||
| 60 | int getTransitionTime() const; | 80 | int getTransitionTime() const; |
| 61 | 81 | ||
| 82 | + //! \brief Convert to json representation | ||
| 62 | nlohmann::json toJson() const; | 83 | nlohmann::json toJson() const; |
| 63 | 84 | ||
| 85 | + //! \brief Equality comparison | ||
| 64 | bool operator==(const LightState& other) const; | 86 | bool operator==(const LightState& other) const; |
| 87 | + //! \brief Inequality comparison | ||
| 65 | bool operator!=(const LightState& other) const; | 88 | bool operator!=(const LightState& other) const; |
| 66 | 89 | ||
| 67 | private: | 90 | private: |
| @@ -86,51 +109,140 @@ private: | @@ -86,51 +109,140 @@ private: | ||
| 86 | nlohmann::json state; | 109 | nlohmann::json state; |
| 87 | }; | 110 | }; |
| 88 | 111 | ||
| 112 | +//! \brief Scene stored in the bridge | ||
| 113 | +//! | ||
| 114 | +//! Scenes bundle the state of multiple lights so it can be recalled later. | ||
| 89 | class Scene | 115 | class Scene |
| 90 | { | 116 | { |
| 91 | public: | 117 | public: |
| 118 | + //! \brief Type of the scen | ||
| 92 | enum class Type | 119 | enum class Type |
| 93 | { | 120 | { |
| 94 | - lightScene, | ||
| 95 | - groupScene | 121 | + lightScene, //!< The scene affects specific lights |
| 122 | + groupScene //!< The scene affects all light of a specific group | ||
| 96 | }; | 123 | }; |
| 97 | 124 | ||
| 98 | public: | 125 | public: |
| 126 | + //! \brief Construct existing Scene | ||
| 127 | + //! \param id Scene id | ||
| 128 | + //! \param commands HueCommandAPI for requests | ||
| 129 | + //! \param refreshDuration Time between refreshing the cached state | ||
| 99 | Scene(const std::string& id, const HueCommandAPI& commands, std::chrono::steady_clock::duration refreshDuration); | 130 | Scene(const std::string& id, const HueCommandAPI& commands, std::chrono::steady_clock::duration refreshDuration); |
| 100 | 131 | ||
| 132 | + //! \brief Refreshes internal cached state | ||
| 133 | + //! \throws std::system_error when system or socket operations fail | ||
| 134 | + //! \throws HueException when response contained no body | ||
| 135 | + //! \throws HueAPIResponseException when response contains an error | ||
| 136 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 101 | void refresh(); | 137 | void refresh(); |
| 138 | + | ||
| 139 | + //! \brief Get scene identifier | ||
| 102 | std::string getId() const; | 140 | std::string getId() const; |
| 141 | + //! \brief Get scene name | ||
| 142 | + //! | ||
| 143 | + //! The scene name is always unique for the bridge. It defaults to the id. | ||
| 103 | std::string getName() const; | 144 | std::string getName() const; |
| 145 | + //! \brief Set scene name | ||
| 146 | + //! \param name New name for the scene. | ||
| 147 | + //! Must be unique for all schedules, otherwise a number is added. | ||
| 148 | + //! \throws std::system_error when system or socket operations fail | ||
| 149 | + //! \throws HueException when response contained no body | ||
| 150 | + //! \throws HueAPIResponseException when response contains an error | ||
| 151 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 104 | void setName(const std::string& name); | 152 | void setName(const std::string& name); |
| 105 | - | 153 | + //! \brief Get scene type |
| 154 | + //! | ||
| 155 | + //! GroupScenes are deleted when the group is deleted. | ||
| 106 | Type getType() const; | 156 | Type getType() const; |
| 107 | 157 | ||
| 158 | + //! \brief Get group id for a GroupScene | ||
| 159 | + //! \returns Group id or 0 if the scene is a LightScene. | ||
| 108 | int getGroupId() const; | 160 | int getGroupId() const; |
| 109 | 161 | ||
| 162 | + //! \brief Get light ids | ||
| 163 | + //! | ||
| 164 | + //! For a GroupScene, the light ids are the lights in the group. | ||
| 110 | std::vector<int> getLightIds() const; | 165 | std::vector<int> getLightIds() const; |
| 166 | + //! \brief Set light ids for LightScene | ||
| 167 | + //! \param ids New light ids | ||
| 168 | + //! | ||
| 169 | + //! Light ids cannot be changed on GroupScene. Change the lights in the group instead. | ||
| 170 | + //! \throws std::system_error when system or socket operations fail | ||
| 171 | + //! \throws HueException when response contained no body | ||
| 172 | + //! \throws HueAPIResponseException when response contains an error | ||
| 173 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 111 | void setLightIds(const std::vector<int>& ids); | 174 | void setLightIds(const std::vector<int>& ids); |
| 112 | 175 | ||
| 176 | + //! \brief Get user that created or last changed the scene. | ||
| 113 | std::string getOwner() const; | 177 | std::string getOwner() const; |
| 178 | + //! \brief Get whether the scene can be automatically deleted | ||
| 114 | bool getRecycle() const; | 179 | bool getRecycle() const; |
| 180 | + //! \brief Get whether scene is locked by a rule or schedule | ||
| 115 | bool isLocked() const; | 181 | bool isLocked() const; |
| 116 | 182 | ||
| 183 | + //! \brief Get app specific data | ||
| 117 | std::string getAppdata() const; | 184 | std::string getAppdata() const; |
| 185 | + //! \brief Get version of app specific data | ||
| 118 | int getAppdataVersion() const; | 186 | int getAppdataVersion() const; |
| 187 | + //! \brief Set app specific data | ||
| 188 | + //! \param data Custom data in any format, max length 16. | ||
| 189 | + //! \param version Version of the data | ||
| 190 | + //! \throws std::system_error when system or socket operations fail | ||
| 191 | + //! \throws HueException when response contained no body | ||
| 192 | + //! \throws HueAPIResponseException when response contains an error | ||
| 193 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 119 | void setAppdata(const std::string& data, int version); | 194 | void setAppdata(const std::string& data, int version); |
| 120 | 195 | ||
| 196 | + //! \brief Get picture, reserved for future use. | ||
| 197 | + //! | ||
| 198 | + //! Currently always an empty string. | ||
| 121 | std::string getPicture() const; | 199 | std::string getPicture() const; |
| 200 | + //! \brief Get time the scene was created/updated. | ||
| 122 | time::AbsoluteTime getLastUpdated() const; | 201 | time::AbsoluteTime getLastUpdated() const; |
| 202 | + //! \brief Get version of the scene | ||
| 203 | + //! \returns 1 for legacy scene without lightstates | ||
| 204 | + //! \returns 2 for updated scenes with lightstates | ||
| 123 | int getVersion() const; | 205 | int getVersion() const; |
| 124 | 206 | ||
| 207 | + //! \brief Get stored states of the lights | ||
| 208 | + //! \returns LightStates for each light in the scene, or an empty map for legacy scenes. | ||
| 125 | std::map<int, LightState> getLightStates() const; | 209 | std::map<int, LightState> getLightStates() const; |
| 210 | + //! \brief Set light states | ||
| 211 | + //! \param states New states for each light in the scene. | ||
| 212 | + //! Should contain exactly the lights in the scene. Additional states might cause an error. | ||
| 213 | + //! \throws std::system_error when system or socket operations fail | ||
| 214 | + //! \throws HueException when response contained no body | ||
| 215 | + //! \throws HueAPIResponseException when response contains an error | ||
| 216 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 126 | void setLightStates(const std::map<int, LightState>& states); | 217 | void setLightStates(const std::map<int, LightState>& states); |
| 127 | 218 | ||
| 219 | + //! \brief Store current light state of every light in the scene | ||
| 220 | + //! \throws std::system_error when system or socket operations fail | ||
| 221 | + //! \throws HueException when response contained no body | ||
| 222 | + //! \throws HueAPIResponseException when response contains an error | ||
| 223 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 128 | void storeCurrentLightState(); | 224 | void storeCurrentLightState(); |
| 225 | + //! \brief Store current light state and update transition time | ||
| 226 | + //! \param transition The updated transition time to this scene | ||
| 227 | + //! \throws std::system_error when system or socket operations fail | ||
| 228 | + //! \throws HueException when response contained no body | ||
| 229 | + //! \throws HueAPIResponseException when response contains an error | ||
| 230 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 129 | void storeCurrentLightState(int transition); | 231 | void storeCurrentLightState(int transition); |
| 130 | 232 | ||
| 233 | + //! \brief Recall scene, putting every light in the stored state | ||
| 234 | + //! \throws std::system_error when system or socket operations fail | ||
| 235 | + //! \throws HueException when response contained no body | ||
| 236 | + //! \throws HueAPIResponseException when response contains an error | ||
| 237 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 131 | void recall(); | 238 | void recall(); |
| 132 | 239 | ||
| 133 | private: | 240 | private: |
| 241 | + //! \brief Send put request to specified sub path | ||
| 242 | + //! \throws std::system_error when system or socket operations fail | ||
| 243 | + //! \throws HueException when response contained no body | ||
| 244 | + //! \throws HueAPIResponseException when response contains an error | ||
| 245 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 134 | void sendPutRequest(const std::string& path, const nlohmann::json& request, FileInfo fileInfo); | 246 | void sendPutRequest(const std::string& path, const nlohmann::json& request, FileInfo fileInfo); |
| 135 | 247 | ||
| 136 | private: | 248 | private: |
| @@ -138,16 +250,40 @@ private: | @@ -138,16 +250,40 @@ private: | ||
| 138 | APICache state; | 250 | APICache state; |
| 139 | }; | 251 | }; |
| 140 | 252 | ||
| 253 | +//! \brief Parameters for creating a new Scene | ||
| 254 | +//! | ||
| 255 | +//! Can be used like a builder object with chained calls. | ||
| 141 | class CreateScene | 256 | class CreateScene |
| 142 | { | 257 | { |
| 143 | public: | 258 | public: |
| 259 | + //! \brief Set name | ||
| 260 | + //! \see Scene::setName | ||
| 144 | CreateScene& setName(const std::string& name); | 261 | CreateScene& setName(const std::string& name); |
| 262 | + //! \brief Set group id, making the scene a GroupScene | ||
| 263 | + //! \param id Group id for the scene, not 0 | ||
| 264 | + //! | ||
| 265 | + //! The group id cannot be changed after the scene was created. | ||
| 266 | + //! \throws HueException when used after setLightIds | ||
| 145 | CreateScene& setGroupId(int id); | 267 | CreateScene& setGroupId(int id); |
| 268 | + //! \brief Set light ids, making the scene a LightScene | ||
| 269 | + //! \param ids Ids of lights in the scene | ||
| 270 | + //! \throws HueException when used after setGroupId | ||
| 146 | CreateScene& setLightIds(const std::vector<int>& ids); | 271 | CreateScene& setLightIds(const std::vector<int>& ids); |
| 272 | + //! \brief Set whether the scene can be automatically deleted | ||
| 273 | + //! | ||
| 274 | + //! Cannot be changed after the scene was created. | ||
| 147 | CreateScene& setRecycle(bool recycle); | 275 | CreateScene& setRecycle(bool recycle); |
| 276 | + //! \brief Set app specific data | ||
| 277 | + //! \see Scene::setAppdata | ||
| 148 | CreateScene& setAppdata(const std::string& data, int version); | 278 | CreateScene& setAppdata(const std::string& data, int version); |
| 279 | + //! \brief Set light states of the scene | ||
| 280 | + //! | ||
| 281 | + //! When omitted, the current light states are stored. | ||
| 282 | + //! \see Scene::setLightStates | ||
| 149 | CreateScene& setLightStates(const std::map<int, LightState>& states); | 283 | CreateScene& setLightStates(const std::map<int, LightState>& states); |
| 150 | 284 | ||
| 285 | + //! \brief Get request to create the scene. | ||
| 286 | + //! \returns JSON request for a POST to create the new scene | ||
| 151 | nlohmann::json getRequest() const; | 287 | nlohmann::json getRequest() const; |
| 152 | 288 | ||
| 153 | private: | 289 | private: |
include/hueplusplus/Schedule.h
| @@ -212,6 +212,8 @@ public: | @@ -212,6 +212,8 @@ public: | ||
| 212 | //! When recycle is true, it is deleted when no resourcelinks refer to it. | 212 | //! When recycle is true, it is deleted when no resourcelinks refer to it. |
| 213 | CreateSchedule& setRecycle(bool recycle); | 213 | CreateSchedule& setRecycle(bool recycle); |
| 214 | 214 | ||
| 215 | + //! \brief Get request to create the schedule. | ||
| 216 | +//! \returns JSON request for a POST to create the new schedule | ||
| 215 | nlohmann::json getRequest() const; | 217 | nlohmann::json getRequest() const; |
| 216 | 218 | ||
| 217 | private: | 219 | private: |
src/TimePattern.cpp
| @@ -90,7 +90,6 @@ std::chrono::system_clock::time_point parseUTCTimestamp(const std::string& times | @@ -90,7 +90,6 @@ std::chrono::system_clock::time_point parseUTCTimestamp(const std::string& times | ||
| 90 | // (also not officially thread-safe, but none of the time functions are) | 90 | // (also not officially thread-safe, but none of the time functions are) |
| 91 | // Set local timezone to UTC and then set it back | 91 | // Set local timezone to UTC and then set it back |
| 92 | char* tz = std::getenv("TZ"); | 92 | char* tz = std::getenv("TZ"); |
| 93 | - std::time_t ctime = std::mktime(&tm); | ||
| 94 | if (tz) | 93 | if (tz) |
| 95 | { | 94 | { |
| 96 | tz = strdup(tz); | 95 | tz = strdup(tz); |