Skip to content

Commit c8603b2

Browse files
committed
Add backlog to buffered logger
1 parent d5304bc commit c8603b2

3 files changed

Lines changed: 41 additions & 18 deletions

File tree

src/asyncbufferedtcplogger.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
#include "asyncbufferedtcplogger.h"
2+
#include "configuration.h"
23

34
APB::AsyncBufferedTCPLogger::AsyncBufferedTCPLogger(AsyncServer & loggerServer) {
45
loggerServer.onClient([this](void *,AsyncClient *c){
56
this->client = c;
7+
if(!this->backlog.empty()) {
8+
c->write("==== Flushing backlog ====\n");
9+
while(!this->backlog.empty()) {
10+
c->write(this->backlog.front().c_str(), this->backlog.front().length());
11+
this->backlog.pop();
12+
}
13+
c->write("==== Backlog finished ====\n");
14+
}
615
}, nullptr);
716
}
817

18+
#include "utils.h"
919
size_t APB::AsyncBufferedTCPLogger::write(uint8_t c) {
10-
if(!client) {
11-
return 0;
12-
}
1320
buffer[currentPosition++] = c;
1421
if(c == '\n') {
22+
ScopeGuard resetBuffer(std::bind(&AsyncBufferedTCPLogger::reset, this));
23+
if(!client) {
24+
return fillBacklog();
25+
}
1526
client->write(buffer.data(), currentPosition);
16-
reset();
1727
}
1828
return 1;
1929
}
@@ -22,3 +32,13 @@ void APB::AsyncBufferedTCPLogger::reset() {
2232
std::fill(std::begin(buffer), std::end(buffer), 0);
2333
currentPosition = 0;
2434
}
35+
36+
size_t APB::AsyncBufferedTCPLogger::fillBacklog() {
37+
#if APB_NETWORK_LOGGER_BACKLOG > 0
38+
backlog.push(String{buffer.data()});
39+
while(backlog.size() > APB_NETWORK_LOGGER_BACKLOG) {
40+
backlog.pop();
41+
}
42+
#endif
43+
return 0;
44+
}

src/asyncbufferedtcplogger.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22
#include <Print.h>
33
#include <AsyncTCP.h>
4+
#include <queue>
45

56
namespace APB {
67
class AsyncBufferedTCPLogger: public Print {
@@ -11,7 +12,9 @@ class AsyncBufferedTCPLogger: public Print {
1112
private:
1213
AsyncClient *client = nullptr;
1314
void reset();
15+
size_t fillBacklog();
1416
std::array<char, 1024> buffer = {0};
17+
std::queue<String> backlog;
1518
uint16_t currentPosition = 0;
1619
};
1720

src/main.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
#include <AsyncTCP.h>
2020
#include "asyncbufferedtcplogger.h"
2121

22-
#include "time.h"
23-
#include "esp_sntp.h"
2422
Scheduler scheduler;
2523
AsyncServer loggerServer{9911};
2624

@@ -52,16 +50,15 @@ void setup() {
5250

5351
Log.begin(LOG_LEVEL_VERBOSE, &Serial, true);
5452
Log.infoln(LOG_SCOPE "setup, core: %d", xPortGetCoreID());
53+
54+
Log.addHandler(&bufferedLogger);
5555

5656
LittleFS.begin();
5757
APB::Settings::Instance.setup();
5858
APB::StatusLed::Instance.setup();
5959

6060
APB::WiFiManager::Instance.setup(scheduler);
6161
loggerServer.begin();
62-
63-
Log.addHandler(&bufferedLogger);
64-
6562
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
6663
Wire.setClock(100000);
6764
APB::Ambient::Instance.setup(scheduler);
@@ -103,28 +100,31 @@ void setupArduinoOTA() {
103100
}
104101

105102
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
106-
Serial.println("Start updating " + type);
103+
Log.infoln("Start updating %s", type.c_str());
107104
LittleFS.end();
108105
})
109106
.onEnd([]() {
110-
Serial.println("\nEnd");
107+
Log.infoln("\nEnd");
111108
})
112109
.onProgress([](unsigned int progress, unsigned int total) {
113-
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
110+
Log.infoln("Progress: %u%%\r", (progress / (total / 100)));
114111
})
115112
.onError([](ota_error_t error) {
116-
Serial.printf("Error[%u]: ", error);
113+
String errorMessage;
117114
if (error == OTA_AUTH_ERROR) {
118-
Serial.println("Auth Failed");
115+
errorMessage = "Auth Failed";
119116
} else if (error == OTA_BEGIN_ERROR) {
120-
Serial.println("Begin Failed");
117+
errorMessage = "Begin Failed";
121118
} else if (error == OTA_CONNECT_ERROR) {
122-
Serial.println("Connect Failed");
119+
errorMessage = "Connect Failed";
123120
} else if (error == OTA_RECEIVE_ERROR) {
124-
Serial.println("Receive Failed");
121+
errorMessage = "Receive Failed";
125122
} else if (error == OTA_END_ERROR) {
126-
Serial.println("End Failed");
123+
errorMessage = "End Failed";
124+
} else {
125+
errorMessage = "Unknown error";
127126
}
127+
Log.errorln("Error[%u]: %s", error, errorMessage.c_str());
128128
});
129129

130130
ArduinoOTA.begin();

0 commit comments

Comments
 (0)