|
|
- /*
-
- TUYA MODULE
-
- Copyright (C) 2019 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
-
- */
-
- #pragma once
-
- #include <algorithm>
- #include <vector>
-
- namespace Tuya {
-
- template <typename T>
- class States {
-
- public:
-
- struct Container {
- uint8_t dp;
- T value;
- };
-
- using iterator = typename std::vector<Container>::iterator;
- using const_iterator = typename std::vector<Container>::const_iterator;
-
- States(size_t capacity) :
- _capacity(capacity)
- {
- _states.reserve(capacity);
- }
-
- bool update(const uint8_t dp, const T value, bool create=false) {
- auto found = std::find_if(_states.begin(), _states.end(), [dp](const Container& internal) {
- return dp == internal.dp;
- });
-
- if (found != _states.end()) {
- if (found->value != value) {
- found->value = value;
- _changed = true;
- return true;
- }
- } else if (create) {
- _changed = true;
- _states.emplace_back(States::Container{dp, value});
- return true;
- }
-
- return false;
- }
-
- bool pushOrUpdate(const uint8_t dp, const T value) {
- if (_states.size() >= _capacity) return false;
- return update(dp, value, true);
- }
-
- bool changed() {
- bool res = _changed;
- if (_changed) _changed = false;
- return res;
- }
-
- Container& operator[] (const size_t n) {
- return _states[n];
- }
-
- size_t size() const {
- return _states.size();
- }
-
- size_t capacity() const {
- return _capacity;
- }
-
- iterator begin() {
- return _states.begin();
- }
-
- iterator end() {
- return _states.end();
- }
-
- const_iterator begin() const {
- return _states.begin();
- }
-
- const_iterator end() const {
- return _states.end();
- }
-
- private:
- bool _changed = false;
- size_t _capacity = 0;
- std::vector<Container> _states;
- };
-
- class DiscoveryTimeout {
- public:
- DiscoveryTimeout(uint32_t start, uint32_t timeout) :
- _start(start),
- _timeout(timeout)
- {}
-
- DiscoveryTimeout(uint32_t timeout) :
- DiscoveryTimeout(millis(), timeout)
- {}
-
- operator bool() {
- return (millis() - _start > _timeout);
- }
-
- void feed() {
- _start = millis();
- }
-
- private:
- uint32_t _start;
- const uint32_t _timeout;
- };
-
- }
|