SinricPro Library
ColorController.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(COLOR, setColor); // "setColor"
11 FSTR(COLOR, color); // "color"
12 FSTR(COLOR, r); // "r"
13 FSTR(COLOR, g); // "g"
14 FSTR(COLOR, b); // "b"
15 
33 using ColorCallback = std::function<bool(const String &, byte &, byte &, byte &)>;
34 
39 template <typename T>
41  public:
43 
45  bool sendColorEvent(byte r, byte g, byte b, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
46 
47  protected:
48  bool handleColorController(SinricProRequest &request);
49 
50  private:
51  EventLimiter event_limiter;
52  ColorCallback colorCallback;
53 };
54 
55 template <typename T>
57 : event_limiter(EVENT_LIMIT_STATE) {
58  T* device = static_cast<T*>(this);
59  device->registerRequestHandler(std::bind(&ColorController<T>::handleColorController, this, std::placeholders::_1));
60 }
61 
62 
70 template <typename T>
72  colorCallback = cb;
73 }
74 
86 template <typename T>
87 bool ColorController<T>::sendColorEvent(byte r, byte g, byte b, String cause) {
88  if (event_limiter) return false;
89  T* device = static_cast<T*>(this);
90 
91  JsonDocument eventMessage = device->prepareEvent(FSTR_COLOR_setColor, cause.c_str());
92  JsonObject event_color = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value][FSTR_COLOR_color].to<JsonObject>();
93  event_color[FSTR_COLOR_r] = r;
94  event_color[FSTR_COLOR_g] = g;
95  event_color[FSTR_COLOR_b] = b;
96  return device->sendEvent(eventMessage);
97 }
98 
99 template <typename T>
100 bool ColorController<T>::handleColorController(SinricProRequest &request) {
101  T* device = static_cast<T*>(this);
102 
103  bool success = false;
104 
105  if (colorCallback && request.action == FSTR_COLOR_setColor) {
106  unsigned char r, g, b;
107  r = request.request_value[FSTR_COLOR_color][FSTR_COLOR_r];
108  g = request.request_value[FSTR_COLOR_color][FSTR_COLOR_g];
109  b = request.request_value[FSTR_COLOR_color][FSTR_COLOR_b];
110  success = colorCallback(device->deviceId, r, g, b);
111  request.response_value[FSTR_COLOR_color].to<JsonObject>();
112  request.response_value[FSTR_COLOR_color][FSTR_COLOR_r] = r;
113  request.response_value[FSTR_COLOR_color][FSTR_COLOR_g] = g;
114  request.response_value[FSTR_COLOR_color][FSTR_COLOR_b] = b;
115  }
116 
117  return success;
118 }
119 
120 } // SINRICPRO_NAMESPACE
121 
122 template <typename T>
123 using ColorController = SINRICPRO_NAMESPACE::ColorController<T>;
ColorController.
Definition: ColorController.h:40
void onColor(ColorCallback cb)
Set callback function for setColor request.
Definition: ColorController.h:71
bool sendColorEvent(byte r, byte g, byte b, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setColor event to SinricPro Server indicating actual color.
Definition: ColorController.h:87
std::function< bool(const String &, byte &, byte &, byte &)> ColorCallback
Callback definition for onColor function.
Definition: ColorController.h:33