Added SD card writes -> Coords are stored as coords[0..].txt

This commit is contained in:
Ano-sys
2025-08-15 13:11:58 +02:00
parent 76f96e4245
commit b9e982bb0c
2 changed files with 51 additions and 29 deletions
+2 -1
View File
@@ -35,7 +35,7 @@
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
TinyGPSPlus gps; TinyGPSPlus gps;
SDHelper logger(SD_CS, FAM_W); SDHelper logger;
void sendMessage(const String& msg) { void sendMessage(const String& msg) {
LoRa.beginPacket(); LoRa.beginPacket();
@@ -116,6 +116,7 @@ void SerialPrintGPS(){
void storeToSD(const String& lat, const String& lng){ void storeToSD(const String& lat, const String& lng){
static int i = 1; static int i = 1;
Serial.println("Filename: " + logger.Filename());
logger.Log(String(i++) + ": " + lat + " " + lng); logger.Log(String(i++) + ": " + lat + " " + lng);
} }
+49 -28
View File
@@ -1,59 +1,80 @@
#pragma once #pragma once
#include "FS.h"
#include <SPI.h> #include <SPI.h>
#include <SD.h> #include <SD.h>
typedef enum{
FAM_R,
FAM_W
} FileAccessMode;
class SDHelper { class SDHelper {
private: private:
uint8_t _cs; uint8_t _cs;
FileAccessMode _fam;
File _stream; File _stream;
String _filename; String _filename;
bool _available = false; bool _available = false;
SPIClass _spi; SPIClass _spi;
String getNewFilename() { String getNewFilename(fs::FS& fs) {
static unsigned long i = 0; unsigned long i = 0;
String name;
do { File root = fs.open("/");
name = "coords" + String(i++) + ".txt"; if(!root){
} while (SD.exists(name.c_str())); Serial.println("Failed to open root of SD!");
return name; return "/coords.txt";
}
File file = root.openNextFile();
while(file){
if(String(file.name()).indexOf("coords") != -1) i++;
file = root.openNextFile();
}
return "/coords" + String(i++) + ".txt";
}
void appendFile(fs::FS& fs, const char* path, const char* message) {
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("Failed to open file for appending!");
Serial.println("Trying writing insted!");
file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing!");
return;
}
}
if(file.print(message))Serial.println("Wrote message!");
else Serial.println("Writing failed!");
file.close();
} }
public: public:
SDHelper(uint8_t csPin, FileAccessMode fam, String filename = "") : _cs(csPin), _fam(fam), _spi(HSPI){ SDHelper() : _spi(HSPI){
_spi.begin(14, 2, 15, 13); _spi.begin(14, 2, 15, 13);
if(!SD.begin(_cs, _spi)){ if(!SD.begin(13, _spi)){
_available = false; _available = false;
return; return;
} }
if(_fam == FAM_W){ uint8_t cardType = SD.cardType();
_filename = filename.length() ? filename : getNewFilename();
_stream = SD.open(_filename.c_str(), FILE_WRITE); if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
} }
else {
_filename = filename; _filename = getNewFilename(SD);
_stream = SD.open(_filename.c_str(), FILE_READ);
}
_available = (bool)_stream;
} }
~SDHelper(){ ~SDHelper(){
if(_stream) _stream.close(); if(_stream) _stream.close();
} }
bool Available() const { return _available; } String Filename() { return _filename; }
const String& filename() const { return _filename; }
void Log(const String& msg) { void Log(const String& msg) {
if(_fam != FAM_W || !_stream) return; appendFile(SD, _filename.c_str(), (msg + "\n").c_str());
_stream.println(msg);
_stream.flush();
} }
}; };