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

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

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