Commit 41587a59 authored by Pavel Vainerman's avatar Pavel Vainerman

(HourGlass): небольшая корректировка кода и теста

parent 29709852
...@@ -41,10 +41,11 @@ ...@@ -41,10 +41,11 @@
для проверки наступления условия срабатывания. для проверки наступления условия срабатывания.
\par Пример использования. \par Пример использования.
Допустим у вас есть сигнал "перегрев"(in_overheating) и вам необходимо выставить какой-то Допустим у вас есть сигнал "температура"(in_temp) и вам необходимо выставить какой-то
флаг о перегреве (isOverheating), если этот сигнал устойчиво держится в течение 10 секунд, флаг о перегреве (isOverheating).
то check() станет "true". При этом если сигнал снимется на 5 секунд ("песок начнёт обратно пересыпаться"), Если температура продержиться выше порога в течение 10 секунд check() станет "true".
а потом опять выставиться, то до срабатывания check() == true уже останется 5 сек, а не 10 сек. Если температура станет меньше порога через 6 секунд ("песок начнёт обратно пересыпаться"),
а потом опять станет выше, то до срабатывания check() == true уже останется 4 сек, а не 10 сек.
Получается, что для срабатывания check()=true сигнал должен не колеблясь держаться больше заданного времени. Получается, что для срабатывания check()=true сигнал должен не колеблясь держаться больше заданного времени.
\code \code
HourGlass hg; HourGlass hg;
...@@ -52,7 +53,7 @@ ...@@ -52,7 +53,7 @@
while( ....) while( ....)
{ {
hg.rotate(in_overheating); // управляем состоянием песочных часов (прямой или обратный ход часов). hg.rotate( in_temp > HiTemp ); // управляем состоянием песочных часов (прямой или обратный ход часов).
isOverheating = hg.check(); isOverheating = hg.check();
} }
...@@ -152,13 +153,13 @@ class HourGlass ...@@ -152,13 +153,13 @@ class HourGlass
return _state; return _state;
} }
// текущее "насыпавшееся" количество "песка" // текущее "насыпавшееся" количество "песка" (прошедшее время)
inline timeout_t amount() inline timeout_t amount()
{ {
return ( _size - remain() ); return ( _size - remain() );
} }
// остаток песка (времени) // остаток песка (времени) (оставшееся время)
inline timeout_t remain() inline timeout_t remain()
{ {
timeout_t c = t.getCurrent(); timeout_t c = t.getCurrent();
...@@ -189,7 +190,7 @@ class HourGlass ...@@ -189,7 +190,7 @@ class HourGlass
protected: protected:
PassiveTimer t; /*!< таймер для отсчёта времени.. */ PassiveTimer t; /*!< таймер для отсчёта времени.. */
bool _state; /*!< текущее "положение часов", true - прямое, false - обратное (перевёрнутое) */ bool _state; /*!< текущее "положение часов", true - прямое, false - обратное (перевёрнутое) */
timeout_t _sand; /*!< сколько песка ещё осталось.. */ timeout_t _sand; /*!< сколько песка ещё осталось.. */
timeout_t _size; /*!< размер часов */ timeout_t _size; /*!< размер часов */
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -96,4 +96,22 @@ TEST_CASE("HourGlass", "[HourGlass]" ) ...@@ -96,4 +96,22 @@ TEST_CASE("HourGlass", "[HourGlass]" )
REQUIRE( hg.amount() == 100 ); REQUIRE( hg.amount() == 100 );
CHECK( hg.check() ); CHECK( hg.check() );
} }
SECTION( "Check delay" )
{
// выставляем часы на 100.. а check вызываем через 130..
// должно корректно отработать и вернуть true..
HourGlass hg;
hg.run(100);
msleep(130);
CHECK( hg.check() );
REQUIRE( hg.remain() == 0 );
REQUIRE( hg.amount() == 100 );
CHECK_FALSE( hg.rotate(false) );
CHECK_FALSE( hg.check() );
msleep(130);
REQUIRE( hg.remain() == 100 ); // песок весь просыпался обратно
REQUIRE( hg.amount() == 0 );
REQUIRE( hg.interval() == 100 );
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment