Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 8fd21e960 -> ab85825ec
oicmgr; rename source file to oicmgr.c. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/f4a08b42 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f4a08b42 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f4a08b42 Branch: refs/heads/develop Commit: f4a08b427cf6384aa4ede02d3677202bfed60a65 Parents: 8fd21e9 Author: Marko Kiiskila <ma...@runtime.io> Authored: Wed Oct 5 15:34:05 2016 -0700 Committer: Marko Kiiskila <ma...@runtime.io> Committed: Wed Oct 5 15:34:05 2016 -0700 ---------------------------------------------------------------------- mgmt/oicmgr/src/newtmgr.c | 380 ----------------------------------------- mgmt/oicmgr/src/oicmgr.c | 380 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 380 insertions(+), 380 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f4a08b42/mgmt/oicmgr/src/newtmgr.c ---------------------------------------------------------------------- diff --git a/mgmt/oicmgr/src/newtmgr.c b/mgmt/oicmgr/src/newtmgr.c deleted file mode 100644 index 0f426ac..0000000 --- a/mgmt/oicmgr/src/newtmgr.c +++ /dev/null @@ -1,380 +0,0 @@ -/** - * 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 <syscfg/syscfg.h> -#include <sysinit/sysinit.h> - -#include <os/os.h> -#include <os/endian.h> - -#include <assert.h> -#include <string.h> - -#include <mgmt/mgmt.h> -#include <nmgr_os/nmgr_os.h> - -#include <oic/oc_api.h> - -#define OMGR_OC_EVENT (OS_EVENT_T_PERUSER) -#define OMGR_OC_TIMER (OS_EVENT_T_PERUSER + 1) -#define OICMGR_STACK_SZ OS_STACK_ALIGN(MYNEWT_VAL(OICMGR_STACK_SIZE)) - -struct omgr_jbuf { - struct mgmt_jbuf ob_mj; - char *ob_in; - uint16_t ob_in_off; - uint16_t ob_in_end; - char *ob_out; - uint16_t ob_out_off; - uint16_t ob_out_end; -}; - -struct omgr_state { - struct os_eventq os_evq; - struct os_event os_oc_event; - struct os_callout os_oc_timer; - struct os_task os_task; - struct omgr_jbuf os_jbuf; /* JSON buffer for NMGR task */ - char os_rsp[MGMT_MAX_MTU]; -}; - -static struct omgr_state omgr_state = { - .os_oc_event.ev_type = OMGR_OC_EVENT, - .os_oc_timer.c_ev.ev_type = OMGR_OC_TIMER, - .os_oc_timer.c_evq = &omgr_state.os_evq -}; - -static os_stack_t oicmgr_stack[OICMGR_STACK_SZ]; - -static void omgr_oic_get(oc_request_t *request, oc_interface_mask_t interface); -static void omgr_oic_put(oc_request_t *request, oc_interface_mask_t interface); - -static char -omgr_jbuf_read_next(struct json_buffer *jb) -{ - struct omgr_jbuf *njb; - char c; - - njb = (struct omgr_jbuf *) jb; - - if (njb->ob_in_off + 1 > njb->ob_in_end) { - return '\0'; - } - - c = njb->ob_in[njb->ob_in_off]; - ++njb->ob_in_off; - - return (c); -} - -static char -omgr_jbuf_read_prev(struct json_buffer *jb) -{ - struct omgr_jbuf *njb; - char c; - - njb = (struct omgr_jbuf *) jb; - - if (njb->ob_in_off == 0) { - return '\0'; - } - - --njb->ob_in_off; - c = njb->ob_in[njb->ob_in_off]; - - return (c); -} - -static int -omgr_jbuf_readn(struct json_buffer *jb, char *buf, int size) -{ - struct omgr_jbuf *njb; - int read; - int left; - - njb = (struct omgr_jbuf *)jb; - - left = njb->ob_in_end - njb->ob_in_off; - read = size > left ? left : size; - - memcpy(buf, njb->ob_in + njb->ob_in_off, read); - - return (read); -} - -static int -omgr_jbuf_write(void *arg, char *data, int len) -{ - struct omgr_jbuf *njb; - int rc; - - njb = (struct omgr_jbuf *)arg; - - if (njb->ob_out_off + len >= njb->ob_out_end) { - rc = -1; - goto err; - } - memcpy(njb->ob_out + njb->ob_out_off, data, len); - njb->ob_out_off += len; - njb->ob_out[njb->ob_out_off] = '\0'; - - return (0); -err: - return (rc); -} - -static void -omgr_jbuf_init(struct omgr_jbuf *ob) -{ - struct mgmt_jbuf *mjb; - - memset(ob, 0, sizeof(*ob)); - - mjb = &ob->ob_mj; - mjb->mjb_buf.jb_read_next = omgr_jbuf_read_next; - mjb->mjb_buf.jb_read_prev = omgr_jbuf_read_prev; - mjb->mjb_buf.jb_readn = omgr_jbuf_readn; - mjb->mjb_enc.je_write = omgr_jbuf_write; - mjb->mjb_enc.je_arg = ob; -} - -static void -omgr_jbuf_setibuf(struct omgr_jbuf *ob, char *ptr, uint16_t len) -{ - ob->ob_in_off = 0; - ob->ob_in_end = len; - ob->ob_in = ptr; -} - -static void -omgr_jbuf_setobuf(struct omgr_jbuf *ob, char *ptr, uint16_t maxlen) -{ - ob->ob_out = ptr; - ob->ob_out_off = 0; - ob->ob_out_end = maxlen; - ob->ob_out[0] = '\0'; - ob->ob_mj.mjb_enc.je_wr_commas = 0; -} - -static struct mgmt_handler * -omgr_oic_find_handler(const char *q, int qlen) -{ - char id_str[8]; - int grp = -1; - int id = -1; - char *str; - char *eptr; - int slen; - - slen = oc_ri_get_query_value(q, qlen, "gr", &str); - if (slen > 0 && slen < sizeof(id_str) - 1) { - memcpy(id_str, str, slen); - id_str[slen] = '\0'; - grp = strtoul(id_str, &eptr, 0); - if (*eptr != '\0') { - return NULL; - } - } - slen = oc_ri_get_query_value(q, qlen, "id", &str); - if (slen > 0 && slen < sizeof(id_str) - 1) { - memcpy(id_str, str, slen); - id_str[slen] = '\0'; - id = strtoul(id_str, &eptr, 0); - if (*eptr != '\0') { - return NULL; - } - } - return mgmt_find_handler(grp, id); -} - -static void -omgr_oic_op(oc_request_t *req, oc_interface_mask_t mask, int isset) -{ - struct omgr_state *o = &omgr_state; - struct mgmt_handler *handler; - oc_rep_t *data; - int rc; - - if (!req->query_len) { - goto bad_req; - } - - handler = omgr_oic_find_handler(req->query, req->query_len); - if (!handler) { - goto bad_req; - } - - /* - * Setup state for JSON encoding. - */ - omgr_jbuf_setobuf(&o->os_jbuf, o->os_rsp, sizeof(o->os_rsp)); - - data = req->request_payload; - if (data) { - if (data->type != STRING) { - goto bad_req; - } - omgr_jbuf_setibuf(&o->os_jbuf, oc_string(data->value_string), - oc_string_len(data->value_string)); - } else { - omgr_jbuf_setibuf(&o->os_jbuf, NULL, 0); - } - - if (!isset) { - if (handler->mh_read) { - rc = handler->mh_read(&o->os_jbuf.ob_mj); - } else { - goto bad_req; - } - } else { - if (handler->mh_write) { - rc = handler->mh_write(&o->os_jbuf.ob_mj); - } else { - goto bad_req; - } - } - if (rc) { - goto bad_req; - } - - oc_rep_start_root_object(); - switch (mask) { - case OC_IF_BASELINE: - oc_process_baseline_interface(req->resource); - case OC_IF_RW: - oc_rep_set_text_string(root, "key", o->os_rsp); - break; - default: - break; - } - oc_rep_end_root_object(); - oc_send_response(req, OC_STATUS_OK); - - return; -bad_req: - oc_send_response(req, OC_STATUS_BAD_REQUEST); -} - -static void -omgr_oic_get(oc_request_t *req, oc_interface_mask_t mask) -{ - omgr_oic_op(req, mask, 0); -} - -static void -omgr_oic_put(oc_request_t *req, oc_interface_mask_t mask) -{ - omgr_oic_op(req, mask, 1); -} - -static void -omgr_app_init(void) -{ - oc_init_platform("MyNewt", NULL, NULL); - oc_add_device("/oic/d", "oic.d.light", "MynewtLed", "1.0", "1.0", NULL, - NULL); -} - -static void -omgr_register_resources(void) -{ - uint8_t mode; - oc_resource_t *res = NULL; - char name[12]; - - snprintf(name, sizeof(name), "/omgr"); - res = oc_new_resource(name, 1, 0); - oc_resource_bind_resource_type(res, "x.mynewt.nmgr"); - mode = OC_IF_RW; - oc_resource_bind_resource_interface(res, mode); - oc_resource_set_default_interface(res, mode); - oc_resource_set_discoverable(res); - oc_resource_set_request_handler(res, OC_GET, omgr_oic_get); - oc_resource_set_request_handler(res, OC_PUT, omgr_oic_put); - oc_add_resource(res); -} - -static const oc_handler_t omgr_oc_handler = { - .init = omgr_app_init, - .register_resources = omgr_register_resources -}; - -void -oc_signal_main_loop(void) -{ - struct omgr_state *o = &omgr_state; - - os_eventq_put(&o->os_evq, &o->os_oc_event); -} - -void -omgr_oic_task(void *arg) -{ - struct omgr_state *o = &omgr_state; - struct os_event *ev; - struct os_callout_func *ocf; - os_time_t next_event; - - omgr_jbuf_init(&o->os_jbuf); - - oc_main_init((oc_handler_t *)&omgr_oc_handler); - while (1) { - ev = os_eventq_get(&o->os_evq); - switch (ev->ev_type) { - case OMGR_OC_EVENT: - case OMGR_OC_TIMER: - next_event = oc_main_poll(); - if (next_event) { - os_callout_reset(&o->os_oc_timer, next_event - os_time_get()); - } else { - os_callout_stop(&o->os_oc_timer); - } - break; - case OS_EVENT_T_TIMER: - ocf = (struct os_callout_func *)ev; - ocf->cf_func(CF_ARG(ocf)); - break; - } - } -} - -int -oicmgr_init(void) -{ - struct omgr_state *o = &omgr_state; - int rc; - - os_eventq_init(&o->os_evq); - - rc = os_task_init(&o->os_task, "newtmgr_oic", omgr_oic_task, NULL, - MYNEWT_VAL(OICMGR_TASK_PRIO), OS_WAIT_FOREVER, - oicmgr_stack, OICMGR_STACK_SZ); - if (rc != 0) { - goto err; - } - - rc = nmgr_os_groups_register(&o->os_evq); - if (rc != 0) { - goto err; - } - - return (0); -err: - return (rc); -} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f4a08b42/mgmt/oicmgr/src/oicmgr.c ---------------------------------------------------------------------- diff --git a/mgmt/oicmgr/src/oicmgr.c b/mgmt/oicmgr/src/oicmgr.c new file mode 100644 index 0000000..0f426ac --- /dev/null +++ b/mgmt/oicmgr/src/oicmgr.c @@ -0,0 +1,380 @@ +/** + * 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 <syscfg/syscfg.h> +#include <sysinit/sysinit.h> + +#include <os/os.h> +#include <os/endian.h> + +#include <assert.h> +#include <string.h> + +#include <mgmt/mgmt.h> +#include <nmgr_os/nmgr_os.h> + +#include <oic/oc_api.h> + +#define OMGR_OC_EVENT (OS_EVENT_T_PERUSER) +#define OMGR_OC_TIMER (OS_EVENT_T_PERUSER + 1) +#define OICMGR_STACK_SZ OS_STACK_ALIGN(MYNEWT_VAL(OICMGR_STACK_SIZE)) + +struct omgr_jbuf { + struct mgmt_jbuf ob_mj; + char *ob_in; + uint16_t ob_in_off; + uint16_t ob_in_end; + char *ob_out; + uint16_t ob_out_off; + uint16_t ob_out_end; +}; + +struct omgr_state { + struct os_eventq os_evq; + struct os_event os_oc_event; + struct os_callout os_oc_timer; + struct os_task os_task; + struct omgr_jbuf os_jbuf; /* JSON buffer for NMGR task */ + char os_rsp[MGMT_MAX_MTU]; +}; + +static struct omgr_state omgr_state = { + .os_oc_event.ev_type = OMGR_OC_EVENT, + .os_oc_timer.c_ev.ev_type = OMGR_OC_TIMER, + .os_oc_timer.c_evq = &omgr_state.os_evq +}; + +static os_stack_t oicmgr_stack[OICMGR_STACK_SZ]; + +static void omgr_oic_get(oc_request_t *request, oc_interface_mask_t interface); +static void omgr_oic_put(oc_request_t *request, oc_interface_mask_t interface); + +static char +omgr_jbuf_read_next(struct json_buffer *jb) +{ + struct omgr_jbuf *njb; + char c; + + njb = (struct omgr_jbuf *) jb; + + if (njb->ob_in_off + 1 > njb->ob_in_end) { + return '\0'; + } + + c = njb->ob_in[njb->ob_in_off]; + ++njb->ob_in_off; + + return (c); +} + +static char +omgr_jbuf_read_prev(struct json_buffer *jb) +{ + struct omgr_jbuf *njb; + char c; + + njb = (struct omgr_jbuf *) jb; + + if (njb->ob_in_off == 0) { + return '\0'; + } + + --njb->ob_in_off; + c = njb->ob_in[njb->ob_in_off]; + + return (c); +} + +static int +omgr_jbuf_readn(struct json_buffer *jb, char *buf, int size) +{ + struct omgr_jbuf *njb; + int read; + int left; + + njb = (struct omgr_jbuf *)jb; + + left = njb->ob_in_end - njb->ob_in_off; + read = size > left ? left : size; + + memcpy(buf, njb->ob_in + njb->ob_in_off, read); + + return (read); +} + +static int +omgr_jbuf_write(void *arg, char *data, int len) +{ + struct omgr_jbuf *njb; + int rc; + + njb = (struct omgr_jbuf *)arg; + + if (njb->ob_out_off + len >= njb->ob_out_end) { + rc = -1; + goto err; + } + memcpy(njb->ob_out + njb->ob_out_off, data, len); + njb->ob_out_off += len; + njb->ob_out[njb->ob_out_off] = '\0'; + + return (0); +err: + return (rc); +} + +static void +omgr_jbuf_init(struct omgr_jbuf *ob) +{ + struct mgmt_jbuf *mjb; + + memset(ob, 0, sizeof(*ob)); + + mjb = &ob->ob_mj; + mjb->mjb_buf.jb_read_next = omgr_jbuf_read_next; + mjb->mjb_buf.jb_read_prev = omgr_jbuf_read_prev; + mjb->mjb_buf.jb_readn = omgr_jbuf_readn; + mjb->mjb_enc.je_write = omgr_jbuf_write; + mjb->mjb_enc.je_arg = ob; +} + +static void +omgr_jbuf_setibuf(struct omgr_jbuf *ob, char *ptr, uint16_t len) +{ + ob->ob_in_off = 0; + ob->ob_in_end = len; + ob->ob_in = ptr; +} + +static void +omgr_jbuf_setobuf(struct omgr_jbuf *ob, char *ptr, uint16_t maxlen) +{ + ob->ob_out = ptr; + ob->ob_out_off = 0; + ob->ob_out_end = maxlen; + ob->ob_out[0] = '\0'; + ob->ob_mj.mjb_enc.je_wr_commas = 0; +} + +static struct mgmt_handler * +omgr_oic_find_handler(const char *q, int qlen) +{ + char id_str[8]; + int grp = -1; + int id = -1; + char *str; + char *eptr; + int slen; + + slen = oc_ri_get_query_value(q, qlen, "gr", &str); + if (slen > 0 && slen < sizeof(id_str) - 1) { + memcpy(id_str, str, slen); + id_str[slen] = '\0'; + grp = strtoul(id_str, &eptr, 0); + if (*eptr != '\0') { + return NULL; + } + } + slen = oc_ri_get_query_value(q, qlen, "id", &str); + if (slen > 0 && slen < sizeof(id_str) - 1) { + memcpy(id_str, str, slen); + id_str[slen] = '\0'; + id = strtoul(id_str, &eptr, 0); + if (*eptr != '\0') { + return NULL; + } + } + return mgmt_find_handler(grp, id); +} + +static void +omgr_oic_op(oc_request_t *req, oc_interface_mask_t mask, int isset) +{ + struct omgr_state *o = &omgr_state; + struct mgmt_handler *handler; + oc_rep_t *data; + int rc; + + if (!req->query_len) { + goto bad_req; + } + + handler = omgr_oic_find_handler(req->query, req->query_len); + if (!handler) { + goto bad_req; + } + + /* + * Setup state for JSON encoding. + */ + omgr_jbuf_setobuf(&o->os_jbuf, o->os_rsp, sizeof(o->os_rsp)); + + data = req->request_payload; + if (data) { + if (data->type != STRING) { + goto bad_req; + } + omgr_jbuf_setibuf(&o->os_jbuf, oc_string(data->value_string), + oc_string_len(data->value_string)); + } else { + omgr_jbuf_setibuf(&o->os_jbuf, NULL, 0); + } + + if (!isset) { + if (handler->mh_read) { + rc = handler->mh_read(&o->os_jbuf.ob_mj); + } else { + goto bad_req; + } + } else { + if (handler->mh_write) { + rc = handler->mh_write(&o->os_jbuf.ob_mj); + } else { + goto bad_req; + } + } + if (rc) { + goto bad_req; + } + + oc_rep_start_root_object(); + switch (mask) { + case OC_IF_BASELINE: + oc_process_baseline_interface(req->resource); + case OC_IF_RW: + oc_rep_set_text_string(root, "key", o->os_rsp); + break; + default: + break; + } + oc_rep_end_root_object(); + oc_send_response(req, OC_STATUS_OK); + + return; +bad_req: + oc_send_response(req, OC_STATUS_BAD_REQUEST); +} + +static void +omgr_oic_get(oc_request_t *req, oc_interface_mask_t mask) +{ + omgr_oic_op(req, mask, 0); +} + +static void +omgr_oic_put(oc_request_t *req, oc_interface_mask_t mask) +{ + omgr_oic_op(req, mask, 1); +} + +static void +omgr_app_init(void) +{ + oc_init_platform("MyNewt", NULL, NULL); + oc_add_device("/oic/d", "oic.d.light", "MynewtLed", "1.0", "1.0", NULL, + NULL); +} + +static void +omgr_register_resources(void) +{ + uint8_t mode; + oc_resource_t *res = NULL; + char name[12]; + + snprintf(name, sizeof(name), "/omgr"); + res = oc_new_resource(name, 1, 0); + oc_resource_bind_resource_type(res, "x.mynewt.nmgr"); + mode = OC_IF_RW; + oc_resource_bind_resource_interface(res, mode); + oc_resource_set_default_interface(res, mode); + oc_resource_set_discoverable(res); + oc_resource_set_request_handler(res, OC_GET, omgr_oic_get); + oc_resource_set_request_handler(res, OC_PUT, omgr_oic_put); + oc_add_resource(res); +} + +static const oc_handler_t omgr_oc_handler = { + .init = omgr_app_init, + .register_resources = omgr_register_resources +}; + +void +oc_signal_main_loop(void) +{ + struct omgr_state *o = &omgr_state; + + os_eventq_put(&o->os_evq, &o->os_oc_event); +} + +void +omgr_oic_task(void *arg) +{ + struct omgr_state *o = &omgr_state; + struct os_event *ev; + struct os_callout_func *ocf; + os_time_t next_event; + + omgr_jbuf_init(&o->os_jbuf); + + oc_main_init((oc_handler_t *)&omgr_oc_handler); + while (1) { + ev = os_eventq_get(&o->os_evq); + switch (ev->ev_type) { + case OMGR_OC_EVENT: + case OMGR_OC_TIMER: + next_event = oc_main_poll(); + if (next_event) { + os_callout_reset(&o->os_oc_timer, next_event - os_time_get()); + } else { + os_callout_stop(&o->os_oc_timer); + } + break; + case OS_EVENT_T_TIMER: + ocf = (struct os_callout_func *)ev; + ocf->cf_func(CF_ARG(ocf)); + break; + } + } +} + +int +oicmgr_init(void) +{ + struct omgr_state *o = &omgr_state; + int rc; + + os_eventq_init(&o->os_evq); + + rc = os_task_init(&o->os_task, "newtmgr_oic", omgr_oic_task, NULL, + MYNEWT_VAL(OICMGR_TASK_PRIO), OS_WAIT_FOREVER, + oicmgr_stack, OICMGR_STACK_SZ); + if (rc != 0) { + goto err; + } + + rc = nmgr_os_groups_register(&o->os_evq); + if (rc != 0) { + goto err; + } + + return (0); +err: + return (rc); +}