Browse Source

Added debug logging to memory, and Web API to retrieve the log

master
Youen Toupin 3 years ago
parent
commit
127fd6176c
  1. 53
      ESP32/src/DebugLog.cpp
  2. 26
      ESP32/src/DebugLog.h
  3. 74
      ESP32/src/vehicle-monitor.cpp

53
ESP32/src/DebugLog.cpp

@ -0,0 +1,53 @@
#include "DebugLog.h"
detail::DebugLog DebugLog;
namespace detail
{
DebugLog::DebugLog()
{
buffer[sizeof(buffer)-1] = 0;
}
DebugLog::~DebugLog()
{
}
void DebugLog::append(uint8_t b)
{
buffer[end] = b;
end = (end + 1) % (sizeof(buffer)-1);
if(end == start) start = (start + 1) % (sizeof(buffer)-1);
}
size_t DebugLog::write(uint8_t b)
{
append(b);
return Serial.write(b);
}
size_t DebugLog::write(const uint8_t *buffer, size_t size)
{
for(size_t i = 0; i < size; ++i)
{
append(buffer[i]);
}
return Serial.write(buffer, size);
}
const char* DebugLog::get(int partIdx)
{
buffer[end] = 0;
if(partIdx == 0)
{
return (const char*)&buffer[start];
}
else if(partIdx == 1)
{
if(end < start)
return (const char*)&buffer[0];
}
return (const char*)&buffer[end];
}
}

26
ESP32/src/DebugLog.h

@ -0,0 +1,26 @@
#include <Arduino.h>
namespace detail
{
class DebugLog : public Print
{
public:
DebugLog();
~DebugLog();
virtual size_t write(uint8_t b) override;
virtual size_t write(const uint8_t *buffer, size_t size) override;
const char* get(int partIdx);
private:
void append(uint8_t b);
private:
uint8_t buffer[4096];
int start = 0;
int end = 0;
};
}
extern detail::DebugLog DebugLog;

74
ESP32/src/vehicle-monitor.cpp

