diff --git a/include/data_processor.hpp b/include/data_processor.hpp index 1fa8135..33b4992 100644 --- a/include/data_processor.hpp +++ b/include/data_processor.hpp @@ -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 }; diff --git a/src/data_processor.cpp b/src/data_processor.cpp index 1c8d32c..9b638b1 100644 --- a/src/data_processor.cpp +++ b/src/data_processor.cpp @@ -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 + } } }