SD Card logging

This commit is contained in:
oh3bsg 2021-11-03 19:48:56 +02:00
parent 0b02394607
commit 80815edc19
4 changed files with 149 additions and 0 deletions

View File

@ -31,6 +31,12 @@
#include "src/mqtt.h"
#endif
#if FEATURE_SD_CARD_LOG
#include "FS.h"
#include "SD.h"
#include "src/sd_card.h"
#endif
//#define ESP_MEM_DEBUG 1
//int e;
@ -2146,6 +2152,11 @@ void setup()
sonde.setup();
initGPS();
#if FEATURE_SD_CARD_LOG
sd_card_init();
createDir(SD, "/log");
#endif
WiFi.onEvent(WiFiEvent);
getKeyPress(); // clear key buffer
}
@ -2373,6 +2384,9 @@ void loopDecoder() {
sondehub_send_data(&shclient, s, &sonde.config.sondehub);
}
#endif
#if FEATURE_SD_CARD_LOG
sd_card_log(s);
#endif
#if FEATURE_MQTT
// send to MQTT if enabledson

View File

@ -9,6 +9,7 @@
#define FEATURE_MQTT 0
#define FEATURE_RS92 0
#define FEATURE_SD_CARD_LOG 1
/* Most recent version support fonts in a dedicated flash parition "fonts".
* This is incomabtible (in terms of code and flash layout) to previous versions.

123
RX_FSK/src/sd_card.cpp Normal file
View File

@ -0,0 +1,123 @@
// sd_card related functions
// https://randomnerdtutorials.com/esp32-microsd-card-arduino/#sdcardcustompins
#include <math.h>
#include <SPI.h>
#include "SD.h"
#include "sonde.h"
#include "sd_card.h"
SPIClass spi_sd = SPIClass(HSPI);
void createDir(fs::FS &fs, const char * path){
Serial.printf("Creating Dir: %s\n", path);
if(fs.mkdir(path)){
Serial.println("Dir created");
} else {
Serial.println("mkdir failed");
}
}
void writeFile(fs::FS &fs, const char * path, const char * message) {
Serial.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}
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");
return;
}
if(file.print(message)){
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
void sd_card_init(void) {
Serial.println("sd_card_init()");
spi_sd.begin(14, 2, 15);
if(!SD.begin(13, spi_sd)){
Serial.println("Card Mount Failed");
return;
}
else {
Serial.println("Card Mounted");
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
Serial.println("No SD card attached");
return;
}
Serial.print("SD Card Type: ");
if(cardType == CARD_MMC){
Serial.println("MMC");
} else if(cardType == CARD_SD){
Serial.println("SDSC");
} else if(cardType == CARD_SDHC){
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
void sd_card_log(SondeInfo *s) {
char file[18];
char log_msg[150];
struct tm timeinfo;
time_t now;
time(&now);
gmtime_r(&now, &timeinfo);
if (timeinfo.tm_year <= (2016 - 1900)) {
Serial.println("Failed to obtain time");
return;
}
sprintf(file, "/log/%s.txt",s->d.ser);
// timestamp,serial,frame,lat,lon,alt,vel_v,vel_h,heading,temp,humidity,pressure,type,freq_mhz,snr,f_error_hz,sats,batt_v,burst_timer,aux_data
// 2021-10-30T00:58:41.000Z,S2250304,6826,59.48863,26.47421,9997.6,-25.5,23.0,82.6,-50.7,25.0,-1.0,RS41-SG,404.001,8.3,-187,9,2.5,08:28:27,-1
sprintf(log_msg,
"%04d-%02d-%02dT%02d:%02d:%02d.000Z,%s,%d,%.5f,%.5f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%s,%.3f,%d,-1,%d,%.1f,%d,-1\n",
timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,
s->d.ser, s->d.vframe, (float)s->d.lat, (float)s->d.lon, (float)s->d.alt, (float)s->d.vs, (float)s->d.hs, (float)s->d.dir,
(float)s->d.temperature, isnan((float)s->d.relativeHumidity) ? -1: (float)s->d.relativeHumidity, isnan((float)s->d.pressure) ? -1: (float)s->d.pressure, s->d.typestr != 0 ? s->d.typestr: " ", (float)s->freq, s->rssi, s->d.sats,
s->d.batteryVoltage, s->d.burstKT
);
Serial.println(log_msg);
if (SD.exists(file)) {
// append data
Serial.println("append new file");
appendFile(SD, file, log_msg);
}
else {
// new file
Serial.println("new file");
writeFile(SD, file, "timestamp,serial,frame,lat,lon,alt,vel_v,vel_h,heading,temp,humidity,pressure,type,freq_mhz,snr,f_error_hz,sats,batt_v,burst_timer,aux_data\n");
appendFile(SD, file, log_msg);
}
}

11
RX_FSK/src/sd_card.h Normal file
View File

@ -0,0 +1,11 @@
// sd_card module header
#ifndef _SD_CARD
#define _SD_CARD
void sd_card_init(void);
void writeFile(fs::FS &fs, const char * path, const char * message);
void appendFile(fs::FS &fs, const char * path, const char * message);
void createDir(fs::FS &fs, const char * path);
void sd_card_log(SondeInfo *s);
#endif // _SD_CARD