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 */