Save files appending on same session and new file on new session
This commit is contained in:
@@ -9,7 +9,6 @@
|
||||
// Definitions
|
||||
#include <tasks.h>
|
||||
#include <devices.h>
|
||||
#include <psvector.h>
|
||||
#include <datasave.h>
|
||||
#include <ui.h>
|
||||
|
||||
@@ -51,13 +50,12 @@ void loop()
|
||||
{
|
||||
// global variables
|
||||
bool running = true;
|
||||
const uint32_t max_history = 1024;
|
||||
|
||||
const uint32_t max_queue = 128;
|
||||
|
||||
PSRAMVector<ignitionBoxStatus> ignA_history_0(max_history);
|
||||
PSRAMVector<ignitionBoxStatus> ignA_history_1(max_history);
|
||||
auto &active_history = ignA_history_0;
|
||||
auto &writable_history = ignA_history_1;
|
||||
auto *active_history = &ignA_history_0;
|
||||
auto *writable_history = &ignA_history_1;
|
||||
|
||||
// Resources Initialization
|
||||
static Devices dev;
|
||||
@@ -177,71 +175,50 @@ void loop()
|
||||
////////////////////// MAIN LOOP //////////////////////
|
||||
clearScreen();
|
||||
setCursor(0, 0);
|
||||
bool partial_save = false; // flag to indicate if a partial save has been done after a timeout
|
||||
uint32_t counter = 0;
|
||||
ignitionBoxStatus ignA;
|
||||
ignitionBoxStatus ign_info;
|
||||
int64_t last = esp_timer_get_time();
|
||||
uint32_t missed_firings12 = 0;
|
||||
uint32_t missed_firings34 = 0;
|
||||
|
||||
while (running)
|
||||
{
|
||||
if (counter == active_history.size())
|
||||
if (counter >= active_history->size())
|
||||
{
|
||||
counter = 0;
|
||||
partial_save = false; // reset partial save flag on new data cycle
|
||||
std::swap(active_history, writable_history); // switch active and writable buffers
|
||||
dataSaveParams save_params{
|
||||
.history = writable_history,
|
||||
.file_path = "ignition_history.csv"
|
||||
};
|
||||
if (SAVE_HISTORY_TO_SPIFFS)
|
||||
xTaskCreate(
|
||||
saveHistoryTask,
|
||||
"saveHistoryTask",
|
||||
RT_TASK_STACK / 2,
|
||||
&writable_history,
|
||||
RT_TASK_PRIORITY + 1, // higher priority to ensure it runs asap after buffer switch
|
||||
&save_params,
|
||||
RT_TASK_PRIORITY - 10, // higher priority to ensure it runs asap after buffer switch
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (xQueueReceive(rt_taskA_queue, &ignA, pdMS_TO_TICKS(1000)) == pdTRUE)
|
||||
if (xQueueReceive(rt_taskA_queue, &ign_info, pdMS_TO_TICKS(1000)) == pdTRUE)
|
||||
{
|
||||
if (ignA.coils12.spark_status == sparkStatus::SPARK_POS_FAIL || ignA.coils12.spark_status == sparkStatus::SPARK_NEG_FAIL)
|
||||
missed_firings12++;
|
||||
if (ignA.coils34.spark_status == sparkStatus::SPARK_POS_FAIL || ignA.coils34.spark_status == sparkStatus::SPARK_NEG_FAIL)
|
||||
missed_firings34++;
|
||||
|
||||
clearScreen();
|
||||
setCursor(0, 0);
|
||||
printField("++ Timestamp", (uint32_t)ignA.timestamp);
|
||||
Serial.println("========== Coils 12 =============");
|
||||
printField("Events", ignA.coils12.n_events);
|
||||
printField("Missed Firing", missed_firings12);
|
||||
printField("Spark Dly", (uint32_t)ignA.coils12.spark_delay);
|
||||
printField("Spark Sts", sparkStatusNames.at(ignA.coils12.spark_status));
|
||||
printField("Peak P_IN", ignA.coils12.peak_p_in);
|
||||
printField("Peak N_IN", ignA.coils12.peak_n_in);
|
||||
printField("Peak P_OUT", ignA.coils12.peak_p_out);
|
||||
printField("Peak N_OUT", ignA.coils12.peak_n_out);
|
||||
printField("Soft Start ", softStartStatusNames.at(ignA.coils12.sstart_status));
|
||||
|
||||
Serial.println("========== Coils 34 =============");
|
||||
printField("Events", ignA.coils34.n_events);
|
||||
printField("Missed Firing", missed_firings34);
|
||||
printField("Spark Dly", (uint32_t)ignA.coils34.spark_delay);
|
||||
printField("Spark Sts", sparkStatusNames.at(ignA.coils34.spark_status));
|
||||
printField("Peak P_IN", ignA.coils34.peak_p_in);
|
||||
printField("Peak N_IN", ignA.coils34.peak_n_in);
|
||||
printField("Peak P_OUT", ignA.coils34.peak_p_out);
|
||||
printField("Peak N_OUT", ignA.coils34.peak_n_out);
|
||||
printField("Soft Start ", softStartStatusNames.at(ignA.coils34.sstart_status));
|
||||
|
||||
Serial.println("========== END =============");
|
||||
Serial.println();
|
||||
printField("Engine RPM", ignA.eng_rpm);
|
||||
printField("ADC Read Time", ignA.adc_read_time);
|
||||
printField("Queue Errors", ignA.n_queue_errors);
|
||||
|
||||
active_history[counter++ % active_history.size()] = ignA;
|
||||
printInfo(ign_info);
|
||||
auto &hist = *active_history;
|
||||
hist[counter++ % active_history->size()] = ign_info;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Waiting for data... ");
|
||||
if (!partial_save && counter > 0) // if timeout occurs but we have unsaved data, save it before next timeout
|
||||
{
|
||||
counter = 0; // reset counter after saving
|
||||
partial_save = true;
|
||||
Serial.println("Saving history to SPIFFS...");
|
||||
save_history(*active_history, "ignition_history.csv");
|
||||
}
|
||||
delay(500);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user