58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#include "fsfw/osal/linux/Timer.h"
|
|
#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
|
|
#include <errno.h>
|
|
|
|
|
|
Timer::Timer() {
|
|
sigevent sigEvent;
|
|
sigEvent.sigev_notify = SIGEV_NONE;
|
|
sigEvent.sigev_signo = 0;
|
|
sigEvent.sigev_value.sival_ptr = &timerId;
|
|
int status = timer_create(CLOCK_MONOTONIC, &sigEvent, &timerId);
|
|
if(status!=0){
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
sif::error << "Timer creation failed with: " << status <<
|
|
" errno: " << errno << std::endl;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
Timer::~Timer() {
|
|
timer_delete(timerId);
|
|
}
|
|
|
|
int Timer::setTimer(uint32_t intervalMs) {
|
|
itimerspec timer;
|
|
timer.it_value.tv_sec = intervalMs / 1000;
|
|
timer.it_value.tv_nsec = (intervalMs * 1000000) % (1000000000);
|
|
timer.it_interval.tv_sec = 0;
|
|
timer.it_interval.tv_nsec = 0;
|
|
set = true;
|
|
return timer_settime(timerId, 0, &timer, NULL);
|
|
}
|
|
|
|
|
|
int Timer::getTimer(uint32_t* remainingTimeMs){
|
|
itimerspec timer;
|
|
timer.it_value.tv_sec = 0;
|
|
timer.it_value.tv_nsec = 0;
|
|
timer.it_interval.tv_sec = 0;
|
|
timer.it_interval.tv_nsec = 0;
|
|
int status = timer_gettime(timerId, &timer);
|
|
|
|
*remainingTimeMs = timer.it_value.tv_sec * 1000 + timer.it_value.tv_nsec / 1000000;
|
|
|
|
return status;
|
|
}
|
|
|
|
bool Timer::isSet() const {
|
|
return this->set;
|
|
}
|
|
|
|
void Timer::resetTimer() {
|
|
if(not this->set) {
|
|
set = false;
|
|
}
|
|
setTimer(0);
|
|
}
|