1
+ #pragma once
2
+
3
+ #include " ../SinricProRequest.h"
4
+ #include " ../EventLimiter.h"
5
+ #include " ../SinricProStrings.h"
6
+ #include " ../SinricProNamespace.h"
7
+
8
+ /* *
9
+ * @brief Enum defining the different types of button press events
10
+ */
11
+ enum class SmartButtonPressType {
12
+ SINGLE_PRESS,
13
+ DOUBLE_PRESS,
14
+ LONG_PRESS
15
+ };
16
+
17
+ namespace SINRICPRO_NAMESPACE {
18
+
19
+ FSTR (BUTTONSTATE, state); // Button state key
20
+ FSTR (BUTTONSTATE, singlePress); // Single press state value
21
+ FSTR (BUTTONSTATE, doublePress); // Double press state value
22
+ FSTR (BUTTONSTATE, longPress); // Long press state value
23
+ FSTR (BUTTONSTATE, setSmartButtonState); // Set state action name
24
+
25
+ // Callback type definition for button press events
26
+ using SmartButtonPressCallback = std::function<bool (const String&, SmartButtonPressType)>;
27
+
28
+ /* *
29
+ * @brief Controller class for managing smart button state and interactions
30
+ *
31
+ * @tparam T The device type that this controller is attached to
32
+ */
33
+ template <typename T>
34
+ class SmartButtonStateController {
35
+ public:
36
+ /* *
37
+ * @brief Construct a new Smart Button State Controller
38
+ * Automatically registers the request handler with the device
39
+ */
40
+ SmartButtonStateController ();
41
+
42
+ /* *
43
+ * @brief Register callback for button press events from the app
44
+ * @param cb Callback function to handle button press events
45
+ */
46
+ void onButtonPress (SmartButtonPressCallback cb);
47
+
48
+ protected:
49
+ /* *
50
+ * @brief Handle incoming button state change requests
51
+ * @param request The incoming request to process
52
+ * @return true if request was handled successfully, false otherwise
53
+ */
54
+ bool handleSmartButtonStateController (SinricProRequest &request);
55
+
56
+ private:
57
+ SmartButtonPressCallback buttonPressCallback;
58
+
59
+ /* *
60
+ * @brief Convert string state to SmartButtonPressType enum
61
+ * @param stateStr The state string from the request
62
+ * @return corresponding SmartButtonPressType enum value
63
+ */
64
+ SmartButtonPressType getSmartButtonPressType (const String& stateStr);
65
+ };
66
+
67
+ template <typename T>
68
+ SmartButtonStateController<T>::SmartButtonStateController() {
69
+ T* device = static_cast <T*>(this );
70
+ device->registerRequestHandler (
71
+ std::bind (&SmartButtonStateController<T>::handleSmartButtonStateController,
72
+ this ,
73
+ std::placeholders::_1)
74
+ );
75
+ }
76
+
77
+ template <typename T>
78
+ void SmartButtonStateController<T>::onButtonPress(SmartButtonPressCallback cb) {
79
+ buttonPressCallback = cb;
80
+ }
81
+
82
+ template <typename T>
83
+ SmartButtonPressType SmartButtonStateController<T>::getSmartButtonPressType(const String& stateStr) {
84
+ if (stateStr == FSTR_BUTTONSTATE_singlePress) {
85
+ return SmartButtonPressType::SINGLE_PRESS;
86
+ } else if (stateStr == FSTR_BUTTONSTATE_doublePress) {
87
+ return SmartButtonPressType::DOUBLE_PRESS;
88
+ } else {
89
+ return SmartButtonPressType::LONG_PRESS;
90
+ }
91
+ }
92
+
93
+ template <typename T>
94
+ bool SmartButtonStateController<T>::handleSmartButtonStateController(SinricProRequest &request) {
95
+ // Only process setSmartButtonState actions
96
+ if (request.action != FSTR_BUTTONSTATE_setSmartButtonState || !buttonPressCallback) {
97
+ return false ;
98
+ }
99
+
100
+ T* device = static_cast <T*>(this );
101
+ String stateStr = request.request_value [FSTR_BUTTONSTATE_state];
102
+
103
+ // Only process valid button states
104
+ if (stateStr != FSTR_BUTTONSTATE_singlePress &&
105
+ stateStr != FSTR_BUTTONSTATE_doublePress &&
106
+ stateStr != FSTR_BUTTONSTATE_longPress) {
107
+ return false ;
108
+ }
109
+
110
+ SmartButtonPressType pressType = getSmartButtonPressType (stateStr);
111
+ return buttonPressCallback (device->deviceId , pressType);
112
+ }
113
+
114
+ } // namespace SINRICPRO_NAMESPACE
115
+
116
+ template <typename T>
117
+ using SmartButtonStateController = SINRICPRO_NAMESPACE::SmartButtonStateController<T>;
0 commit comments