feat(log): add new function to log buffer with level and hex dump.

This commit is contained in:
michael
2017-08-21 22:03:53 +08:00
parent 9a1ba5985b
commit 8244fa95fe
5 changed files with 248 additions and 26 deletions

View File

@@ -52,8 +52,12 @@
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include "esp_log.h"
#include "rom/queue.h"
#include "soc/soc_memory_layout.h"
//print number of bytes per line for esp_log_buffer_char and esp_log_buffer_hex
#define BYTES_PER_LINE 16
@@ -332,32 +336,120 @@ uint32_t esp_log_timestamp() __attribute__((alias("esp_log_early_timestamp")));
#endif //BOOTLOADER_BUILD
void esp_log_buffer_hex(const char *tag, const void *buffer, uint16_t buff_len)
void esp_log_buffer_hex_internal(const char *tag, const void *buffer, uint16_t buff_len,
esp_log_level_t log_level)
{
const char *as_bytes = (const char *)buffer;
char temp_buffer[3*BYTES_PER_LINE + 1]= {0};
int line_len = 0;
for (int i = 0; i < buff_len; i++) {
line_len += sprintf(temp_buffer+line_len, "%02x ", as_bytes[i]);
if (((i + 1) % BYTES_PER_LINE == 0) || (i == buff_len - 1)) {
ESP_LOGI(tag, "%s", temp_buffer);
line_len = 0;
temp_buffer[0] = 0;
if ( buff_len == 0 ) return;
char temp_buffer[BYTES_PER_LINE+3]; //for not-byte-accessible memory
char hex_buffer[3*BYTES_PER_LINE+1];
const char *ptr_line;
int bytes_cur_line;
do {
if ( buff_len > BYTES_PER_LINE ) {
bytes_cur_line = BYTES_PER_LINE;
} else {
bytes_cur_line = buff_len;
}
}
if ( !esp_ptr_byte_accesible(buffer) ) {
//use memcpy to get around alignment issue
memcpy( temp_buffer, buffer, (bytes_cur_line+3)/4*4 );
ptr_line = temp_buffer;
} else {
ptr_line = buffer;
}
for( int i = 0; i < bytes_cur_line; i ++ ) {
sprintf( hex_buffer + 3*i, "%02x ", ptr_line[i] );
}
ESP_LOG_LEVEL( log_level, tag, "%s", hex_buffer );
buffer += bytes_cur_line;
buff_len -= bytes_cur_line;
} while( buff_len );
}
void esp_log_buffer_char(const char *tag, const void *buffer, uint16_t buff_len)
void esp_log_buffer_char_internal(const char *tag, const void *buffer, uint16_t buff_len,
esp_log_level_t log_level)
{
const char *as_bytes = (const char *)buffer;
char temp_buffer[BYTES_PER_LINE + 1] = {0};
int line_len = 0;
for (int i = 0; i < buff_len; i++) {
line_len += sprintf(temp_buffer+line_len, "%c", as_bytes[i]);
if (((i + 1) % BYTES_PER_LINE == 0) || (i == buff_len - 1)) {
ESP_LOGI(tag, "%s", temp_buffer);
line_len = 0;
temp_buffer[0] = 0;
if ( buff_len == 0 ) return;
char temp_buffer[BYTES_PER_LINE+3]; //for not-byte-accessible memory
char char_buffer[BYTES_PER_LINE+1];
const char *ptr_line;
int bytes_cur_line;
do {
if ( buff_len > BYTES_PER_LINE ) {
bytes_cur_line = BYTES_PER_LINE;
} else {
bytes_cur_line = buff_len;
}
}
if ( !esp_ptr_byte_accesible(buffer) ) {
//use memcpy to get around alignment issue
memcpy( temp_buffer, buffer, (bytes_cur_line+3)/4*4 );
ptr_line = temp_buffer;
} else {
ptr_line = buffer;
}
for( int i = 0; i < bytes_cur_line; i ++ ) {
sprintf( char_buffer + i, "%c", ptr_line[i] );
}
ESP_LOG_LEVEL( log_level, tag, "%s", char_buffer );
buffer += bytes_cur_line;
buff_len -= bytes_cur_line;
} while( buff_len );
}
void esp_log_buffer_hexdump_internal( const char *tag, const void *buffer, uint16_t buff_len, esp_log_level_t log_level)
{
if ( buff_len == 0 ) return;
char temp_buffer[BYTES_PER_LINE+3]; //for not-byte-accessible memory
const char *ptr_line;
//format: field[length]
// ADDR[10]+" "+DATA_HEX[8*3]+" "+DATA_HEX[8*3]+" |"+DATA_CHAR[8]+"|"
char hd_buffer[10+2+BYTES_PER_LINE*3+3+BYTES_PER_LINE+1+1];
char *ptr_hd;
int bytes_cur_line;
do {
if ( buff_len > BYTES_PER_LINE ) {
bytes_cur_line = BYTES_PER_LINE;
} else {
bytes_cur_line = buff_len;
}
if ( !esp_ptr_byte_accesible(buffer) ) {
//use memcpy to get around alignment issue
memcpy( temp_buffer, buffer, (bytes_cur_line+3)/4*4 );
ptr_line = temp_buffer;
} else {
ptr_line = buffer;
}
ptr_hd = hd_buffer;
ptr_hd += sprintf( ptr_hd, "%p ", buffer );
for( int i = 0; i < BYTES_PER_LINE; i ++ ) {
if ( (i&7)==0 ) {
ptr_hd += sprintf( ptr_hd, " " );
}
if ( i < bytes_cur_line ) {
ptr_hd += sprintf( ptr_hd, " %02x", ptr_line[i] );
} else {
ptr_hd += sprintf( ptr_hd, " " );
}
}
ptr_hd += sprintf( ptr_hd, " |" );
for( int i = 0; i < bytes_cur_line; i ++ ) {
if ( isprint((int)ptr_line[i]) ) {
ptr_hd += sprintf( ptr_hd, "%c", ptr_line[i] );
} else {
ptr_hd += sprintf( ptr_hd, "." );
}
}
ptr_hd += sprintf( ptr_hd, "|" );
ESP_LOG_LEVEL( log_level, tag, "%s", hd_buffer );
buffer += bytes_cur_line;
buff_len -= bytes_cur_line;
} while( buff_len );
}