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, &timestamp_len);
90         if (timestamp_len > 3) {
91             memcpy(&timestamp_str[timestamp_len - 2], &timestamp_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