SinricPro Library
SinricProTV.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 _SINRICTV_H_
9 #define _SINRICTV_H_
10 
11 #include "SinricProDevice.h"
12 
28 class SinricProTV : public SinricProDevice {
29  public:
30  SinricProTV(const DeviceId &deviceId);
31  String getProductType() { return SinricProDevice::getProductType() + String("TV"); }
32  // callback
33 
48  typedef std::function<bool(const String&, int&)> SetVolumeCallback;
49 
65  typedef std::function<bool(const String&, int&, bool)> AdjustVolumeCallback;
66 
81  typedef std::function<bool(const String&, bool&)> MuteCallback;
82 
97  typedef std::function<bool(const String&, String&)> MediaControlCallback;
98 
113  typedef std::function<bool(const String&, String&)> SelectInputCallback;
114 
129  typedef std::function<bool(const String&, String&)> ChangeChannelCallback;
130 
145  typedef std::function<bool(const String&, int, String&)> ChangeChannelNumberCallback;
146 
161  typedef std::function<bool(const String&, int, String&)> SkipChannelsCallback;
162 
165  void onMute(MuteCallback cb);
171 
172  // event
173  bool sendVolumeEvent(int volume, String cause = "PHYSICAL_INTERACTION");
174  bool sendMuteEvent(bool mute, String cause = "PHYSICAL_INTERACTION");
175  bool sendMediaControlEvent(String mediaControl, String cause = "PHYSICAL_INTERACTION");
176  bool sendSelectInputEvent(String intput, String cause = "PHYSICAL_INTERACTION");
177  bool sendChangeChannelEvent(String channelName, String cause = "PHYSICAL_INTERACTION");
178  // handle
179  bool handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
180  private:
181  SetVolumeCallback volumeCallback;
182  AdjustVolumeCallback adjustVolumeCallback;
183  MuteCallback muteCallback;
184  MediaControlCallback mediaControlCallback;
185  SelectInputCallback selectInputCallback;
186  ChangeChannelCallback changeChannelCallback;
187  ChangeChannelNumberCallback changeChannelNumberCallback;
188  SkipChannelsCallback skipChannelsCallback;
189 };
190 
191 
192 SinricProTV::SinricProTV(const DeviceId &deviceId) : SinricProDevice(deviceId),
193  volumeCallback(nullptr),
194  adjustVolumeCallback(nullptr),
195  muteCallback(nullptr),
196  mediaControlCallback(nullptr),
197  selectInputCallback(nullptr),
198  changeChannelCallback(nullptr),
199  changeChannelNumberCallback(nullptr),
200  skipChannelsCallback(nullptr) {
201 }
202 
203 bool SinricProTV::handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) {
204  if (deviceId != this->deviceId) return false;
205  if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value)) return true;
206 
207  bool success = false;
208  String actionString = String(action);
209 
210  if (volumeCallback && actionString == "setVolume") {
211  int volume = request_value["volume"];
212  success = volumeCallback(deviceId, volume);
213  response_value["volume"] = volume;
214  return success;
215  }
216 
217  if (adjustVolumeCallback && actionString == "adjustVolume") {
218  int volume = request_value["volume"];
219  bool volumeDefault = request_value["volumeDefault"] | false;
220  success = adjustVolumeCallback(deviceId, volume, volumeDefault);
221  response_value["volume"] = volume;
222  return success;
223  }
224 
225  if (muteCallback && actionString == "setMute") {
226  bool mute = request_value["mute"];
227  success = muteCallback(deviceId, mute);
228  response_value["mute"] = mute;
229  return success;
230  }
231 
232  if (mediaControlCallback && actionString == "mediaControl") {
233  String mediaControl = request_value["control"];
234  success = mediaControlCallback(deviceId, mediaControl);
235  response_value["control"] = mediaControl;
236  return success;
237  }
238 
239  if (selectInputCallback && actionString == "selectInput") {
240  String input = request_value["input"];
241  success = selectInputCallback(deviceId, input);
242  response_value["input"] = input;
243  return success;
244  }
245 
246  if (actionString == "changeChannel") {
247 
248  if (changeChannelCallback && request_value["channel"].containsKey("name")) {
249  String channelName = request_value["channel"]["name"] | "";
250  success = changeChannelCallback(deviceId, channelName);
251  response_value["channel"]["name"] = channelName;
252  }
253 
254  if (changeChannelNumberCallback && request_value["channel"].containsKey("number")) {
255  int channelNumber = request_value["channel"]["number"];
256  String channelName("");
257  success = changeChannelNumberCallback(deviceId, channelNumber, channelName);
258  response_value["channel"]["name"] = channelName;
259  }
260  return success;
261  }
262 
263  if (skipChannelsCallback && actionString == "skipChannels") {
264  int channelCount = request_value["channelCount"] | 0;
265  String channelName;
266  success = skipChannelsCallback(deviceId, channelCount, channelName);
267  response_value["channel"]["name"] = channelName;
268  return success;
269  }
270 
271  return success;
272 }
273 
281 void SinricProTV::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
282 
290 void SinricProTV::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
291 
299 void SinricProTV::onMute(MuteCallback cb) { muteCallback = cb; }
300 
308 void SinricProTV::onMediaControl(MediaControlCallback cb) { mediaControlCallback = cb; }
309 
317 void SinricProTV::onSelectInput(SelectInputCallback cb) { selectInputCallback = cb; }
318 
326 void SinricProTV::onChangeChannel(ChangeChannelCallback cb) { changeChannelCallback = cb; }
327 
335 void SinricProTV::onChangeChannelNumber(ChangeChannelNumberCallback cb) { changeChannelNumberCallback = cb; }
336 
344 void SinricProTV::onSkipChannels(SkipChannelsCallback cb) { skipChannelsCallback = cb; }
345 
355 bool SinricProTV::sendVolumeEvent(int volume, String cause) {
356  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setVolume", cause.c_str());
357  JsonObject event_value = eventMessage["payload"]["value"];
358  event_value["volume"] = volume;
359  return sendEvent(eventMessage);
360 }
361 
371 bool SinricProTV::sendMuteEvent(bool mute, String cause) {
372  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setMute", cause.c_str());
373  JsonObject event_value = eventMessage["payload"]["value"];
374  event_value["mute"] = mute;
375  return sendEvent(eventMessage);
376 }
377 
387 bool SinricProTV::sendMediaControlEvent(String mediaControl, String cause) {
388  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "mediaControl", cause.c_str());
389  JsonObject event_value = eventMessage["payload"]["value"];
390  event_value["control"] = mediaControl;
391  return sendEvent(eventMessage);
392 }
393 
403 bool SinricProTV::sendSelectInputEvent(String input, String cause) {
404  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "selectInput", cause.c_str());
405  JsonObject event_value = eventMessage["payload"]["value"];
406  event_value["input"] = input;
407  return sendEvent(eventMessage);
408 }
409 
419 bool SinricProTV::sendChangeChannelEvent(String channelName, String cause) {
420  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "changeChannel", cause.c_str());
421  JsonObject event_value = eventMessage["payload"]["value"];
422  event_value["channel"]["name"] = channelName;
423  return sendEvent(eventMessage);
424 }
425 
426 #endif
427 
SinricProTV::onMediaControl
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: SinricProTV.h:308
SinricProTV::onMute
void onMute(MuteCallback cb)
Set callback function for setMute request.
Definition: SinricProTV.h:299
SinricProTV::ChangeChannelNumberCallback
std::function< bool(const String &, int, String &)> ChangeChannelNumberCallback
Callback definition for onChangeChannelNumber function.
Definition: SinricProTV.h:145
SinricProTV::sendVolumeEvent
bool sendVolumeEvent(int volume, String cause="PHYSICAL_INTERACTION")
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: SinricProTV.h:355
SinricProTV
Device to control a TV.
Definition: SinricProTV.h:28
SinricProTV::sendMuteEvent
bool sendMuteEvent(bool mute, String cause="PHYSICAL_INTERACTION")
Send setMute event to SinricPro Server indicating actual mute state.
Definition: SinricProTV.h:371
SinricProTV::MediaControlCallback
std::function< bool(const String &, String &)> MediaControlCallback
Callback definition for onMediaControl function.
Definition: SinricProTV.h:97
SinricProTV::onChangeChannelNumber
void onChangeChannelNumber(ChangeChannelNumberCallback cb)
Set callback function for changeChannel request.
Definition: SinricProTV.h:335
SinricProTV::SetVolumeCallback
std::function< bool(const String &, int &)> SetVolumeCallback
Callback definition for onSetVolume function.
Definition: SinricProTV.h:48
SinricProTV::onSetVolume
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: SinricProTV.h:281
SinricProTV::ChangeChannelCallback
std::function< bool(const String &, String &)> ChangeChannelCallback
Callback definition for onChangeChannel function.
Definition: SinricProTV.h:129
SinricProTV::sendChangeChannelEvent
bool sendChangeChannelEvent(String channelName, String cause="PHYSICAL_INTERACTION")
Send changeChannel event to SinricPro Server to report selected channel.
Definition: SinricProTV.h:419
SinricProTV::MuteCallback
std::function< bool(const String &, bool &)> MuteCallback
Callback definition for onMute function.
Definition: SinricProTV.h:81
SinricProTV::onSelectInput
void onSelectInput(SelectInputCallback cb)
Set callback function for selectInput request.
Definition: SinricProTV.h:317
SinricProTV::SkipChannelsCallback
std::function< bool(const String &, int, String &)> SkipChannelsCallback
Callback definition for onSkipChannels function.
Definition: SinricProTV.h:161
SinricProTV::onChangeChannel
void onChangeChannel(ChangeChannelCallback cb)
Set callback function for changeChannel request.
Definition: SinricProTV.h:326
SinricProTV::onSkipChannels
void onSkipChannels(SkipChannelsCallback cb)
Set callback function for skipChannels request.
Definition: SinricProTV.h:344
SinricProTV::sendSelectInputEvent
bool sendSelectInputEvent(String intput, String cause="PHYSICAL_INTERACTION")
Send selectInput event to SinricPro Server to report selected input.
Definition: SinricProTV.h:403
SinricProTV::SelectInputCallback
std::function< bool(const String &, String &)> SelectInputCallback
Callback definition for onSelectInput function.
Definition: SinricProTV.h:113
SinricProTV::AdjustVolumeCallback
std::function< bool(const String &, int &, bool)> AdjustVolumeCallback
Callback definition for onAdjustVolume function.
Definition: SinricProTV.h:65
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:24
SinricProTV::onAdjustVolume
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: SinricProTV.h:290
SinricProTV::sendMediaControlEvent
bool sendMediaControlEvent(String mediaControl, String cause="PHYSICAL_INTERACTION")
Send mediaControl event to SinricPro Server indicating devices media control state.
Definition: SinricProTV.h:387