File: new_sim_timer_thread.cpp

package info (click to toggle)
openhpi 3.8.0-2.3
  • links: PTS
  • area: main
  • in suites: sid, trixie
  • size: 31,888 kB
  • sloc: ansic: 225,326; cpp: 63,687; java: 16,472; cs: 15,161; python: 11,884; sh: 11,508; makefile: 4,945; perl: 1,529; xml: 36; asm: 13
file content (108 lines) | stat: -rw-r--r-- 2,439 bytes parent folder | download | duplicates (4)
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;
}