3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
7 #include "../SinricProNamespace.h"
9 namespace SINRICPRO_NAMESPACE {
28 using ModeCallback = std::function<bool(
const String &, String &)>;
60 bool sendModeEvent(String mode, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
61 bool sendModeEvent(String instance, String mode, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
65 bool handleModeController(SinricProRequest &request);
68 EventLimiter event_limiter;
69 std::map<String, EventLimiter> event_limiter_generic;
71 std::map<String, GenericModeCallback> genericModeCallback;
76 : event_limiter(EVENT_LIMIT_STATE) {
77 T* device =
static_cast<T*
>(
this);
101 genericModeCallback[instance] = cb;
113 template <
typename T>
115 if (event_limiter)
return false;
116 T* device =
static_cast<T*
>(
this);
118 JsonDocument eventMessage = device->prepareEvent(FSTR_MODE_setMode, cause.c_str());
119 JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
120 event_value[FSTR_MODE_mode] = mode;
121 return device->sendEvent(eventMessage);
134 template <
typename T>
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;
139 T* device =
static_cast<T*
>(
this);
141 JsonDocument eventMessage = device->prepareEvent(FSTR_MODE_setMode, cause.c_str());
142 eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
143 JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
144 event_value[FSTR_MODE_mode] = mode;
145 return device->sendEvent(eventMessage);
148 template <
typename T>
150 T* device =
static_cast<T*
>(
this);
152 bool success =
false;
153 if (request.action != FSTR_MODE_setMode)
return false;
154 String mode = request.request_value[FSTR_MODE_mode] |
"";
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;
163 if (setModeCallback) {
164 success = setModeCallback(device->deviceId, mode);
165 request.response_value[FSTR_MODE_mode] = mode;
175 template <
typename T>
176 using ModeController = SINRICPRO_NAMESPACE::ModeController<T>;
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