You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by st...@apache.org on 2016/02/24 00:32:08 UTC

incubator-mynewt-larva git commit: This closes #6

Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/develop b28b84cdb -> 16dce45da


This closes #6

Squashed commit of the following:

commit a91d0a934b1f2e70ff13f6f46a578d757558ddd3
Author: Gordon Chaffee <go...@runtime.io>
Date:   Mon Feb 22 12:39:22 2016 -0800

    Add definition of LOGS_NMGR_OP_CLEAR

commit bdfac9a0ed4d0fc4d39d43e9b763432eb8393641
Author: Gordon Chaffee <go...@runtime.io>
Date:   Mon Feb 22 03:32:54 2016 -0800

    Add stub for newtmgr 'logs clear' command

commit e5f11daedad980570f6267c3d7f4e03af01aa985
Author: Gordon Chaffee <go...@runtime.io>
Date:   Mon Feb 22 03:26:29 2016 -0800

    Add support for newtmgr 'logs show' command

commit e1a67326d5d8ecc6fb95dfe4576fe1c90ffd39d2
Author: Gordon Chaffee <go...@runtime.io>
Date:   Mon Feb 22 03:21:54 2016 -0800

    Add encoding functions for json arrays of unknown length


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/16dce45d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/16dce45d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/16dce45d

Branch: refs/heads/develop
Commit: 16dce45daa1dca2b0c354d0078ef579905997385
Parents: b28b84c
Author: Sterling Hughes <st...@apache.org>
Authored: Tue Feb 23 15:31:42 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Feb 23 15:32:06 2016 -0800

----------------------------------------------------------------------
 libs/json/include/json/json.h          |  31 +++---
 libs/json/src/json_encode.c            |  84 +++++++++++----
 libs/newtmgr/include/newtmgr/newtmgr.h |   3 +-
 libs/newtmgr/src/newtmgr.c             |   3 +-
 sys/log/include/log/log.h              |   5 +
 sys/log/pkg.yml                        |   3 +
 sys/log/src/log.c                      |  18 +++-
 sys/log/src/log_nmgr.c                 | 161 ++++++++++++++++++++++++++++
 8 files changed, 269 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/libs/json/include/json/json.h
