diff --git a/src/lib/systemlib/hysteresis/hysteresis.cpp b/src/lib/systemlib/hysteresis/hysteresis.cpp index 33aee834c1a5f22decc0a0a7d0e3064259213f6e..473867d044009425da7455cfbbde6cf0fea84088 100644 --- a/src/lib/systemlib/hysteresis/hysteresis.cpp +++ b/src/lib/systemlib/hysteresis/hysteresis.cpp @@ -37,13 +37,21 @@ * @author Julian Oes <julian@oes.ch> */ -#include <px4_log.h> -#include "systemlib/hysteresis/hysteresis.h" - +#include "hysteresis.h" namespace systemlib { +void +Hysteresis::set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us) +{ + if (from_state == true) { + _time_from_true_us = new_hysteresis_time_us; + + } else { + _time_from_false_us = new_hysteresis_time_us; + } +} void Hysteresis::set_state_and_update(const bool new_state) @@ -66,10 +74,19 @@ Hysteresis::update() { if (_requested_state != _state) { - if (hrt_elapsed_time(&_last_time_to_change_state) >= (_state ? - _hysteresis_time_from_true_us : - _hysteresis_time_from_false_us)) { - _state = _requested_state; + const hrt_abstime elapsed = hrt_elapsed_time(&_last_time_to_change_state); + + if (_state && !_requested_state) { + // true -> false + if (elapsed >= _time_from_true_us) { + _state = false; + } + + } else if (!_state && _requested_state) { + // false -> true + if (elapsed >= _time_from_false_us) { + _state = true; + } } } } diff --git a/src/lib/systemlib/hysteresis/hysteresis.h b/src/lib/systemlib/hysteresis/hysteresis.h index 97cd6c049e90ec1c385e1b67c859f8643c051110..2fbc271d0c69b8cbe172507a110fe62a2852f49f 100644 --- a/src/lib/systemlib/hysteresis/hysteresis.h +++ b/src/lib/systemlib/hysteresis/hysteresis.h @@ -49,31 +49,17 @@ namespace systemlib class Hysteresis { public: - Hysteresis(bool init_state) : + explicit Hysteresis(bool init_state) : _state(init_state), - _requested_state(init_state), - _hysteresis_time_from_true_us(0), - _hysteresis_time_from_false_us(0), - _last_time_to_change_state(0) + _requested_state(init_state) {} + Hysteresis() = delete; // no default constructor - ~Hysteresis() - {} - - void set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us) - { - if (from_state == true) { - _hysteresis_time_from_true_us = new_hysteresis_time_us; + ~Hysteresis() = default; - } else { - _hysteresis_time_from_false_us = new_hysteresis_time_us; - } - } + bool get_state() const { return _state; } - bool get_state() const - { - return _state; - } + void set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us); void set_state_and_update(const bool new_state); @@ -81,11 +67,13 @@ public: private: + hrt_abstime _last_time_to_change_state{0}; + + hrt_abstime _time_from_true_us{0}; + hrt_abstime _time_from_false_us{0}; + bool _state; bool _requested_state; - hrt_abstime _hysteresis_time_from_true_us; - hrt_abstime _hysteresis_time_from_false_us; - hrt_abstime _last_time_to_change_state; }; } // namespace systemlib