SinricPro Library
ToggleController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
9 
10 FSTR(TOGGLE, setToggleState); // "setToggleState"
11 FSTR(TOGGLE, state); // "state"
12 FSTR(TOGGLE, On); // "On"
13 FSTR(TOGGLE, Off); // "Off"
14 
29 using GenericToggleStateCallback = std::function<bool(const String &, const String&, bool &)>;
30 
31 
36 template <typename T>
38  public:
40 
41  void onToggleState(const String& instance, GenericToggleStateCallback cb);
42  bool sendToggleStateEvent(const String &instance, bool state, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
43 
44  protected:
45  bool handleToggleController(SinricProRequest &request);
46 
47  private:
48  std::map<String, EventLimiter> event_limiter;
49  std::map<String, GenericToggleStateCallback> genericToggleStateCallback;
50 };
51 
52 template <typename T>
54  T* device = static_cast<T*>(this);
55  device->registerRequestHandler(std::bind(&ToggleController<T>::handleToggleController, this, std::placeholders::_1));
56 }
57 
66 template <typename T>
68  genericToggleStateCallback[instance] = cb;
69 }
70 
81 template <typename T>
82 bool ToggleController<T>::sendToggleStateEvent(const String &instance, bool state, String cause) {
83  if (event_limiter.find(instance) == event_limiter.end()) event_limiter[instance] = EventLimiter(EVENT_LIMIT_STATE);
84  if (event_limiter[instance]) return false;
85 
86  T* device = static_cast<T*>(this);
87 
88  JsonDocument eventMessage = device->prepareEvent(FSTR_TOGGLE_setToggleState, cause.c_str());
89  eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_instanceId] = instance;
90  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
91  event_value[FSTR_TOGGLE_state] = state ? FSTR_TOGGLE_On : FSTR_TOGGLE_Off;
92  return device->sendEvent(eventMessage);
93 }
94 
95 template <typename T>
96 bool ToggleController<T>::handleToggleController(SinricProRequest &request) {
97  T* device = static_cast<T*>(this);
98 
99  bool success = false;
100 
101  if (request.action == FSTR_TOGGLE_setToggleState) {
102  bool powerState = request.request_value[FSTR_TOGGLE_state] == FSTR_TOGGLE_On ? true : false;
103  if (genericToggleStateCallback.find(request.instance) != genericToggleStateCallback.end())
104  success = genericToggleStateCallback[request.instance](device->deviceId, request.instance, powerState);
105  request.response_value[FSTR_TOGGLE_state] = powerState ? FSTR_TOGGLE_On : FSTR_TOGGLE_Off;
106  return success;
107  }
108  return success;
109 }
110 
111 } // SINRICPRO_NAMESPACE
112 
113 template <typename T>
114 using ToggleController = SINRICPRO_NAMESPACE::ToggleController<T>;
ToggleController.
Definition: ToggleController.h:37
std::function< bool(const String &, const String &, bool &)> GenericToggleStateCallback
Callback definition for onToggleState function.
Definition: ToggleController.h:29