----------------------------------------------------------------------
diff --git a/libs/json/include/json/json.h b/libs/json/include/json/json.h
index a64af64..9f8e29c 100644
--- a/libs/json/include/json/json.h
+++ b/libs/json/include/json/json.h
@@ -6,7 +6,7 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
@@ -35,7 +35,7 @@
 #define JSON_VALUE_TYPE_OBJECT (5)
 
 /**
- * For JSON decode, descriptions of the JSON values that 
+ * For JSON decode, descriptions of the JSON values that
  * need to be parsed.
  */
 struct json_value_desc {
@@ -46,7 +46,7 @@ struct json_value_desc {
     uint8_t jv_matched;
 };
 
-/** 
+/**
  * For encode.  The contents of a JSON value to encode.
  */
 struct json_value {
@@ -88,7 +88,7 @@ struct json_value {
     (__jv)->jv_val.u = (uint64_t) __v;
 
 /* Encoding functions */
-typedef int (*json_write_func_t)(void *buf, char *data, 
+typedef int (*json_write_func_t)(void *buf, char *data,
         int len);
 
 struct json_encoder {
@@ -103,22 +103,27 @@ struct json_encoder {
 
 int json_encode_object_start(struct json_encoder *);
 int json_encode_object_key(struct json_encoder *encoder, char *key);
-int json_encode_object_entry(struct json_encoder *, char *, 
+int json_encode_object_entry(struct json_encoder *, char *,
         struct json_value *);
 int json_encode_object_finish(struct json_encoder *);
 
+int json_encode_array_name(struct json_encoder *encoder, char *name);
+int json_encode_array_start(struct json_encoder *encoder);
+int json_encode_array_value(struct json_encoder *encoder, struct json_value *val);
+int json_encode_array_finish(struct json_encoder *encoder);
+
 /* Json parser definitions */
 typedef enum {
-    t_integer, 
-    t_uinteger, 
+    t_integer,
+    t_uinteger,
     t_real,
-    t_string, 
-    t_boolean, 
+    t_string,
+    t_boolean,
     t_character,
-    t_object, 
-    t_structobject, 
-    t_array, 
-    t_check, 
+    t_object,
+    t_structobject,
+    t_array,
+    t_check,
     t_ignore
 } json_type;
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/libs/json/src/json_encode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_encode.c b/libs/json/src/json_encode.c
index fe8fc98..2132bf2 100644
--- a/libs/json/src/json_encode.c
+++ b/libs/json/src/json_encode.c
@@ -6,7 +6,7 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
@@ -36,7 +36,7 @@
     (__e)->je_write((__e)->je_arg, "]", sizeof("]")-1);
 
 
-int 
+int
 json_encode_object_start(struct json_encoder *encoder)
 {
     JSON_ENCODE_OBJECT_START(encoder);
@@ -45,7 +45,7 @@ json_encode_object_start(struct json_encoder *encoder)
     return (0);
 }
 
-static int 
+static int
 json_encode_value(struct json_encoder *encoder, struct json_value *jv)
 {
     int rc;
@@ -54,7 +54,7 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
 
     switch (jv->jv_type) {
         case JSON_VALUE_TYPE_BOOL:
-            len = sprintf(encoder->je_encode_buf, "%s", 
+            len = sprintf(encoder->je_encode_buf, "%s",
                     jv->jv_val.u > 0 ? "true" : "false");
             encoder->je_write(encoder->je_arg, encoder->je_encode_buf, len);
             break;
@@ -64,7 +64,7 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
             encoder->je_write(encoder->je_arg, encoder->je_encode_buf, len);
             break;
         case JSON_VALUE_TYPE_INT64:
-            len = sprintf(encoder->je_encode_buf, "%ld", 
+            len = sprintf(encoder->je_encode_buf, "%ld",
                     (long) jv->jv_val.u);
             encoder->je_write(encoder->je_arg, encoder->je_encode_buf, len);
             break;
@@ -75,34 +75,34 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
                     case '"':
                     case '/':
                     case '\\':
-                        encoder->je_write(encoder->je_arg, "\\", 
+                        encoder->je_write(encoder->je_arg, "\\",
                                 sizeof("\\")-1);
-                        encoder->je_write(encoder->je_arg, 
+                        encoder->je_write(encoder->je_arg,
                                 (char *) &jv->jv_val.str[i], 1);
- 
+
                         break;
                     case '\t':
-                        encoder->je_write(encoder->je_arg, "\\t", 
+                        encoder->je_write(encoder->je_arg, "\\t",
                                 sizeof("\\t")-1);
                         break;
                     case '\r':
-                        encoder->je_write(encoder->je_arg, "\\r", 
+                        encoder->je_write(encoder->je_arg, "\\r",
                                 sizeof("\\r")-1);
                         break;
                     case '\n':
-                        encoder->je_write(encoder->je_arg, "\\n", 
+                        encoder->je_write(encoder->je_arg, "\\n",
                                 sizeof("\\n")-1);
                         break;
                     case '\f':
-                        encoder->je_write(encoder->je_arg, "\\f", 
+                        encoder->je_write(encoder->je_arg, "\\f",
                                 sizeof("\\f")-1);
                         break;
                     case '\b':
-                        encoder->je_write(encoder->je_arg, "\\b", 
+                        encoder->je_write(encoder->je_arg, "\\b",
                                 sizeof("\\b")-1);
                         break;
                    default:
-                        encoder->je_write(encoder->je_arg, 
+                        encoder->je_write(encoder->je_arg,
                                 (char *) &jv->jv_val.str[i], 1);
                         break;
                 }
@@ -126,8 +126,8 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
         case JSON_VALUE_TYPE_OBJECT:
             JSON_ENCODE_OBJECT_START(encoder);
             for (i = 0; i < jv->jv_len; i++) {
-                rc = json_encode_object_entry(encoder, 
-                        jv->jv_val.composite.keys[i], 
+                rc = json_encode_object_entry(encoder,
+                        jv->jv_val.composite.keys[i],
                         jv->jv_val.composite.values[i]);
                 if (rc != 0) {
                     goto err;
@@ -146,7 +146,7 @@ err:
     return (rc);
 }
 
-int 
+int
 json_encode_object_key(struct json_encoder *encoder, char *key)
 {
     if (encoder->je_has_objects) {
@@ -161,8 +161,8 @@ json_encode_object_key(struct json_encoder *encoder, char *key)
     return (0);
 }
 
-int 
-json_encode_object_entry(struct json_encoder *encoder, char *key, 
+int
+json_encode_object_entry(struct json_encoder *encoder, char *key,
         struct json_value *val)
 {
     int rc;
@@ -186,7 +186,7 @@ err:
     return (rc);
 }
 
-int 
+int
 json_encode_object_finish(struct json_encoder *encoder)
 {
     JSON_ENCODE_OBJECT_END(encoder);
@@ -195,3 +195,47 @@ json_encode_object_finish(struct json_encoder *encoder)
 
     return (0);
 }
+
+int
+json_encode_array_name(struct json_encoder *encoder, char *name)
+{
+    return json_encode_object_key(encoder, name);
+}
+
+int
+json_encode_array_start(struct json_encoder *encoder)
+{
+    JSON_ENCODE_ARRAY_START(encoder);
+    encoder->je_has_objects = 0;
+
+    return (0);
+}
+
+int
+json_encode_array_value(struct json_encoder *encoder, struct json_value *jv)
+{
+    int rc;
+
+    if (encoder->je_has_objects) {
+        encoder->je_write(encoder->je_arg, ",", sizeof(",")-1);
+    }
+
+    rc = json_encode_value(encoder, jv);
+    if (rc != 0) {
+        goto err;
+    }
+    encoder->je_has_objects = 1;
+
+    return (0);
+err:
+    return (rc);
+}
+
+
+int
+json_encode_array_finish(struct json_encoder *encoder)
+{
+    JSON_ENCODE_ARRAY_END(encoder);
+
+    return (0);
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/libs/newtmgr/include/newtmgr/newtmgr.h
----------------------------------------------------------------------
diff --git a/libs/newtmgr/include/newtmgr/newtmgr.h b/libs/newtmgr/include/newtmgr/newtmgr.h
index 4fd7e8a..79ee70d 100644
--- a/libs/newtmgr/include/newtmgr/newtmgr.h
+++ b/libs/newtmgr/include/newtmgr/newtmgr.h
@@ -29,8 +29,9 @@
  */
 #define NMGR_GROUP_ID_DEFAULT   (0)
 #define NMGR_GROUP_ID_IMAGE     (1)
-#define NMGR_GROUP_ID_STATS     (2) 
+#define NMGR_GROUP_ID_STATS     (2)
 #define NMGR_GROUP_ID_CONFIG    (3)
+#define NMGR_GROUP_ID_LOGS      (4)
 #define NMGR_GROUP_ID_PERUSER   (64)
 
 #define NMGR_OP_READ            (0)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/libs/newtmgr/src/newtmgr.c
----------------------------------------------------------------------
diff --git a/libs/newtmgr/src/newtmgr.c b/libs/newtmgr/src/newtmgr.c
index 1ea385a..7ba1d11 100644
--- a/libs/newtmgr/src/newtmgr.c
+++ b/libs/newtmgr/src/newtmgr.c
@@ -43,9 +43,8 @@ static int nmgr_def_console_echo(struct nmgr_jbuf *);
 
 /* Located in newtmgr_os.c */
 int nmgr_def_taskstat_read(struct nmgr_jbuf *);
-int nmgr_def_taskstat_write(struct nmgr_jbuf *);
 int nmgr_def_mpstat_read(struct nmgr_jbuf *);
-int nmgr_def_mpstat_write(struct nmgr_jbuf *);
+int nmgr_def_logs_read(struct nmgr_jbuf *);
 
 static struct nmgr_group nmgr_def_group;
 /* ORDER MATTERS HERE.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/sys/log/include/log/log.h
----------------------------------------------------------------------
diff --git a/sys/log/include/log/log.h b/sys/log/include/log/log.h
index 63e76ca..c843638 100644
--- a/sys/log/include/log/log.h
+++ b/sys/log/include/log/log.h
@@ -141,4 +141,9 @@ int log_flush(struct log *log);
 int log_cbmem_handler_init(struct log_handler *, struct cbmem *);
 int log_console_handler_init(struct log_handler *);
 
+/* Private */
+#ifdef NEWTMGR_PRESENT
+int log_nmgr_register_group(void);
+#endif
+
 #endif /* __LOG_H__ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/sys/log/pkg.yml
----------------------------------------------------------------------
diff --git a/sys/log/pkg.yml b/sys/log/pkg.yml
index ea403c3..507887a 100644
--- a/sys/log/pkg.yml
+++ b/sys/log/pkg.yml
@@ -25,6 +25,9 @@ pkg.deps:
     - libs/testutil
 pkg.deps.SHELL:
     - libs/shell
+pkg.deps.NEWTMGR:
+    - libs/newtmgr
 pkg.req_caps.SHELL:
     - console
 pkg.cflags.SHELL: -DSHELL_PRESENT
+pkg.cflags.NEWTMGR: -DNEWTMGR_PRESENT

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/sys/log/src/log.c
----------------------------------------------------------------------
diff --git a/sys/log/src/log.c b/sys/log/src/log.c
index 1bd6e27..2e8e3c9 100644
--- a/sys/log/src/log.c
+++ b/sys/log/src/log.c
@@ -38,21 +38,33 @@ static uint8_t log_inited;
 #ifdef SHELL_PRESENT
 struct shell_cmd g_shell_log_cmd;
 int shell_log_dump_all_cmd(int, char **);
-#endif 
+#endif
 
-int 
+int
 log_init(void)
 {
+    int rc;
+
     if (log_inited) {
         return (0);
     }
     log_inited = 1;
 
-#ifdef SHELL_PRESENT 
+#ifdef SHELL_PRESENT
     shell_cmd_register(&g_shell_log_cmd, "log", shell_log_dump_all_cmd);
 #endif
 
+#ifdef NEWTMGR_PRESENT
+    rc = log_nmgr_register_group();
+    if (rc != 0) {
+        goto err;
+    }
+#endif /* NEWTMGR_PRESENT */
+
     return (0);
+
+err:
+    return (rc);
 }
 
 struct log *

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/16dce45d/sys/log/src/log_nmgr.c
----------------------------------------------------------------------
diff --git a/sys/log/src/log_nmgr.c b/sys/log/src/log_nmgr.c
new file mode 100644
index 0000000..24b374a
--- /dev/null
+++ b/sys/log/src/log_nmgr.c
@@ -0,0 +1,161 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <os/os.h>
+
+#include <string.h>
+
+#include <stdio.h>
+
+#ifdef NEWTMGR_PRESENT
+
+#include "newtmgr/newtmgr.h"
+#include "json/json.h"
+#include "log/log.h"
+
+/* Source code is only included if the newtmgr library is enabled.  Otherwise
+ * this file is compiled out for code size.
+ */
+
+static int log_nmgr_read(struct nmgr_jbuf *njb);
+
+static struct nmgr_group log_nmgr_group;
+
+#define LOGS_NMGR_ID_READ  (0)
+#define LOGS_NMGR_OP_CLEAR (1)
+
+/* ORDER MATTERS HERE.
+ * Each element represents the command ID, referenced from newtmgr.
+ */
+static struct nmgr_handler log_nmgr_group_handlers[] = {
+    [LOGS_NMGR_ID_READ] = {log_nmgr_read, log_nmgr_read},
+    [LOGS_NMGR_OP_CLEAR] = {NULL, NULL}, /* Stub */
+};
+
+static int
+log_nmgr_add_entry(struct log *log, void *arg, void *dptr, uint16_t len)
+{
+    struct log_entry_hdr ueh;
+    char data[128];
+    int dlen;
+    struct json_encoder *encoder;
+    struct json_value jv;
+    int rc;
+
+    rc = log_read(log, dptr, &ueh, 0, sizeof(ueh));
+    if (rc != sizeof(ueh)) {
+        goto err;
+    }
+
+    dlen = min(len-sizeof(ueh), 128);
+
+    rc = log_read(log, dptr, data, sizeof(ueh), dlen);
+    if (rc < 0) {
+        goto err;
+    }
+    data[rc] = 0;
+
+    encoder = (struct json_encoder *) arg;
+
+    json_encode_object_start(encoder);
+
+    JSON_VALUE_STRINGN(&jv, data, rc);
+    rc = json_encode_object_entry(encoder, "log", &jv);
+    if (rc != 0) {
+        goto err;
+    }
+
+    JSON_VALUE_UINT(&jv, *(uint64_t *) &ueh.ue_ts);
+    rc = json_encode_object_entry(encoder, "ts", &jv);
+    if (rc != 0) {
+        goto err;
+    }
+
+    json_encode_object_finish(encoder);
+
+    return (0);
+err:
+    return (rc);
+}
+
+static int
+log_nmgr_read(struct nmgr_jbuf *njb)
+{
+    struct log *log;
+    int rc;
+    struct json_value jv;
+    struct json_encoder *encoder;
+
+    encoder = (struct json_encoder *) &nmgr_task_jbuf.njb_enc;
+
+    json_encode_object_start(encoder);
+    JSON_VALUE_INT(&jv, NMGR_ERR_EOK);
+    json_encode_object_entry(encoder, "rc", &jv);
+    json_encode_array_name(encoder, "logs");
+    json_encode_array_start(encoder);
+
+    log = NULL;
+    while (1) {
+        log = log_list_get_next(log);
+        if (log == NULL) {
+            break;
+        }
+
+        if (log->l_log->log_type == LOG_TYPE_STREAM) {
+            continue;
+        }
+
+        rc = log_walk(log, log_nmgr_add_entry, NULL);
+        if (rc != 0) {
+            goto err;
+        }
+    }
+
+    json_encode_array_finish(encoder);
+    json_encode_object_finish(encoder);
+
+    return (0);
+err:
+    nmgr_jbuf_setoerr(njb, rc);
+    return (0);
+}
+
+/**
+ * Register nmgr group handlers.
+ */
+int
+log_nmgr_register_group(void)
+{
+    int rc;
+
+    NMGR_GROUP_SET_HANDLERS(&log_nmgr_group, log_nmgr_group_handlers);
+    log_nmgr_group.ng_group_id = NMGR_GROUP_ID_LOGS;
+
+    rc = nmgr_group_register(&log_nmgr_group);
+    if (rc != 0) {
+        goto err;
+    }
+
+    return (0);
+err:
+    return (rc);
+}
+
+
+#endif /* NEWTMGR_PRESENT */