Mem debug, Variable http timeout and min heapfrag

This commit is contained in:
Magnus Persson
2022-02-03 09:32:09 +01:00
parent a130ebd67d
commit e336633c38
8 changed files with 43 additions and 14 deletions

View File

@ -417,6 +417,8 @@ bool HardwareConfig::loadFile() {
doc[PARAM_HW_FORMULA_CALIBRATION_TEMP].as<float>()); doc[PARAM_HW_FORMULA_CALIBRATION_TEMP].as<float>());
if (!doc[PARAM_HW_WIFI_PORTALTIMEOUT].isNull()) if (!doc[PARAM_HW_WIFI_PORTALTIMEOUT].isNull())
this->setWifiPortalTimeout(doc[PARAM_HW_WIFI_PORTALTIMEOUT].as<int>()); this->setWifiPortalTimeout(doc[PARAM_HW_WIFI_PORTALTIMEOUT].as<int>());
if (!doc[PARAM_HW_PUSH_TIMEOUT].isNull())
this->setPushTimeout(doc[PARAM_HW_PUSH_TIMEOUT].as<int>());
Log.notice(F("CFG : Configuration file " CFG_HW_FILENAME " loaded." CR)); Log.notice(F("CFG : Configuration file " CFG_HW_FILENAME " loaded." CR));
return true; return true;

View File

