mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-28 18:53:34 +08:00
systemlib: added library for hysteresis
There have been two cases where a hysteresis function wasn't working correctly. It is therefore a good idea to abstract the hysteresis functionality into a library.
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
#include <systemlib/hysteresis/hysteresis.h>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
const static unsigned hysteresis_time_us = 5000;
|
||||
|
||||
TEST(HysteresisTest, InitFalse)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(hysteresis_time_us, false);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
}
|
||||
|
||||
TEST(HysteresisTest, InitTrue)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(hysteresis_time_us, true);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
}
|
||||
|
||||
TEST(HysteresisTest, ZeroCase)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(0, false);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
|
||||
// Change and see result immediately.
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
|
||||
// A wait won't change anything.
|
||||
usleep(1000);
|
||||
hysteresis.update();
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
}
|
||||
|
||||
TEST(HysteresisTest, ChangeAfterTime)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(hysteresis_time_us, false);
|
||||
|
||||
// Change to true.
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
|
||||
// Change back to false.
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
}
|
||||
|
||||
TEST(HysteresisTest, ChangeAfterTimeMultipleSets)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(hysteresis_time_us, false);
|
||||
|
||||
// Change to true.
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
|
||||
// Change to false.
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
}
|
||||
|
||||
TEST(HysteresisTest, TakeChangeBack)
|
||||
{
|
||||
systemlib::Hysteresis hysteresis(hysteresis_time_us, false);
|
||||
|
||||
// Change to true.
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
// Change your mind to false.
|
||||
hysteresis.set_state_and_update(false);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(6000);
|
||||
hysteresis.update();
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
|
||||
// And true again
|
||||
hysteresis.set_state_and_update(true);
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_FALSE(hysteresis.get_state());
|
||||
usleep(3000);
|
||||
hysteresis.update();
|
||||
ASSERT_TRUE(hysteresis.get_state());
|
||||
}
|
||||
Reference in New Issue
Block a user