SinricPro Library
Loading...
Searching...
No Matches
ModeController.h
1#pragma once
2
3#include "../SinricProRequest.h"
4#include "../EventLimiter.h"
5#include "../SinricProStrings.h"
6
7#include "../SinricProNamespace.h"
8
9namespace SINRICPRO_NAMESPACE {
10
11FSTR(MODE, setMode); // "setMode"
12FSTR(MODE, mode); // "mode"
13
28using ModeCallback = std::function<bool(const String &, String &)>;
29
45using GenericModeCallback = std::function<bool(const String &, const String &, String &)>;
46
47
52template <typename T>
54 public:
56
58 void onSetMode(const String& instance, GenericModeCallback cb);
59
61 bool sendModeEvent(String instance, String mode, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
62
63 protected:
64
65 bool handleModeController(SinricProRequest &request);
66
67 private:
68 EventLimiter event_limiter;
69 std::map<String, EventLimiter> event_limiter_generic;
70 ModeCallback setModeCallback;
71 std::map<String, GenericModeCallback> genericModeCallback;
72};
73
74template <typename T>
76: event_limiter(EVENT_LIMIT_STATE) {
77 T* device = static_cast<T*>(this);
78 device->registerRequestHandler(std::bind(&ModeController<T>::handleModeController, this, std::placeholders::_1));
79}
80
88template <typename T>
89void ModeController<T>::onSetMode(ModeCallback cb) { setModeCallback = cb; }
90
99template <typename T>
101 genericModeCallback[instance] = cb;
102}
103
113template <typename T>
115 if (event_limiter) return false;
116 T* device = static_cast<T*>(this);
117
118 JsonDocument eventMessage = device->prepareEvent(FSTR_MODE_setMode, cause.c_str());
121 return device->sendEvent(eventMessage);
122}
123
134template <typename T>
135bool ModeController<T>::sendModeEvent(String instance, String mode, String cause) {
136 if (event_limiter_generic.find(instance) == event_limiter_generic.end()) event_limiter_generic[instance] = EventLimiter(EVENT_LIMIT_STATE);
137 if (event_limiter_generic[instance]) return false;
138
139 T* device = static_cast<T*>(this);
140
141 JsonDocument eventMessage = device->prepareEvent(FSTR_MODE_setMode, cause.c_str());
145 return device->sendEvent(eventMessage);
146}
147
148template <typename T>
149bool ModeController<T>::handleModeController(SinricProRequest &request) {
150 T* device = static_cast<T*>(this);
151
152 bool success = false;
153 if (request.action != FSTR_MODE_setMode) return false;
154 String mode = request.request_value[FSTR_MODE_mode] | "";
155
156 if (request.instance != "") {
157 if (genericModeCallback.find(request.instance) != genericModeCallback.end()) {
158 success = genericModeCallback[request.instance](device->deviceId, request.instance, mode);
159 request.response_value[FSTR_MODE_mode] = mode;
160 return success;
161 } else return false;
162 } else {
163 if (setModeCallback) {
164 success = setModeCallback(device->deviceId, mode);
165 request.response_value[FSTR_MODE_mode] = mode;
166 return success;
167 }
168 }
169
170 return success;
171}
172
173} // SINRICPRO_NAMESPACE
174
175template <typename T>
176using ModeController = SINRICPRO_NAMESPACE::ModeController<T>;
AirQuality.
Definition AirQualitySensor.h:19
ModeController.
Definition ModeController.h:53
bool sendModeEvent(String mode, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setMode event to SinricPro Server indicating the mode has changed.
Definition ModeController.h:114
void onSetMode(const String &instance, GenericModeCallback cb)
Set callback function for setMode request on a specific instance.
Definition ModeController.h:100
bool sendModeEvent(String instance, String mode, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setMode event to SinricPro Server indicating the mode on a specific instance has changed.
Definition ModeController.h:135
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition ModeController.h:89
std::function< bool(const String &, String &)> ModeCallback
Callback definition for onSetMode function.
Definition ModeController.h:28
std::function< bool(const String &, const String &, String &)> GenericModeCallback
Callback definition for onSetMode function for a specific instance.
Definition ModeController.h:45