SinricPro Library
SinricProSpeaker.h
1 /*
2  * Copyright (c) 2019 Sinric. All rights reserved.
3  * Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
4  *
5  * This file is part of the Sinric Pro (https://github.com/sinricpro/)
6  */
7 
8 #ifndef _SINRICSPEAKER_H_
9 #define _SINRICSPEAKER_H_
10 
11 #include "SinricProDevice.h"
12 
33  public:
34  SinricProSpeaker(const char* deviceId, unsigned long eventWaitTime=100);
35  // callbacks
36 
51  typedef std::function<bool(const String&, int&)> SetVolumeCallback;
52 
67  typedef std::function<bool(const String&, int&)> AdjustVolumeCallback;
68 
83  typedef std::function<bool(const String&, bool&)> MuteCallback;
84 
99  typedef std::function<bool(const String&, String&)> MediaControlCallback;
100 
117  typedef std::function<bool(const String&, const String&, int&)> SetBandsCallback;
118 
135  typedef std::function<bool(const String&, const String&, int&)> AdjustBandsCallback;
136 
152  typedef std::function<bool(const String&, const String&, int&)> ResetBandsCallback;
153  typedef std::function<bool(const String&, String&)> ModeCallback;
168 
171  void onMute(MuteCallback cb);
173  void onSetBands(SetBandsCallback cb);
176  void onSetMode(ModeCallback cb);
177 
178  // event
179  bool sendVolumeEvent(int volume, String cause = "PHYSICAL_INTERACTION");
180  bool sendMuteEvent(bool mute, String cause = "PHYSICAL_INTERACTION");
181  bool sendMediaControlEvent(String mediaControl, String cause = "PHYSICAL_INTERACTION");
182  bool sendBandsEvent(String bands, int level, String cause = "PHYSICAL_INTERACTION");
183  bool sendModeEvent(String mode, String cause = "PHYSICAL_INTERACTION");
184  // handle
185  bool handleRequest(const char* deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
186  private:
187  SetVolumeCallback volumeCallback;
188  AdjustVolumeCallback adjustVolumeCallback;
189  MuteCallback muteCallback;
190  MediaControlCallback mediaControlCallback;
191  SetBandsCallback setBandsCallback;
192  AdjustBandsCallback adjustBandsCallback;
193  ResetBandsCallback resetBandsCallback;
194  ModeCallback setModeCallback;
195 };
196 
197 
198 SinricProSpeaker::SinricProSpeaker(const char* deviceId, unsigned long eventWaitTime) : SinricProDevice(deviceId, eventWaitTime),
199  volumeCallback(nullptr),
200  adjustVolumeCallback(nullptr),
201  muteCallback(nullptr),
202  mediaControlCallback(nullptr),
203  setBandsCallback(nullptr),
204  adjustBandsCallback(nullptr),
205  resetBandsCallback(nullptr),
206  setModeCallback(nullptr) {
207 }
208 
209 bool SinricProSpeaker::handleRequest(const char* deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) {
210  if (strcmp(deviceId, this->deviceId) != 0) return false;
211  if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value)) return true;
212 
213  bool success = false;
214  String actionString = String(action);
215 
216  if (volumeCallback && actionString == "setVolume") {
217  int volume = request_value["volume"];
218  success = volumeCallback(String(deviceId), volume);
219  response_value["volume"] = volume;
220  return success;
221  }
222 
223  if (adjustVolumeCallback && actionString == "adjustVolume") {
224  int volume = request_value["volume"];
225  success = adjustVolumeCallback(String(deviceId), volume);
226  response_value["volume"] = volume;
227  return success;
228  }
229 
230  if (muteCallback && actionString == "setMute") {
231  bool mute = request_value["mute"];
232  success = muteCallback(String(deviceId), mute);
233  response_value["mute"] = mute;
234  return success;
235  }
236 
237  if (setModeCallback && actionString == "setMode") {
238  String mode = request_value["mode"] | "";
239  success = setModeCallback(String(deviceId), mode);
240  response_value["mode"] = mode;
241  return success;
242  }
243 
244  if (mediaControlCallback && actionString == "mediaControl") {
245  String mediaControl = request_value["control"];
246  success = mediaControlCallback(String(deviceId), mediaControl);
247  response_value["control"] = mediaControl;
248  return success;
249  }
250 
251  if (setBandsCallback && actionString == "setBands") {
252  JsonArray bands_array = request_value["bands"];
253  JsonArray response_value_bands = response_value.createNestedArray("bands");
254 
255  for (size_t i=0; i<bands_array.size(); i++) {
256  int level = bands_array[i]["level"] | 0;
257  String bandsName = bands_array[i]["name"] | "";
258  success = setBandsCallback(deviceId, bandsName, level);
259  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
260  response_value_bands_i["name"] = bandsName;
261  response_value_bands_i["level"] = level;
262  }
263  return success;
264  }
265 
266  if (setBandsCallback && actionString == "adjustBands") {
267  JsonArray bands_array = request_value["bands"];
268  JsonArray response_value_bands = response_value.createNestedArray("bands");
269 
270  for (size_t i=0; i<bands_array.size(); i++) {
271  int levelDelta = bands_array[i]["levelDelta"] | 1;
272  String direction = bands_array[i]["levelDirection"];
273  if (direction=="DOWN") levelDelta *= -1;
274  String bandsName = bands_array[i]["name"] | "";
275  success = adjustBandsCallback(deviceId, bandsName, levelDelta);
276  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
277  response_value_bands_i["name"] = bandsName;
278  response_value_bands_i["level"] = levelDelta;
279  }
280  return success;
281  }
282 
283  if (resetBandsCallback && actionString == "resetBands") {
284  JsonArray bands_array = request_value["bands"];
285  JsonArray response_value_bands = response_value.createNestedArray("bands");
286 
287  for (size_t i=0; i<bands_array.size(); i++) {
288  int level = 0;
289  String bandsName = bands_array[i]["name"] | "";
290  success = adjustBandsCallback(deviceId, bandsName, level);
291  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
292  response_value_bands_i["name"] = bandsName;
293  response_value_bands_i["level"] = level;
294  }
295  return success;
296  }
297 
298  return success;
299 }
300 
308 void SinricProSpeaker::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
309 
317 void SinricProSpeaker::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
318 
326 void SinricProSpeaker::onMute(MuteCallback cb) { muteCallback = cb; }
327 
335 void SinricProSpeaker::onMediaControl(MediaControlCallback cb) { mediaControlCallback = cb; }
336 
344 void SinricProSpeaker::onSetBands(SetBandsCallback cb) { setBandsCallback = cb; }
345 
353 void SinricProSpeaker::onAdjustBands(AdjustBandsCallback cb) { adjustBandsCallback = cb; }
354 
362 void SinricProSpeaker::onResetBands(ResetBandsCallback cb) { resetBandsCallback = cb; }
363 
371 void SinricProSpeaker::onSetMode(ModeCallback cb) { setModeCallback = cb; }
372 
382 bool SinricProSpeaker::sendVolumeEvent(int volume, String cause) {
383  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setVolume", cause.c_str());
384  JsonObject event_value = eventMessage["payload"]["value"];
385  event_value["volume"] = volume;
386  return sendEvent(eventMessage);
387 }
388 
398 bool SinricProSpeaker::sendMuteEvent(bool mute, String cause) {
399  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setMute", cause.c_str());
400  JsonObject event_value = eventMessage["payload"]["value"];
401  event_value["mute"] = mute;
402  return sendEvent(eventMessage);
403 }
404 
414 bool SinricProSpeaker::sendMediaControlEvent(String mediaControl, String cause) {
415  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "mediaControl", cause.c_str());
416  JsonObject event_value = eventMessage["payload"]["value"];
417  event_value["control"] = mediaControl;
418  return sendEvent(eventMessage);
419 }
420 
430 bool SinricProSpeaker::sendModeEvent(String mode, String cause) {
431  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setMode", cause.c_str());
432  JsonObject event_value = eventMessage["payload"]["value"];
433  event_value["mode"] = mode;
434  return sendEvent(eventMessage);
435 }
436 
447 bool SinricProSpeaker::sendBandsEvent(String bands, int level, String cause) {
448  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setBands", cause.c_str());
449  JsonObject event_value = eventMessage["payload"]["value"];
450  JsonArray event_value_bands = event_value.createNestedArray("bands");
451  JsonObject event_bands = event_value_bands.createNestedObject();
452  event_bands["name"] = bands;
453  event_bands["value"] = level;
454  return sendEvent(eventMessage);
455 }
456 
457 
458 #endif
459 
SinricProSpeaker::SetVolumeCallback
std::function< bool(const String &, int &)> SetVolumeCallback
Callback definition for onSetVolume function.
Definition: SinricProSpeaker.h:51
SinricProSpeaker::AdjustVolumeCallback
std::function< bool(const String &, int &)> AdjustVolumeCallback
Callback definition for onAdjustVolume function.
Definition: SinricProSpeaker.h:67
SinricProSpeaker::SetBandsCallback
std::function< bool(const String &, const String &, int &)> SetBandsCallback
Callback definition for onSetBands function.
Definition: SinricProSpeaker.h:117
SinricProSpeaker::MuteCallback
std::function< bool(const String &, bool &)> MuteCallback
Callback definition for onMute function.
Definition: SinricProSpeaker.h:83
SinricProSpeaker::sendModeEvent
bool sendModeEvent(String mode, String cause="PHYSICAL_INTERACTION")
Send setMode event to SinricPro Server indicating the mode has changed.
Definition: SinricProSpeaker.h:430
SinricProSpeaker::sendMuteEvent
bool sendMuteEvent(bool mute, String cause="PHYSICAL_INTERACTION")
Send setMute event to SinricPro Server indicating actual mute state.
Definition: SinricProSpeaker.h:398
SinricProSpeaker::ResetBandsCallback
std::function< bool(const String &, const String &, int &)> ResetBandsCallback
Callback definition for onResetBands function.
Definition: SinricProSpeaker.h:152
SinricProSpeaker::ModeCallback
std::function< bool(const String &, String &)> ModeCallback
Callback definition for onSetMode function.
Definition: SinricProSpeaker.h:167
SinricProSpeaker::onSetBands
void onSetBands(SetBandsCallback cb)
Set callback function for setBands request.
Definition: SinricProSpeaker.h:344
SinricProSpeaker::onAdjustBands
void onAdjustBands(AdjustBandsCallback cb)
Set callback function for adjustBands request.
Definition: SinricProSpeaker.h:353
SinricProSpeaker::onAdjustVolume
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: SinricProSpeaker.h:317
SinricProSpeaker::onSetMode
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition: SinricProSpeaker.h:371
SinricProSpeaker::sendVolumeEvent
bool sendVolumeEvent(int volume, String cause="PHYSICAL_INTERACTION")
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: SinricProSpeaker.h:382
SinricProSpeaker::MediaControlCallback
std::function< bool(const String &, String &)> MediaControlCallback
Callback definition for onMediaControl function.
Definition: SinricProSpeaker.h:99
SinricProSpeaker::sendBandsEvent
bool sendBandsEvent(String bands, int level, String cause="PHYSICAL_INTERACTION")
Send setBands event to SinricPro Server indicating bands level has changed.
Definition: SinricProSpeaker.h:447
SinricProSpeaker::onSetVolume
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: SinricProSpeaker.h:308
SinricProSpeaker
Device to control a smart speaker.
Definition: SinricProSpeaker.h:32
SinricProSpeaker::sendMediaControlEvent
bool sendMediaControlEvent(String mediaControl, String cause="PHYSICAL_INTERACTION")
Send mediaControl event to SinricPro Server indicating devices media control state.
Definition: SinricProSpeaker.h:414
SinricProSpeaker::onResetBands
void onResetBands(ResetBandsCallback cb)
Set callback function for resetBands request.
Definition: SinricProSpeaker.h:362
SinricProSpeaker::AdjustBandsCallback
std::function< bool(const String &, const String &, int &)> AdjustBandsCallback
Callback definition for onAdjustBands function.
Definition: SinricProSpeaker.h:135
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:23
SinricProSpeaker::onMute
void onMute(MuteCallback cb)
Set callback function for setMute request.
Definition: SinricProSpeaker.h:326
SinricProSpeaker::onMediaControl
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: SinricProSpeaker.h:335