Orocos Real-Time Toolkit  2.5.0
TimeService.cpp
00001 /***************************************************************************
00002  tag: Peter Soetens  Wed Apr 17 16:01:31 CEST 2002  TimeService.cpp
00003 
00004                        TimeService.cpp -  description
00005                           -------------------
00006    begin                : Wed April 17 2002
00007    copyright            : (C) 2002 Peter Soetens
00008    email                : peter.soetens@mech.kuleuven.ac.be
00009 
00010 ***************************************************************************
00011 *                                                                         *
00012 *   This program is free software; you can redistribute it and/or modify  *
00013 *   it under the terms of the GNU General Public License as published by  *
00014 *   the Free Software Foundation; either version 2 of the License, or     *
00015 *   (at your option) any later version.                                   *
00016 *                                                                         *
00017 ***************************************************************************/
00018 
00019 #include "os/fosi.h"
00020 #include "TimeService.hpp"
00021 
00022 namespace RTT {
00023     using namespace os;
00024 
00025     TimeService* TimeService::_instance = 0;
00026 
00027     const TimeService::ticks TimeService::InfiniteTicks = ::InfiniteTicks;
00028     const TimeService::nsecs TimeService::InfiniteNSecs = ::InfiniteNSecs;
00029     const TimeService::Seconds TimeService::InfiniteSeconds  = ::InfiniteSeconds;
00030 
00031     TimeService::ticks TimeService::nsecs2ticks( const nsecs m )
00032     {
00033         return nano2ticks( m );
00034     }
00035 
00036     TimeService::nsecs TimeService::ticks2nsecs( const ticks t )
00037     {
00038         return ticks2nano( t );
00039     }
00040 
00041     TimeService* TimeService::Instance()
00042     {
00043         if ( _instance == 0 )
00044         {
00045             _instance = new TimeService();
00046         }
00047 
00048         return _instance;
00049     }
00050 
00051 
00052     bool TimeService::Release()
00053     {
00054         if ( _instance != 0 )
00055         {
00056             delete _instance;
00057             _instance = 0;
00058             return true;
00059         }
00060 
00061         return false;
00062     }
00063 
00064 
00065     TimeService::TimeService()
00066         : offset(0), use_clock(true)
00067     {
00068         //os::cout << "HeartBeat Created\n";
00069     }
00070 
00071     TimeService::~TimeService()
00072     {
00073         //os::cout << "HB DESTRUCTOR\n";
00074     }
00075 
00076     void TimeService::enableSystemClock( bool yes_no )
00077     {
00078         // guarantee monotonous time increase :
00079         if ( yes_no == use_clock )
00080             return;
00081         // we switched from one time domain to the other
00082         use_clock=yes_no;
00083         if ( use_clock == true )
00084             {
00085                 // if offset is X, then start counting from X.
00086                 offset = offset - rtos_get_time_ticks();
00087             }
00088         else
00089             {
00090                 // start counting from _now_ + old offset
00091                 offset = offset + rtos_get_time_ticks();
00092             }
00093     }
00094 
00095 
00096     TimeService::ticks
00097     TimeService::getTicks() const
00098     {
00099         return use_clock ? rtos_get_time_ticks() + offset : 0 + offset;
00100     }
00101 
00102     TimeService::ticks
00103     TimeService::getTicks( TimeService::ticks &relativeTime ) const
00104     {
00105         if ( relativeTime == 0 )
00106         {
00107             relativeTime = getTicks();
00108             return 0;
00109         }
00110         return ( getTicks() - relativeTime );
00111     }
00112 
00113     TimeService::ticks
00114     TimeService::ticksSince( TimeService::ticks relativeTime ) const
00115     {
00116         return ( getTicks() - relativeTime );
00117     }
00118 
00119 
00120     TimeService::Seconds
00121     TimeService::getSeconds( TimeService::ticks &relativeTime ) const
00122     {
00123         return nsecs_to_Seconds( ticks2nsecs( getTicks( relativeTime ) ) ) ;
00124     }
00125 
00126     TimeService::Seconds
00127     TimeService::secondsSince( TimeService::ticks relativeTime ) const
00128     {
00129         return nsecs_to_Seconds( ticks2nsecs( ticksSince( relativeTime ) ) ) ;
00130     }
00131 
00132     TimeService::Seconds
00133     TimeService::secondsChange( TimeService::Seconds delta )
00134     {
00135         offset += nsecs2ticks( Seconds_to_nsecs( delta ) );
00136         return nsecs_to_Seconds( ticks2nsecs( ticksSince( 0 ) ) ) ;
00137     }
00138 
00139     TimeService::nsecs
00140     TimeService::getNSecs() const
00141     {
00142         return rtos_get_time_ns();
00143     }
00144 
00145     TimeService::nsecs
00146     TimeService::getNSecs( TimeService::nsecs &relativeTime ) const
00147     {
00148         if ( relativeTime == 0 )
00149         {
00150             relativeTime = getNSecs();
00151             return 0;
00152         }
00153         return ( getNSecs() - relativeTime );
00154     }
00155 }