Files
bobbycar-boardcomputer-firm…/main/taskmanager.cpp

149 lines
5.4 KiB
C++
Raw Normal View History

2021-12-05 00:50:37 +01:00
#include "taskmanager.h"
#include "sdkconfig.h"
2021-12-05 00:50:37 +01:00
// system includes
#include <chrono>
// esp-idf includes
#include <esp_log.h>
// local includes
#include "wifi_bobbycar.h"
#ifdef FEATURE_ROTARY
#include "rotary.h"
#endif
#ifdef FEATURE_MOSFETS
#include "mosfets.h"
#endif
2021-12-18 20:08:40 +01:00
#include "time_bobbycar.h"
2021-12-19 01:55:48 +01:00
#include "potis.h"
2021-12-19 02:37:48 +01:00
#ifdef FEATURE_BLUETOOTH
#include "bluetooth_bobby.h"
2021-12-19 22:50:50 +01:00
#ifdef FEATURE_BMS
#include "bmsutils.h"
#endif
2021-12-19 02:37:48 +01:00
#endif
2021-12-19 03:33:51 +01:00
#ifdef FEATURE_CAN
#include "can.h"
#endif
2021-12-19 04:23:47 +01:00
#include "debuginputhandler.h"
#ifdef FEATURE_SERIAL
#include "serial_bobby.h"
#endif
2021-12-19 04:42:01 +01:00
#include "ota.h"
2021-12-19 04:48:12 +01:00
#include "ble_bobby.h"
2021-12-19 04:56:24 +01:00
#include "webserver.h"
2021-12-19 16:42:45 +01:00
#include "ledstrip.h"
2021-12-19 16:48:42 +01:00
#include "espnowfunctions.h"
#include "cloud.h"
#include "udpcloud.h"
2021-12-19 23:25:52 +01:00
#include "modes.h"
#include "drivingstatistics.h"
#include "dnsannounce.h"
#include "screens.h"
2022-06-12 20:15:31 +02:00
#include "utils.h"
2022-10-05 21:41:14 +02:00
#include "feedbackemulator.h"
2021-12-05 00:50:37 +01:00
using namespace std::chrono_literals;
namespace {
constexpr const char * const TAG = "TASKS";
void not_needed() {}
2022-01-17 13:01:09 +01:00
BobbySchedulerTask schedulerTasksArr[] {
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "wifi", wifi_begin, wifi_update, 100ms, false },
2022-06-12 20:15:31 +02:00
#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined(FEATURE_DPAD_6WIRESW) || defined(DPAD_BOARDCOMPUTER_V2)
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { bobbydpad::dpad_name, bobbydpad::dpad_init, bobbydpad::dpad_update, 20ms, true },
#endif
#ifdef FEATURE_ROTARY
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "rotary", initRotary, updateRotary, 20ms, false },
#endif
#ifdef FEATURE_MOSFETS
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "mosfets", init_mosfets, update_mosfets, 100ms, false },
#endif
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "time", initTime, updateTime, 100ms, false },
BobbySchedulerTask { "potis", initPotis, readPotis, 20ms, false },
2021-12-19 02:37:48 +01:00
#ifdef FEATURE_BLUETOOTH
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "bluetooth", bluetooth_init, bluetooth_update, 100ms, false },
2021-12-19 22:50:50 +01:00
#ifdef FEATURE_BMS
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "bms", bms::init, bms::update, 100ms, false },
2021-12-19 22:50:50 +01:00
#endif
2021-12-19 02:37:48 +01:00
#endif
2021-12-19 03:33:51 +01:00
#ifdef FEATURE_CAN
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "can", can::initCan, can::updateCan, 10ms, false },
2021-12-19 03:33:51 +01:00
#endif
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "debuginput", initDebugInput, handleDebugInput, 50ms, true },
#ifdef FEATURE_SERIAL
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "serial", initSerial, updateSerial, 50ms, false },
#endif
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "ota", initOta, handleOta, 50ms, false },
BobbySchedulerTask { "ble", initBle, handleBle, 100ms, false },
BobbySchedulerTask { "webserver", initWebserver, handleWebserver, 100ms, false },
BobbySchedulerTask { "ledstrip", initLedStrip, updateLedStrip, 30ms, false },
BobbySchedulerTask { "espnow", espnow::initESPNow, espnow::handle, 100ms, false },
BobbySchedulerTask { "cloud", initCloud, updateCloud, 50ms, false },
2022-10-30 02:19:41 +02:00
BobbySchedulerTask { "udpcloud", udpCloudInit, udpCloudUpdate, 50ms, false },
2022-10-01 17:34:13 +02:00
BobbySchedulerTask { "drivingmode", initDrivingMode, updateDrivingMode, 20ms, false },
BobbySchedulerTask { "drivingstatistics", initStatistics, calculateStatistics, 100ms, false },
BobbySchedulerTask { "dnsannounce", init_dns_announce, handle_dns_announce, 100ms, false },
BobbySchedulerTask { "updateDisp", not_needed, updateDisplay, 20ms, true },
2022-10-30 02:19:41 +02:00
BobbySchedulerTask { "redrawDisp", not_needed, redrawDisplay, 40ms, true },
2022-10-05 21:41:14 +02:00
BobbySchedulerTask { "feedbackEmulator", feedbackemulator::init, feedbackemulator::update, 500ms, false},
2021-12-05 00:50:37 +01:00
};
} // namespace
2022-01-17 13:01:09 +01:00
cpputils::ArrayView<BobbySchedulerTask> schedulerTasks{std::begin(schedulerTasksArr), std::end(schedulerTasksArr)};
2021-12-05 00:50:37 +01:00
2022-01-17 13:01:09 +01:00
const BobbySchedulerTask &drivingModeTask = []() -> const BobbySchedulerTask & {
auto iter = std::find_if(std::begin(schedulerTasksArr), std::end(schedulerTasksArr), [](const BobbySchedulerTask &task){
2021-12-19 23:25:52 +01:00
return std::string_view{task.name()} == "drivingmode";
});
return *iter;
}();
2021-12-05 00:50:37 +01:00
void sched_pushStats(bool printTasks)
{
if (printTasks)
ESP_LOGI(TAG, "begin listing tasks...");
for (auto &schedulerTask : schedulerTasks)
schedulerTask.pushStats(printTasks);
if (printTasks)
ESP_LOGI(TAG, "end listing tasks");
}
2022-02-18 01:21:54 +01:00
2023-08-13 20:13:05 +02:00
std::expected<bool, std::string> checkInitializedByName(const std::string& name)
2022-02-18 01:21:54 +01:00
{
for (auto &schedulerTask : schedulerTasks)
{
2022-02-18 18:56:20 +01:00
// ESP_LOGE(TAG, "%s == %s", schedulerTask.name(), name.c_str());
2022-02-18 01:21:54 +01:00
if (schedulerTask.name() == name)
return schedulerTask.isInitialized();
}
2023-08-13 20:15:53 +02:00
return std::unexpected("Task not found: " + std::string{name});
2022-02-18 01:21:54 +01:00
}
2022-10-13 16:48:32 +02:00
bool checkEnabledByName(const std::string& name) {
2022-02-18 18:56:20 +01:00
bool enabled = true;
2022-02-18 01:21:54 +01:00
// iterate over all feature flags (runForEveryFeature())
configs.callForEveryFeature([&](ConfiguredFeatureFlag &feature) {
2022-02-18 18:56:20 +01:00
if (feature.getTaskName() == name)
2022-04-29 22:40:49 +02:00
enabled = feature.isEnabled.value();
2022-02-18 01:21:54 +01:00
});
return enabled;
}
2022-10-13 16:48:32 +02:00
void reload_tasks()
{
for (auto &task : schedulerTasks)
{
if (checkEnabledByName(task.name()) && !task.isInitialized())
{
task.setup();
}
}
}