Skip to content

Commit cdb822e

Browse files
committed
Merge branch 'dev-2.9.3'
2 parents 113984c + b0eca71 commit cdb822e

File tree

5 files changed

+128
-42
lines changed

5 files changed

+128
-42
lines changed

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"maintainer": true
1414
}
1515
],
16-
"version": "2.9.2",
16+
"version": "2.9.3",
1717
"frameworks": "arduino",
1818
"platforms": [
1919
"espressif8266",

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=SinricPro
2-
version=2.9.2
2+
version=2.9.3
33
author=Boris Jaeger <sivar2311@gmail.com>
44
maintainer=Boris Jaeger <sivar2311@gmail.com>
55
sentence=Library for https://sinric.pro - simple way to connect your device to alexa

src/Capabilities/RangeController.h

Lines changed: 122 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,96 +4,123 @@
44
#include "SinricProRequest.h"
55

66
/**
7-
* @brief RangeController
7+
* @brief RangeControllerFloatInt
88
* @ingroup Capabilities
99
**/
1010
template <typename T>
1111
class RangeController {
1212
public:
13+
1314
RangeController() { static_cast<T &>(*this).requestHandlers.push_back(std::bind(&RangeController<T>::handleRangeController, this, std::placeholders::_1)); }
1415
/**
1516
* @brief Callback definition for onRangeValue function
1617
*
1718
* Gets called when device receive a `setRangeValue` reuqest \n
1819
* @param[in] deviceId String which contains the ID of device
19-
* @param[in] rangeValue Integer 0..3 for range value device has to be set
20-
* @param[out] rangeValue Integer 0..3 returning the current range value
20+
* @param[in] rangeValue for range value device has to be set
21+
* @param[out] rangeValue returning the current range value
2122
* @return the success of the request
2223
* @retval true request handled properly
2324
* @retval false request was not handled properly because of some error
2425
*
2526
* @section SetRangeValueCallback Example-Code
2627
* @snippet callbacks.cpp onRangeValue
2728
**/
28-
using SetRangeValueCallback = std::function<bool(const String &, int &)>;
29+
30+
using GenericRangeValueCallback_int = bool (*)(const String &, const String &, int &);
31+
using GenericRangeValueCallback_float = bool (*)(const String &, const String &, float &);
32+
33+
struct GenericRangeValueCallback {
34+
GenericRangeValueCallback() : type(type_unknown) {}
35+
GenericRangeValueCallback(GenericRangeValueCallback_int cb) : type(type_int), cb_int(cb) {}
36+
GenericRangeValueCallback(GenericRangeValueCallback_float cb) : type(type_float), cb_float(cb) {}
37+
enum {
38+
type_unknown,
39+
type_int,
40+
type_float
41+
} type;
42+
union {
43+
GenericRangeValueCallback_int cb_int;
44+
GenericRangeValueCallback_float cb_float;
45+
};
46+
};
47+
48+
using SetRangeValueCallback = bool (*)(const String &, int &);
49+
// using SetRangeValueCallback = std::function<bool(const String &, int &)>;
2950

3051
/**
3152
* @brief Callback definition for onRangeValue function on a specific instance
3253
*
3354
* Gets called when device receive a `setRangeValue` reuqest \n
3455
* @param[in] deviceId String which contains the ID of device
3556
* @param[in] instance String instance name
36-
* @param[in] rangeValue Integer 0..3 for range value device has to be set
37-
* @param[out] rangeValue Integer 0..3 returning the current range value
57+
* @param[in] rangeValue for range value device has to be set
58+
* @param[out] rangeValue returning the current range value
3859
* @return the success of the request
3960
* @retval true request handled properly
4061
* @retval false request was not handled properly because of some error
4162
*
4263
* @section GenericSetRangeValueCallback Example-Code
4364
* @snippet callbacks.cpp onRangeValueGeneric
4465
**/
45-
using GenericSetRangeValueCallback = std::function<bool(const String &, const String &, int &)>;
66+
using GenericSetRangeValueCallback_int = GenericRangeValueCallback_int;
67+
using GenericSetRangeValueCallback_float = GenericRangeValueCallback_float;
4668

4769
/**
4870
* @brief Callback definition for onAdjustRangeValue function
4971
*
5072
* Gets called when device receive a `adjustRangeValue` reuqest \n
5173
* @param[in] deviceId String which contains the ID of device
52-
* @param[in] rangeValue Integer -3..3 delta value for range value have to change
53-
* @param[out] rangeValue Integer 3..3 returning the absolute range value
74+
* @param[in] rangeValue delta value for range value have to change
75+
* @param[out] rangeValue returning the absolute range value
5476
* @return the success of the request
5577
* @retval true request handled properly
5678
* @retval false request was not handled properly because of some error
5779
*
5880
* @section AdjustRangeValueCallback Example-Code
5981
* @snippet callbacks.cpp onAdjustRangeValue
6082
**/
61-
using AdjustRangeValueCallback = std::function<bool(const String &, int &)>;
83+
using AdjustRangeValueCallback = bool (*)(const String &, int &);
84+
// using AdjustRangeValueCallback = std::function<bool(const String &, int &)>;
6285

6386
/**
6487
* @brief Callback definition for onAdjustRangeValue function on a specific instance for custom devices
6588
*
6689
* Gets called when device receive a `adjustRangeValue` reuqest \n
6790
* @param[in] deviceId String which contains the ID of device
6891
* @param[in] instance String instance name
69-
* @param[in] rangeValue Integer -3..3 delta value for range value have to change
70-
* @param[out] rangeValue Integer 3..3 returning the absolute range value
92+
* @param[in] rangeValue delta value for range value have to change
93+
* @param[out] rangeValue returning the absolute range value
7194
* @return the success of the request
7295
* @retval true request handled properly
7396
* @retval false request was not handled properly because of some error
7497
*
7598
* @section GenericAdjustRangeValueCallback Example-Code
7699
* @snippet callbacks.cpp onAdjustRangeValueGeneric
77100
**/
78-
using GenericAdjustRangeValueCallback = std::function<bool(const String&, const String&, int&)>;
101+
using GenericAdjustRangeValueCallback_int = GenericRangeValueCallback_int;
102+
using GenericAdjustRangeValueCallback_float = GenericRangeValueCallback_float;
79103

80104
void onRangeValue(SetRangeValueCallback cb);
81-
void onRangeValue(const String& instance, GenericSetRangeValueCallback cb);
105+
void onRangeValue(const String& instance, GenericSetRangeValueCallback_int cb);
106+
void onRangeValue(const String& instance, GenericSetRangeValueCallback_float cb);
82107

83108
void onAdjustRangeValue(AdjustRangeValueCallback cb);
84-
void onAdjustRangeValue(const String& instance, GenericAdjustRangeValueCallback cb);
109+
void onAdjustRangeValue(const String& instance, GenericAdjustRangeValueCallback_int cb);
110+
void onAdjustRangeValue(const String& instance, GenericAdjustRangeValueCallback_float cb);
85111

86112
bool sendRangeValueEvent(int rangeValue, String cause = "PHYSICAL_INTERACTION");
87113
bool sendRangeValueEvent(const String& instance, int rangeValue, String cause = "PHYSICAL_INTERACTION");
114+
bool sendRangeValueEvent(const String& instance, float rangeValue, String cause = "PHYSICAL_INTERACTION");
88115

89116
protected:
90117
bool handleRangeController(SinricProRequest &request);
91118

92119
private:
93120
SetRangeValueCallback setRangeValueCallback;
94-
std::map<String, GenericSetRangeValueCallback> genericSetRangeValueCallback;
121+
std::map<String, GenericRangeValueCallback> genericSetRangeValueCallback;
95122
AdjustRangeValueCallback adjustRangeValueCallback;
96-
std::map<String, GenericAdjustRangeValueCallback> genericAdjustRangeValueCallback;
123+
std::map<String, GenericRangeValueCallback> genericAdjustRangeValueCallback;
97124
};
98125

99126
/**
@@ -115,8 +142,13 @@ void RangeController<T>::onRangeValue(SetRangeValueCallback cb) {
115142
* @see GenericSetRangeValueCallback
116143
*/
117144
template <typename T>
118-
void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback cb) {
119-
genericSetRangeValueCallback[instance] = cb;
145+
void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback_int cb) {
146+
genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
147+
}
148+
149+
template <typename T>
150+
void RangeController<T>::onRangeValue(const String& instance, GenericSetRangeValueCallback_float cb) {
151+
genericSetRangeValueCallback[instance] = GenericRangeValueCallback(cb);
120152
}
121153

