perf(sd): activar escritura por buffer y sync periodico

- Se elimina el guardado fisico forzado en cada mensaje CAN.
 - Ahora los datos se acumulan en RAM y se guardan en la SD cada 1 segundo.
 - Esto evita que el procesador se bloquee y pierda datos.
 - Nota: riesgo de perder maximo 1s de log (minimo comparado al riesgo de perder paquetes del CAN por que se bloquee el procesador con el codigo anterior) si se corta la energia de golpe.
This commit is contained in:
Alejandro Guerrero 2025-12-16 13:53:09 +01:00
parent d190db3d3c
commit 9993acaba6
Signed by: alejandrogs73
GPG key ID: 1CFF10953BEE333C
2 changed files with 13 additions and 6 deletions

View file

@ -30,6 +30,10 @@ private:
SdFile* _logFile;
CarState car;
uint32_t _last_sync_time = 0;
const uint32_t _sync_interval_ms = 1000; // Guardar físicamente cada 1 segundo (ajustable)
// Esto optimiza tiempos. Los datos se guardan a la velocidad del CAN en RAM y cada 1 segundo se vuelcan a la SD. Cosa mucho más optima ya que la SD es relativamente lenta comparada al CAN
void flushToSD(); // Guardado físico
};

View file

@ -150,15 +150,18 @@ void DataProcessor::flushToSD() {
// Verificamos que los punteros existan Y que el archivo esté abierto
if (_sd && _logFile && _logFile->isOpen()) {
// 1. Escribimos los datos
// 1. Escribimos al BUFFER (RAM) - Esto es instantáneo (microsegundos)
_logFile->print(millis());
_logFile->print(",");
_logFile->println(car.ect);
// 2. SYNC
// Esto fuerza a la SD a guardar físicamente los datos AHORA MISMO,
// pero mantiene el archivo abierto para la siguiente vuelta.
_logFile->sync();
// 2. SYNC CONTROLADO
// Solo obligamos a la tarjeta a "escribir de verdad" si ha pasado X tiempo.
// Esto evita detener el CAN cada 10ms.
if (millis() - _last_sync_time > _sync_interval_ms) {
_logFile->sync(); // Aquí sí gastamos tiempo, pero solo 1 vez por segundo
_last_sync_time = millis();
// Serial.println("[SD] Sync realizado"); // Descomentar solo para debug
}
}
}