task refactoring working, sometimes misses events, check priorities
This commit is contained in:
@@ -296,20 +296,22 @@ rtIgnitionTask::rtIgnitionTask(const rtTaskParams params, const uint32_t history
|
||||
m_params.rt_queue = m_queue;
|
||||
|
||||
// create PSram history vectors
|
||||
m_history_0.resize(history_size);
|
||||
m_history_1.resize(history_size);
|
||||
m_history_0 = PSHistory(history_size);
|
||||
m_history_1 = PSHistory(history_size);
|
||||
// assing active and writable history
|
||||
m_active_history = std::unique_ptr<PSHistory>(&m_history_0);
|
||||
m_save_history = std::unique_ptr<PSHistory>(&m_history_1);
|
||||
|
||||
LOG_WARN("Starting Manager for [", m_params.name.c_str(), "]");
|
||||
auto task_success = xTaskCreate(
|
||||
// auto task_success = pdPASS;
|
||||
auto task_success = xTaskCreatePinnedToCore(
|
||||
rtIgnitionTask_manager,
|
||||
(std::string("man_") + m_params.name).c_str(),
|
||||
m_params.rt_stack_size,
|
||||
8192,
|
||||
(void *)this,
|
||||
1,
|
||||
&m_manager_handle);
|
||||
m_params.rt_priority >> 2,
|
||||
&m_manager_handle,
|
||||
m_core);
|
||||
|
||||
if (task_success != pdPASS)
|
||||
{
|
||||
@@ -341,10 +343,12 @@ void rtIgnitionTask::run()
|
||||
|
||||
if (new_data == pdPASS)
|
||||
{
|
||||
m_last_data = millis();
|
||||
m_manager_status = rtTaskStatus::RUNNING;
|
||||
// if history buffer is full swap buffers and if enabled save history buffer
|
||||
if (m_counter_status >= m_active_history->size())
|
||||
{
|
||||
LOG_DEBUG("Save for Buffer Full: ", m_counter_status);
|
||||
m_counter_status = 0;
|
||||
m_partial_save = false; // reset partial save flag on new data cycle
|
||||
std::swap(m_active_history, m_save_history);
|
||||
@@ -356,13 +360,21 @@ void rtIgnitionTask::run()
|
||||
m_info_filtered.update(m_last_status);
|
||||
(*m_active_history)[m_counter_status] = m_last_status;
|
||||
|
||||
if (m_on_message_cb && m_counter_status % 10)
|
||||
{
|
||||
m_on_message_cb(m_info_filtered);
|
||||
}
|
||||
|
||||
// update data counter
|
||||
m_counter_status++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (millis() - m_last_data > c_idle_time){
|
||||
if (m_counter_status > 0 && !m_partial_save){
|
||||
if (millis() - m_last_data > c_idle_time)
|
||||
{
|
||||
if (m_counter_status > 0 && !m_partial_save)
|
||||
{
|
||||
LOG_DEBUG("Save Partial: ", m_counter_status);
|
||||
m_active_history->resize(m_counter_status);
|
||||
saveHistory(*m_active_history, m_history_path);
|
||||
m_active_history->resize(m_max_history);
|
||||
@@ -434,13 +446,18 @@ void rtIgnitionTask::enableSave(const bool enable, const std::filesystem::path f
|
||||
}
|
||||
}
|
||||
|
||||
void rtIgnitionTask::onMessage(std::function<void(ignitionBoxStatusFiltered)> callaback)
|
||||
{
|
||||
m_on_message_cb = callaback;
|
||||
}
|
||||
|
||||
void rtIgnitionTask::saveHistory(const rtIgnitionTask::PSHistory &history, const std::filesystem::path &file_name)
|
||||
{
|
||||
// Lock filesystem mutex to avoid concurrent access
|
||||
std::lock_guard<std::mutex> fs_lock(m_fs_mutex);
|
||||
|
||||
// Check for free space
|
||||
if (LittleFS.totalBytes() - LittleFS.usedBytes() < history.size() * sizeof(ignitionBoxStatus) * 200) // check if at least 1MB is free for saving history
|
||||
if (LittleFS.totalBytes() - LittleFS.usedBytes() < history.size() * sizeof(ignitionBoxStatus)) // check if at least 1MB is free for saving history
|
||||
{
|
||||
LOG_ERROR("Not enough space in SPIFFS to save history");
|
||||
return;
|
||||
@@ -454,9 +471,8 @@ void rtIgnitionTask::saveHistory(const rtIgnitionTask::PSHistory &history, const
|
||||
|
||||
// if firt save remove old file and create new
|
||||
auto save_flags = std::ios::out;
|
||||
if (m_first_save && m_filesystem.exists(file_path.c_str()))
|
||||
if (m_first_save)
|
||||
{
|
||||
m_first_save = false;
|
||||
save_flags |= std::ios::trunc; // overwrite existing file
|
||||
m_filesystem.remove(file_path.c_str()); // ensure file is removed before saving to avoid issues with appending to existing file in SPIFFS
|
||||
LOG_INFO("Saving history to Flash, new file:", file_path.c_str());
|
||||
@@ -477,12 +493,12 @@ void rtIgnitionTask::saveHistory(const rtIgnitionTask::PSHistory &history, const
|
||||
// write csv header
|
||||
if (m_first_save)
|
||||
{
|
||||
ofs << "TS,\
|
||||
EVENTS_12,DLY_12,STAT_12,V_12_1,V_12_2,V_12_3,V_12_4,IGNITION_MODE_12,\
|
||||
EVENTS_34,DLY_34,STAT_34,V_34_1,V_34_2,V_34_3,V_34_4,IGNITION_MODE_34,\
|
||||
ENGINE_RPM,ADC_READTIME,N_QUEUE_ERRORS"
|
||||
ofs << "TS,EVENTS_12,DLY_12,STAT_12,V_12_1,V_12_2,V_12_3,V_12_4,IGNITION_MODE_12,"
|
||||
<< "EVENTS_34,DLY_34,STAT_34,V_34_1,V_34_2,V_34_3,V_34_4,IGNITION_MODE_34,"
|
||||
<< "ENGINE_RPM,ADC_READTIME,N_QUEUE_ERRORS"
|
||||
<< std::endl;
|
||||
ofs.flush();
|
||||
m_first_save = false;
|
||||
}
|
||||
|
||||
for (const auto &entry : history)
|
||||
|
||||
Reference in New Issue
Block a user