2023-04-15 22:13:02 +00:00
|
|
|
#ifndef _LOGGING_H_
|
|
|
|
#define _LOGGING_H_
|
|
|
|
|
|
|
|
// SD Card Logging
|
|
|
|
|
|
|
|
#include <SPI.h> //SCK=13, MISO=12, MOSI=11
|
|
|
|
#include <SD.h> //Format sd cart with FAT or FAT16
|
|
|
|
|
2023-05-20 00:36:09 +00:00
|
|
|
#define SDCHIPSELECT 14
|
2023-04-15 22:13:02 +00:00
|
|
|
boolean datalogging=true;
|
|
|
|
String datalogging_filename="UNKNOWN.txt";
|
|
|
|
|
2023-05-23 19:46:34 +00:00
|
|
|
bool initLogging();
|
2023-04-15 22:13:02 +00:00
|
|
|
void loggingLoop(unsigned long loopmillis,ESCSerialComm& escFront, ESCSerialComm& escRear);
|
|
|
|
void writeLogComment(unsigned long time, String msg);
|
|
|
|
|
2023-05-23 19:46:34 +00:00
|
|
|
bool initLogging() {
|
2023-04-15 22:13:02 +00:00
|
|
|
Serial.print("Initializing SD card...");
|
|
|
|
// see if the card is present and can be initialized:
|
|
|
|
if (!SD.begin(SDCHIPSELECT)) {
|
|
|
|
Serial.println("Card failed, or not present");
|
|
|
|
display.print(F("Fail!")); display.display();
|
|
|
|
datalogging=false; //disable logging
|
|
|
|
delay(1000);
|
2023-05-23 19:46:34 +00:00
|
|
|
return false;
|
2023-04-15 22:13:02 +00:00
|
|
|
}else{
|
|
|
|
Serial.println("Card initialized.");
|
|
|
|
display.print(F("LOG=")); display.display();
|
|
|
|
if (datalogging){
|
|
|
|
int filenumber=0;
|
|
|
|
char buffer[6];
|
|
|
|
sprintf(buffer, "%04d", filenumber);
|
|
|
|
datalogging_filename="LOG_"+String(buffer)+".TXT";
|
|
|
|
while(SD.exists(datalogging_filename) && filenumber<10000) {
|
|
|
|
Serial.print(datalogging_filename); Serial.println(" exists");
|
|
|
|
filenumber++;
|
|
|
|
sprintf(buffer, "%04d", filenumber);
|
|
|
|
datalogging_filename="LOG_"+String(buffer)+".TXT";
|
|
|
|
|
|
|
|
}
|
|
|
|
Serial.print(datalogging_filename); Serial.println(" is free");
|
|
|
|
display.print(datalogging_filename); display.display();
|
|
|
|
}
|
|
|
|
}
|
2023-05-23 19:46:34 +00:00
|
|
|
return true;
|
2023-04-15 22:13:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void loggingLoop(unsigned long loopmillis,ESCSerialComm& escFront, ESCSerialComm& escRear) {
|
|
|
|
|
|
|
|
static unsigned long last_datalogging_write=0;
|
|
|
|
static boolean logging_headerWritten=false;
|
|
|
|
if (datalogging) {
|
|
|
|
#define LOGGINGINTERVAL 100
|
|
|
|
if (loopmillis-last_datalogging_write>LOGGINGINTERVAL)
|
|
|
|
{
|
|
|
|
last_datalogging_write=loopmillis;
|
|
|
|
|
|
|
|
File dataFile = SD.open(datalogging_filename, FILE_WRITE);
|
|
|
|
|
|
|
|
if (dataFile) { // if the file is available, write to it
|
|
|
|
if (!logging_headerWritten) {
|
|
|
|
dataFile.print("time,cmd_FrontL,cmd_FrontR,cmd_RearL,cmd_RearR,");
|
|
|
|
dataFile.print("current_FrontL,current_FrontR,current_RearL,current_RearR,");
|
|
|
|
dataFile.print("rpm_FrontL,rpm_FrontR,rpm_RearL,rpm_RearR,");
|
|
|
|
dataFile.print("temp_Front,temp_Rear,vbat_Front,vbat_Rear,");
|
|
|
|
dataFile.println("currentAll,throttle,brake,speed,trip,currentConsumed,motorenabled,disarmedByDelay");
|
|
|
|
dataFile.print("#TIMESTAMP:"); dataFile.println(now());
|
|
|
|
logging_headerWritten=true;
|
|
|
|
}
|
|
|
|
dataFile.print(loopmillis/1000.0,3); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getCmdL()); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getCmdR()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getCmdL()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getCmdR()); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getFiltered_curL(),3); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getFiltered_curR(),3); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFiltered_curL(),3); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFiltered_curR(),3); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getFeedback_speedL_meas()); dataFile.print(";"); //Todo: check if speed for R wheels needs to be negated
|
|
|
|
dataFile.print(escFront.getFeedback_speedR_meas()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFeedback_speedL_meas()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFeedback_speedR_meas()); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getFeedback_boardTemp()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFeedback_boardTemp()); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getFeedback_batVoltage()); dataFile.print(";");
|
|
|
|
dataFile.print(escRear.getFeedback_batVoltage()); dataFile.print(";");
|
|
|
|
dataFile.print(filtered_currentAll,3); dataFile.print(";");
|
|
|
|
dataFile.print(throttle_pos); dataFile.print(";");
|
|
|
|
dataFile.print(brake_pos); dataFile.print(";");
|
2023-05-23 20:01:07 +00:00
|
|
|
dataFile.print((escFront.getMeanSpeed()+escRear.getMeanSpeed())/2.0); dataFile.print(";");
|
2023-04-15 22:13:02 +00:00
|
|
|
dataFile.print(escFront.getTrip()); dataFile.print(";");
|
|
|
|
dataFile.print(escFront.getCurrentConsumed(),3); dataFile.print(";");
|
|
|
|
dataFile.println("");
|
|
|
|
dataFile.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void writeLogComment(unsigned long time, String msg) {
|
|
|
|
//SerialRef.print("#"); SerialRef.print(time/1000.0,3); SerialRef.print(","); SerialRef.print(msg); SerialRef.println();
|
|
|
|
if (datalogging) {
|
|
|
|
File dataFile = SD.open(datalogging_filename, FILE_WRITE);
|
|
|
|
|
|
|
|
if (dataFile) { // if the file is available, write to it
|
|
|
|
dataFile.print("#");
|
|
|
|
dataFile.print(time/1000.0,3);
|
|
|
|
dataFile.print(",");
|
|
|
|
dataFile.print(msg);
|
|
|
|
dataFile.println();
|
|
|
|
dataFile.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|