SinricPro Library
VolumeController.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(VOLUME, setVolume); // "setVolume"
11 FSTR(VOLUME, volume); // "volume"
12 FSTR(VOLUME, adjustVolume); // "adjustVolume"
13 FSTR(VOLUME, volumeDefault); // "volumeDefault"
14 
29 using SetVolumeCallback = std::function<bool(const String &, int &)>;
30 
46 using AdjustVolumeCallback = std::function<bool(const String &, int &, bool)>;
47 
48 
53 template <typename T>
55  public:
57 
60 
61  bool sendVolumeEvent(int volume, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
62 
63  protected:
64  bool handleVolumeController(SinricProRequest &request);
65 
66  private:
67  EventLimiter event_limiter;
68  SetVolumeCallback volumeCallback;
69  AdjustVolumeCallback adjustVolumeCallback;
70 };
71 
72 template <typename T>
74 : event_limiter(EVENT_LIMIT_STATE) {
75  T* device = static_cast<T*>(this);
76  device->registerRequestHandler(std::bind(&VolumeController<T>::handleVolumeController, this, std::placeholders::_1));
77 }
78 
86 template <typename T>
87 void VolumeController<T>::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
88 
96 template <typename T>
97 void VolumeController<T>::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
98 
108 template <typename T>
109 bool VolumeController<T>::sendVolumeEvent(int volume, String cause) {
110  if (event_limiter) return false;
111  T* device = static_cast<T*>(this);
112 
113  JsonDocument eventMessage = device->prepareEvent(FSTR_VOLUME_setVolume, cause.c_str());
114  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
115  event_value[FSTR_VOLUME_volume] = volume;
116  return device->sendEvent(eventMessage);
117 }
118 
119 template <typename T>
120 bool VolumeController<T>::handleVolumeController(SinricProRequest &request) {
121  T* device = static_cast<T*>(this);
122 
123  bool success = false;
124 
125  if (volumeCallback && request.action == FSTR_VOLUME_setVolume) {
126  int volume = request.request_value[FSTR_VOLUME_volume];
127  success = volumeCallback(device->deviceId, volume);
128  request.response_value[FSTR_VOLUME_volume] = volume;
129  return success;
130  }
131 
132  if (adjustVolumeCallback && request.action == FSTR_VOLUME_adjustVolume) {
133  int volume = request.request_value[FSTR_VOLUME_volume];
134  bool volumeDefault = request.request_value[FSTR_VOLUME_volumeDefault] | false;
135  success = adjustVolumeCallback(device->deviceId, volume, volumeDefault);
136  request.response_value[FSTR_VOLUME_volume] = volume;
137  return success;
138  }
139  return success;
140 }
141 
142 } // SINRICPRO_NAMESPACE
143 
144 template <typename T>
145 using VolumeController = SINRICPRO_NAMESPACE::VolumeController<T>;
VolumeController.
Definition: VolumeController.h:54
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: VolumeController.h:97
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: VolumeController.h:87
bool sendVolumeEvent(int volume, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: VolumeController.h:109
std::function< bool(const String &, int &)> SetVolumeCallback
Callback definition for onSetVolume function.
Definition: VolumeController.h:29
std::function< bool(const String &, int &, bool)> AdjustVolumeCallback
Callback definition for onAdjustVolume function.
Definition: VolumeController.h:46