You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2018/12/05 09:31:24 UTC
[mynewt-core] 02/04: sys/log: Add pretty-printing for CBOR log
entries
This is an automated email from the ASF dual-hosted git repository.
andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 885766f3b8d6baee521fea2feef7c707ef1ccf2c
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Dec 4 16:52:36 2018 +0100
sys/log: Add pretty-printing for CBOR log entries
---
sys/log/full/src/log_shell.c | 130 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 126 insertions(+), 4 deletions(-)
diff --git a/sys/log/full/src/log_shell.c b/sys/log/full/src/log_shell.c
index 2897039..650d236 100644
--- a/sys/log/full/src/log_shell.c
+++ b/sys/log/full/src/log_shell.c
@@ -36,6 +36,115 @@
#include "shell/shell.h"
#include "console/console.h"
#include "base64/hex.h"
+#if MYNEWT_VAL(LOG_VERSION) > 2
+#include "tinycbor/cbor.h"
+#endif
+
+#if MYNEWT_VAL(LOG_VERSION) > 2
+struct log_shell_cbor_reader {
+ struct cbor_decoder_reader r;
+ struct log *log;
+ void *dptr;
+};
+
+static uint8_t
+log_shell_cbor_reader_get8(struct cbor_decoder_reader *d, int offset)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+ uint8_t val = 0;
+
+ (void)log_read_body(cbr->log, cbr->dptr, &val, offset, sizeof(val));
+
+ return val;
+}
+
+static uint16_t
+log_shell_cbor_reader_get16(struct cbor_decoder_reader *d, int offset)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+ uint16_t val = 0;
+
+ (void)log_read_body(cbr->log, cbr->dptr, &val, offset, sizeof(val));
+
+ return val;
+}
+
+static uint32_t
+log_shell_cbor_reader_get32(struct cbor_decoder_reader *d, int offset)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+ uint8_t val = 0;
+
+ (void)log_read_body(cbr->log, cbr->dptr, &val, offset, sizeof(val));
+
+ return val;
+}
+
+static uint64_t
+log_shell_cbor_reader_get64(struct cbor_decoder_reader *d, int offset)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+ uint64_t val = 0;
+
+ (void)log_read_body(cbr->log, cbr->dptr, &val, offset, sizeof(val));
+
+ return val;
+}
+
+static uintptr_t
+log_shell_cbor_reader_cmp(struct cbor_decoder_reader *d, char *dst,
+ int src_offset, size_t len)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+ uint8_t buf[16];
+ int chunk_len;
+ int offset;
+ int rc;
+
+ offset = 0;
+
+ while (offset < len) {
+ chunk_len = min(len - offset, sizeof(buf));
+
+ log_read_body(cbr->log, cbr->dptr, buf, src_offset + offset, chunk_len);
+
+ rc = memcmp(&dst[offset], buf, chunk_len);
+ if (rc) {
+ return rc;
+ }
+
+ offset += chunk_len;
+ }
+
+ return 0;
+}
+
+static uintptr_t
+log_shell_cbor_reader_cpy(struct cbor_decoder_reader *d, char *dst,
+ int src_offset, size_t len)
+{
+ struct log_shell_cbor_reader *cbr = (struct log_shell_cbor_reader *)d;
+
+ log_read_body(cbr->log, cbr->dptr, dst, src_offset, len);
+
+ return (uintptr_t)dst;
+}
+
+static void
+log_shell_cbor_reader_init(struct log_shell_cbor_reader *cbr, struct log *log,
+ void *dptr, uint16_t len)
+{
+ cbr->r.get8 = &log_shell_cbor_reader_get8;
+ cbr->r.get16 = &log_shell_cbor_reader_get16;
+ cbr->r.get32 = &log_shell_cbor_reader_get32;
+ cbr->r.get64 = &log_shell_cbor_reader_get64;
+ cbr->r.cmp = &log_shell_cbor_reader_cmp;
+ cbr->r.cpy = &log_shell_cbor_reader_cpy;
+ cbr->r.message_size = len;
+ cbr->log = log;
+ cbr->dptr = dptr;
+}
+#endif
static int
shell_log_dump_entry(struct log *log, struct log_offset *log_offset,
@@ -45,18 +154,26 @@ shell_log_dump_entry(struct log *log, struct log_offset *log_offset,
int dlen;
int rc;
#if MYNEWT_VAL(LOG_VERSION) > 2
+ struct CborParser cbor_parser;
+ struct CborValue cbor_value;
+ struct log_shell_cbor_reader cbor_reader;
char tmp[32 + 1];
int off;
int blksz;
+ bool read_data = ueh->ue_etype != LOG_ETYPE_CBOR;
+#else
+ bool read_data = true;
#endif
dlen = min(len, 128);
- rc = log_read_body(log, dptr, data, 0, dlen);
- if (rc < 0) {
- return rc;
+ if (read_data) {
+ rc = log_read_body(log, dptr, data, 0, dlen);
+ if (rc < 0) {
+ return rc;
+ }
+ data[rc] = 0;
}
- data[rc] = 0;
console_printf("[%llu] ", ueh->ue_ts);
@@ -67,6 +184,11 @@ shell_log_dump_entry(struct log *log, struct log_offset *log_offset,
case LOG_ETYPE_STRING:
console_write(data, strlen(data));
break;
+ case LOG_ETYPE_CBOR:
+ log_shell_cbor_reader_init(&cbor_reader, log, dptr, len);
+ cbor_parser_init(&cbor_reader.r, 0, &cbor_parser, &cbor_value);
+ cbor_value_to_pretty(stdout, &cbor_value);
+ break;
default:
for (off = 0; off < rc; off += blksz) {
blksz = dlen - off;