task.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "kbf/task.h"
  2. #include <utility>
  3. #include <esp_log.h>
  4. #include <kbf/macros.h>
  5. static constexpr const char *TAG = "kbf::task";
  6. kbf::Task::Task(string name, TaskFunc function, void *data) : function(function),
  7. name(std::move(name)),
  8. data(data) {
  9. ESP_LOGD(TAG, "creating task: %s", this->name.c_str());
  10. handle = nullptr;
  11. auto ret = xTaskCreate(task, name.c_str(), 4096, this, 5, &handle);
  12. if (ret == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
  13. ESP_LOGE(TAG, "failed to create task: out of memory");
  14. ABORT("TODO implement graceful failure");
  15. } else if (ret != pdPASS) {
  16. ESP_LOGE(TAG, "unknown error: %d", ret);
  17. ABORT("debug me");
  18. }
  19. }
  20. kbf::Task::~Task() {
  21. if (running) stop();
  22. }
  23. void kbf::Task::stop() {
  24. if (running) {
  25. ESP_LOGD(TAG, "stopping task: %s", name.c_str());
  26. vTaskDelete(handle);
  27. running = false;
  28. } else {
  29. ESP_LOGW(TAG, "task is not running: %s", name.c_str());
  30. }
  31. }
  32. void kbf::Task::task(void *pvParameters) {
  33. auto task = static_cast<Task *>(pvParameters);
  34. if (!task->name.length()) {
  35. ABORT("task has no name! debug me");
  36. }
  37. ESP_LOGD(TAG, "begin task: %s", task->name.c_str());
  38. task->running = true;
  39. task->function(task->data);
  40. task->running = false;
  41. ESP_LOGD(TAG, "end task: %s", task->name.c_str());
  42. vTaskDelete(task->handle);
  43. }
  44. bool kbf::Task::isRunning() const {
  45. return running;
  46. }