SinricPro Library
RangeController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
9 
10 FSTR(RANGE, setRangeValue); // "setRangeValue"
11 FSTR(RANGE, rangeValue); // "rangeValue"
12 FSTR(RANGE, adjustRangeValue); // "adjustRangeValue"
13 FSTR(RANGE, rangeValueDelta); // "rangeValueDelta"
14 
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 {
44  GenericRangeValueCallback_float cb_float;
45  };
46 };
47 
48 using SetRangeValueCallback = bool (*)(const String &, int &);
49 
66  using GenericSetRangeValueCallback_float = GenericRangeValueCallback_float;
67 
82 using AdjustRangeValueCallback = bool (*)(const String &, int &);
83 
100 using GenericAdjustRangeValueCallback_float = GenericRangeValueCallback_float;
101 
102 
103 
108 template <typename T>
110  public:
111 
112  RangeController();
113 
114  void onRangeValue(SetRangeValueCallback cb);
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 
122  bool sendRangeValueEvent(int rangeValue, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
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 
138 template <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 
151 template <typename T>
152 void RangeController<T>::onRangeValue(SetRangeValueCallback cb) {
153  setRangeValueCallback = cb;
154 }
155 
163 template <typename T>
165  genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
166 }
167 
168 template <typename T>
169 void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback_float cb) {
170  genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
171 }
172 
179 template <typename T>
181  adjustRangeValueCallback = cb;
182 }
183 
184 template <typename T>
186  genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
187 }
188 
189 template <typename T>
190 void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_float cb) {
191  genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
192 }
193 
203 template <typename T>
204 bool RangeController<T>::sendRangeValueEvent(int rangeValue, String cause) {
205  if (event_limiter) return false;
206  T* device = static_cast<T*>(this);
207 
208  JsonDocument eventMessage = device->prepareEvent(FSTR_RANGE_setRangeValue, cause.c_str());
209  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
210  event_value[FSTR_RANGE_rangeValue] = rangeValue;
211  return device->sendEvent(eventMessage);
212 }
213 
224 template <typename T>
225 bool 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 
230  JsonDocument eventMessage = device->prepareEvent(FSTR_RANGE_setRangeValue, cause.c_str());
231  eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
232 
233  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
234  event_value[FSTR_RANGE_rangeValue] = rangeValue;
235  return device->sendEvent(eventMessage);
236 }
237 
238 template <typename T>
239 bool 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 
244  JsonDocument eventMessage = device->prepareEvent(FSTR_RANGE_setRangeValue, cause.c_str());
245  eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
246 
247  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
248  event_value[FSTR_RANGE_rangeValue] = rangeValue;
249  return device->sendEvent(eventMessage);
250 }
251 
252 template <typename T>
253 bool 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 
325 template <typename T>
326 using RangeController = SINRICPRO_NAMESPACE::RangeController<T>;
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
GenericRangeValueCallback_int GenericAdjustRangeValueCallback_int
Callback definition for onAdjustRangeValue function on a specific instance for custom devices.
Definition: RangeController.h:99