diff --git a/G26-Telemetria.ino b/G26-Telemetria.ino index 28b1e07..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) @@ -24,14 +25,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 @@ -49,4 +55,4 @@ void setup() { void loop() { delay(100); -} \ No newline at end of file +} 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 abbcf77..1fa8135 100644 --- a/include/data_processor.hpp +++ b/include/data_processor.hpp @@ -1,14 +1,17 @@ #ifndef DATAPROCESSOR_HPP #define DATAPROCESSOR_HPP -#include -#include "SdFat.h" -#include +#include "common/common_libraries.hpp" 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 +33,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..1c8d32c 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,142 +20,145 @@ 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"); + // } } // 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(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(); + } -} \ No newline at end of file +}