SinricPro Library
EqualizerController.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(EQUALIZER, setBands); // "setBands"
11 FSTR(EQUALIZER, bands); // "bands"
12 FSTR(EQUALIZER, name); // "name"
13 FSTR(EQUALIZER, value); // "value"
14 FSTR(EQUALIZER, level); // "level"
15 FSTR(EQUALIZER, adjustBands); // "adjustBands"
16 FSTR(EQUALIZER, levelDelta); // "levelDelta"
17 FSTR(EQUALIZER, levelDirection); // "levelDirection"
18 FSTR(EQUALIZER, DOWN); // "DOWN"
19 FSTR(EQUALIZER, resetBands); // "resetBands"
20 
37 using SetBandsCallback = std::function<bool(const String &, const String &, int &)>;
38 
55 using AdjustBandsCallback = std::function<bool(const String &, const String &, int &)>;
56 
72 using ResetBandsCallback = std::function<bool(const String &, const String &, int &)>;
73 
78 template <typename T>
80 public:
82 
86 
87  bool sendBandsEvent(String bands, int level, String cause = "PHYSICAL_INTERACTION");
88 
89 protected:
90  bool handleEqualizerController(SinricProRequest &request);
91 
92 private:
93  EventLimiter event_limiter;
94  SetBandsCallback setBandsCallback;
95  AdjustBandsCallback adjustBandsCallback;
96  ResetBandsCallback resetBandsCallback;
97 };
98 
99 template <typename T>
101 : event_limiter(EVENT_LIMIT_STATE) {
102  T* device = static_cast<T*>(this);
103  device->registerRequestHandler(std::bind(&EqualizerController<T>::handleEqualizerController, this, std::placeholders::_1));
104 }
105 
113 template <typename T>
114 void EqualizerController<T>::onSetBands(SetBandsCallback cb) { setBandsCallback = cb; }
115 
123 template <typename T>
124 void EqualizerController<T>::onAdjustBands(AdjustBandsCallback cb) { adjustBandsCallback = cb; }
125 
133 template <typename T>
134 void EqualizerController<T>::onResetBands(ResetBandsCallback cb) { resetBandsCallback = cb; }
135 
146 template <typename T>
147 bool EqualizerController<T>::sendBandsEvent(String bands, int level, String cause) {
148  if (event_limiter) return false;
149  T* device = static_cast<T*>(this);
150 
151  JsonDocument eventMessage = device->prepareEvent(FSTR_EQUALIZER_setBands, cause.c_str());
152  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
153  JsonArray event_value_bands = event_value.createNestedArray(FSTR_EQUALIZER_bands);
154  JsonObject event_bands = event_value_bands.add<JsonObject>();
155  event_bands[FSTR_EQUALIZER_name] = bands;
156  event_bands[FSTR_EQUALIZER_value] = level;
157  return device->sendEvent(eventMessage);
158 }
159 
160 template <typename T>
161 bool EqualizerController<T>::handleEqualizerController(SinricProRequest &request) {
162  T* device = static_cast<T*>(this);
163  bool success = false;
164 
165  if (setBandsCallback && request.action == FSTR_EQUALIZER_setBands) {
166  JsonArray bands_array = request.request_value[FSTR_EQUALIZER_bands];
167  JsonArray response_value_bands = request.response_value[FSTR_EQUALIZER_bands].to<JsonArray>();
168 
169  for (size_t i = 0; i < bands_array.size(); i++) {
170  int level = bands_array[i][FSTR_EQUALIZER_level] | 0;
171  String bandsName = bands_array[i][FSTR_EQUALIZER_name] | "";
172  success = setBandsCallback(device->deviceId, bandsName, level);
173  JsonObject response_value_bands_i = response_value_bands.add<JsonObject>();
174  response_value_bands_i[FSTR_EQUALIZER_name] = bandsName;
175  response_value_bands_i[FSTR_EQUALIZER_level] = level;
176  }
177  return success;
178  }
179 
180  if (adjustBandsCallback && request.action == FSTR_EQUALIZER_adjustBands) {
181  JsonArray bands_array = request.request_value[FSTR_EQUALIZER_bands];
182  JsonArray response_value_bands = request.response_value[FSTR_EQUALIZER_bands].to<JsonArray>();
183 
184  for (size_t i = 0; i < bands_array.size(); i++) {
185  int levelDelta = bands_array[i][FSTR_EQUALIZER_levelDelta] | 1;
186  String direction = bands_array[i][FSTR_EQUALIZER_levelDirection];
187  if (direction == FSTR_EQUALIZER_DOWN)
188  levelDelta *= -1;
189  String bandsName = bands_array[i][FSTR_EQUALIZER_name] | "";
190  success = adjustBandsCallback(device->deviceId, bandsName, levelDelta);
191  JsonObject response_value_bands_i = response_value_bands.add<JsonObject>();
192  response_value_bands_i[FSTR_EQUALIZER_name] = bandsName;
193  response_value_bands_i[FSTR_EQUALIZER_level] = levelDelta;
194  }
195  return success;
196  }
197 
198  if (resetBandsCallback && request.action == FSTR_EQUALIZER_resetBands) {
199  JsonArray bands_array = request.request_value[FSTR_EQUALIZER_bands];
200  JsonArray response_value_bands = request.response_value[FSTR_EQUALIZER_bands].to<JsonArray>();
201 
202  for (size_t i = 0; i < bands_array.size(); i++) {
203  int level = 0;
204  String bandsName = bands_array[i][FSTR_EQUALIZER_name] | "";
205  success = adjustBandsCallback(device->deviceId, bandsName, level);
206  JsonObject response_value_bands_i = response_value_bands.add<JsonObject>();
207  response_value_bands_i[FSTR_EQUALIZER_name] = bandsName;
208  response_value_bands_i[FSTR_EQUALIZER_level] = level;
209  }
210  return success;
211  }
212 
213  return success;
214 }
215 
216 } // SINRICPRO_NAMESPACE
217 
218 template <typename T>
219 using EqualizerController = SINRICPRO_NAMESPACE::EqualizerController<T>;
EqualizerController.
Definition: EqualizerController.h:79
void onAdjustBands(AdjustBandsCallback cb)
Set callback function for adjustBands request.
Definition: EqualizerController.h:124
void onSetBands(SetBandsCallback cb)
Set callback function for setBands request.
Definition: EqualizerController.h:114
bool sendBandsEvent(String bands, int level, String cause="PHYSICAL_INTERACTION")
Send setBands event to SinricPro Server indicating bands level has changed.
Definition: EqualizerController.h:147
void onResetBands(ResetBandsCallback cb)
Set callback function for resetBands request.
Definition: EqualizerController.h:134
std::function< bool(const String &, const String &, int &)> AdjustBandsCallback
Callback definition for onAdjustBands function.
Definition: EqualizerController.h:55
std::function< bool(const String &, const String &, int &)> ResetBandsCallback
Callback definition for onResetBands function.
Definition: EqualizerController.h:72
std::function< bool(const String &, const String &, int &)> SetBandsCallback
Callback definition for onSetBands function.
Definition: EqualizerController.h:37