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 DeviceId &deviceId);
35  String getProductType() { return SinricProDevice::getProductType() + String("SPEAKER"); }
36  // callbacks
37 
52  typedef std::function<bool(const String&, int&)> SetVolumeCallback;
53 
69  typedef std::function<bool(const String&, int&, bool)> AdjustVolumeCallback;
70 
85  typedef std::function<bool(const String&, bool&)> MuteCallback;
86 
101  typedef std::function<bool(const String&, String&)> MediaControlCallback;
102 
117  typedef std::function<bool(const String&, String&)> SelectInputCallback;
118 
135  typedef std::function<bool(const String&, const String&, int&)> SetBandsCallback;
136 
153  typedef std::function<bool(const String&, const String&, int&)> AdjustBandsCallback;
154 
170  typedef std::function<bool(const String&, const String&, int&)> ResetBandsCallback;
171  typedef std::function<bool(const String&, String&)> ModeCallback;
186 
189  void onMute(MuteCallback cb);
192  void onSetBands(SetBandsCallback cb);
195  void onSetMode(ModeCallback cb);
196 
197  // event
198  bool sendVolumeEvent(int volume, String cause = "PHYSICAL_INTERACTION");
199  bool sendMuteEvent(bool mute, String cause = "PHYSICAL_INTERACTION");
200  bool sendMediaControlEvent(String mediaControl, String cause = "PHYSICAL_INTERACTION");
201  bool sendSelectInputEvent(String intput, String cause = "PHYSICAL_INTERACTION");
202  bool sendBandsEvent(String bands, int level, String cause = "PHYSICAL_INTERACTION");
203  bool sendModeEvent(String mode, String cause = "PHYSICAL_INTERACTION");
204  // handle
205  bool handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
206  private:
207  SetVolumeCallback volumeCallback;
208  AdjustVolumeCallback adjustVolumeCallback;
209  MuteCallback muteCallback;
210  MediaControlCallback mediaControlCallback;
211  SelectInputCallback selectInputCallback;
212  SetBandsCallback setBandsCallback;
213  AdjustBandsCallback adjustBandsCallback;
214  ResetBandsCallback resetBandsCallback;
215  ModeCallback setModeCallback;
216 };
217 
218 
219 SinricProSpeaker::SinricProSpeaker(const DeviceId &deviceId) : SinricProDevice(deviceId),
220  volumeCallback(nullptr),
221  adjustVolumeCallback(nullptr),
222  muteCallback(nullptr),
223  mediaControlCallback(nullptr),
224  setBandsCallback(nullptr),
225  adjustBandsCallback(nullptr),
226  resetBandsCallback(nullptr),
227  setModeCallback(nullptr) {
228 }
229 
230 bool SinricProSpeaker::handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) {
231  if (deviceId != this->deviceId) return false;
232  if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value)) return true;
233 
234  bool success = false;
235  String actionString = String(action);
236 
237  if (volumeCallback && actionString == "setVolume") {
238  int volume = request_value["volume"];
239  success = volumeCallback(deviceId, volume);
240  response_value["volume"] = limitValue(volume, 0, 100);
241  return success;
242  }
243 
244  if (adjustVolumeCallback && actionString == "adjustVolume") {
245  int volume = request_value["volume"];
246  bool volumeDefault = request_value["volumeDefault"] | false;
247  success = adjustVolumeCallback(deviceId, volume, volumeDefault);
248  response_value["volume"] = limitValue(volume, 0, 100);
249  return success;
250  }
251 
252  if (muteCallback && actionString == "setMute") {
253  bool mute = request_value["mute"];
254  success = muteCallback(deviceId, mute);
255  response_value["mute"] = mute;
256  return success;
257  }
258 
259  if (setModeCallback && actionString == "setMode") {
260  String mode = request_value["mode"] | "";
261  success = setModeCallback(deviceId, mode);
262  response_value["mode"] = mode;
263  return success;
264  }
265 
266  if (mediaControlCallback && actionString == "mediaControl") {
267  String mediaControl = request_value["control"];
268  success = mediaControlCallback(deviceId, mediaControl);
269  response_value["control"] = mediaControl;
270  return success;
271  }
272 
273  if (selectInputCallback && actionString == "selectInput") {
274  String input = request_value["input"];
275  success = selectInputCallback(deviceId, input);
276  response_value["input"] = input;
277  return success;
278  }
279 
280  if (setBandsCallback && actionString == "setBands") {
281  JsonArray bands_array = request_value["bands"];
282  JsonArray response_value_bands = response_value.createNestedArray("bands");
283 
284  for (size_t i=0; i<bands_array.size(); i++) {
285  int level = bands_array[i]["level"] | 0;
286  String bandsName = bands_array[i]["name"] | "";
287  success = setBandsCallback(deviceId, bandsName, level);
288  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
289  response_value_bands_i["name"] = bandsName;
290  response_value_bands_i["level"] = limitValue(level, 0, 100);
291  }
292  return success;
293  }
294 
295  if (setBandsCallback && actionString == "adjustBands") {
296  JsonArray bands_array = request_value["bands"];
297  JsonArray response_value_bands = response_value.createNestedArray("bands");
298 
299  for (size_t i=0; i<bands_array.size(); i++) {
300  int levelDelta = bands_array[i]["levelDelta"] | 1;
301  String direction = bands_array[i]["levelDirection"];
302  if (direction=="DOWN") levelDelta *= -1;
303  String bandsName = bands_array[i]["name"] | "";
304  success = adjustBandsCallback(deviceId, bandsName, levelDelta);
305  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
306  response_value_bands_i["name"] = bandsName;
307  response_value_bands_i["level"] = limitValue(levelDelta, 0, 100);
308  }
309  return success;
310  }
311 
312  if (resetBandsCallback && actionString == "resetBands") {
313  JsonArray bands_array = request_value["bands"];
314  JsonArray response_value_bands = response_value.createNestedArray("bands");
315 
316  for (size_t i=0; i<bands_array.size(); i++) {
317  int level = 0;
318  String bandsName = bands_array[i]["name"] | "";
319  success = adjustBandsCallback(deviceId, bandsName, level);
320  JsonObject response_value_bands_i = response_value_bands.createNestedObject();
321  response_value_bands_i["name"] = bandsName;
322  response_value_bands_i["level"] = limitValue(level, 0, 100);
323  }
324  return success;
325  }
326 
327  return success;
328 }
329 
337 void SinricProSpeaker::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
338 
346 void SinricProSpeaker::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
347 
355 void SinricProSpeaker::onMute(MuteCallback cb) { muteCallback = cb; }
356 
364 void SinricProSpeaker::onMediaControl(MediaControlCallback cb) { mediaControlCallback = cb; }
365 
373 void SinricProSpeaker::onSelectInput(SelectInputCallback cb) { selectInputCallback = cb; }
374 
382 void SinricProSpeaker::onSetBands(SetBandsCallback cb) { setBandsCallback = cb; }
383 
391 void SinricProSpeaker::onAdjustBands(AdjustBandsCallback cb) { adjustBandsCallback = cb; }
392 
400 void SinricProSpeaker::onResetBands(ResetBandsCallback cb) { resetBandsCallback = cb; }
401 
409 void SinricProSpeaker::onSetMode(ModeCallback cb) { setModeCallback = cb; }
410 
420 bool SinricProSpeaker::sendVolumeEvent(int volume, String cause) {
421  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setVolume", cause.c_str());
422  JsonObject event_value = eventMessage["payload"]["value"];
423  event_value["volume"] = volume;
424  return sendEvent(eventMessage);
425 }
426 
436 bool SinricProSpeaker::sendMuteEvent(bool mute, String cause) {
437  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setMute", cause.c_str());
438  JsonObject event_value = eventMessage["payload"]["value"];
439  event_value["mute"] = mute;
440  return sendEvent(eventMessage);
441 }
442 
452 bool SinricProSpeaker::sendMediaControlEvent(String mediaControl, String cause) {
453  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "mediaControl", cause.c_str());
454  JsonObject event_value = eventMessage["payload"]["value"];
455  event_value["control"] = mediaControl;
456  return sendEvent(eventMessage);
457 }
458 
468 bool SinricProSpeaker::sendSelectInputEvent(String input, String cause) {
469  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "selectInput", cause.c_str());
470  JsonObject event_value = eventMessage["payload"]["value"];
471  event_value["input"] = input;
472  return sendEvent(eventMessage);
473 }
474 
475 
485 bool SinricProSpeaker::sendModeEvent(String mode, String cause) {
486  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setMode", cause.c_str());
487  JsonObject event_value = eventMessage["payload"]["value"];
488  event_value["mode"] = mode;
489  return sendEvent(eventMessage);
490 }
491 
502 bool SinricProSpeaker::sendBandsEvent(String bands, int level, String cause) {
503  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setBands", cause.c_str());
504  JsonObject event_value = eventMessage["payload"]["value"];
505  JsonArray event_value_bands = event_value.createNestedArray("bands");
506  JsonObject event_bands = event_value_bands.createNestedObject();
507  event_bands["name"] = bands;
508  event_bands["value"] = level;
509  return sendEvent(eventMessage);
510 }
511 
512 
513 #endif
514 
SinricProSpeaker::SetVolumeCallback
std::function< bool(const String &, int &)> SetVolumeCallback
Callback definition for onSetVolume function.
Definition: SinricProSpeaker.h:52
SinricProSpeaker::SetBandsCallback
std::function< bool(const String &, const String &, int &)> SetBandsCallback
Callback definition for onSetBands function.
Definition: SinricProSpeaker.h:135
SinricProSpeaker::MuteCallback
std::function< bool(const String &, bool &)> MuteCallback
Callback definition for onMute function.
Definition: SinricProSpeaker.h:85
SinricProSpeaker::sendModeEvent
bool sendModeEvent(String mode, String cause="PHYSICAL_INTERACTION")
Send setMode event to SinricPro Server indicating the mode has changed.
Definition: SinricProSpeaker.h:485
SinricProSpeaker::sendMuteEvent
bool sendMuteEvent(bool mute, String cause="PHYSICAL_INTERACTION")
Send setMute event to SinricPro Server indicating actual mute state.
Definition: SinricProSpeaker.h:436
SinricProSpeaker::ResetBandsCallback
std::function< bool(const String &, const String &, int &)> ResetBandsCallback
Callback definition for onResetBands function.
Definition: SinricProSpeaker.h:170
SinricProSpeaker::ModeCallback
std::function< bool(const String &, String &)> ModeCallback
Callback definition for onSetMode function.
Definition: SinricProSpeaker.h:185
SinricProSpeaker::onSetBands
void onSetBands(SetBandsCallback cb)
Set callback function for setBands request.
Definition: SinricProSpeaker.h:382
SinricProSpeaker::onAdjustBands
void onAdjustBands(AdjustBandsCallback cb)
Set callback function for adjustBands request.
Definition: SinricProSpeaker.h:391
SinricProSpeaker::onAdjustVolume
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: SinricProSpeaker.h:346
SinricProSpeaker::sendSelectInputEvent
bool sendSelectInputEvent(String intput, String cause="PHYSICAL_INTERACTION")
Send selectInput event to SinricPro Server to report selected input.
Definition: SinricProSpeaker.h:468
SinricProSpeaker::onSetMode
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition: SinricProSpeaker.h:409
SinricProSpeaker::sendVolumeEvent
bool sendVolumeEvent(int volume, String cause="PHYSICAL_INTERACTION")
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: SinricProSpeaker.h:420
SinricProSpeaker::SelectInputCallback
std::function< bool(const String &, String &)> SelectInputCallback
Callback definition for onSelectInput function.
Definition: SinricProSpeaker.h:117
SinricProSpeaker::MediaControlCallback
std::function< bool(const String &, String &)> MediaControlCallback
Callback definition for onMediaControl function.
Definition: SinricProSpeaker.h:101
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:502
SinricProSpeaker::onSelectInput
void onSelectInput(SelectInputCallback cb)
Set callback function for selectInput request.
Definition: SinricProSpeaker.h:373
SinricProSpeaker::onSetVolume
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: SinricProSpeaker.h:337
SinricProSpeaker::AdjustVolumeCallback
std::function< bool(const String &, int &, bool)> AdjustVolumeCallback
Callback definition for onAdjustVolume function.
Definition: SinricProSpeaker.h:69
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:452
SinricProSpeaker::onResetBands
void onResetBands(ResetBandsCallback cb)
Set callback function for resetBands request.
Definition: SinricProSpeaker.h:400
SinricProSpeaker::AdjustBandsCallback
std::function< bool(const String &, const String &, int &)> AdjustBandsCallback
Callback definition for onAdjustBands function.
Definition: SinricProSpeaker.h:153
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:24
SinricProSpeaker::onMute
void onMute(MuteCallback cb)
Set callback function for setMute request.
Definition: SinricProSpeaker.h:355
SinricProSpeaker::onMediaControl
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: SinricProSpeaker.h:364