00001
00002 #include "TimerComponent.hpp"
00003 #include <rtt/Logger.hpp>
00004 #include "ocl/Component.hpp"
00005
00006 ORO_CREATE_COMPONENT_TYPE()
00007 ORO_LIST_COMPONENT_TYPE( OCL::TimerComponent )
00008
00009 namespace OCL
00010 {
00011 using namespace std;
00012 using namespace RTT;
00013
00014 TimerComponent::TimerComponent( std::string name )
00015 : TaskContext( name, PreOperational ), mtimer( 32, mtimeoutEvent ),
00016 mtimeoutEvent("timeout"),
00017 waitForCommand( "waitFor", &TimerComponent::waitFor, this),
00018 waitCommand( "wait", &TimerComponent::wait, this)
00019 {
00020
00021
00022
00023
00024 this->addOperation("arm", &os::Timer::arm , &mtimer, RTT::ClientThread).doc("Arm a single shot timer.").arg("timerId", "A numeric id of the timer to arm.").arg("delay", "The delay in seconds before it fires.");
00025 this->addOperation("startTimer", &os::Timer::startTimer , &mtimer, RTT::ClientThread).doc("Start a periodic timer.").arg("timerId", "A numeric id of the timer to start.").arg("period", "The period in seconds.");
00026 this->addOperation("killTimer", &os::Timer::killTimer , &mtimer, RTT::ClientThread).doc("Kill (disable) an armed or started timer.").arg("timerId", "A numeric id of the timer to kill.");
00027 this->addOperation("isArmed", &os::Timer::isArmed , &mtimer, RTT::ClientThread).doc("Check if a given timer is armed or started.").arg("timerId", "A numeric id of the timer to check.");
00028 this->addOperation("setMaxTimers", &os::Timer::setMaxTimers , &mtimer, RTT::ClientThread).doc("Raise or lower the maximum amount of timers.").arg("timers", "The largest amount of timers. The highest timerId is max-1.");
00029 this->addOperation( waitForCommand ).doc("Wait until a timer expires.").arg("timerId", "A numeric id of the timer to wait for.");
00030 this->addOperation( waitCommand ).doc("Arm and wait until that timer expires.").arg("timerId", "A numeric id of the timer to arm and to wait for.").arg("delay", "The delay in seconds before the timer expires.");
00031 this->addPort(mtimeoutEvent).doc("This port is written each time a timer expires. The timer id is the value sent in this port.");
00032 }
00033
00034 TimerComponent::~TimerComponent() {
00035 this->stop();
00036 }
00037
00038 bool TimerComponent::startHook()
00039 {
00040 return mtimer.getThread() && mtimer.getThread()->start();
00041 }
00042
00043 void TimerComponent::updateHook()
00044 {
00045
00046 }
00047
00048 void TimerComponent::stopHook()
00049 {
00050 mtimer.getThread()->stop();
00051 }
00052
00053 bool TimerComponent::wait(RTT::os::Timer::TimerId id, double seconds)
00054 {
00055 return mtimer.arm(id, seconds);
00056 }
00057
00058 bool TimerComponent::waitFor(RTT::os::Timer::TimerId id)
00059 {
00060 return true;
00061 }
00062
00063 bool TimerComponent::isTimerExpired(RTT::os::Timer::TimerId id) const
00064 {
00065 return !mtimer.isArmed(id);
00066 }
00067 }