#pragma once
#include <mySD.h>
#include "data.h"
const int mySD_CS=13;
const int mySD_SCLK=14;
const int mySD_MISO=2;
const int mySD_MOSI=15;
const char csvHeader[]=" secs, co2, temp, humid, pm1, pm2.5, pm4, pm10, batt\n";
const char csvFormat[]="% 6lu, % 4u, % 5.1f, %5.1f, %6.1f, %6.1f, %6.1f, %6.1f, %4.2f\n";
const size_t lineLength=66;
class DataLog {
private:
File logfile;
char line[100];
uint8_t linesSinceLastFlush;
uint8_t flushThreshold;
public:
DataLog(uint8_t ft=4) : flushThreshold(ft) {}
void start() {
bool sdok=SD.begin(mySD_CS, mySD_MOSI, mySD_MISO, mySD_SCLK);
Serial.print("# sdok: ");Serial.println(sdok);
logfile = SD.open("quality.csv",FILE_WRITE);
Serial.print("# file: ");Serial.println(logfile.name());
uint32_t fileSize = logfile.size();
logfile.seek(fileSize);
if (fileSize == 0) {
logfile.write((uint8_t*)csvHeader, lineLength);
}
linesSinceLastFlush=1;
}
void show(const SensorData *data) {
snprintf(
line, lineLength+1,
csvFormat,
millis()/1000,
data->co2,
data->temperature,
max(0.0f,data->humidity),
max(0.0f,data->pm.mc_1p0),
max(0.0f,data->pm.mc_2p5 - data->pm.mc_1p0),
max(0.0f,data->pm.mc_4p0 - data->pm.mc_2p5),
max(0.0f,data->pm.mc_10p0 - data->pm.mc_4p0),
max(0.0f,data->batteryVoltage)
);
size_t written=logfile.write((uint8_t *)line,lineLength);
Serial.print("# ");Serial.write(line);
Serial.print("# written: ");Serial.println(written);
if (++linesSinceLastFlush > flushThreshold) {
logfile.flush();
linesSinceLastFlush=0;
Serial.println("# flushed");
}
}
bool serialCommand(const String &tag, const String &command) {
if (command == "log") {
Serial.print(tag);Serial.println(" begin");
uint8_t buffer[1024];
logfile.flush();
int remaining = logfile.position();
logfile.seek(0);
while (remaining > 0) {
int bytesRead = logfile.read(buffer, 1024);
Serial.write(buffer, bytesRead);
remaining -= bytesRead;
}
Serial.print(tag);Serial.println(" end");
return true;
}
return false;
}
};