Prep for larger log buffer

This commit is contained in:
Theo Arends 2021-06-10 18:06:11 +02:00
parent 2e97e58830
commit d0cd897ea0
2 changed files with 41 additions and 18 deletions

View File

@ -2326,8 +2326,10 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l
return false; return false;
} }
void AddLogData(uint32_t loglevel, const char* log_data) { void AddLogData(uint32_t loglevel, const char* log_data, const char* log_data_payload = nullptr, const char* log_data_retained = nullptr) {
// Store log_data in buffer
// To lower heap usage log_data_payload may contain the payload data from MqttPublishPayload()
// and log_data_retained may contain optional retained message from MqttPublishPayload()
#ifdef ESP32 #ifdef ESP32
// this takes the mutex, and will be release when the class is destroyed - // this takes the mutex, and will be release when the class is destroyed -
// i.e. when the functon leaves You CAN call mutex.give() to leave early. // i.e. when the functon leaves You CAN call mutex.give() to leave early.
@ -2337,9 +2339,13 @@ void AddLogData(uint32_t loglevel, const char* log_data) {
char mxtime[14]; // "13:45:21.999 " char mxtime[14]; // "13:45:21.999 "
snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d.%03d "), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcMillis()); snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d.%03d "), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcMillis());
char empty[2] = { 0 };
if (!log_data_payload) { log_data_payload = empty; }
if (!log_data_retained) { log_data_retained = empty; }
if ((loglevel <= TasmotaGlobal.seriallog_level) && if ((loglevel <= TasmotaGlobal.seriallog_level) &&
(TasmotaGlobal.masterlog_level <= TasmotaGlobal.seriallog_level)) { (TasmotaGlobal.masterlog_level <= TasmotaGlobal.seriallog_level)) {
Serial.printf("%s%s\r\n", mxtime, log_data); Serial.printf("%s%s%s%s\r\n", mxtime, log_data, log_data_payload, log_data_retained);
} }
uint32_t highest_loglevel = Settings.weblog_level; uint32_t highest_loglevel = Settings.weblog_level;
@ -2353,9 +2359,15 @@ void AddLogData(uint32_t loglevel, const char* log_data) {
// Delimited, zero-terminated buffer of log lines. // Delimited, zero-terminated buffer of log lines.
// Each entry has this format: [index][loglevel][log data]['\1'] // Each entry has this format: [index][loglevel][log data]['\1']
uint32_t log_data_len = strlen(log_data); // Truncate log messages longer than MAX_LOGSZ which is the log buffer size minus 64 spare
uint32_t log_data_len = strlen(log_data) + strlen(log_data_payload) + strlen(log_data_retained);
char too_long[TOPSZ];
if (log_data_len > MAX_LOGSZ) { if (log_data_len > MAX_LOGSZ) {
sprintf_P((char*)log_data + 128, PSTR(" ... truncated %d"), log_data_len); snprintf_P(too_long, sizeof(too_long) - 20, PSTR("%s%s"), log_data, log_data_payload); // 20 = strlen("... 123456 truncated")
snprintf_P(too_long, sizeof(too_long), PSTR("%s... %d truncated"), too_long, log_data_len);
log_data = too_long;
log_data_payload = empty;
log_data_retained = empty;
} }
TasmotaGlobal.log_buffer_pointer &= 0xFF; TasmotaGlobal.log_buffer_pointer &= 0xFF;
@ -2363,7 +2375,7 @@ void AddLogData(uint32_t loglevel, const char* log_data) {
TasmotaGlobal.log_buffer_pointer++; // Index 0 is not allowed as it is the end of char string TasmotaGlobal.log_buffer_pointer++; // Index 0 is not allowed as it is the end of char string
} }
while (TasmotaGlobal.log_buffer_pointer == TasmotaGlobal.log_buffer[0] || // If log already holds the next index, remove it while (TasmotaGlobal.log_buffer_pointer == TasmotaGlobal.log_buffer[0] || // If log already holds the next index, remove it
strlen(TasmotaGlobal.log_buffer) + strlen(log_data) + strlen(mxtime) + 4 > LOG_BUFFER_SIZE) // 4 = log_buffer_pointer + '\1' + '\0' strlen(TasmotaGlobal.log_buffer) + strlen(log_data) + strlen(log_data_payload) + strlen(log_data_retained) + strlen(mxtime) + 4 > LOG_BUFFER_SIZE) // 4 = log_buffer_pointer + '\1' + '\0'
{ {
char* it = TasmotaGlobal.log_buffer; char* it = TasmotaGlobal.log_buffer;
it++; // Skip log_buffer_pointer it++; // Skip log_buffer_pointer
@ -2371,8 +2383,8 @@ void AddLogData(uint32_t loglevel, const char* log_data) {
it++; // Skip delimiting "\1" it++; // Skip delimiting "\1"
memmove(TasmotaGlobal.log_buffer, it, LOG_BUFFER_SIZE -(it-TasmotaGlobal.log_buffer)); // Move buffer forward to remove oldest log line memmove(TasmotaGlobal.log_buffer, it, LOG_BUFFER_SIZE -(it-TasmotaGlobal.log_buffer)); // Move buffer forward to remove oldest log line
} }
snprintf_P(TasmotaGlobal.log_buffer, sizeof(TasmotaGlobal.log_buffer), PSTR("%s%c%c%s%s\1"), snprintf_P(TasmotaGlobal.log_buffer, sizeof(TasmotaGlobal.log_buffer), PSTR("%s%c%c%s%s%s%s\1"),
TasmotaGlobal.log_buffer, TasmotaGlobal.log_buffer_pointer++, '0'+loglevel, mxtime, log_data); TasmotaGlobal.log_buffer, TasmotaGlobal.log_buffer_pointer++, '0'+loglevel, mxtime, log_data, log_data_payload, log_data_retained);
TasmotaGlobal.log_buffer_pointer &= 0xFF; TasmotaGlobal.log_buffer_pointer &= 0xFF;
if (!TasmotaGlobal.log_buffer_pointer) { if (!TasmotaGlobal.log_buffer_pointer) {
TasmotaGlobal.log_buffer_pointer++; // Index 0 is not allowed as it is the end of char string TasmotaGlobal.log_buffer_pointer++; // Index 0 is not allowed as it is the end of char string

View File

@ -187,7 +187,7 @@ void MqttDisableLogging(bool state) {
* void MqttDisconnect() * void MqttDisconnect()
* void MqttSubscribeLib(char *topic) * void MqttSubscribeLib(char *topic)
* bool MqttPublishLib(const char* topic, const uint8_t* payload, unsigned int plength, bool retained) * bool MqttPublishLib(const char* topic, const uint8_t* payload, unsigned int plength, bool retained)
* *
* Change/Verify PubSubClient.h defines: * Change/Verify PubSubClient.h defines:
* #define MQTT_MAX_PACKET_SIZE 1200 // Tasmota v8.1.0.8 * #define MQTT_MAX_PACKET_SIZE 1200 // Tasmota v8.1.0.8
\*********************************************************************************************/ \*********************************************************************************************/
@ -622,19 +622,30 @@ void MqttPublishPayload(const char* topic, const char* payload, uint32_t binary_
retained = false; // Some brokers don't support retained, they will disconnect if received retained = false; // Some brokers don't support retained, they will disconnect if received
} }
String log_data; // 20210420 Moved to heap to solve tight stack resulting in exception 2 // To lower heap usage the payload is not copied to the heap but used directly
String log_data_topic; // 20210420 Moved to heap to solve tight stack resulting in exception 2
if (Settings.flag.mqtt_enabled && MqttPublishLib(topic, (const uint8_t*)payload, binary_length, retained)) { // SetOption3 - Enable MQTT if (Settings.flag.mqtt_enabled && MqttPublishLib(topic, (const uint8_t*)payload, binary_length, retained)) { // SetOption3 - Enable MQTT
log_data = F(D_LOG_MQTT); // MQT: log_data_topic = F(D_LOG_MQTT); // MQT:
log_data += topic; // stat/tasmota/STATUS2 log_data_topic += topic; // stat/tasmota/STATUS2
} else { } else {
log_data = F(D_LOG_RESULT); // RSL: log_data_topic = F(D_LOG_RESULT); // RSL:
log_data += strrchr(topic,'/')+1; // STATUS2 log_data_topic += strrchr(topic,'/')+1; // STATUS2
retained = false; // Without MQTT enabled there is no retained message retained = false; // Without MQTT enabled there is no retained message
} }
log_data += F(" = "); // = log_data_topic += F(" = "); // =
log_data += (binary_data) ? HexToString((uint8_t*)payload, binary_length) : payload; char* log_data_payload = (char*)payload;
if (retained) { log_data += F(" (" D_RETAINED ")"); } // (retained) String log_data_payload_b;
AddLogData(LOG_LEVEL_INFO, log_data.c_str()); // MQT: stat/tasmota/STATUS2 = {"StatusFWR":{"Version":... if (binary_data) {
log_data_payload_b = HexToString((uint8_t*)payload, binary_length);
log_data_payload = (char*)log_data_payload_b.c_str();
}
char* log_data_retained = nullptr;
String log_data_retained_b;
if (retained) {
log_data_retained_b = F(" (" D_RETAINED ")"); // (retained)
log_data_retained = (char*)log_data_retained_b.c_str();
}
AddLogData(LOG_LEVEL_INFO, log_data_topic.c_str(), log_data_payload, log_data_retained); // MQT: stat/tasmota/STATUS2 = {"StatusFWR":{"Version":...
if (Settings.ledstate &0x04) { if (Settings.ledstate &0x04) {
TasmotaGlobal.blinks++; TasmotaGlobal.blinks++;