1 #include "core_log.h"
2
3 extern aiot_state_logcb_t g_logcb_handler;
4
5 static core_log_t g_core_log = { .time_start = 0, .time_interval = 0, .timestamp = 0, .log_stamp = 1, .log_date = 0};
6
_core_log_append_code(int32_t code,char * buffer)7 static void _core_log_append_code(int32_t code, char *buffer)
8 {
9 uint8_t code_hex[4] = {0};
10 char code_str[9] = {0};
11
12 code_hex[0] = ((uint16_t)(-code) >> 8) & 0x000000FF;
13 code_hex[1] = ((uint16_t)(-code)) & 0x000000FF;
14 core_hex2str(code_hex, 2, code_str, 0);
15
16 memcpy(buffer + strlen(buffer), "[LK-", strlen("[LK-"));
17 memcpy(buffer + strlen(buffer), code_str, strlen(code_str));
18 memcpy(buffer + strlen(buffer), "] ", strlen("] "));
19 }
20
_core_log_get_timestamp(aiot_sysdep_portfile_t * sysdep)21 static uint64_t _core_log_get_timestamp(aiot_sysdep_portfile_t *sysdep)
22 {
23 uint64_t timenow = sysdep->core_sysdep_time();
24
25 /*NTP同步过时间,判断系统时间是否已更新,没更新进入if分支使用网络时间log*/
26 if (g_core_log.timestamp != 0 && g_core_log.timestamp > timenow)
27 {
28 if (timenow >= g_core_log.time_start) {
29 g_core_log.time_interval += timenow - g_core_log.time_start;
30 }else{
31 /* loss (max_time - g_core_log.time_start) ms */
32 g_core_log.time_interval += timenow;
33 }
34 g_core_log.time_start = timenow;
35 timenow = g_core_log.timestamp + g_core_log.time_interval;
36 }
37
38 return timenow;
39 }
40
_core_log_append_date(aiot_sysdep_portfile_t * sysdep,uint64_t timestamp,char * buffer)41 void _core_log_append_date(aiot_sysdep_portfile_t *sysdep, uint64_t timestamp, char *buffer)
42 {
43 int32_t res = STATE_SUCCESS;
44 char date_str[7][11] = {{0}};
45 char *time = NULL;
46 char *time_src[] = { date_str[0], date_str[1], date_str[2], date_str[3], date_str[4], date_str[5] };
47 char *time_fmt = "%s/%s/%s %s:%s:%s";
48 core_date_t date;
49
50 memset(&date, 0, sizeof(core_date_t));
51
52 core_utc2date(timestamp, 8, &date);
53 core_uint2str(date.year, date_str[0], NULL);
54 core_uint2str(date.mon, date_str[1], NULL);
55 core_uint2str(date.day, date_str[2], NULL);
56 core_uint2str(date.hour, date_str[3], NULL);
57 core_uint2str(date.min, date_str[4], NULL);
58 core_uint2str(date.sec, date_str[5], NULL);
59
60 res = core_sprintf(sysdep, &time, time_fmt, time_src, sizeof(time_src)/sizeof(char *), CORE_LOG_MODULE_NAME);
61 if (res >= STATE_SUCCESS) {
62 memcpy(buffer + strlen(buffer), time, strlen(time));
63
64 sysdep->core_sysdep_free(time);
65 }
66 }
67
68
_core_log_append_prefix(aiot_sysdep_portfile_t * sysdep,int32_t code,char * buffer)69 static void _core_log_append_prefix(aiot_sysdep_portfile_t *sysdep, int32_t code, char *buffer)
70 {
71 uint64_t timenow = 0;
72 if (sysdep == NULL) {
73 return;
74 }
75
76 timenow = _core_log_get_timestamp(sysdep);
77
78
79 if (1 == g_core_log.log_date) {
80 memcpy(buffer + strlen(buffer), "[", strlen("["));
81 _core_log_append_date(sysdep, timenow, buffer);
82 memcpy(buffer + strlen(buffer), "]", strlen("]"));
83 }
84
85 if(1 == g_core_log.log_stamp){
86 char timestamp_str[24] = {0};
87 uint8_t timestamp_len = 0;
88
89 core_uint642str(timenow, timestamp_str, ×tamp_len);
90 if (timestamp_len > 3) {
91 memcpy(×tamp_str[timestamp_len - 2], ×tamp_str[timestamp_len - 3], 3);
92 timestamp_str[timestamp_len - 3] = '.';
93 }
94
95 memcpy(buffer + strlen(buffer), "[", strlen("["));
96 memcpy(buffer + strlen(buffer), timestamp_str, strlen(timestamp_str));
97 memcpy(buffer + strlen(buffer), "]", strlen("]"));
98 }
99
100 _core_log_append_code(code, buffer);
101 }
102
_core_log(aiot_sysdep_portfile_t * sysdep,int32_t code,char * buffer,char * fmt,void * datas[],uint8_t count)103 static void _core_log(aiot_sysdep_portfile_t *sysdep, int32_t code, char *buffer, char *fmt, void *datas[],
104 uint8_t count)
105 {
106 uint32_t idx = 0, buffer_idx = 0, copy_len = 0, arg_flag = 0, arg_idx = 0;
107 void *arg = datas[arg_idx];
108
109 _core_log_append_prefix(sysdep, code, buffer);
110 buffer_idx += strlen(buffer);
111
112 for (idx = 0; idx < strlen(fmt);) {
113 if (buffer_idx >= CORE_LOG_MAXLEN) {
114 break;
115 }
116
117 if (arg_flag == 1) {
118 if (arg_idx < count - 1) {
119 arg = datas[++arg_idx];
120 } else {
121 arg = NULL;
122 }
123 arg_flag = 0;
124 }
125
126 if (fmt[idx] == '%' && fmt[idx + 1] == 's' && arg != NULL) {
127 char *value = arg;
128 copy_len = (strlen(buffer) + strlen(value) > CORE_LOG_MAXLEN) ? (CORE_LOG_MAXLEN - strlen(buffer)) : (strlen(value));
129 memcpy(buffer + strlen(buffer), value, copy_len);
130 buffer_idx += copy_len;
131 idx += 2;
132 arg_flag = 1;
133 } else if (memcmp(&fmt[idx], "%.*s", strlen("%.*s")) == 0 && arg != NULL && (arg_idx + 1) < count) {
134 char *value = (datas[arg_idx + 1] == NULL) ? ("") : (datas[arg_idx + 1]);
135 uint32_t len = (datas[arg_idx + 1] == NULL) ? (0) : (*(uint32_t *)arg);
136 copy_len = (strlen(buffer) + len > CORE_LOG_MAXLEN) ? (CORE_LOG_MAXLEN - strlen(buffer)) : (len);
137 memcpy(buffer + strlen(buffer), value, copy_len);
138 buffer_idx += copy_len;
139 idx += strlen("%.*s");
140 arg_flag = 1;
141 arg_idx++;
142 } else if (fmt[idx] == '%' && fmt[idx + 1] == 'd' && arg != NULL) {
143 char uint32_str[11] = {0};
144 core_uint2str(*(uint32_t *)arg, uint32_str, NULL);
145 copy_len = (strlen(buffer) + strlen(uint32_str) > CORE_LOG_MAXLEN) ? (CORE_LOG_MAXLEN - strlen(buffer)) : (strlen(
146 uint32_str));
147 memcpy(buffer + strlen(buffer), uint32_str, copy_len);
148 buffer_idx += copy_len;
149 idx += 2;
150 arg_flag = 1;
151 } else {
152 buffer[buffer_idx++] = fmt[idx++];
153 }
154 }
155 }
156
core_log_set_timestamp(aiot_sysdep_portfile_t * sysdep,uint64_t timestamp)157 void core_log_set_timestamp(aiot_sysdep_portfile_t *sysdep, uint64_t timestamp)
158 {
159 g_core_log.timestamp = timestamp;
160 g_core_log.time_start = sysdep->core_sysdep_time();
161 g_core_log.time_interval = 0;
162 }
163
core_log_get_timestamp(aiot_sysdep_portfile_t * sysdep)164 uint64_t core_log_get_timestamp(aiot_sysdep_portfile_t *sysdep)
165 {
166 return _core_log_get_timestamp(sysdep);
167 }
168
core_log(aiot_sysdep_portfile_t * sysdep,int32_t code,char * data)169 void core_log(aiot_sysdep_portfile_t *sysdep, int32_t code, char *data)
170 {
171 char buffer[CORE_LOG_MAXLEN + 3] = {0};
172 uint32_t len = 0;
173
174 if (g_logcb_handler == NULL) {
175 return;
176 }
177
178 buffer[CORE_LOG_MAXLEN] = '\r';
179 buffer[CORE_LOG_MAXLEN + 1] = '\n';
180 _core_log_append_prefix(sysdep, code, buffer);
181 len = (strlen(buffer) + strlen(data) > CORE_LOG_MAXLEN) ? (CORE_LOG_MAXLEN - strlen(buffer)) : (strlen(data));
182 memcpy(buffer + strlen(buffer), data, len);
183
184 g_logcb_handler(code, buffer);
185 }
186
core_log1(aiot_sysdep_portfile_t * sysdep,int32_t code,char * fmt,void * data)187 void core_log1(aiot_sysdep_portfile_t *sysdep, int32_t code, char *fmt, void *data)
188 {
189 char buffer[CORE_LOG_MAXLEN + 3] = {0};
190 void *datas[] = {data};
191
192 if (g_logcb_handler == NULL) {
193 return;
194 }
195
196 buffer[CORE_LOG_MAXLEN] = '\r';
197 buffer[CORE_LOG_MAXLEN + 1] = '\n';
198 _core_log(sysdep, code, buffer, fmt, datas, 1);
199
200 g_logcb_handler(code, buffer);
201 }
202
core_log2(aiot_sysdep_portfile_t * sysdep,int32_t code,char * fmt,void * data1,void * data2)203 void core_log2(aiot_sysdep_portfile_t *sysdep, int32_t code, char *fmt, void *data1, void *data2)
204 {
205 char buffer[CORE_LOG_MAXLEN + 3] = {0};
206 void *datas[] = {data1, data2};
207
208 if (g_logcb_handler == NULL) {
209 return;
210 }
211
212 buffer[CORE_LOG_MAXLEN] = '\r';
213 buffer[CORE_LOG_MAXLEN + 1] = '\n';
214 _core_log(sysdep, code, buffer, fmt, datas, 2);
215
216 g_logcb_handler(code, buffer);
217 }
218
core_log3(aiot_sysdep_portfile_t * sysdep,int32_t code,char * fmt,void * data1,void * data2,void * data3)219 void core_log3(aiot_sysdep_portfile_t *sysdep, int32_t code, char *fmt, void *data1, void *data2, void *data3)
220 {
221 char buffer[CORE_LOG_MAXLEN + 3] = {0};
222 void *datas[] = {data1, data2, data3};
223
224 if (g_logcb_handler == NULL) {
225 return;
226 }
227
228 buffer[CORE_LOG_MAXLEN] = '\r';
229 buffer[CORE_LOG_MAXLEN + 1] = '\n';
230 _core_log(sysdep, code, buffer, fmt, datas, 3);
231
232 g_logcb_handler(code, buffer);
233 }
234
235 #if 0
236 void core_log4(aiot_sysdep_portfile_t *sysdep, int32_t code, char *fmt, void *data1, void *data2, void *data3,
237 void *data4)
238 {
239 char buffer[CORE_LOG_MAXLEN + 3] = {0};
240 void *datas[] = {data1, data2, data3, data4};
241
242 if (g_logcb_handler == NULL) {
243 return;
244 }
245
246 buffer[CORE_LOG_MAXLEN] = '\r';
247 buffer[CORE_LOG_MAXLEN + 1] = '\n';
248 _core_log(sysdep, code, buffer, fmt, datas, 4);
249
250 g_logcb_handler(code, buffer);
251 }
252 #endif
253
core_log_hexdump(int32_t code,char prefix,uint8_t * buffer,uint32_t len)254 void core_log_hexdump(int32_t code, char prefix, uint8_t *buffer, uint32_t len)
255 {
256 uint32_t idx = 0, line_idx = 0, ch_idx = 0, code_len = 0;
257 /* [LK-XXXX] + 1 + 1 + 16*3 + 1 + 1 + 1 + 16 + 2*/
258 char hexdump[25 + 72] = {0};
259
260 if (g_logcb_handler == NULL || len == 0) {
261 return;
262 }
263
264 g_logcb_handler(code, "\r\n");
265 _core_log_append_code(code, hexdump);
266 code_len = strlen(hexdump);
267
268 for (idx = 0; idx < len;) {
269 memset(hexdump + code_len, ' ', 71);
270 ch_idx = 2;
271 hexdump[code_len + 0] = prefix;
272 hexdump[code_len + 51] = '|';
273 hexdump[code_len + 52] = ' ';
274 for (line_idx = idx; ((line_idx - idx) < 16) && (line_idx < len); line_idx++) {
275 if ((line_idx - idx) == 8) {
276 ch_idx++;
277 }
278 core_hex2str((uint8_t *)&buffer[line_idx], 1, &hexdump[code_len + ch_idx], 0);
279 hexdump[code_len + ch_idx + 2] = ' ';
280 if (buffer[line_idx] >= 0x20 && buffer[line_idx] <= 0x7E) {
281 hexdump[code_len + 53 + (line_idx - idx)] = buffer[line_idx];
282 } else {
283 hexdump[code_len + 53 + (line_idx - idx)] = '.';
284 }
285 ch_idx += 3;
286 }
287 hexdump[code_len + 69] = '\r';
288 hexdump[code_len + 70] = '\n';
289 idx += (line_idx - idx);
290 g_logcb_handler(code, hexdump);
291 }
292 g_logcb_handler(code, "\r\n");
293 }
294
295