Skip to content

Commit 330fbd5

Browse files
committed
feat: refactor to use onButtonPress
1 parent baa541b commit 330fbd5

File tree

1 file changed

+42
-47
lines changed

1 file changed

+42
-47
lines changed

src/Capabilities/SmartButtonStateController.h

+42-47
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,25 @@
55
#include "../SinricProStrings.h"
66
#include "../SinricProNamespace.h"
77

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+
817
namespace SINRICPRO_NAMESPACE {
918

10-
// String constants for button states and actions
1119
FSTR(BUTTONSTATE, state); // Button state key
1220
FSTR(BUTTONSTATE, singlePress); // Single press state value
1321
FSTR(BUTTONSTATE, doublePress); // Double press state value
1422
FSTR(BUTTONSTATE, longPress); // Long press state value
1523
FSTR(BUTTONSTATE, setSmartButtonState); // Set state action name
1624

17-
// Callback type definitions for different button press events
18-
using SmartButtonPressCallback = std::function<bool(const String &)>;
25+
// Callback type definition for button press events
26+
using SmartButtonPressCallback = std::function<bool(const String&, SmartButtonPressType)>;
1927

2028
/**
2129
* @brief Controller class for managing smart button state and interactions
@@ -32,22 +40,10 @@ class SmartButtonStateController {
3240
SmartButtonStateController();
3341

3442
/**
35-
* @brief Register callback for single press event from app
36-
* @param cb Callback function to handle single press
43+
* @brief Register callback for button press events
44+
* @param cb Callback function to handle button press events
3745
*/
38-
void onSinglePress(SmartButtonPressCallback cb);
39-
40-
/**
41-
* @brief Register callback for double press event from app
42-
* @param cb Callback function to handle double press
43-
*/
44-
void onDoublePress(SmartButtonPressCallback cb);
45-
46-
/**
47-
* @brief Register callback for long press event from app
48-
* @param cb Callback function to handle long press
49-
*/
50-
void onLongPress(SmartButtonPressCallback cb);
46+
void onButtonPress(SmartButtonPressCallback cb);
5147

5248
protected:
5349
/**
@@ -58,9 +54,14 @@ class SmartButtonStateController {
5854
bool handleSmartButtonStateController(SinricProRequest &request);
5955

6056
private:
61-
SmartButtonPressCallback smartButtonSinglePressCallback;
62-
SmartButtonPressCallback smartButtonDoublePressCallback;
63-
SmartButtonPressCallback smartButtonLongPressCallback;
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);
6465

6566
/**
6667
* returns true if states match, false otherwise
@@ -70,8 +71,6 @@ class SmartButtonStateController {
7071
}
7172
};
7273

73-
// Implementation
74-
7574
template <typename T>
7675
SmartButtonStateController<T>::SmartButtonStateController() {
7776
T* device = static_cast<T*>(this);
@@ -83,44 +82,40 @@ SmartButtonStateController<T>::SmartButtonStateController() {
8382
}
8483

8584
template <typename T>
86-
void SmartButtonStateController<T>::onSinglePress(SmartButtonPressCallback cb) {
87-
smartButtonSinglePressCallback = cb;
88-
}
89-
90-
template <typename T>
91-
void SmartButtonStateController<T>::onDoublePress(SmartButtonPressCallback cb) {
92-
smartButtonDoublePressCallback = cb;
85+
void SmartButtonStateController<T>::onButtonPress(SmartButtonPressCallback cb) {
86+
buttonPressCallback = cb;
9387
}
9488

9589
template <typename T>
96-
void SmartButtonStateController<T>::onLongPress(SmartButtonPressCallback cb) {
97-
smartButtonLongPressCallback = cb;
90+
SmartButtonPressType SmartButtonStateController<T>::getSmartButtonPressType(const String& stateStr) {
91+
if (stateStr == FSTR_BUTTONSTATE_singlePress) {
92+
return SmartButtonPressType::SINGLE_PRESS;
93+
} else if (stateStr == FSTR_BUTTONSTATE_doublePress) {
94+
return SmartButtonPressType::DOUBLE_PRESS;
95+
} else {
96+
return SmartButtonPressType::LONG_PRESS;
97+
}
9898
}
9999

100100
template <typename T>
101101
bool SmartButtonStateController<T>::handleSmartButtonStateController(SinricProRequest &request) {
102102
// Only process setSmartButtonState actions
103-
if (request.action != FSTR_BUTTONSTATE_setSmartButtonState) {
103+
if (request.action != FSTR_BUTTONSTATE_setSmartButtonState || !buttonPressCallback) {
104104
return false;
105105
}
106106

107107
T* device = static_cast<T*>(this);
108-
bool success = false;
109-
110-
// Handle single press
111-
if (smartButtonSinglePressCallback && isStateMatch(request, FSTR_BUTTONSTATE_singlePress)) {
112-
success = smartButtonSinglePressCallback(device->deviceId);
113-
}
114-
// Handle double press
115-
else if (smartButtonDoublePressCallback && isStateMatch(request, FSTR_BUTTONSTATE_doublePress)) {
116-
success = smartButtonDoublePressCallback(device->deviceId);
117-
}
118-
// Handle long press
119-
else if (smartButtonLongPressCallback && isStateMatch(request, FSTR_BUTTONSTATE_longPress)) {
120-
success = smartButtonLongPressCallback(device->deviceId);
108+
String stateStr = request.request_value[FSTR_BUTTONSTATE_state];
109+
110+
// Only process valid button states
111+
if (stateStr != FSTR_BUTTONSTATE_singlePress &&
112+
stateStr != FSTR_BUTTONSTATE_doublePress &&
113+
stateStr != FSTR_BUTTONSTATE_longPress) {
114+
return false;
121115
}
122116

123-
return success;
117+
SmartButtonPressType pressType = getSmartButtonPressType(stateStr);
118+
return buttonPressCallback(device->deviceId, pressType);
124119
}
125120

126121
} // namespace SINRICPRO_NAMESPACE

0 commit comments

Comments
 (0)