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 (OPEN_CLOSE, openPercent); // "openPercent"
11
+ FSTR (OPEN_CLOSE, openDirection); // "openDirection"
12
+ FSTR (OPEN_CLOSE, setOpenClose); // "setOpenClose"
13
+ FSTR (OPEN_CLOSE, adjustOpenClose); // "adjustOpenClose"
14
+
15
+ using OpenCloseCallback = std::function<bool (const String &, const String &, int &)>;
16
+
17
+ using AdjustOpenCloseCallback = std::function<bool (const String &, const String &, int &)>;
18
+
19
+ template <typename T>
20
+ class OpenCloseController {
21
+ public:
22
+ OpenCloseController ();
23
+
24
+ void onOpenClose (OpenCloseCallback cb);
25
+
26
+ void onAdjustOpenClose (AdjustOpenCloseCallback cb);
27
+
28
+ bool sendOpenCloseEvent (int openPercent, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
29
+
30
+ bool sendOpenCloseEvent (String openDirection, int openPercent, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
31
+
32
+ protected:
33
+ bool handleOpenCloseController (SinricProRequest &request);
34
+
35
+ private:
36
+ EventLimiter event_limiter;
37
+ OpenCloseCallback openCloseCallbackCallback;
38
+ AdjustOpenCloseCallback adjustOpenCloseCallback;
39
+ };
40
+
41
+ template <typename T>
42
+ OpenCloseController<T>::OpenCloseController()
43
+ :event_limiter(EVENT_LIMIT_STATE) {
44
+ T* device = static_cast <T*>(this );
45
+ device->registerRequestHandler (std::bind (&OpenCloseController<T>::handleOpenCloseController, this , std::placeholders::_1));
46
+ }
47
+
48
+ template <typename T>
49
+ void OpenCloseController<T>::onOpenClose(OpenCloseCallback cb) { openCloseCallbackCallback = cb; }
50
+
51
+ template <typename T>
52
+ void OpenCloseController<T>::onAdjustOpenClose(AdjustOpenCloseCallback cb) { adjustOpenCloseCallback = cb; }
53
+
54
+ template <typename T>
55
+ bool OpenCloseController<T>::sendOpenCloseEvent(String openDirection, int openPercent, String cause) {
56
+ if (event_limiter) return false ;
57
+ T* device = static_cast <T*>(this );
58
+
59
+ JsonDocument eventMessage = device->prepareEvent (FSTR_OPEN_CLOSE_setOpenClose, cause.c_str ());
60
+ JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
61
+ event_value[FSTR_OPEN_CLOSE_openDirection] = openDirection;
62
+ event_value[FSTR_OPEN_CLOSE_openPercent] = openPercent;
63
+
64
+ return device->sendEvent (eventMessage);
65
+ }
66
+
67
+ template <typename T>
68
+ bool OpenCloseController<T>::sendOpenCloseEvent(int openPercent, String cause) {
69
+ if (event_limiter) return false ;
70
+ T* device = static_cast <T*>(this );
71
+
72
+ JsonDocument eventMessage = device->prepareEvent (FSTR_OPEN_CLOSE_setOpenClose, cause.c_str ());
73
+ JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
74
+ event_value[FSTR_OPEN_CLOSE_openPercent] = openPercent;
75
+
76
+ return device->sendEvent (eventMessage);
77
+ }
78
+
79
+ template <typename T>
80
+ bool OpenCloseController<T>::handleOpenCloseController(SinricProRequest &request) {
81
+ if (request.action != FSTR_OPEN_CLOSE_setOpenClose) {
82
+ return false ;
83
+ }
84
+
85
+ T* device = static_cast <T*>(this );
86
+
87
+ bool success = false ;
88
+
89
+ if (openCloseCallbackCallback && request.action == FSTR_OPEN_CLOSE_setOpenClose) {
90
+ String openDirection = request.request_value [FSTR_OPEN_CLOSE_openDirection];
91
+ int openPercent = request.request_value [FSTR_OPEN_CLOSE_openPercent];
92
+
93
+ success = openCloseCallbackCallback (device->deviceId , openDirection, openPercent);
94
+
95
+ request.response_value [FSTR_OPEN_CLOSE_openDirection] = openDirection;
96
+ request.response_value [FSTR_OPEN_CLOSE_openPercent] = openPercent;
97
+
98
+ return success;
99
+ }
100
+
101
+ if (adjustOpenCloseCallback && request.action == FSTR_OPEN_CLOSE_adjustOpenClose) {
102
+ // TOOD:
103
+ }
104
+
105
+ return success;
106
+ }
107
+
108
+ } // SINRICPRO_NAMESPACE
109
+
110
+ template <typename T>
111
+ using OpenCloseController = SINRICPRO_NAMESPACE::OpenCloseController<T>;
0 commit comments