SinricPro Library
Loading...
Searching...
No Matches
SettingController.h
1#pragma once
2
3#include <variant>
4
5#include "../SinricProRequest.h"
6#include "../SinricProStrings.h"
7
8#include "../SinricProNamespace.h"
9namespace SINRICPRO_NAMESPACE {
10
11FSTR(SETTING, setSetting); // "setSetting"
12FSTR(SETTING, id); // "id"
13FSTR(SETTING, value); // "value"
14
18using SettingValue = std::variant<int, float, bool, String>;
19
20using SetSettingCallback = std::function<bool(const String&, const String&, SettingValue&)>;
21
22template <typename T>
23class SettingController {
24 public:
25 SettingController();
26 void onSetSetting(SetSettingCallback cb);
27
28 protected:
29 bool handleSettingController(SinricProRequest &request);
30
31 private:
32 SetSettingCallback setSettingCallback;
33};
34
35template <typename T>
36SettingController<T>::SettingController() {
37 T* device = static_cast<T*>(this);
38 device->registerRequestHandler(std::bind(&SettingController<T>::handleSettingController, this, std::placeholders::_1));
39}
40
41template <typename T>
42void SettingController<T>::onSetSetting(SetSettingCallback cb) {
43 setSettingCallback = cb;
44}
45
46template <typename T>
47bool SettingController<T>::handleSettingController(SinricProRequest &request) {
48 T* device = static_cast<T*>(this);
49
50 bool success = false;
51
52 if (setSettingCallback && request.action == FSTR_SETTING_setSetting) {
53 String settingId = request.request_value[FSTR_SETTING_id] | "";
54 JsonVariant valueVariant = request.request_value[FSTR_SETTING_value];
55
56 SettingValue settingValue;
57
58 if (valueVariant.is<bool>()) {
59 settingValue = valueVariant.as<bool>();
60 } else if (valueVariant.is<float>()) {
61 settingValue = valueVariant.as<float>();
62 } else if (valueVariant.is<int>()) {
63 settingValue = valueVariant.as<int>();
64 } else if (valueVariant.is<JsonObject>()) {
65 String jsonString;
66 serializeJson(valueVariant, jsonString);
67 settingValue = jsonString;
68 } else if (valueVariant.is<const char*>()) {
69 settingValue = String(valueVariant.as<const char*>());
70 }
71
72 success = setSettingCallback(device->deviceId, settingId, settingValue);
73
74 request.response_value[FSTR_SETTING_id] = settingId;
75
76 if (valueVariant.is<JsonObject>()) {
77 request.response_value[FSTR_SETTING_value] = valueVariant;
78 } else if (std::holds_alternative<int>(settingValue)) {
79 request.response_value[FSTR_SETTING_value] = std::get<int>(settingValue);
80 } else if (std::holds_alternative<float>(settingValue)) {
81 request.response_value[FSTR_SETTING_value] = std::get<float>(settingValue);
82 } else if (std::holds_alternative<bool>(settingValue)) {
83 request.response_value[FSTR_SETTING_value] = std::get<bool>(settingValue);
84 } else if (std::holds_alternative<String>(settingValue)) {
85 request.response_value[FSTR_SETTING_value] = std::get<String>(settingValue);
86 }
87
88 return success;
89 }
90
91 return success;
92}
93
94} // SINRICPRO_NAMESPACE
95
96using SettingValue = SINRICPRO_NAMESPACE::SettingValue;
97
98template <typename T>
99using SettingController = SINRICPRO_NAMESPACE::SettingController<T>;
AirQuality.
Definition AirQualitySensor.h:19
std::variant< int, float, bool, String > SettingValue
Variant type for setting values that can hold int, float, bool, or String.
Definition SettingController.h:18