Starbeamrainbowlabs
c7012c621d
....but we don't initialise it to a value if it hasn't been written to yet.
59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
#include <Arduino.h>
|
|
#include <SdFat.h>
|
|
#include <EEPROM.h>
|
|
// #include <ArduinoFiles.h>
|
|
|
|
#include "settings.h"
|
|
#include "gps.h"
|
|
|
|
// FUTURE: We might be able to trim it down if we disable long filenames with #define
|
|
|
|
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);
|
|
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) {
|
|
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're 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;
|
|
}
|
|
*/
|
|
|
|
void store_eeprom_uint32_save(uint8_t offset, uint32_t value) {
|
|
EEPROM.put(offset, value);
|
|
}
|
|
|
|
uint32_t store_eeprom_uint32_retrieve(uint8_t offset) {
|
|
uint32_t result;
|
|
EEPROM.get(offset, result);
|
|
return result;
|
|
}
|