SinricPro Library
ModeController.h
1 #ifndef _MODECONTROLLER_H_
2 #define _MODECONTROLLER_H_
3 
4 #include "SinricProRequest.h"
5 
10 template <typename T>
12  public:
13  ModeController() { static_cast<T &>(*this).requestHandlers.push_back(std::bind(&ModeController<T>::handleModeController, this, std::placeholders::_1)); }
28  using ModeCallback = std::function<bool(const String &, String &)>;
29 
45  using GenericModeCallback = std::function<bool(const String &, const String &, String &)>;
46 
48  void onSetMode(const String& instance, GenericModeCallback cb);
49 
50  bool sendModeEvent(String mode, String cause = "PHYSICAL_INTERACTION");
51  bool sendModeEvent(String instance, String mode, String cause = "PHYSICAL_INTERACTION");
52 
53  protected:
54  bool handleModeController(SinricProRequest &request);
55 
56  private:
57  ModeCallback setModeCallback;
58  std::map<String, GenericModeCallback> genericModeCallback;
59 };
60 
68 template <typename T>
69 void ModeController<T>::onSetMode(ModeCallback cb) { setModeCallback = cb; }
70 
79 template <typename T>
80 void ModeController<T>::onSetMode(const String& instance, GenericModeCallback cb) {
81  genericModeCallback[instance] = cb;
82 }
83 
93 template <typename T>
94 bool ModeController<T>::sendModeEvent(String mode, String cause) {
95  T& device = static_cast<T&>(*this);
96 
97  DynamicJsonDocument eventMessage = device.prepareEvent("setMode", cause.c_str());
98  JsonObject event_value = eventMessage["payload"]["value"];
99  event_value["mode"] = mode;
100  return device.sendEvent(eventMessage);
101 }
102 
113 template <typename T>
114 bool ModeController<T>::sendModeEvent(String instance, String mode, String cause) {
115  T &device = static_cast<T &>(*this);
116 
117  DynamicJsonDocument eventMessage = device.prepareEvent("setMode", cause.c_str());
118  eventMessage["payload"]["instanceId"] = instance;
119  JsonObject event_value = eventMessage["payload"]["value"];
120  event_value["mode"] = mode;
121  return device.sendEvent(eventMessage);
122 }
123 
124 template <typename T>
125 bool ModeController<T>::handleModeController(SinricProRequest &request) {
126  T &device = static_cast<T &>(*this);
127 
128  bool success = false;
129  if (request.action != "setMode") return false;
130  String mode = request.request_value["mode"] | "";
131 
132  if (request.instance != "") {
133  if (genericModeCallback.find(request.instance) != genericModeCallback.end()) {
134  success = genericModeCallback[request.instance](device.deviceId, request.instance, mode);
135  request.response_value["mode"] = mode;
136  return success;
137  } else return false;
138  } else {
139  if (setModeCallback) {
140  success = setModeCallback(device.deviceId, mode);
141  request.response_value["mode"] = mode;
142  return success;
143  }
144  }
145 
146  return success;
147 }
148 
149 #endif
ModeController.
Definition: ModeController.h:11
bool sendModeEvent(String instance, String mode, String cause="PHYSICAL_INTERACTION")
Send setMode event to SinricPro Server indicating the mode on a specific instance 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:80
bool sendModeEvent(String mode, String cause="PHYSICAL_INTERACTION")
Send setMode event to SinricPro Server indicating the mode has changed.
Definition: ModeController.h:94
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
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition: ModeController.h:69