-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathInnuLog.h
158 lines (140 loc) · 5.37 KB
/
InnuLog.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef INNULOG_H
#define INNULOG_H
// Author: Innuendo
// Version: 0.0.1
#ifdef ESP32
#include "esp32-hal-log.h"
#endif
#include <Arduino.h>
#define DEBUG_ESP_PORT Serial
#define LOG_COLOR_ERROR "\033[0;31m"
#define LOG_COLOR_INFO "\033[0;32m"
#define LOG_COLOR_WARN "\033[0;33m"
#define LOG_COLOR_VERBOSE "\033[0;36m"
#define LOG_COLOR_RESET "\033[0m"
#define INNU_NONE 0
#define INNU_ERROR 1
#define INNU_INFO 2
#define INNU_VERBOSE 3
#define LOG_CFG "/log_cfg.json"
#define LOGS_COUNT 6
struct InnuLogTag
{
String tagName;
int level;
};
#ifdef ESP8266 // required for logging on ESP8266
const char *IRAM_ATTR pathToFileName(const char *path)
{
size_t i = 0;
size_t pos = 0;
char *p = (char *)path;
while (*p)
{
i++;
if (*p == '/' || *p == '\\')
{
pos = i;
}
p++;
}
return path + pos;
}
#endif
struct InnuLogTag InnuTagLevel[LOGS_COUNT]{
{"CFG", INNU_NONE},
{"SEN", INNU_NONE},
{"ACT", INNU_NONE},
{"IND", INNU_NONE},
{"SYS", INNU_INFO},
{"DIS", INNU_NONE}};
#define DEBUG_ERROR(TAG, ...) \
if (getTagLevel(TAG) >= INNU_ERROR) \
{ \
DEBUG_ESP_PORT.printf(LOG_COLOR_ERROR); \
DEBUG_ESP_PORT.printf(PSTR("[%6lu][E][%s:%d] %s(): "), millis(), pathToFileName(__FILE__), __LINE__, __FUNCTION__); \
DEBUG_ESP_PORT.printf(__VA_ARGS__); \
DEBUG_ESP_PORT.println(LOG_COLOR_RESET); \
}
#define DEBUG_INFO(TAG, ...) \
if (getTagLevel(TAG) >= INNU_INFO) \
{ \
DEBUG_ESP_PORT.printf(LOG_COLOR_INFO); \
DEBUG_ESP_PORT.printf(PSTR("[%6lu][I][%s:%d] %s(): "), millis(), pathToFileName(__FILE__), __LINE__, __FUNCTION__); \
DEBUG_ESP_PORT.printf(__VA_ARGS__); \
DEBUG_ESP_PORT.println(LOG_COLOR_RESET); \
}
#define DEBUG_VERBOSE(TAG, ...) \
if (getTagLevel(TAG) >= INNU_VERBOSE) \
{ \
DEBUG_ESP_PORT.printf(LOG_COLOR_VERBOSE); \
DEBUG_ESP_PORT.printf(PSTR("[%6lu][V][%s:%d] %s(): "), millis(), pathToFileName(__FILE__), __LINE__, __FUNCTION__); \
DEBUG_ESP_PORT.printf(__VA_ARGS__); \
DEBUG_ESP_PORT.println(LOG_COLOR_RESET); \
}
#endif
int getTagLevel(const String &tagName)
{
for (int i = 0; i < LOGS_COUNT; i++)
{
if (InnuTagLevel[i].tagName == tagName)
{
return InnuTagLevel[i].level;
}
}
return INNU_NONE;
}
void setTagLevel(const String &tagName, int level)
{
for (int i = 0; i < LOGS_COUNT; i++)
if (InnuTagLevel[i].tagName == tagName)
{
InnuTagLevel[i].level = level;
return;
}
}
void saveLog()
{
JsonDocument doc;
doc["CFG"] = getTagLevel("CFG");
doc["SEN"] = getTagLevel("SEN");
doc["ACT"] = getTagLevel("ACT");
doc["IND"] = getTagLevel("IND");
doc["SYS"] = getTagLevel("SYS");
doc["DIS"] = getTagLevel("DIS");
File logFile = LittleFS.open(LOG_CFG, "w");
if (!logFile)
{
DEBUG_ERROR("CFG", "error could not save log_cfg.json - permission denied");
return;
}
serializeJson(doc, logFile);
logFile.close();
DEBUG_INFO("CFG", "CFG: %d sen: %d act: %d ind: %d sys: %d dis: %d", getTagLevel("CFG"), getTagLevel("SEN"), getTagLevel("ACT"), getTagLevel("IND"), getTagLevel("SYS"), getTagLevel("DIS"));
}
void readLog()
{
if (!LittleFS.exists(LOG_CFG))
{
saveLog();
}
else
{
File logFile = LittleFS.open(LOG_CFG, "r");
JsonDocument doc;
DeserializationError error = deserializeJson(doc, logFile);
if (error)
{
DEBUG_ERROR("SYS", "error could not read log_cfg: %s - JSON error %s", LOG_CFG, error.c_str());
return;
}
logFile.close();
setTagLevel("CFG", doc["CFG"]);
setTagLevel("SEN", doc["SEN"]);
setTagLevel("ACT", doc["ACT"]);
setTagLevel("IND", doc["IND"]);
setTagLevel("SYS", doc["SYS"]);
setTagLevel("DIS", doc["DIS"]);
DEBUG_INFO("CFG", "read logging CFG: %d sen: %d act: %d ind: %d sys: %d dis: %d", getTagLevel("CFG"), getTagLevel("SEN"), getTagLevel("ACT"), getTagLevel("IND"), getTagLevel("SYS"), getTagLevel("DIS"));
}
}