SinricPro Library
MediaController.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(MEDIA, mediaControl); // "mediaControl"
11 FSTR(MEDIA, control); // "control"
12 
27 using MediaControlCallback = std::function<bool(const String &, String &)>;
28 
29 
34 template <typename T>
36  public:
38 
40  bool sendMediaControlEvent(String mediaControl, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
41 
42  protected:
43  bool handleMediaController(SinricProRequest &request);
44 
45  private:
46  EventLimiter event_limiter;
47  MediaControlCallback mediaControlCallback;
48 };
49 
50 template <typename T>
52 : event_limiter(EVENT_LIMIT_STATE) {
53  T* device = static_cast<T*>(this);
54  device->registerRequestHandler(std::bind(&MediaController<T>::handleMediaController, this, std::placeholders::_1));
55 }
56 
64 template <typename T>
66  mediaControlCallback = cb;
67 }
68 
78 template <typename T>
79 bool MediaController<T>::sendMediaControlEvent(String mediaControl, String cause) {
80  if (event_limiter) return false;
81  T* device = static_cast<T*>(this);
82 
83  JsonDocument eventMessage = device->prepareEvent(FSTR_MEDIA_mediaControl, cause.c_str());
84  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
85  event_value[FSTR_MEDIA_control] = mediaControl;
86  return device->sendEvent(eventMessage);
87 }
88 
89 template <typename T>
90 bool MediaController<T>::handleMediaController(SinricProRequest &request) {
91  T* device = static_cast<T*>(this);
92 
93  bool success = false;
94 
95  if (mediaControlCallback && request.action == FSTR_MEDIA_mediaControl) {
96  String mediaControl = request.request_value[FSTR_MEDIA_control];
97  success = mediaControlCallback(device->deviceId, mediaControl);
98  request.response_value[FSTR_MEDIA_control] = mediaControl;
99  return success;
100  }
101 
102  return success;
103 }
104 
105 } // SINRICPRO_NAMESPACE
106 
107 template <typename T>
108 using MediaController = SINRICPRO_NAMESPACE::MediaController<T>;
MediaController.
Definition: MediaController.h:35
bool sendMediaControlEvent(String mediaControl, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send mediaControl event to SinricPro Server indicating devices media control state.
Definition: MediaController.h:79
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: MediaController.h:65
std::function< bool(const String &, String &)> MediaControlCallback
Callback definition for onMediaControl function.
Definition: MediaController.h:27