From 8e7c116e6a5970c123ab16c9fc180c2940200707 Mon Sep 17 00:00:00 2001 From: alejandrogs73 Date: Mon, 15 Dec 2025 21:10:33 +0100 Subject: [PATCH 1/3] feat(telemetry): Memoria de estado (CarState) y limpieza para test de Temperatura MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Creada la estructura 'CarState' para que el ESP32 no se olvide de los datos entre mensajes. - Comentados todos los cálculos que no sean usados para ahorrar recursos. --- G26-Telemetria.ino | 2 +- include/data_processor.hpp | 7 +- src/data_processor.cpp | 199 +++++++++++++++++++------------------ 3 files changed, 109 insertions(+), 99 deletions(-) diff --git a/G26-Telemetria.ino b/G26-Telemetria.ino index 28b1e07..b093b0f 100644 --- a/G26-Telemetria.ino +++ b/G26-Telemetria.ino @@ -49,4 +49,4 @@ void setup() { void loop() { delay(100); -} \ No newline at end of file +} diff --git a/include/data_processor.hpp b/include/data_processor.hpp index abbcf77..04f5873 100644 --- a/include/data_processor.hpp +++ b/include/data_processor.hpp @@ -9,6 +9,11 @@ class DataProcessor { public: DataProcessor() = default; + // Estructura de datos + struct CarState { + int ect = 0; // Temperatura (IMPORTANTE POR AHORA). Luego habría que añadir aquí todas las variables que se vallan a guardar. + }; + // Configuración SD void setLogSystem(SdFat* sd_inst, SdFile* file_inst) { _sd = sd_inst; @@ -30,4 +35,4 @@ private: void flushToSD(); // Guardado físico }; -#endif \ No newline at end of file +#endif diff --git a/src/data_processor.cpp b/src/data_processor.cpp index 83a9191..1f91230 100644 --- a/src/data_processor.cpp +++ b/src/data_processor.cpp @@ -3,9 +3,13 @@ //RPM + TPS + vBatt + ECT void DataProcessor::send_serial_frame_0(int rpmh, int rpml, int tpsh, int tpsl, int vbatth, int vbattl, int ect){ - int rpm = (rpmh * 256) + rpml; - int tps = (tpsh * 256) + tpsl; - double vbatt = ((vbatth * 256) + vbattl) / 100.0; + + car.ect = ect; // GUARDAR LA VARIABLE DEL FRAME EN LA ESTRUCTURA + + // El resto de variables no son relevantes ahora, se quedan comentadas para ahorrar memoria + // int rpm = (rpmh * 256) + rpml; + // int tps = (tpsh * 256) + tpsl; + // double vbatt = ((vbatth * 256) + vbattl) / 100.0; // 2. Escribimos en la SD flushToSD(); @@ -16,126 +20,127 @@ void DataProcessor::send_serial_frame_0(int rpmh, int rpml, int tpsh, int tpsl, //LAMB + LAMBTRG + FUEL + GEAR void DataProcessor::send_serial_frame_1(int lmbh, int lmbl, int lmbth, int lmbtl, int fuelh, int fuell, int gear){ - int lmb = (lmbh * 256) + lmbl; - int lmbtrg = (lmbth * 256) + lmbtl; - int fuel = (fuelh * 256) + fuell; + + // int lmb = (lmbh * 256) + lmbl; + // int lmbtrg = (lmbth * 256) + lmbtl; + // int fuel = (fuelh * 256) + fuell; } void DataProcessor::send_serial_frame_2(int shut, int fan, int lmbch, int lmbcl, int brakeh, int brakel, int aux1){ - int lmbcorrect = (lmbch * 256) + lmbcl; - int brake = (brakeh * 256) + brakel; + // int lmbcorrect = (lmbch * 256) + lmbcl; + // int brake = (brakeh * 256) + brakel; - char shut_str[10]; - char fan_str[10]; - char aux1_str[10]; + // char shut_str[10]; + // char fan_str[10]; + // char aux1_str[10]; } void DataProcessor::send_serial_frame_3(int aux3, int aux4, int aux5, int aux6, int aux7, int aux8, int dig1){ - char aux3_str[10]; - char aux4_str[10]; - char aux5_str[10]; - char aux6_str[10]; - char aux7_str[10]; - char aux8_str[10]; - char dig1_str[10]; + // char aux3_str[10]; + // char aux4_str[10]; + // char aux5_str[10]; + // char aux6_str[10]; + // char aux7_str[10]; + // char aux8_str[10]; + // char dig1_str[10]; - if (aux3 == 1){ - strcpy(aux3_str, "ON"); - } else { - strcpy(aux3_str, "OFF"); - } + // if (aux3 == 1){ + // strcpy(aux3_str, "ON"); + // } else { + // strcpy(aux3_str, "OFF"); + // } - if (aux4 == 1){ + // if (aux4 == 1){ - strcpy(aux4_str, "ON"); - } else { - strcpy(aux4_str, "OFF"); - } + // strcpy(aux4_str, "ON"); + // } else { + // strcpy(aux4_str, "OFF"); + // } - if (aux5 == 1){ - strcpy(aux5_str, "ON"); - } else { - strcpy(aux5_str, "OFF"); - } + // if (aux5 == 1){ + // strcpy(aux5_str, "ON"); + // } else { + // strcpy(aux5_str, "OFF"); + // } - if (aux6 == 1){ - strcpy(aux6_str, "ON"); - } else { - strcpy(aux6_str, "OFF"); - } + // if (aux6 == 1){ + // strcpy(aux6_str, "ON"); + // } else { + // strcpy(aux6_str, "OFF"); + // } - if (aux7 == 1){ - strcpy(aux7_str, "ON"); - } else { - strcpy(aux7_str, "OFF"); - } + // if (aux7 == 1){ + // strcpy(aux7_str, "ON"); + // } else { + // strcpy(aux7_str, "OFF"); + // } - if (aux8 == 1){ - strcpy(aux8_str, "ON"); - } else { - strcpy(aux8_str, "OFF"); - } + // if (aux8 == 1){ + // strcpy(aux8_str, "ON"); + // } else { + // strcpy(aux8_str, "OFF"); + // } - if (dig1 == 1){ - strcpy(dig1_str, "ON"); - } else { - strcpy(dig1_str, "OFF"); - } + // if (dig1 == 1){ + // strcpy(dig1_str, "ON"); + // } else { + // strcpy(dig1_str, "OFF"); + // } } void DataProcessor::send_serial_frame_4(int dig3, int dig4, int dig5, int dig6, int dig7, int dig8, int dig9){ - char dig3_str[10]; - char dig4_str[10]; - char dig5_str[10]; - char dig6_str[10]; - char dig7_str[10]; - char dig8_str[10]; - char dig9_str[10]; + // char dig3_str[10]; + // char dig4_str[10]; + // char dig5_str[10]; + // char dig6_str[10]; + // char dig7_str[10]; + // char dig8_str[10]; + // char dig9_str[10]; - if (dig3 == 1){ - strcpy(dig3_str, "ON"); - } else { - strcpy(dig3_str, "OFF"); - } + // if (dig3 == 1){ + // strcpy(dig3_str, "ON"); + // } else { + // strcpy(dig3_str, "OFF"); + // } - if (dig4 == 1){ - strcpy(dig4_str, "ON"); - } else { - strcpy(dig4_str, "OFF"); - } + // if (dig4 == 1){ + // strcpy(dig4_str, "ON"); + // } else { + // strcpy(dig4_str, "OFF"); + // } - if (dig5 == 1){ - strcpy(dig5_str, "ON"); - } else { - strcpy(dig5_str, "OFF"); - } + // if (dig5 == 1){ + // strcpy(dig5_str, "ON"); + // } else { + // strcpy(dig5_str, "OFF"); + // } - if (dig6 == 1){ - strcpy(dig6_str, "ON"); - } else { - strcpy(dig6_str, "OFF"); - } + // if (dig6 == 1){ + // strcpy(dig6_str, "ON"); + // } else { + // strcpy(dig6_str, "OFF"); + // } - if (dig7 == 1){ - strcpy(dig7_str, "ON"); - } else { - strcpy(dig7_str, "OFF"); - } + // if (dig7 == 1){ + // strcpy(dig7_str, "ON"); + // } else { + // strcpy(dig7_str, "OFF"); + // } - if (dig8 == 1){ - strcpy(dig8_str, "ON"); - } else { - strcpy(dig8_str, "OFF"); - } + // if (dig8 == 1){ + // strcpy(dig8_str, "ON"); + // } else { + // strcpy(dig8_str, "OFF"); + // } - if (dig9 == 1){ - strcpy(dig9_str, "ON"); - } else { - strcpy(dig9_str, "OFF"); - } + // if (dig9 == 1){ + // strcpy(dig9_str, "ON"); + // } else { + // strcpy(dig9_str, "OFF"); + // } } @@ -149,9 +154,9 @@ void DataProcessor::flushToSD() { _logFile->print(millis()); _logFile->print(","); - _logFile->println(ect); + _logFile->println(car.ect); _logFile->close(); } } -} \ No newline at end of file +} From e991ea392314f5ddf775eb9c19770cde72921f70 Mon Sep 17 00:00:00 2001 From: alejandrogs73 Date: Mon, 15 Dec 2025 21:28:12 +0100 Subject: [PATCH 2/3] =?UTF-8?q?feat(telemetry):=20Escritura=20r=C3=A1pida?= =?UTF-8?q?=20en=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(); + } } From d190db3d3cce443138b8c43d84f880b675700b8b Mon Sep 17 00:00:00 2001 From: alejandrogs73 Date: Mon, 15 Dec 2025 21:47:44 +0100 Subject: [PATCH 3/3] =?UTF-8?q?refactor(libs):=20Limpieza=20y=20orden=20en?= =?UTF-8?q?=20las=20librer=C3=ADas=20-=20Se=20ha=20centralizado=20todas=20?= =?UTF-8?q?las=20librerias=20bajo=20common=5Flibraries.=20-=20Ahora=20todo?= =?UTF-8?q?=20hace=20un=20llamado=20a=20common=5Flibraries.hpp,=20mera=20o?= =?UTF-8?q?ptimizaci=C3=B3n.=20-=20Todo=20queda=20m=C3=A1s=20ordenado:=20s?= =?UTF-8?q?i=20cambiamos=20la=20librer=C3=ADa=20de=20la=20SD=20ma=C3=B1ana?= =?UTF-8?q?,=20solo=20hay=20que=20tocar=20un=20archivo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- G26-Telemetria.ino | 3 ++- include/common/common_libraries.hpp | 10 +++++++--- include/common/telemetry_status.hpp | 2 +- include/data_processor.hpp | 4 +--- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/G26-Telemetria.ino b/G26-Telemetria.ino index 6ce3c0b..ef01df3 100644 --- a/G26-Telemetria.ino +++ b/G26-Telemetria.ino @@ -1,10 +1,11 @@ - #include #include #include "SdFat.h" + #include "include/can.hpp" #include "include/data_processor.hpp" + // --- CONFIGURACIÓN SD (VSPI) --- #define SD_CS_PIN 5 #define SPI_CLOCK SD_SCK_MHZ(20) diff --git a/include/common/common_libraries.hpp b/include/common/common_libraries.hpp index de54e53..9c8577a 100644 --- a/include/common/common_libraries.hpp +++ b/include/common/common_libraries.hpp @@ -2,9 +2,13 @@ #define COMMON_LIBRARIES_HPP #include + +#include #include "SdFat.h" -#include "time.h" -#include + #include -#endif \ No newline at end of file +#include "time.h" +#include + +#endif diff --git a/include/common/telemetry_status.hpp b/include/common/telemetry_status.hpp index 74e2971..b356a05 100644 --- a/include/common/telemetry_status.hpp +++ b/include/common/telemetry_status.hpp @@ -6,4 +6,4 @@ enum class TelemetryStatus { }; -#endif \ No newline at end of file +#endif diff --git a/include/data_processor.hpp b/include/data_processor.hpp index 04f5873..1fa8135 100644 --- a/include/data_processor.hpp +++ b/include/data_processor.hpp @@ -1,9 +1,7 @@ #ifndef DATAPROCESSOR_HPP #define DATAPROCESSOR_HPP -#include -#include "SdFat.h" -#include +#include "common/common_libraries.hpp" class DataProcessor { public: