SinricPro Library
PowerLevelController.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(POWERLEVEL, setPowerLevel); // "setPowerLevel"
11 FSTR(POWERLEVEL, powerLevel); // "powerLevel"
12 FSTR(POWERLEVEL, adjustPowerLevel); // "adjustPowerLevel"
13 FSTR(POWERLEVEL, powerLevelDelta); // "powerLevelDelta"
14 
30 using SetPowerLevelCallback = std::function<bool(const String &, int &)>;
45 using AdjustPowerLevelCallback = std::function<bool(const String &, int &)>;
46 
47 
52 template <typename T>
54  public:
56 
59  bool sendPowerLevelEvent(int powerLevel, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
60 
61  protected:
62  bool handlePowerLevelController(SinricProRequest &request);
63 
64  private:
65  EventLimiter event_limiter;
66  SetPowerLevelCallback setPowerLevelCallback;
67  AdjustPowerLevelCallback adjustPowerLevelCallback;
68 };
69 
70 template <typename T>
72 : event_limiter(EVENT_LIMIT_STATE) {
73  T* device = static_cast<T*>(this);
74  device->registerRequestHandler(std::bind(&PowerLevelController<T>::handlePowerLevelController, this, std::placeholders::_1));
75 }
76 
83 template <typename T>
85  setPowerLevelCallback = cb;
86 }
87 
94 template <typename T>
96 {
97  adjustPowerLevelCallback = cb;
98 }
99 
109 template <typename T>
110 bool PowerLevelController<T>::sendPowerLevelEvent(int powerLevel, String cause) {
111  if (event_limiter) return false;
112  T* device = static_cast<T*>(this);
113 
114  JsonDocument eventMessage = device->prepareEvent(FSTR_POWERLEVEL_setPowerLevel, cause.c_str());
115  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
116  event_value[FSTR_POWERLEVEL_powerLevel] = powerLevel;
117  return device->sendEvent(eventMessage);
118 }
119 
120 template <typename T>
121 bool PowerLevelController<T>::handlePowerLevelController(SinricProRequest &request) {
122  T* device = static_cast<T*>(this);
123 
124  bool success = false;
125 
126  if (setPowerLevelCallback && request.action == FSTR_POWERLEVEL_setPowerLevel) {
127  int powerLevel = request.request_value[FSTR_POWERLEVEL_powerLevel];
128  success = setPowerLevelCallback(device->deviceId, powerLevel);
129  request.response_value[FSTR_POWERLEVEL_powerLevel] = powerLevel;
130  }
131 
132  if (adjustPowerLevelCallback && request.action == FSTR_POWERLEVEL_adjustPowerLevel) {
133  int powerLevelDelta = request.request_value[FSTR_POWERLEVEL_powerLevelDelta];
134  success = adjustPowerLevelCallback(device->deviceId, powerLevelDelta);
135  request.response_value[FSTR_POWERLEVEL_powerLevel] = powerLevelDelta;
136  }
137  return success;
138 }
139 
140 } // SINRICPRO_NAMESPACE
141 
142 template <typename T>
143 using PowerLevelController = SINRICPRO_NAMESPACE::PowerLevelController<T>;
PowerLevelController.
Definition: PowerLevelController.h:53
void onPowerLevel(SetPowerLevelCallback cb)
Set callback function for setPowerLevel request.
Definition: PowerLevelController.h:84
void onAdjustPowerLevel(AdjustPowerLevelCallback cb)
Set callback function for adjustPowerLevel request.
Definition: PowerLevelController.h:95
bool sendPowerLevelEvent(int powerLevel, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setPowerLevel event to SinricPro Server indicating actual power level.
Definition: PowerLevelController.h:110
std::function< bool(const String &, int &)> AdjustPowerLevelCallback
Definition for onAdjustPowerLevel callback.
Definition: PowerLevelController.h:45
std::function< bool(const String &, int &)> SetPowerLevelCallback
Definition for setPowerLevel callback.
Definition: PowerLevelController.h:30