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;