@ -60,6 +60,7 @@ class HardwareConfig {
int _gyroSensorMovingThreashold = 500; int _gyroSensorMovingThreashold = 500;
int _gyroReadCount = 50; int _gyroReadCount = 50;
int _gyroReadDelay = 3150; // us, empirical, to hold sampling to 200 Hz int _gyroReadDelay = 3150; // us, empirical, to hold sampling to 200 Hz
int _pushTimeout = 10; // seconds
public: public:
int getWifiPortalTimeout() { return _wifiPortalTimeout; } int getWifiPortalTimeout() { return _wifiPortalTimeout; }
@ -78,6 +79,8 @@ class HardwareConfig {
void setGyroReadCount(int c) { _gyroReadCount = c; } void setGyroReadCount(int c) { _gyroReadCount = c; }
int getGyroReadDelay() { return _gyroReadDelay; } int getGyroReadDelay() { return _gyroReadDelay; }
void setGyroReadDelay(int d) { _gyroReadDelay = d; } void setGyroReadDelay(int d) { _gyroReadDelay = d; }
int getPushTimeout() { return _pushTimeout; }
void setPushTimeout(int t) { _pushTimeout = t; }
bool saveFile(); bool saveFile();
bool loadFile(); bool loadFile();

View File

@ -155,7 +155,6 @@ void FloatHistoryLog::save() {
// Print the heap information. // Print the heap information.
// //
void printHeap(String prefix) { void printHeap(String prefix) {
#if LOG_LEVEL == 6 || LOG_LEVEL == 5
#if defined(ESP8266) #if defined(ESP8266)
Log.notice( Log.notice(
F("%s: Free-heap %d kb, Heap-rag %d %%, Max-block %d kb Stack=%d b." CR), F("%s: Free-heap %d kb, Heap-rag %d %%, Max-block %d kb Stack=%d b." CR),
@ -168,7 +167,6 @@ void printHeap(String prefix) {
Log.verbose(F("HELP: Heap %d kb, FreeSketch %d kb." CR), Log.verbose(F("HELP: Heap %d kb, FreeSketch %d kb." CR),
ESP.getFreeHeap() / 1024, ESP.getFreeSketchSpace() / 1024); ESP.getFreeHeap() / 1024, ESP.getFreeSketchSpace() / 1024);
#endif #endif
#endif
} }
// //
@ -325,11 +323,12 @@ void PerfLogging::pushInflux() {
// Create body for influxdb2, format used // Create body for influxdb2, format used
// key,host=mdns value=0.0 // key,host=mdns value=0.0
String body; String body;
body.reserve(500);
// Create the payload with performance data. // Create the payload with performance data.
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
PerfEntry* pe = first; PerfEntry* pe = first;
char buf[100]; char buf[150];
snprintf(&buf[0], sizeof(buf), "perf,host=%s,device=%s ", myConfig.getMDNS(), snprintf(&buf[0], sizeof(buf), "perf,host=%s,device=%s ", myConfig.getMDNS(),
myConfig.getID()); myConfig.getID());
body += &buf[0]; body += &buf[0];
@ -351,15 +350,23 @@ void PerfLogging::pushInflux() {
snprintf(&buf[0], sizeof(buf), "\ndebug,host=%s,device=%s ", snprintf(&buf[0], sizeof(buf), "\ndebug,host=%s,device=%s ",
myConfig.getMDNS(), myConfig.getID()); myConfig.getMDNS(), myConfig.getID());
body += &buf[0]; body += &buf[0];
#if defined (ESP8266)
snprintf( snprintf(
&buf[0], sizeof(buf), &buf[0], sizeof(buf),
"angle=%.4f,gyro-ax=%d,gyro-ay=%d,gyro-az=%d,gyro-temp=%.2f,ds-temp=%.2f", "angle=%.4f,gyro-ax=%d,gyro-ay=%d,gyro-az=%d,gyro-temp=%.2f,ds-temp=%.2f,heap=%d,heap-frag=%d,heap-max=%d,stack=%d",
myGyro.getAngle(), myGyro.getLastGyroData().ax, myGyro.getAngle(), myGyro.getLastGyroData().ax,
myGyro.getLastGyroData().ay, myGyro.getLastGyroData().az, myGyro.getLastGyroData().ay, myGyro.getLastGyroData().az,
myGyro.getSensorTempC(), myTempSensor.getTempC(myConfig.isGyroTemp())); myGyro.getSensorTempC(), myTempSensor.getTempC(myConfig.isGyroTemp()), ESP.getFreeHeap(), ESP.getHeapFragmentation(), ESP.getMaxFreeBlockSize(), ESP.getFreeContStack());
body += &buf[0]; #else // defined (ESP32)
snprintf(
&buf[0], sizeof(buf),
"angle=%.4f,gyro-ax=%d,gyro-ay=%d,gyro-az=%d,gyro-temp=%.2f,ds-temp=%.2f,heap=%d,heap-frag=%d,heap-max=%d",
myGyro.getAngle(), myGyro.getLastGyroData().ax,
myGyro.getLastGyroData().ay, myGyro.getLastGyroData().az,
myGyro.getSensorTempC(), myTempSensor.getTempC(myConfig.isGyroTemp()), ESP.getFreeHeap(), 0, ESP.getMaxAllocHeap());
#endif
// Log.notice(F("PERF: data %s." CR), body.c_str() ); body += &buf[0];
#if LOG_LEVEL == 6 && !defined(HELPER_DISABLE_LOGGING) #if LOG_LEVEL == 6 && !defined(HELPER_DISABLE_LOGGING)
Log.verbose(F("PERF: url %s." CR), serverPath.c_str()); Log.verbose(F("PERF: url %s." CR), serverPath.c_str());
@ -369,6 +376,7 @@ void PerfLogging::pushInflux() {
// Send HTTP POST request // Send HTTP POST request
String auth = "Token " + String(myConfig.getInfluxDb2PushToken()); String auth = "Token " + String(myConfig.getInfluxDb2PushToken());
http.addHeader(F("Authorization"), auth.c_str()); http.addHeader(F("Authorization"), auth.c_str());
http.setTimeout(myHardwareConfig.getPushTimeout());
int httpResponseCode = http.POST(body); int httpResponseCode = http.POST(body);
if (httpResponseCode == 204) { if (httpResponseCode == 204) {
@ -413,7 +421,9 @@ float reduceFloatPrecision(float f, int dec) {
// https://circuits4you.com/2019/03/21/esp8266-url-encode-decode-example/ // https://circuits4you.com/2019/03/21/esp8266-url-encode-decode-example/
// //
String urlencode(String str) { String urlencode(String str) {
String encodedString = ""; String encodedString;
encodedString.reserve(str.length()*2);
encodedString = "";
char c; char c;
char code0; char code0;
char code1; char code1;
@ -453,8 +463,13 @@ unsigned char h2int(char c) {
return (0); return (0);
} }
//
// urlencode string
//
String urldecode(String str) { String urldecode(String str) {
String encodedString = ""; String encodedString;
encodedString.reserve(str.length());
encodedString = "";
char c; char c;
char code0; char code0;
char code1; char code1;

View File

@ -258,8 +258,11 @@ bool loopReadGravity() {
push.send(angle, gravitySG, corrGravitySG, tempC, push.send(angle, gravitySG, corrGravitySG, tempC,
(millis() - runtimeMillis) / 1000); (millis() - runtimeMillis) / 1000);
LOG_PERF_STOP("loop-push"); LOG_PERF_STOP("loop-push");
// Send stats to influx after each push run.
if (runMode == RunMode::configurationMode) {
LOG_PERF_PUSH(); LOG_PERF_PUSH();
} }
}
return true; return true;
} else { } else {
Log.error(F("MAIN: No gyro value found, the device might be moving.")); Log.error(F("MAIN: No gyro value found, the device might be moving."));

View File

@ -37,7 +37,7 @@ SOFTWARE.
// //
void PushTarget::send(float angle, float gravitySG, float corrGravitySG, void PushTarget::send(float angle, float gravitySG, float corrGravitySG,
float tempC, float runTime) { float tempC, float runTime) {
printHeap("StartPush"); printHeap("PUSH");
http.setReuse(false); http.setReuse(false);
httpSecure.setReuse(false); httpSecure.setReuse(false);
@ -50,14 +50,12 @@ void PushTarget::send(float angle, float gravitySG, float corrGravitySG,
LOG_PERF_STOP("push-brewfather"); LOG_PERF_STOP("push-brewfather");
} }
printHeap("http1");
if (myConfig.isHttpActive()) { if (myConfig.isHttpActive()) {
LOG_PERF_START("push-http"); LOG_PERF_START("push-http");
sendHttp(engine, myConfig.isHttpSSL(), 0); sendHttp(engine, myConfig.isHttpSSL(), 0);
LOG_PERF_STOP("push-http"); LOG_PERF_STOP("push-http");
} }
printHeap("http2");
if (myConfig.isHttp2Active()) { if (myConfig.isHttp2Active()) {
LOG_PERF_START("push-http2"); LOG_PERF_START("push-http2");
sendHttp(engine, myConfig.isHttp2SSL(), 1); sendHttp(engine, myConfig.isHttp2SSL(), 1);
@ -92,6 +90,7 @@ void PushTarget::sendInfluxDb2(TemplatingEngine& engine) {
String doc = engine.create(TemplatingEngine::TEMPLATE_INFLUX); String doc = engine.create(TemplatingEngine::TEMPLATE_INFLUX);
http.begin(wifi, serverPath); http.begin(wifi, serverPath);
http.setTimeout(myHardwareConfig.getPushTimeout());
#if LOG_LEVEL == 6 && !defined(PUSH_DISABLE_LOGGING) #if LOG_LEVEL == 6 && !defined(PUSH_DISABLE_LOGGING)
Log.verbose(F("PUSH: url %s." CR), serverPath.c_str()); Log.verbose(F("PUSH: url %s." CR), serverPath.c_str());
@ -128,6 +127,7 @@ void PushTarget::sendBrewfather(TemplatingEngine& engine) {
String doc = engine.create(TemplatingEngine::TEMPLATE_BREWFATHER); String doc = engine.create(TemplatingEngine::TEMPLATE_BREWFATHER);
http.begin(wifi, serverPath); http.begin(wifi, serverPath);
http.setTimeout(myHardwareConfig.getPushTimeout());
#if LOG_LEVEL == 6 && !defined(PUSH_DISABLE_LOGGING) #if LOG_LEVEL == 6 && !defined(PUSH_DISABLE_LOGGING)
Log.verbose(F("PUSH: url %s." CR), serverPath.c_str()); Log.verbose(F("PUSH: url %s." CR), serverPath.c_str());
@ -200,6 +200,7 @@ void PushTarget::sendHttp(TemplatingEngine& engine, bool isSecure, int index) {
Log.notice(F("PUSH: HTTP, SSL enabled without validation." CR)); Log.notice(F("PUSH: HTTP, SSL enabled without validation." CR));
wifiSecure.setInsecure(); wifiSecure.setInsecure();
httpSecure.begin(wifiSecure, serverPath); httpSecure.begin(wifiSecure, serverPath);
httpSecure.setTimeout(myHardwareConfig.getPushTimeout());
if (index == 0) { if (index == 0) {
addHttpHeader(httpSecure, myConfig.getHttpHeader(0)); addHttpHeader(httpSecure, myConfig.getHttpHeader(0));
@ -212,6 +213,7 @@ void PushTarget::sendHttp(TemplatingEngine& engine, bool isSecure, int index) {
httpResponseCode = httpSecure.POST(doc); httpResponseCode = httpSecure.POST(doc);
} else { } else {
http.begin(wifi, serverPath); http.begin(wifi, serverPath);
http.setTimeout(myHardwareConfig.getPushTimeout());
if (index == 0) { if (index == 0) {
addHttpHeader(http, myConfig.getHttpHeader(0)); addHttpHeader(http, myConfig.getHttpHeader(0));
@ -274,7 +276,7 @@ void PushTarget::sendMqtt(TemplatingEngine& engine, bool isSecure) {
#endif #endif
// Send MQQT message(s) // Send MQQT message(s)
mqtt.setTimeout(10); // 10 seconds timeout mqtt.setTimeout(myHardwareConfig.getPushTimeout()); // 10 seconds timeout
int lines = 1; int lines = 1;
// Find out how many lines are in the document. Each line is one // Find out how many lines are in the document. Each line is one

View File

@ -73,6 +73,7 @@ SOFTWARE.
#define PARAM_HW_FORMULA_DEVIATION "formula-max-deviation" #define PARAM_HW_FORMULA_DEVIATION "formula-max-deviation"
#define PARAM_HW_FORMULA_CALIBRATION_TEMP "formula-calibration-temp" #define PARAM_HW_FORMULA_CALIBRATION_TEMP "formula-calibration-temp"
#define PARAM_HW_WIFI_PORTALTIMEOUT "wifi-portaltimeout" #define PARAM_HW_WIFI_PORTALTIMEOUT "wifi-portaltimeout"
#define PARAM_HW_PUSH_TIMEOUT "push-timeout"
#define PARAM_FORMAT_HTTP1 "http-1" #define PARAM_FORMAT_HTTP1 "http-1"
#define PARAM_FORMAT_HTTP2 "http-2" #define PARAM_FORMAT_HTTP2 "http-2"
#define PARAM_FORMAT_BREWFATHER "brewfather" #define PARAM_FORMAT_BREWFATHER "brewfather"

View File

@ -139,6 +139,7 @@ void TemplatingEngine::initialize(float angle, float gravitySG, float corrGravit
// //
const String& TemplatingEngine::create(TemplatingEngine::Templates idx) { const String& TemplatingEngine::create(TemplatingEngine::Templates idx) {
String fname; String fname;
baseTemplate.reserve(600);
// Load templates from memory // Load templates from memory
switch (idx) { switch (idx) {

View File

@ -541,6 +541,8 @@ void WebServerHandler::webHandleDeviceParam() {
myHardwareConfig.SetDefaultCalibrationTemp(s.toFloat()); myHardwareConfig.SetDefaultCalibrationTemp(s.toFloat());
else if (_server->argName(i).equalsIgnoreCase(PARAM_HW_WIFI_PORTALTIMEOUT)) else if (_server->argName(i).equalsIgnoreCase(PARAM_HW_WIFI_PORTALTIMEOUT))
myHardwareConfig.setWifiPortalTimeout(s.toInt()); myHardwareConfig.setWifiPortalTimeout(s.toInt());
else if (_server->argName(i).equalsIgnoreCase(PARAM_HW_PUSH_TIMEOUT))
myHardwareConfig.setPushTimeout(s.toInt());
} }
myHardwareConfig.saveFile(); myHardwareConfig.saveFile();