2022-05-19 00:44:34 +02:00
|
|
|
#include "PeriodicPosixTask.h"
|
2021-06-05 19:52:38 +02:00
|
|
|
|
2022-05-19 00:44:34 +02:00
|
|
|
#include "fsfw/serviceinterface.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
#include "fsfw/tasks/ExecutableObjectIF.h"
|
2021-06-05 19:52:38 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
PeriodicPosixTask::PeriodicPosixTask(const char* name_, int priority_, size_t stackSize_,
|
2022-05-19 00:44:34 +02:00
|
|
|
TaskPeriod period_, TaskDeadlineMissedFunction dlmFunc_)
|
|
|
|
: PeriodicTaskBase(period_, dlmFunc_),
|
2022-05-18 15:42:18 +02:00
|
|
|
posixThread(name_, priority_, stackSize_),
|
2022-05-18 14:32:35 +02:00
|
|
|
started(false) {}
|
2018-07-13 18:28:26 +02:00
|
|
|
|
|
|
|
void* PeriodicPosixTask::taskEntryPoint(void* arg) {
|
2022-02-02 10:29:30 +01:00
|
|
|
// The argument is re-interpreted as PollingTask.
|
2022-05-19 00:44:34 +02:00
|
|
|
auto* originalTask(reinterpret_cast<PeriodicPosixTask*>(arg));
|
2022-02-02 10:29:30 +01:00
|
|
|
// The task's functionality is called.
|
|
|
|
originalTask->taskFunctionality();
|
2022-05-17 18:12:05 +02:00
|
|
|
return nullptr;
|
2018-07-13 18:28:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t PeriodicPosixTask::sleepFor(uint32_t ms) {
|
2022-05-19 00:44:34 +02:00
|
|
|
return PosixThread::sleep(static_cast<uint64_t>(ms) * 1000000);
|
2018-07-13 18:28:26 +02:00
|
|
|
}
|
|
|
|
|
2022-05-19 00:44:34 +02:00
|
|
|
ReturnValue_t PeriodicPosixTask::startTask() {
|
2022-05-14 09:38:59 +02:00
|
|
|
if (isEmpty()) {
|
2022-08-15 20:28:16 +02:00
|
|
|
return returnvalue::FAILED;
|
2022-05-14 09:38:59 +02:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
started = true;
|
2022-05-18 15:42:18 +02:00
|
|
|
posixThread.createTask(&taskEntryPoint, this);
|
2022-08-15 20:28:16 +02:00
|
|
|
return returnvalue::OK;
|
2018-07-13 18:28:26 +02:00
|
|
|
}
|
|
|
|
|
2022-05-19 00:44:34 +02:00
|
|
|
[[noreturn]] void PeriodicPosixTask::taskFunctionality() {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (not started) {
|
2022-05-18 15:42:18 +02:00
|
|
|
posixThread.suspend();
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2020-09-04 14:43:53 +02:00
|
|
|
|
2022-05-14 09:38:59 +02:00
|
|
|
initObjsAfterTaskCreation();
|
2020-09-04 14:43:53 +02:00
|
|
|
|
2022-05-19 00:44:34 +02:00
|
|
|
uint64_t lastWakeTime = PosixThread::getCurrentMonotonicTimeMs();
|
2022-05-18 15:42:18 +02:00
|
|
|
uint64_t periodMs = getPeriodMs();
|
2022-02-02 10:29:30 +01:00
|
|
|
// The task's "infinite" inner loop is entered.
|
2022-05-19 00:44:34 +02:00
|
|
|
while (true) {
|
2022-05-14 09:38:59 +02:00
|
|
|
for (auto const& objOpCodePair : objectList) {
|
|
|
|
objOpCodePair.first->performOperation(objOpCodePair.second);
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2020-09-04 14:43:53 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
if (not PosixThread::delayUntil(&lastWakeTime, periodMs)) {
|
2022-05-19 00:44:34 +02:00
|
|
|
if (dlmFunc != nullptr) {
|
|
|
|
dlmFunc();
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-13 18:28:26 +02:00
|
|
|
}
|