44#include " SinricProRequest.h"
55
66/* *
7- * @brief RangeController
7+ * @brief RangeControllerFloatInt
88 * @ingroup Capabilities
99 **/
1010template <typename T>
1111class RangeController {
1212 public:
13+
1314 RangeController () { static_cast <T &>(*this ).requestHandlers .push_back (std::bind (&RangeController<T>::handleRangeController, this , std::placeholders::_1)); }
1415 /* *
1516 * @brief Callback definition for onRangeValue function
1617 *
1718 * Gets called when device receive a `setRangeValue` reuqest \n
1819 * @param[in] deviceId String which contains the ID of device
19- * @param[in] rangeValue Integer 0..3 for range value device has to be set
20- * @param[out] rangeValue Integer 0..3 returning the current range value
20+ * @param[in] rangeValue for range value device has to be set
21+ * @param[out] rangeValue returning the current range value
2122 * @return the success of the request
2223 * @retval true request handled properly
2324 * @retval false request was not handled properly because of some error
2425 *
2526 * @section SetRangeValueCallback Example-Code
2627 * @snippet callbacks.cpp onRangeValue
2728 **/
28- using SetRangeValueCallback = std::function<bool (const String &, int &)>;
29+
30+ using GenericRangeValueCallback_int = bool (*)(const String &, const String &, int &);
31+ using GenericRangeValueCallback_float = bool (*)(const String &, const String &, float &);
32+
33+ struct GenericRangeValueCallback {
34+ GenericRangeValueCallback () : type(type_unknown) {}
35+ GenericRangeValueCallback (GenericRangeValueCallback_int cb) : type(type_int), cb_int(cb) {}
36+ GenericRangeValueCallback (GenericRangeValueCallback_float cb) : type(type_float), cb_float(cb) {}
37+ enum {
38+ type_unknown,
39+ type_int,
40+ type_float
41+ } type;
42+ union {
43+ GenericRangeValueCallback_int cb_int;
44+ GenericRangeValueCallback_float cb_float;
45+ };
46+ };
47+
48+ using SetRangeValueCallback = bool (*)(const String &, int &);
49+ // using SetRangeValueCallback = std::function<bool(const String &, int &)>;
2950
3051 /* *
3152 * @brief Callback definition for onRangeValue function on a specific instance
3253 *
3354 * Gets called when device receive a `setRangeValue` reuqest \n
3455 * @param[in] deviceId String which contains the ID of device
3556 * @param[in] instance String instance name
36- * @param[in] rangeValue Integer 0..3 for range value device has to be set
37- * @param[out] rangeValue Integer 0..3 returning the current range value
57+ * @param[in] rangeValue for range value device has to be set
58+ * @param[out] rangeValue returning the current range value
3859 * @return the success of the request
3960 * @retval true request handled properly
4061 * @retval false request was not handled properly because of some error
4162 *
4263 * @section GenericSetRangeValueCallback Example-Code
4364 * @snippet callbacks.cpp onRangeValueGeneric
4465 **/
45- using GenericSetRangeValueCallback = std::function<bool (const String &, const String &, int &)>;
66+ using GenericSetRangeValueCallback_int = GenericRangeValueCallback_int;
67+ using GenericSetRangeValueCallback_float = GenericRangeValueCallback_float;
4668
4769 /* *
4870 * @brief Callback definition for onAdjustRangeValue function
4971 *
5072 * Gets called when device receive a `adjustRangeValue` reuqest \n
5173 * @param[in] deviceId String which contains the ID of device
52- * @param[in] rangeValue Integer -3..3 delta value for range value have to change
53- * @param[out] rangeValue Integer 3..3 returning the absolute range value
74+ * @param[in] rangeValue delta value for range value have to change
75+ * @param[out] rangeValue returning the absolute range value
5476 * @return the success of the request
5577 * @retval true request handled properly
5678 * @retval false request was not handled properly because of some error
5779 *
5880 * @section AdjustRangeValueCallback Example-Code
5981 * @snippet callbacks.cpp onAdjustRangeValue
6082 **/
61- using AdjustRangeValueCallback = std::function<bool (const String &, int &)>;
83+ using AdjustRangeValueCallback = bool (*)(const String &, int &);
84+ // using AdjustRangeValueCallback = std::function<bool(const String &, int &)>;
6285
6386 /* *
6487 * @brief Callback definition for onAdjustRangeValue function on a specific instance for custom devices
6588 *
6689 * Gets called when device receive a `adjustRangeValue` reuqest \n
6790 * @param[in] deviceId String which contains the ID of device
6891 * @param[in] instance String instance name
69- * @param[in] rangeValue Integer -3..3 delta value for range value have to change
70- * @param[out] rangeValue Integer 3..3 returning the absolute range value
92+ * @param[in] rangeValue delta value for range value have to change
93+ * @param[out] rangeValue returning the absolute range value
7194 * @return the success of the request
7295 * @retval true request handled properly
7396 * @retval false request was not handled properly because of some error
7497 *
7598 * @section GenericAdjustRangeValueCallback Example-Code
7699 * @snippet callbacks.cpp onAdjustRangeValueGeneric
77100 **/
78- using GenericAdjustRangeValueCallback = std::function<bool (const String&, const String&, int &)>;
101+ using GenericAdjustRangeValueCallback_int = GenericRangeValueCallback_int;
102+ using GenericAdjustRangeValueCallback_float = GenericRangeValueCallback_float;
79103
80104 void onRangeValue (SetRangeValueCallback cb);
81- void onRangeValue (const String& instance, GenericSetRangeValueCallback cb);
105+ void onRangeValue (const String& instance, GenericSetRangeValueCallback_int cb);
106+ void onRangeValue (const String& instance, GenericSetRangeValueCallback_float cb);
82107
83108 void onAdjustRangeValue (AdjustRangeValueCallback cb);
84- void onAdjustRangeValue (const String& instance, GenericAdjustRangeValueCallback cb);
109+ void onAdjustRangeValue (const String& instance, GenericAdjustRangeValueCallback_int cb);
110+ void onAdjustRangeValue (const String& instance, GenericAdjustRangeValueCallback_float cb);
85111
86112 bool sendRangeValueEvent (int rangeValue, String cause = " PHYSICAL_INTERACTION" );
87113 bool sendRangeValueEvent (const String& instance, int rangeValue, String cause = " PHYSICAL_INTERACTION" );
114+ bool sendRangeValueEvent (const String& instance, float rangeValue, String cause = " PHYSICAL_INTERACTION" );
88115
89116 protected:
90117 bool handleRangeController (SinricProRequest &request);
91118
92119 private:
93120 SetRangeValueCallback setRangeValueCallback;
94- std::map<String, GenericSetRangeValueCallback > genericSetRangeValueCallback;
121+ std::map<String, GenericRangeValueCallback > genericSetRangeValueCallback;
95122 AdjustRangeValueCallback adjustRangeValueCallback;
96- std::map<String, GenericAdjustRangeValueCallback > genericAdjustRangeValueCallback;
123+ std::map<String, GenericRangeValueCallback > genericAdjustRangeValueCallback;
97124};
98125
99126/* *
@@ -115,8 +142,13 @@ void RangeController<T>::onRangeValue(SetRangeValueCallback cb) {
115142 * @see GenericSetRangeValueCallback
116143 */
117144template <typename T>
118- void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback cb) {
119- genericSetRangeValueCallback[instance] = cb;
145+ void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback_int cb) {
146+ genericSetRangeValueCallback[instance] = GenericRangeValueCallback (cb);
147+ }
148+
149+ template <typename T>
150+ void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback_float cb) {
151+ genericSetRangeValueCallback[instance] = GenericRangeValueCallback (cb);
120152}
121153
122154/* *
@@ -131,10 +163,14 @@ void RangeController<T>::onAdjustRangeValue(AdjustRangeValueCallback cb) {
131163}
132164
133165template <typename T>
134- void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback cb) {
135- genericAdjustRangeValueCallback[instance] = cb ;
166+ void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_int cb) {
167+ genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback (cb) ;
136168}
137169
170+ template <typename T>
171+ void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_float cb) {
172+ genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback (cb);
173+ }
138174
139175/* *
140176 * @brief Send `rangeValue` event to report curent rangeValue to SinricPro server
@@ -177,39 +213,87 @@ bool RangeController<T>::sendRangeValueEvent(const String& instance, int rangeVa
177213 return device.sendEvent (eventMessage);
178214}
179215
216+ template <typename T>
217+ bool RangeController<T>::sendRangeValueEvent(const String& instance, float rangeValue, String cause){
218+ T &device = static_cast <T &>(*this );
219+
220+ DynamicJsonDocument eventMessage = device.prepareEvent (" setRangeValue" , cause.c_str ());
221+ eventMessage[" payload" ][" instanceId" ] = instance;
222+
223+ JsonObject event_value = eventMessage[" payload" ][" value" ];
224+ event_value[" rangeValue" ] = rangeValue;
225+ return device.sendEvent (eventMessage);
226+ }
227+
180228template <typename T>
181229bool RangeController<T>::handleRangeController(SinricProRequest &request) {
182230 T &device = static_cast <T &>(*this );
183231
184232 bool success = false ;
185233
186234 if (request.action == " setRangeValue" ) {
187- int rangeValue = request.request_value [" rangeValue" ] | 0 ;
188- if (request.instance != " " ) {
189- if (genericSetRangeValueCallback.find (request.instance ) != genericSetRangeValueCallback.end ())
190- success = genericSetRangeValueCallback[request.instance ](device.deviceId , request.instance , rangeValue);
191- } else {
235+
236+ if (request.instance == " " ) {
237+
238+ int rangeValue = request.request_value [" rangeValue" ];
192239 if (setRangeValueCallback) success = setRangeValueCallback (device.deviceId , rangeValue);
240+ request.response_value [" rangeValue" ] = rangeValue;
241+ return success;
242+
243+ } else {
244+
245+ if (genericSetRangeValueCallback.find (request.instance ) == genericSetRangeValueCallback.end ()) return false ;
246+
247+ auto & cb = genericSetRangeValueCallback[request.instance ];
248+
249+ if (cb.type == GenericRangeValueCallback::type_float) {
250+ float value = request.request_value [" rangeValue" ];
251+ success = cb.cb_float (device.deviceId , request.instance , value);
252+ request.response_value [" rangeValue" ] = value;
253+ return success;
254+ }
255+
256+ if (cb.type == GenericRangeValueCallback::type_int) {
257+ int value = request.request_value [" rangeValue" ];
258+ success = cb.cb_int (device.deviceId , request.instance , value);
259+ request.response_value [" rangeValue" ] = value;
260+ return success;
261+ }
193262 }
194- request.response_value [" rangeValue" ] = rangeValue;
195- return success;
196263 }
197264
198265 if (request.action == " adjustRangeValue" ) {
199- int rangeValueDelta = request.request_value [" rangeValueDelta" ] | 0 ;
200- if (request.instance != " " ) {
201- if (genericAdjustRangeValueCallback.find (request.instance ) != genericAdjustRangeValueCallback.end ())
202- success = genericAdjustRangeValueCallback[request.instance ](device.deviceId , request.instance , rangeValueDelta);
266+
267+ if (request.instance == " " ) {
268+
269+ int rangeValue = request.request_value [" rangeValueDelta" ];
270+ if (setRangeValueCallback) success = setRangeValueCallback (device.deviceId , rangeValue);
271+ request.response_value [" rangeValue" ] = rangeValue;
272+ return success;
273+
203274 } else {
204- if (adjustRangeValueCallback)
205- success = adjustRangeValueCallback (device.deviceId , rangeValueDelta);
275+
276+ if (genericSetRangeValueCallback.find (request.instance ) == genericSetRangeValueCallback.end ()) return false ;
277+
278+ auto & cb = genericAdjustRangeValueCallback[request.instance ];
279+
280+ if (cb.type == GenericRangeValueCallback::type_float) {
281+ float value = request.request_value [" rangeValueDelta" ];
282+ success = cb.cb_float (device.deviceId , request.instance , value);
283+ request.response_value [" rangeValue" ] = value;
284+ return success;
285+ }
286+
287+ if (cb.type == GenericRangeValueCallback::type_int) {
288+ int value = request.request_value [" rangeValueDelta" ];
289+ success = cb.cb_int (device.deviceId , request.instance , value);
290+ request.response_value [" rangeValue" ] = value;
291+ return success;
292+ }
206293 }
207-
208- request.response_value [" rangeValue" ] = rangeValueDelta;
209- return success;
210294 }
211295
212- return success ;
296+ return false ;
213297}
214298
215299#endif
0 commit comments