@ -1,5 +1,11 @@
#include <Arduino.h> #include <Arduino.h>
#include "DebugLog.h"
#include "ADC.h"
#include "OTA.h"
#include "DataLogger.h"
#include "utils.h"
#include <WiFi.h> #include <WiFi.h>
#include <WiFiMulti.h> #include <WiFiMulti.h>
#include <FS.h> #include <FS.h>
@ -8,11 +14,6 @@
#include <Dps310.h> #include <Dps310.h>
#include "ADC.h"
#include "OTA.h"
#include "DataLogger.h"
#include "utils.h"
#include "wifi-credentials.h" #include "wifi-credentials.h"
#include <limits> #include <limits>
@ -129,7 +130,7 @@ void connectWifi()
const int numSSIDs = sizeof(wifi_STA_credentials)/sizeof(wifi_STA_credentials[0]); const int numSSIDs = sizeof(wifi_STA_credentials)/sizeof(wifi_STA_credentials[0]);
if(numSSIDs > 0) if(numSSIDs > 0)
{ {
Serial.println("Connecting to wifi..."); DebugLog.println("Connecting to wifi...");
for(int idx = 0; idx < numSSIDs; ++idx) for(int idx = 0; idx < numSSIDs; ++idx)
{ {
@ -152,7 +153,7 @@ void setup()
Serial.begin(115200); Serial.begin(115200);
if(!SPIFFS.begin(false)){ if(!SPIFFS.begin(false)){
Serial.println("SPIFFS Mount Failed"); DebugLog.println("SPIFFS Mount Failed");
return; return;
} }
@ -162,13 +163,13 @@ void setup()
// Create the WiFi Access Point // Create the WiFi Access Point
if(wifi_AP_ssid != nullptr) if(wifi_AP_ssid != nullptr)
{ {
Serial.println("Creating wifi access point..."); DebugLog.println("Creating wifi access point...");
WiFi.softAP(wifi_AP_ssid, wifi_AP_password); WiFi.softAP(wifi_AP_ssid, wifi_AP_password);
Serial.print("Wifi access point created, SSID="); DebugLog.print("Wifi access point created, SSID=");
Serial.print(wifi_AP_ssid); DebugLog.print(wifi_AP_ssid);
Serial.print(", IP="); DebugLog.print(", IP=");
Serial.println(WiFi.softAPIP()); DebugLog.println(WiFi.softAPIP());
} }
// Also connect as a station (if the configured remote access point is in range) // Also connect as a station (if the configured remote access point is in range)
@ -180,6 +181,21 @@ void setup()
pressureSensor.begin(Wire); pressureSensor.begin(Wire);
server.on("/api/debug/log", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncResponseStream *response = request->beginResponseStream("text/plain");
int logPartIdx = 0;
while(true)
{
const char* text = DebugLog.get(logPartIdx);
if(text[0] == 0) break;
response->print(text);
++logPartIdx;
}
request->send(response);
});
server.on("/api/status", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/api/status", HTTP_GET, [](AsyncWebServerRequest *request){
int v = batteryVoltage; int v = batteryVoltage;
int c = batteryOutputCurrent; int c = batteryOutputCurrent;
@ -234,7 +250,7 @@ void setup()
server.serveStatic("/", SPIFFS, "/www/").setCacheControl("max-age=5184000"); server.serveStatic("/", SPIFFS, "/www/").setCacheControl("max-age=5184000");
server.begin(); server.begin();
Serial.println("HTTP server started"); DebugLog.println("HTTP server started");
digitalWrite(debugLedPin, LOW); digitalWrite(debugLedPin, LOW);
} }
@ -246,18 +262,18 @@ void handle_wifi_connection()
{ {
if(newWifiStatus == WL_CONNECTED) if(newWifiStatus == WL_CONNECTED)
{ {
Serial.print("Connected to wifi ("); DebugLog.print("Connected to wifi (");
Serial.print(WiFi.SSID().c_str()); DebugLog.print(WiFi.SSID().c_str());
Serial.print("), ip="); DebugLog.print("), ip=");
Serial.println(WiFi.localIP()); DebugLog.println(WiFi.localIP());
} }
else if(newWifiStatus == WL_DISCONNECTED) else if(newWifiStatus == WL_DISCONNECTED)
{ {
char codeStr[16]; char codeStr[16];
sprintf(codeStr, "%d", (int)newWifiStatus); sprintf(codeStr, "%d", (int)newWifiStatus);
Serial.print("Lost wifi connexion ("); DebugLog.print("Lost wifi connexion (");
Serial.print(codeStr); DebugLog.print(codeStr);
Serial.println(")"); DebugLog.println(")");
connectWifi(); connectWifi();
} }
@ -265,8 +281,8 @@ void handle_wifi_connection()
{ {
char codeStr[16]; char codeStr[16];
sprintf(codeStr, "%d", (int)newWifiStatus); sprintf(codeStr, "%d", (int)newWifiStatus);
Serial.print("Wifi state: "); DebugLog.print("Wifi state: ");
Serial.println(codeStr); DebugLog.println(codeStr);
} }
wifi_STA_status = newWifiStatus; wifi_STA_status = newWifiStatus;
@ -323,7 +339,7 @@ void handle_pressure_measure()
ret = pressureSensor.measureTempOnce(temp, oversampling); ret = pressureSensor.measureTempOnce(temp, oversampling);
if(ret != 0) if(ret != 0)
{ {
Serial.print("Failed to measure temperature: "); Serial.println(ret); DebugLog.print("Failed to measure temperature: "); DebugLog.println(ret);
return; return;
} }
temperature = (int16_t)(temp * 10.0f + 0.5f); temperature = (int16_t)(temp * 10.0f + 0.5f);
@ -332,7 +348,7 @@ void handle_pressure_measure()
pressureSensor.measurePressureOnce(pressure, oversampling); pressureSensor.measurePressureOnce(pressure, oversampling);
if(ret != 0) if(ret != 0)
{ {
Serial.print("Failed to measure pressure: "); Serial.println(ret); DebugLog.print("Failed to measure pressure: "); DebugLog.println(ret);
return; return;
} }
@ -370,9 +386,9 @@ void handle_pressure_measure()
} }
altitude = (int32_t)(alt * 1000.0f + 0.5f); altitude = (int32_t)(alt * 1000.0f + 0.5f);
/*Serial.print("temperature="); Serial.print(temp); Serial.print("°C"); /*DebugLog.print("temperature="); DebugLog.print(temp); DebugLog.print("°C");
Serial.print(" pressure="); Serial.print(pressure); Serial.print("Pa"); DebugLog.print(" pressure="); DebugLog.print(pressure); DebugLog.print("Pa");
Serial.print(" altitude="); Serial.print(altitude); Serial.println("mm");*/ DebugLog.print(" altitude="); DebugLog.print(altitude); DebugLog.println("mm");*/
} }
void loop() void loop()
@ -395,7 +411,7 @@ void loop()
stoppedSince = -1; stoppedSince = -1;
if(!DataLogger::get().isOpen()) if(!DataLogger::get().isOpen())
{ {
Serial.println("Starting DataLogger"); DebugLog.println("Starting DataLogger");
DataLogger::get().open(); DataLogger::get().open();
} }
} }
@ -409,7 +425,7 @@ void loop()
{ {
if(DataLogger::get().isOpen()) if(DataLogger::get().isOpen())
{ {
Serial.println("Stopping DataLogger"); DebugLog.println("Stopping DataLogger");
DataLogger::get().close(); DataLogger::get().close();
} }
} }

Loading…
Cancel
Save