SinricPro Library
ModeController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 
9 namespace SINRICPRO_NAMESPACE {
10 
11 FSTR(MODE, setMode); // "setMode"
12 FSTR(MODE, mode); // "mode"
13 
28 using ModeCallback = std::function<bool(const String &, String &)>;
29 
45 using GenericModeCallback = std::function<bool(const String &, const String &, String &)>;
46 
47 
52 template <typename T>
54  public:
56 
58  void onSetMode(const String& instance, GenericModeCallback cb);
59 
60  bool sendModeEvent(String mode, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
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 
74 template <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 
88 template <typename T>
89 void ModeController<T>::onSetMode(ModeCallback cb) { setModeCallback = cb; }
90 
99 template <typename T>
100 void ModeController<T>::onSetMode(const String& instance, GenericModeCallback cb) {
101  genericModeCallback[instance] = cb;
102 }
103 
113 template <typename T>
114 bool ModeController<T>::sendModeEvent(String mode, String cause) {
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());
119  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
120  event_value[FSTR_MODE_mode] = mode;
121  return device->sendEvent(eventMessage);
122 }
123 
134 template <typename T>
135 bool 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());
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);
146 }
147 
148 template <typename T>
149 bool 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 
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