Commit 96749fc5 authored by Pavel Vainerman's avatar Pavel Vainerman

Переименовал SandClock --> HourGlass. Добавил класс DelayTimer удобный для…

Переименовал SandClock --> HourGlass. Добавил класс DelayTimer удобный для случаев, когда необходима задержка, отдельно на срабатывание и отдельно на отпускание..
parent 6d379b1f
...@@ -22,16 +22,19 @@ ...@@ -22,16 +22,19 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "PassiveTimer.h" #include "PassiveTimer.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! Таймер реализующий задержку на срабатывание и отпускание сигнала.. /*! Таймер реализующий задержку на срабатывание и отпускание сигнала.
Для проверки вызывается функция check( state ), где state - это текущее состояние
сигнала, а функция check() возвращает сигнал с задержкой.
Чтобы состояние переключилось, оно должно продержаться не менее заданного времени.
*/ */
class DelayTimer class DelayTimer
{ {
public: public:
DelayTimer():realState(false),state(false), DelayTimer():prevState(false),state(false),
ondelay(0),offdelay(0),waiting(false){} onDelay(0),offDelay(0),waiting_on(false),waiting_off(false){}
DelayTimer( timeout_t on_msec, timeout_t off_msec ):realState(false),state(false), DelayTimer( timeout_t on_msec, timeout_t off_msec ):prevState(false),state(false),
ondelay(on_msec),offdelay(off_msec),waiting(false) onDelay(on_msec),offDelay(off_msec),waiting_on(false),waiting_off(false)
{ {
} }
...@@ -40,8 +43,8 @@ class DelayTimer ...@@ -40,8 +43,8 @@ class DelayTimer
// запустить часы (заново) // запустить часы (заново)
inline void set( timeout_t on_msec, timeout_t off_msec ) inline void set( timeout_t on_msec, timeout_t off_msec )
{ {
ondelay = on_msec; onDelay = on_msec;
offdelay = off_msec; offDelay = off_msec;
} }
inline void reset() inline void reset()
...@@ -51,24 +54,52 @@ class DelayTimer ...@@ -51,24 +54,52 @@ class DelayTimer
inline bool check( bool st ) inline bool check( bool st )
{ {
if( realState != st ) if( waiting_off )
{ {
if( st ) if( !st && pt.checkTime() )
pt.setTiming(ondelay); {
else waiting_off = false;
pt.setTiming(offdelay); state = false;
return state;
}
else if( st != prevState )
pt.reset();
waiting = true; prevState = st;
realState = st; return state;
} }
if( !waiting ) if( waiting_on )
{
if( st && pt.checkTime() )
{
waiting_on = false;
state = true;
return state; return state;
}
else if( st != prevState )
pt.reset();
if( pt.checkTime() ) prevState = st;
return state;
}
if( state != st )
{ {
state = realState; prevState = st;
waiting = false; if( st )
{
pt.setTiming(onDelay);
waiting_on = true;
}
else
{
pt.setTiming(offDelay);
waiting_off = true;
}
if( pt.checkTime() )
return st;
} }
return state; return state;
...@@ -76,11 +107,12 @@ class DelayTimer ...@@ -76,11 +107,12 @@ class DelayTimer
protected: protected:
PassiveTimer pt; PassiveTimer pt;
bool realState; bool prevState;
bool state; bool state;
timeout_t ondelay; timeout_t onDelay;
timeout_t offdelay; timeout_t offDelay;
bool waiting; bool waiting_on;
bool waiting_off;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#endif #endif
......
...@@ -96,5 +96,43 @@ int main() ...@@ -96,5 +96,43 @@ int main()
} }
cerr << "DelayTimer: TEST10 OK! " << endl; cerr << "DelayTimer: TEST10 OK! " << endl;
DelayTimer dtm3(200,100);
dtm3.check(true);
msleep(190);
dtm3.check(false);
dtm3.check(true);
msleep(50);
if( dtm3.check(true) )
{
cerr << "DelayTimer: TEST11 FAILED! " << endl;
return 1;
}
cerr << "DelayTimer: TEST11 OK! " << endl;
msleep(200);
if( !dtm3.check(true) )
{
cerr << "DelayTimer: TEST12 FAILED! " << endl;
return 1;
}
cerr << "DelayTimer: TEST12 OK! " << endl;
dtm3.check(false);
msleep(90);
dtm3.check(true);
msleep(50);
if( !dtm3.check(false) )
{
cerr << "DelayTimer: TEST13 FAILED! " << endl;
return 1;
}
cerr << "DelayTimer: TEST13 OK! " << endl;
msleep(150);
if( dtm3.check(false) )
{
cerr << "DelayTimer: TEST14 FAILED! " << endl;
return 1;
}
cerr << "DelayTimer: TEST14 OK! " << endl;
return 0; return 0;
} }
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