mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-12 13:27:36 +00:00
feat(log): add new function to log buffer with level and hex dump.
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
|
Reference in New Issue
Block a user