SinricPro Library
ChannelController.h
1 #ifndef _CHANNELCONTROLLER_H_
2 #define _CHANNELCONTROLLER_H_
3 
4 #include "SinricProRequest.h"
5 
10 template <typename T>
12  public:
13  ChannelController() { static_cast<T &>(*this).requestHandlers.push_back(std::bind(&ChannelController<T>::handleChannelController, this, std::placeholders::_1)); }
28  using ChangeChannelCallback = std::function<bool(const String &, String &)>;
29 
44  using ChangeChannelNumberCallback = std::function<bool(const String &, int, String &)>;
45 
60  using SkipChannelsCallback = std::function<bool(const String &, int, String &)>;
61 
65 
66  bool sendChangeChannelEvent(String channelName, String cause = "PHYSICAL_INTERACTION");
67  protected:
68  bool handleChannelController(SinricProRequest &request);
69 
70  private:
71  ChangeChannelCallback changeChannelCallback;
72  ChangeChannelNumberCallback changeChannelNumberCallback;
73  SkipChannelsCallback skipChannelsCallback;
74 };
75 
76 
84 template <typename T>
86  changeChannelCallback = cb;
87 }
88 
96 template <typename T>
98  changeChannelNumberCallback = cb;
99 }
100 
108 template <typename T>
110  skipChannelsCallback = cb;
111 }
112 
122 template <typename T>
123 bool ChannelController<T>::sendChangeChannelEvent(String channelName, String cause) {
124  T& device = static_cast<T&>(*this);
125 
126  DynamicJsonDocument eventMessage = device.prepareEvent("changeChannel", cause.c_str());
127  JsonObject event_value = eventMessage["payload"]["value"];
128  event_value["channel"]["name"] = channelName;
129  return device.sendEvent(eventMessage);
130 }
131 
132 template <typename T>
133 bool ChannelController<T>::handleChannelController(SinricProRequest &request) {
134  T &device = static_cast<T &>(*this);
135 
136  bool success = false;
137 
138  if (request.action == "changeChannel") {
139 
140  if (changeChannelCallback && request.request_value["channel"].containsKey("name")) {
141  String channelName = request.request_value["channel"]["name"] | "";
142  success = changeChannelCallback(device.deviceId, channelName);
143  request.response_value["channel"]["name"] = channelName;
144  }
145 
146  if (changeChannelNumberCallback && request.request_value["channel"].containsKey("number")) {
147  int channelNumber = request.request_value["channel"]["number"];
148  String channelName("");
149  success = changeChannelNumberCallback(device.deviceId, channelNumber, channelName);
150  request.response_value["channel"]["name"] = channelName;
151  }
152  return success;
153  }
154 
155  if (skipChannelsCallback && request.action == "skipChannels") {
156  int channelCount = request.request_value["channelCount"] | 0;
157  String channelName;
158  success = skipChannelsCallback(device.deviceId, channelCount, channelName);
159  request.response_value["channel"]["name"] = channelName;
160  return success;
161  }
162 
163  return success;
164 }
165 
166 #endif
ChannelController.
Definition: ChannelController.h:11
std::function< bool(const String &, int, String &)> SkipChannelsCallback
Callback definition for onSkipChannels function.
Definition: ChannelController.h:60
std::function< bool(const String &, String &)> ChangeChannelCallback
Callback definition for onChangeChannel function.
Definition: ChannelController.h:28
void onChangeChannel(ChangeChannelCallback cb)
Set callback function for changeChannel request.
Definition: ChannelController.h:85
bool sendChangeChannelEvent(String channelName, String cause="PHYSICAL_INTERACTION")
Send changeChannel event to SinricPro Server to report selected channel.
Definition: ChannelController.h:123
void onSkipChannels(SkipChannelsCallback cb)
Set callback function for skipChannels request.
Definition: ChannelController.h:109
std::function< bool(const String &, int, String &)> ChangeChannelNumberCallback
Callback definition for onChangeChannelNumber function.
Definition: ChannelController.h:44
void onChangeChannelNumber(ChangeChannelNumberCallback cb)
Set callback function for changeChannel request.
Definition: ChannelController.h:97