122154
/**
@@ -131,10 +163,14 @@ void RangeController<T>::onAdjustRangeValue(AdjustRangeValueCallback cb) {
131163
}
132164

133165
template <typename T>
134-
void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback cb) {
135-
genericAdjustRangeValueCallback[instance] = cb;
166+
void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_int cb) {
167+
genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
136168
}
137169

170+
template <typename T>
171+
void RangeController<T>::onAdjustRangeValue(const String &instance, GenericAdjustRangeValueCallback_float cb) {
172+
genericAdjustRangeValueCallback[instance] = GenericRangeValueCallback(cb);
173+
}
138174

139175
/**
140176
* @brief Send `rangeValue` event to report curent rangeValue to SinricPro server
@@ -177,39 +213,87 @@ bool RangeController<T>::sendRangeValueEvent(const String& instance, int rangeVa
177213
return device.sendEvent(eventMessage);
178214
}
179215

216+
template <typename T>
217+
bool RangeController<T>::sendRangeValueEvent(const String& instance, float rangeValue, String cause){
218+
T &device = static_cast<T &>(*this);
219+
220+
DynamicJsonDocument eventMessage = device.prepareEvent("setRangeValue", cause.c_str());
221+
eventMessage["payload"]["instanceId"] = instance;
222+
223+
JsonObject event_value = eventMessage["payload"]["value"];
224+
event_value["rangeValue"] = rangeValue;
225+
return device.sendEvent(eventMessage);
226+
}
227+
180228
template <typename T>
181229
bool RangeController<T>::handleRangeController(SinricProRequest &request) {
182230
T &device = static_cast<T &>(*this);
183231

184232
bool success = false;
185233

186234
if (request.action == "setRangeValue") {
187-
int rangeValue = request.request_value["rangeValue"] | 0;
188-
if (request.instance != "") {
189-
if (genericSetRangeValueCallback.find(request.instance) != genericSetRangeValueCallback.end())
190-
success = genericSetRangeValueCallback[request.instance](device.deviceId, request.instance, rangeValue);
191-
} else {
235+
236+
if (request.instance == "") {
237+
238+
int rangeValue = request.request_value["rangeValue"];
192239
if (setRangeValueCallback) success = setRangeValueCallback(device.deviceId, rangeValue);
240+
request.response_value["rangeValue"] = rangeValue;
241+
return success;
242+
243+
} else {
244+
245+
if (genericSetRangeValueCallback.find(request.instance) == genericSetRangeValueCallback.end()) return false;
246+
247+
auto& cb = genericSetRangeValueCallback[request.instance];
248+
249+
if (cb.type == GenericRangeValueCallback::type_float) {
250+
float value = request.request_value["rangeValue"];
251+
success = cb.cb_float(device.deviceId, request.instance, value);
252+
request.response_value["rangeValue"] = value;
253+
return success;
254+
}
255+
256+
if (cb.type == GenericRangeValueCallback::type_int) {
257+
int value = request.request_value["rangeValue"];
258+
success = cb.cb_int(device.deviceId, request.instance, value);
259+
request.response_value["rangeValue"] = value;
260+
return success;
261+
}
193262
}
194-
request.response_value["rangeValue"] = rangeValue;
195-
return success;
196263
}
197264

198265
if (request.action == "adjustRangeValue") {
199-
int rangeValueDelta = request.request_value["rangeValueDelta"] | 0;
200-
if (request.instance != "") {
201-
if (genericAdjustRangeValueCallback.find(request.instance) != genericAdjustRangeValueCallback.end())
202-
success = genericAdjustRangeValueCallback[request.instance](device.deviceId, request.instance, rangeValueDelta);
266+
267+
if (request.instance == "") {
268+
269+
int rangeValue = request.request_value["rangeValueDelta"];
270+
if (setRangeValueCallback) success = setRangeValueCallback(device.deviceId, rangeValue);
271+
request.response_value["rangeValue"] = rangeValue;
272+
return success;
273+
203274
} else {
204-
if (adjustRangeValueCallback)
205-
success = adjustRangeValueCallback(device.deviceId, rangeValueDelta);
275+
276+
if (genericSetRangeValueCallback.find(request.instance) == genericSetRangeValueCallback.end()) return false;
277+
278+
auto& cb = genericAdjustRangeValueCallback[request.instance];
279+
280+
if (cb.type == GenericRangeValueCallback::type_float) {
281+
float value = request.request_value["rangeValueDelta"];
282+
success = cb.cb_float(device.deviceId, request.instance, value);
283+
request.response_value["rangeValue"] = value;
284+
return success;
285+
}
286+
287+
if (cb.type == GenericRangeValueCallback::type_int) {
288+
int value = request.request_value["rangeValueDelta"];
289+
success = cb.cb_int(device.deviceId, request.instance, value);
290+
request.response_value["rangeValue"] = value;
291+
return success;
292+
}
206293
}
207-
208-
request.response_value["rangeValue"] = rangeValueDelta;
209-
return success;
210294
}
211295

212-
return success;
296+
return false;
213297
}
214298

215299
#endif

src/SinricProConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
// Version Configuration
2626
#define SINRICPRO_VERSION_MAJOR 2
2727
#define SINRICPRO_VERSION_MINOR 9
28-
#define SINRICPRO_VERSION_REVISION 2
28+
#define SINRICPRO_VERSION_REVISION 3
2929
#define SINRICPRO_VERSION STR(SINRICPRO_VERSION_MAJOR) "." STR(SINRICPRO_VERSION_MINOR) "." STR(SINRICPRO_VERSION_REVISION)
3030
#define SINRICPRO_VERSION_STR "SinricPro (v" SINRICPRO_VERSION ")"
3131
#define SINRICPRO_VERISON_INT SINRICPRO_VERSION_MAJOR * 1000000 + SINRICPRO_VERSION_MINOR * 1000 + SINRICPRO_VERSION_REVISION

src/SinricProDevice.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ bool SinricProDevice::sendEvent(JsonDocument& event) {
8080
return false;
8181
}
8282
String eventName = event["payload"]["action"] | ""; // get event name
83-
83+
String eventInstance = event["payload"]["instanceId"] | "";
84+
if (eventInstance != "") eventName += "_" + eventInstance;
85+
8486
LeakyBucket_t bucket; // leaky bucket algorithm is used to prevent flooding the server
8587

8688
// get leaky bucket for event from eventFilter

0 commit comments

Comments
 (0)