1 #ifndef SCANNING_PROPERTIES
2 #define SCANNING_PROPERTIES
4 #include "AccessibilitySettingLog.hpp"
5 #include "Geometry.hpp"
8 #include <experimental/any>
19 enum class ScanDirection
25 using UniversalSwitchCb = std::function<void(void *, const std::string &, const std::string &, const std::string &)>;
27 class ScanningProperty
30 ScanningProperty(const std::string &stateVConfKey = {});
31 friend class ScanningProperties;
32 bool getState() const;
33 void setState(bool state);
36 T getFirstValue() const
38 return getValue<T>(firstValue_);
42 T getSecondValue() const
44 return getValue<T>(secondValue_);
48 void setFirstValue(T value)
50 setValue<T>(value, Members::FIRST_VALUE, firstValue_);
54 void setSecondValue(T value)
56 setValue(value, Members::SECOND_VALUE, secondValue_);
59 void registerOnValueChangeCallback(std::function<void(ScanningProperty *)> callback);
60 void unregisterOnValueChangeCallback();
63 enum class Members : size_t
72 T getValue(const std::experimental::any &value) const
75 ASSERT(!value.empty(), "no value");
76 return std::experimental::any_cast<T>(value);
77 } catch (const std::experimental::bad_any_cast &e) {
78 ERROR("%s", e.what());
83 template <typename T, typename U>
84 void setValue(T value, Members member, U &field)
86 ASSERT(static_cast<size_t>(member) < static_cast<size_t>(Members::COUNT), "Wrong class member");
87 ASSERT(!vconfKeys_[static_cast<size_t>(member)].empty(), "Property not synced with vconf");
89 Singleton<VConfInterface>::instance().set(vconfKeys_[static_cast<size_t>(member)], value);
93 void syncFirstValueWithVConf(const std::string &vConfKey, const T defaultValue)
95 syncValueWithVConf<T>(vConfKey, defaultValue, Members::FIRST_VALUE, firstValue_);
99 void syncSecondValueWithVConf(const std::string &vConfKey, const T defaultValue)
101 syncValueWithVConf<T>(vConfKey, defaultValue, Members::SECOND_VALUE, secondValue_);
104 template <typename T, typename U>
105 void syncValueWithVConf(const std::string &vConfKey, const T defaultValue, Members member, U &field)
107 ASSERT(static_cast<size_t>(member) < static_cast<size_t>(Members::COUNT), "Wrong class member");
108 callbackHandle_[static_cast<size_t>(member)] = std::move(Singleton<VConfInterface>::instance().registerAndGet<T>(vConfKey, defaultValue, [this, &field](auto value) {
110 this->onValueChange();
112 DEBUG("otu: %s", vConfKey.c_str());
113 vconfKeys_[static_cast<size_t>(member)] = vConfKey;
116 void onValueChange();
119 std::experimental::any firstValue_;
120 std::experimental::any secondValue_;
121 std::vector<VConfInterface::CallbackHandle> callbackHandle_;
122 std::vector<std::string> vconfKeys_;
123 std::function<void(ScanningProperty *)> onValueChangeCallback_;
134 SINGLE_INTERACTION_INTERVAL,
152 class ScanningProperties
155 ScanningProperties();
156 ScanningProperty *getScanningProperty(Property property);
159 ScanningProperties(const ScanningProperties &) = delete;
160 ScanningProperties(ScanningProperties &&) = delete;
161 ScanningProperties &operator=(const ScanningProperties &) = delete;
162 ScanningProperties &operator=(ScanningProperties &&) = delete;
165 std::vector<std::unique_ptr<ScanningProperty>> properties_;