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