SinricPro Library
Loading...
Searching...
No Matches
RangeController.h
1#pragma once
2
3#include "../SinricProRequest.h"
4#include "../EventLimiter.h"
5#include "../SinricProStrings.h"
6
7#include "../SinricProNamespace.h"
8namespace SINRICPRO_NAMESPACE {
9
10FSTR(RANGE, setRangeValue); // "setRangeValue"
11FSTR(RANGE, rangeValue); // "rangeValue"
12FSTR(RANGE, adjustRangeValue); // "adjustRangeValue"
13FSTR(RANGE, rangeValueDelta); // "rangeValueDelta"
14
30using GenericRangeValueCallback_int = bool (*)(const String &, const String &, int &);
31using GenericRangeValueCallback_float = bool (*)(const String &, const String &, float &);
32
33struct 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 {
44 GenericRangeValueCallback_float cb_float;
45 };
46};
47
48using SetRangeValueCallback = bool (*)(const String &, int &);
49
66 using GenericSetRangeValueCallback_float = GenericRangeValueCallback_float;
67
82using AdjustRangeValueCallback = bool (*)(const String &, int &);
83
100using GenericAdjustRangeValueCallback_float = GenericRangeValueCallback_float;
101
102
103
108template <typename T>
110 public:
111
113
115 void onRangeValue(const String& instance, GenericSetRangeValueCallback_int cb);
116 void onRangeValue(const String& instance, GenericSetRangeValueCallback_float cb);
117
119 void onAdjustRangeValue(const String& instance, GenericAdjustRangeValueCallback_int cb);
120 void onAdjustRangeValue(const String& instance, GenericAdjustRangeValueCallback_float cb);
121
123 bool sendRangeValueEvent(const String& instance, int rangeValue, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
124 bool sendRangeValueEvent(const String& instance, float rangeValue, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
125
126 protected:
127 bool handleRangeController(SinricProRequest &request);
128
129 private:
130 EventLimiter event_limiter;
131 std::map<String, EventLimiter> event_limiter_generic;
132 SetRangeValueCallback setRangeValueCallback;
133 std::map<String, GenericRangeValueCallback> genericSetRangeValueCallback;
134 AdjustRangeValueCallback adjustRangeValueCallback;
135 std::map<String, GenericRangeValueCallback> genericAdjustRangeValueCallback;
136};
137
138template <typename T>
140: event_limiter(EVENT_LIMIT_STATE) {
141 T* device = static_cast<T*>(this);
142 device->registerRequestHandler(std::bind(&RangeController<T>::handleRangeController, this, std::placeholders::_1));
143}
144
151template <typename T>
152void RangeController<T>::onRangeValue(SetRangeValueCallback cb) {
153 setRangeValueCallback = cb;
154}
155
163template <typename T>
165 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
166}
167
168template <typename T>
170 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
171}
172
179template <typename T>
181 adjustRangeValueCallback = cb;
182}
183
184template <typename T>
186 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
187}
188
189template <typename T>
190void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_float cb) {
191 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
192}
193
203template <typename T>
205 if (event_limiter) return false;
206 T* device = static_cast<T*>(this);
207
211 return device->sendEvent(eventMessage);
212}
213
224template <typename T>
225bool RangeController<T>::sendRangeValueEvent(const String& instance, int rangeValue, String cause){
226 if (event_limiter_generic.find(instance) == event_limiter_generic.end()) event_limiter_generic[instance] = EventLimiter(EVENT_LIMIT_STATE);
227 if (event_limiter_generic[instance]) return false;
228 T* device = static_cast<T*>(this);
229
232
235 return device->sendEvent(eventMessage);
236}
237
238template <typename T>
239bool RangeController<T>::sendRangeValueEvent(const String& instance, float rangeValue, String cause) {
240 if (event_limiter_generic.find(instance) == event_limiter_generic.end()) event_limiter_generic[instance] = EventLimiter(EVENT_LIMIT_STATE);
241 if (event_limiter_generic[instance]) return false;
242 T* device = static_cast<T*>(this);
243
246
249 return device->sendEvent(eventMessage);
250}
251
252template <typename T>
253bool RangeController<T>::handleRangeController(SinricProRequest &request) {
254 T* device = static_cast<T*>(this);
255
256 bool success = false;
257
258 if (request.action == FSTR_RANGE_setRangeValue) {
259
260 if (request.instance == "") {
261
262 int rangeValue = request.request_value[FSTR_RANGE_rangeValue];
263 if (setRangeValueCallback) success = setRangeValueCallback(device->deviceId, rangeValue);
264 request.response_value[FSTR_RANGE_rangeValue] = rangeValue;
265 return success;
266
267 } else {
268
269 if (genericSetRangeValueCallback.find(request.instance) == genericSetRangeValueCallback.end()) return false;
270
271 auto& cb = genericSetRangeValueCallback[request.instance];
272
273 if (cb.type == GenericRangeValueCallback::type_float) {
274 float value = request.request_value[FSTR_RANGE_rangeValue];
275 success = cb.cb_float(device->deviceId, request.instance, value);
276 request.response_value[FSTR_RANGE_rangeValue] = value;
277 return success;
278 }
279
280 if (cb.type == GenericRangeValueCallback::type_int) {
281 int value = request.request_value[FSTR_RANGE_rangeValue];
282 success = cb.cb_int(device->deviceId, request.instance, value);
283 request.response_value[FSTR_RANGE_rangeValue] = value;
284 return success;
285 }
286 }
287 }
288
289 if (request.action == FSTR_RANGE_adjustRangeValue) {
290
291 if (request.instance == "") {
292
293 int rangeValue = request.request_value[FSTR_RANGE_rangeValueDelta];
294 if (adjustRangeValueCallback) success = adjustRangeValueCallback(device->deviceId, rangeValue);
295 request.response_value[FSTR_RANGE_rangeValue] = rangeValue;
296 return success;
297
298 } else {
299
300 if (genericAdjustRangeValueCallback.find(request.instance) == genericAdjustRangeValueCallback.end()) return false;
301
302 auto& cb = genericAdjustRangeValueCallback[request.instance];
303
304 if (cb.type == GenericRangeValueCallback::type_float) {
305 float value = request.request_value[FSTR_RANGE_rangeValueDelta];
306 success = cb.cb_float(device->deviceId, request.instance, value);
307 request.response_value[FSTR_RANGE_rangeValue] = value;
308 return success;
309 }
310
311 if (cb.type == GenericRangeValueCallback::type_int) {
312 int value = request.request_value[FSTR_RANGE_rangeValueDelta];
313 success = cb.cb_int(device->deviceId, request.instance, value);
314 request.response_value[FSTR_RANGE_rangeValue] = value;
315 return success;
316 }
317 }
318 }
319
320 return false;
321}
322
323} // SINRICPRO_NAMESPACE
324
325template <typename T>
326using RangeController = SINRICPRO_NAMESPACE::RangeController<T>;
AirQuality.
Definition AirQualitySensor.h:19
RangeControllerFloatInt.
Definition RangeController.h:109
bool sendRangeValueEvent(int rangeValue, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send rangeValue event to report curent rangeValue to SinricPro server.
Definition RangeController.h:204
void onRangeValue(const String &instance, GenericSetRangeValueCallback_int cb)
Set callback function for setRangeValue request on a specific instance (custom device)
Definition RangeController.h:164
void onRangeValue(SetRangeValueCallback cb)
Set callback function for setRangeValue request.
Definition RangeController.h:152
bool sendRangeValueEvent(const String &instance, int rangeValue, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send rangeValue event to report curent rangeValue to SinricPro server for a specific instance (custom...
Definition RangeController.h:225
void onAdjustRangeValue(AdjustRangeValueCallback cb)
Set callback function for adjustRangeValue request.
Definition RangeController.h:180
bool(*)(const String &, const String &, int &) GenericRangeValueCallback_int
Callback definition for onRangeValue function.
Definition RangeController.h:30
GenericRangeValueCallback_int GenericSetRangeValueCallback_int
Callback definition for onRangeValue function on a specific instance.
Definition RangeController.h:65
bool(*)(const String &, int &) AdjustRangeValueCallback
Callback definition for onAdjustRangeValue function.
Definition RangeController.h:82