From e991ea392314f5ddf775eb9c19770cde72921f70 Mon Sep 17 00:00:00 2001 From: alejandrogs73 Date: Mon, 15 Dec 2025 21:28:12 +0100 Subject: [PATCH] =?UTF-8?q?feat(telemetry):=20Escritura=20r=C3=A1pida=20en?= =?UTF-8?q?=20SD=20usando=20sync()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hemos cambiado la táctica: ahora el archivo se abre al arrancar y SE QUEDA ABIERTO. - En lugar de abrir y cerrar el archivo cada vez (que es muy lento), usamos 'sync' para empujar los datos a la tarjeta. --- G26-Telemetria.ino | 19 ++++++++++++------- src/data_processor.cpp | 26 ++++++++++++++------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/G26-Telemetria.ino b/G26-Telemetria.ino index b093b0f..6ce3c0b 100644 --- a/G26-Telemetria.ino +++ b/G26-Telemetria.ino @@ -24,14 +24,19 @@ void setup() { if (!sd.begin(SD_CS_PIN, SPI_CLOCK)) { Serial.println("[FALLO] SD no detectada. El sistema continuará sin Datalogging."); } else { - Serial.println("[OK] SD Montada."); - if (!logFile.exists("G26.csv")) { - if (logFile.open("G26.csv", O_RDWR | O_CREAT | O_AT_END)) { - // SOLO Cabeceras de lo que vamos a grabar ahora - logFile.println("Time,ECT"); - logFile.close(); - } + if (logFile.open("G26.csv", O_RDWR | O_CREAT | O_APPEND)) { + + // Si el archivo es nuevo (tamaño 0), escribimos la cabecera + if (logFile.size() == 0) { + logFile.println("Time,ECT"); } + + // El archivo se queda abierto y listo. + Serial.println("[OK] Archivo abierto"); + + } else { + Serial.println("[ERROR] No se pudo abrir el archivo G26.csv"); + } } // 2. VINCULACIÓN diff --git a/src/data_processor.cpp b/src/data_processor.cpp index 1f91230..1c8d32c 100644 --- a/src/data_processor.cpp +++ b/src/data_processor.cpp @@ -145,18 +145,20 @@ void DataProcessor::send_serial_frame_4(int dig3, int dig4, int dig5, int dig6, } // ESCRITURA EN SD -void DataProcessor::flushToSD() { - // Solo escribe si la tarjeta está lista - if (_sd && _logFile && _sd->card()) { - - // Modo APPEND - if (_logFile->open("G26.csv", O_RDWR | O_CREAT | O_AT_END)) { - - _logFile->print(millis()); - _logFile->print(","); - _logFile->println(car.ect); - _logFile->close(); - } +void DataProcessor::flushToSD() { + // Verificamos que los punteros existan Y que el archivo esté abierto + if (_sd && _logFile && _logFile->isOpen()) { + + // 1. Escribimos los datos + _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(); + } }