3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
10 FSTR(RANGE, setRangeValue);
11 FSTR(RANGE, rangeValue);
12 FSTR(RANGE, adjustRangeValue);
13 FSTR(RANGE, rangeValueDelta);
31 using GenericRangeValueCallback_float = bool (*)(
const String &,
const String &,
float &);
33 struct GenericRangeValueCallback {
34 GenericRangeValueCallback() : type(type_unknown) {}
36 GenericRangeValueCallback(GenericRangeValueCallback_float cb) : type(type_float), cb_float(cb) {}
44 GenericRangeValueCallback_float cb_float;
48 using SetRangeValueCallback = bool (*)(
const String &,
int &);
66 using GenericSetRangeValueCallback_float = GenericRangeValueCallback_float;
100 using GenericAdjustRangeValueCallback_float = GenericRangeValueCallback_float;
108 template <
typename T>
116 void onRangeValue(
const String& instance, GenericSetRangeValueCallback_float cb);
120 void onAdjustRangeValue(
const String& instance, GenericAdjustRangeValueCallback_float cb);
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);
127 bool handleRangeController(SinricProRequest &request);
130 EventLimiter event_limiter;
131 std::map<String, EventLimiter> event_limiter_generic;
132 SetRangeValueCallback setRangeValueCallback;
133 std::map<String, GenericRangeValueCallback> genericSetRangeValueCallback;
135 std::map<String, GenericRangeValueCallback> genericAdjustRangeValueCallback;
138 template <
typename T>
140 : event_limiter(EVENT_LIMIT_STATE) {
141 T* device =
static_cast<T*
>(
this);
151 template <
typename T>
153 setRangeValueCallback = cb;
163 template <
typename T>
165 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
168 template <
typename T>
170 genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
179 template <
typename T>
181 adjustRangeValueCallback = cb;
184 template <
typename T>
186 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
189 template <
typename T>
190 void RangeController<T>::onAdjustRangeValue(
const String &instance, GenericAdjustRangeValueCallback_float cb) {
191 genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
203 template <
typename T>
205 if (event_limiter)
return false;
206 T* device =
static_cast<T*
>(
this);
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);
224 template <
typename T>
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);
230 JsonDocument eventMessage = device->prepareEvent(FSTR_RANGE_setRangeValue, cause.c_str());
231 eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
233 JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
234 event_value[FSTR_RANGE_rangeValue] = rangeValue;
235 return device->sendEvent(eventMessage);
238 template <
typename T>
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);
244 JsonDocument eventMessage = device->prepareEvent(FSTR_RANGE_setRangeValue, cause.c_str());
245 eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
247 JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
248 event_value[FSTR_RANGE_rangeValue] = rangeValue;
249 return device->sendEvent(eventMessage);
252 template <
typename T>
253 bool 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;
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