diff --git a/iot/main/main.ino b/iot/main/main.ino index 5d0594e..485051d 100644 --- a/iot/main/main.ino +++ b/iot/main/main.ino @@ -36,16 +36,13 @@ void setup() { peripheral_unsilence(PIN_SPI_CS_SD); - store_init(); Serial.println(freeMemory(), DEC); store_reading(id, gps_data); Serial.println(freeMemory(), DEC); #ifdef SD_DEBUG_ENABLED - store_debug(gps_data.time, 19); - #endif - Serial.println(freeMemory(), DEC); - store_end(); + store_debug(gps_data.time, 19 - 1); // Don't print the null byte Serial.println(freeMemory(), DEC); + #endif // ------------------------------------------------------------------------ diff --git a/iot/main/storage.cpp b/iot/main/storage.cpp index 974b112..b636e21 100644 --- a/iot/main/storage.cpp +++ b/iot/main/storage.cpp @@ -5,44 +5,44 @@ #include "settings.h" #include "gps.h" -// FUTURE: We might be able to trim it down if we disable long filenames with #define USE_LONG_FILE_NAMES 0 -SdFat* card = nullptr; +// FUTURE: We might be able to trim it down if we disable long filenames with #define -void store_init() { - card = new SdFat(); - if(!card->begin(PIN_SPI_CS_SD)) { +SdFat store_init() { + SdFat card; + if(!card.begin(PIN_SPI_CS_SD)) { Serial.println("Error: MicroSD card init failed"); while(true) delay(100); } + return card; } void store_reading(uint32_t id, GPSLocation location) { // Port the rest of this to SdFat from SD + SdFat card = store_init(); // Open the file to write the data to. If it doesn't exist it will be created. // Unlike elsewhere, FILE_WRITE opens the file with the cursor starting at the end, so it's basically actually equivalent to FILE_APPEND that we use in other environments. Confusing, I know. - File handle = card->open(SD_FILENAME, O_APPEND | O_CREAT | O_WRONLY); - - char line[33]; - int chars = snprintf(line, 33, "%d\t%06d\t%06d\n", - id, - location.lat, location.lng - ); - handle.write(line, chars); - + File handle = card.open(SD_FILENAME, O_APPEND | O_CREAT | O_WRONLY); + uint8_t places = 6; + handle.printField(id, '\t'); + handle.printField(location.lat, '\t', places); + handle.printField(location.lng, '\n', places); handle.close(); // Syncs implicitly } void store_debug(char* buffer, int size) { - File handle = card->open(SD_FILENAME_DEBUG, O_APPEND | O_CREAT | O_WRONLY); + SdFat card = store_init(); + File handle = card.open(SD_FILENAME_DEBUG, O_APPEND | O_CREAT | O_WRONLY); handle.write(buffer, size); handle.write('\n'); handle.close(); } +/* void store_end() { // Apparently we'ree fine so long as we don't have any open file handles - there's no end() method on the SdFat class // card->end(); delete card; card = nullptr; } +*/ diff --git a/iot/main/storage.h b/iot/main/storage.h index cf4e88f..8a3ea67 100644 --- a/iot/main/storage.h +++ b/iot/main/storage.h @@ -11,4 +11,4 @@ void store_reading(uint32_t id, GPSLocation location); void store_debug(char* buffer, int size); -void store_end(); +// void store_end();