1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/**
* @file new_sim_timer_thread.cpp
*
* The file includes a class Timer which runs in another thread:\n
* NewSimulatorTimerThread
*
* @author Lars Wetzel <larswetzel@users.sourceforge.net>
* @version 0.1
* @date 2010
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This
* file and program are licensed under a BSD style license. See
* the Copying file included with the OpenHPI distribution for
* full licensing terms.
*
*/
#include <assert.h>
#include <errno.h>
#include "new_sim.h"
#include "new_sim_utils.h"
#include "new_sim_watchdog.h"
/**
* Constructor for Watchdogs
**/
// NewSimulatorTimerThread::NewSimulatorTimerThread( NewSimulatorWatchdog *wdt,
NewSimulatorTimerThread::NewSimulatorTimerThread(
unsigned int ms_timeout )
: m_timeout( ms_timeout ),
m_running( false ),
m_exit( false ) {
}
/**
* Destructor
**/
NewSimulatorTimerThread::~NewSimulatorTimerThread() {
}
/**
* Set the exit flag and sleep THREAD_SLEEPTIME to be sure it is read
**/
void NewSimulatorTimerThread::Stop() {
m_exit = true;
usleep( THREAD_SLEEPTIME );
}
/**
* Set a new timeout value
*
* @param new_timeout new timeout value in ms
*
* @return latest timeout value of the object
**/
unsigned int NewSimulatorTimerThread::Reset( unsigned int new_timeout ) {
m_timeout = new_timeout;
m_start = cTime::Now();
stdlog << "DBG: Reset timeout value " << m_timeout << "\n";
return m_timeout;
}
/**
* Main loop of the timer.
*
* If the timer expires the method TriggerAction() is called.
**/
void * NewSimulatorTimerThread::Run() {
cTime now;
int delta;
m_start = cTime::Now();
m_running = true;
m_exit = false;
stdlog << "DBG: Run Timerloop - with timeout " << m_timeout << "\n";
while( !m_exit ) {
now = cTime::Now();
now -= m_start;
delta = m_timeout - now.GetMsec();
if ( delta <= 0 ) {
m_exit = TriggerAction();
} else if ( delta <= THREAD_SLEEPTIME / 1000 ) {
usleep( delta*1000 );
} else {
usleep( THREAD_SLEEPTIME );
}
}
m_running = false;
stdlog << "DBG: Exit TimerLoop\n";
return 0;
}
|