Skip to content
Snippets Groups Projects
Commit f8f27901 authored by fxk8y's avatar fxk8y :spider:
Browse files

Adding functional task wrapper

parent 37d06b23
No related branches found
No related tags found
No related merge requests found
#include "LambdaTask.hpp"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static void taskWrapper(void* body) {
std::function<void()>* f = (std::function<void()> *)body;
(*f)();
}
static uint16_t taskID = 0;
static uint16_t nextID() {
return taskID++; // TODO: increment thread-safe!
}
SiliconTorch::Util::LambdaTask::LambdaTask(SiliconTorch::Util::Function0 body) : body(body) {
char taskName[32];
sprintf(taskName, "LambdaTask[%d]", nextID());
// TODO: allow other niceness than one
// TODO: allow pinning to other cores than app CPU
uint8_t priority = 1;
std::function<void()> _body = [&]() {
this->body();
this->_running = false; // TODO: thread safe??? needed?
vTaskDelete(NULL);
};
std::function<void()>* __body = new std::function<void()>(_body);
xTaskCreatePinnedToCore(taskWrapper, taskName, 8192, (void*)__body, priority, &taskHandle, 1);
}
TaskHandle_t SiliconTorch::Util::LambdaTask::getHandle() {
return taskHandle;
}
bool SiliconTorch::Util::LambdaTask::running() {
return _running;
}
// TODO: thread safe??? needed?
void SiliconTorch::Util::LambdaTask::kill() {
if (_running) vTaskDelete(getHandle());
_running = false;
}
#pragma once
// C++ system level
#include <functional>
// ESP32 specific
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
namespace SiliconTorch {
namespace Util {
typedef std::function<void()> Function0;
// TODO: add destructor which deletes the task!
class LambdaTask {
public:
LambdaTask(Function0 body);
void kill();
bool running();
TaskHandle_t getHandle();
private:
bool _running = true;
Function0 body;
TaskHandle_t taskHandle;
};
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment