3#include "../SinricProRequest.h"
4#include "../EventLimiter.h"
5#include "../SinricProStrings.h"
7#include "../SinricProNamespace.h"
8namespace SINRICPRO_NAMESPACE {
10FSTR(RANGE, setRangeValue);
11FSTR(RANGE, rangeValue);
12FSTR(RANGE, adjustRangeValue);
13FSTR(RANGE, rangeValueDelta);
31using GenericRangeValueCallback_float = bool (*)(
const String &,
const String &,
float &);
33struct GenericRangeValueCallback {
34 GenericRangeValueCallback() : type(type_unknown) {}
36 GenericRangeValueCallback(GenericRangeValueCallback_float
cb) : type(type_float), cb_float(
cb) {}
44 GenericRangeValueCallback_float cb_float;
48using SetRangeValueCallback = bool (*)(
const String &,
int &);
127 bool handleRangeController(SinricProRequest &
request);
130 EventLimiter event_limiter;
131 std::map<String, EventLimiter> event_limiter_generic;
133 std::map<String, GenericRangeValueCallback> genericSetRangeValueCallback;
135 std::map<String, GenericRangeValueCallback> genericAdjustRangeValueCallback;
140: event_limiter(EVENT_LIMIT_STATE) {
141 T*
device =
static_cast<T*
>(
this);
153 setRangeValueCallback =
cb;
165 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(
cb);
170 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(
cb);
181 adjustRangeValueCallback =
cb;
186 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(
cb);
190void RangeController<T>::onAdjustRangeValue(
const String &instance, GenericAdjustRangeValueCallback_float cb) {
191 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
205 if (event_limiter)
return false;
206 T*
device =
static_cast<T*
>(
this);
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);
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);
253bool RangeController<T>::handleRangeController(SinricProRequest &request) {
254 T* device =
static_cast<T*
>(
this);
256 bool success =
false;
258 if (request.action == FSTR_RANGE_setRangeValue) {
260 if (request.instance ==
"") {
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;
269 if (genericSetRangeValueCallback.find(request.instance) == genericSetRangeValueCallback.end())
return false;
271 auto& cb = genericSetRangeValueCallback[request.instance];
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;
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;
289 if (request.action == FSTR_RANGE_adjustRangeValue) {
291 if (request.instance ==
"") {
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;
300 if (genericAdjustRangeValueCallback.find(request.instance) == genericAdjustRangeValueCallback.end())
return false;
302 auto& cb = genericAdjustRangeValueCallback[request.instance];
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;
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;
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