SinricPro Library
ChannelController.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(CHANNEL, changeChannel); // "changeChannel"
11 FSTR(CHANNEL, channel); // "channel"
12 FSTR(CHANNEL, name); // "name"
13 FSTR(CHANNEL, number); // "number"
14 FSTR(CHANNEL, skipChannels); // "skipChannels"
15 FSTR(CHANNEL, channelCount); // "channelCount"
16 
31 using ChangeChannelCallback = std::function<bool(const String &, String &)>;
32 
47 using ChangeChannelNumberCallback = std::function<bool(const String &, int, String &)>;
48 
63 using SkipChannelsCallback = std::function<bool(const String &, int, String &)>;
64 
69 template <typename T>
71  public:
73 
77 
78  bool sendChangeChannelEvent(String channelName, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
79  protected:
80  bool handleChannelController(SinricProRequest &request);
81 
82  private:
83  EventLimiter event_limiter;
84  ChangeChannelCallback changeChannelCallback;
85  ChangeChannelNumberCallback changeChannelNumberCallback;
86  SkipChannelsCallback skipChannelsCallback;
87 };
88 
89 template <typename T>
91 : event_limiter(EVENT_LIMIT_STATE) {
92  T* device = static_cast<T*>(this);
93  device->registerRequestHandler(std::bind(&ChannelController<T>::handleChannelController, this, std::placeholders::_1));
94 }
95 
103 template <typename T>
105  changeChannelCallback = cb;
106 }
107 
115 template <typename T>
117  changeChannelNumberCallback = cb;
118 }
119 
127 template <typename T>
129  skipChannelsCallback = cb;
130 }
131 
141 template <typename T>
142 bool ChannelController<T>::sendChangeChannelEvent(String channelName, String cause) {
143  if (event_limiter) return false;
144  T* device = static_cast<T*>(this);
145 
146  JsonDocument eventMessage = device->prepareEvent(FSTR_CHANNEL_changeChannel, cause.c_str());
147  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
148  event_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_name] = channelName;
149  return device->sendEvent(eventMessage);
150 }
151 
152 template <typename T>
153 bool ChannelController<T>::handleChannelController(SinricProRequest &request) {
154  T* device = static_cast<T*>(this);
155 
156  bool success = false;
157 
158  if (request.action == FSTR_CHANNEL_changeChannel) {
159 
160  if (changeChannelCallback && request.request_value[FSTR_CHANNEL_channel].containsKey(FSTR_CHANNEL_name)) {
161  String channelName = request.request_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_name] | "";
162  success = changeChannelCallback(device->deviceId, channelName);
163  request.response_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_name] = channelName;
164  }
165 
166  if (changeChannelNumberCallback && request.request_value[FSTR_CHANNEL_channel].containsKey(FSTR_CHANNEL_number)) {
167  String channelName("");
168  int channelNumber = request.request_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_number];
169  success = changeChannelNumberCallback(device->deviceId, channelNumber, channelName);
170  request.response_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_name] = channelName;
171  }
172  return success;
173  }
174 
175  if (skipChannelsCallback && request.action == FSTR_CHANNEL_skipChannels) {
176  String channelName;
177  int channelCount = request.request_value[FSTR_CHANNEL_channelCount] | 0;
178  success = skipChannelsCallback(device->deviceId, channelCount, channelName);
179  request.response_value[FSTR_CHANNEL_channel][FSTR_CHANNEL_name] = channelName;
180  return success;
181  }
182 
183  return success;
184 }
185 
186 } // SINRICPRO_NAMESPACE
187 
188 template <typename T>
189 using ChannelController = SINRICPRO_NAMESPACE::ChannelController<T>;
ChannelController.
Definition: ChannelController.h:70
void onChangeChannel(ChangeChannelCallback cb)
Set callback function for changeChannel request.
Definition: ChannelController.h:104
void onSkipChannels(SkipChannelsCallback cb)
Set callback function for skipChannels request.
Definition: ChannelController.h:128
void onChangeChannelNumber(ChangeChannelNumberCallback cb)
Set callback function for changeChannel request.
Definition: ChannelController.h:116
bool sendChangeChannelEvent(String channelName, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send changeChannel event to SinricPro Server to report selected channel.
Definition: ChannelController.h:142
std::function< bool(const String &, int, String &)> SkipChannelsCallback
Callback definition for onSkipChannels function.
Definition: ChannelController.h:63
std::function< bool(const String &, String &)> ChangeChannelCallback
Callback definition for onChangeChannel function.
Definition: ChannelController.h:31
std::function< bool(const String &, int, String &)> ChangeChannelNumberCallback
Callback definition for onChangeChannelNumber function.
Definition: ChannelController.h:47