SinricPro Library
PercentageController.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(PERCENTAGE, setPercentage); // "setPercentage"
11 FSTR(PERCENTAGE, percentage); // "percentage"
12 FSTR(PERCENTAGE, adjustPercentage); // "adjustPercentage"
13 
29 using SetPercentageCallback = std::function<bool(const String &, int &)>;
44 using AdjustPercentageCallback = std::function<bool(const String &, int &)>;
45 
46 
51 template <typename T>
53  public:
55 
56  void onSetPercentage(SetPercentageCallback cb);
57  void onAdjustPercentage(AdjustPercentageCallback cb);
58 
59  bool sendSetPercentageEvent(int percentage, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
60 
61  protected:
62  bool handlePercentageController(SinricProRequest &request);
63 
64  private:
65  EventLimiter event_limiter;
66  SetPercentageCallback percentageCallback;
67  AdjustPercentageCallback adjustPercentageCallback;
68 };
69 
70 template <typename T>
72 : event_limiter(EVENT_LIMIT_STATE) {
73  T* device = static_cast<T*>(this);
74  device->registerRequestHandler(std::bind(&PercentageController<T>::handlePercentageController, this, std::placeholders::_1));
75 }
76 
84 template <typename T>
86 
94 template <typename T>
95 void PercentageController<T>::onAdjustPercentage(AdjustPercentageCallback cb) { adjustPercentageCallback = cb; }
96 
106 template <typename T>
107 bool PercentageController<T>::sendSetPercentageEvent(int percentage, String cause) {
108  if (event_limiter) return false;
109  T* device = static_cast<T*>(this);
110 
111  JsonDocument eventMessage = device->prepareEvent(FSTR_PERCENTAGE_setPercentage, cause.c_str());
112  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
113  event_value[FSTR_PERCENTAGE_percentage] = percentage;
114  return device->sendEvent(eventMessage);
115 }
116 
117 template <typename T>
118 bool PercentageController<T>::handlePercentageController(SinricProRequest &request) {
119  T* device = static_cast<T*>(this);
120 
121  bool success = false;
122 
123  if (percentageCallback && request.action == FSTR_PERCENTAGE_setPercentage) {
124  int percentage = request.request_value[FSTR_PERCENTAGE_percentage];
125  success = percentageCallback(device->deviceId, percentage);
126  request.response_value[FSTR_PERCENTAGE_percentage] = percentage;
127  return success;
128  }
129 
130  if (adjustPercentageCallback && request.action == FSTR_PERCENTAGE_adjustPercentage) {
131  int percentage = request.request_value[FSTR_PERCENTAGE_percentage];
132  success = adjustPercentageCallback(device->deviceId, percentage);
133  request.response_value[FSTR_PERCENTAGE_percentage] = percentage;
134  return success;
135  }
136  return success;
137 }
138 
139 } // SINRICPRO_NAMESPACE
140 
141 template <typename T>
142 using PercentageController = SINRICPRO_NAMESPACE::PercentageController<T>;
PercentageController.
Definition: PercentageController.h:52
void onAdjustPercentage(AdjustPercentageCallback cb)
Set callback function for adjustPercentage request.
Definition: PercentageController.h:95
bool sendSetPercentageEvent(int percentage, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setPercentage event to SinricPro Server indicating actual percentage has changed.
Definition: PercentageController.h:107
void onSetPercentage(SetPercentageCallback cb)
Set callback function for setPercentage request.
Definition: PercentageController.h:85
std::function< bool(const String &, int &)> AdjustPercentageCallback
Callback definition for onAdjustPercentage function.
Definition: PercentageController.h:44
std::function< bool(const String &, int &)> SetPercentageCallback
Callback definition for onSetPercentage function.
Definition: PercentageController.h:29