lte/lapi/src/lapi_lwm2m.c (271 lines of code) (raw):

/**************************************************************************** * apps/lte/lapi/src/lapi_lwm2m.c * * SPDX-License-Identifier: Apache-2.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. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include <nuttx/config.h> #include <stdio.h> #include <stdint.h> #include <string.h> #include <errno.h> #include <nuttx/wireless/lte/lte_ioctl.h> #include <nuttx/wireless/lte/lte.h> #include "lte/lapi.h" #include "lte/lte_api.h" #include "lte/lte_lwm2m.h" /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: check_instance ****************************************************************************/ static int check_instance(FAR struct lwm2mstub_instance_s *inst) { int ret = OK; if (inst->object_id < 0 || inst->object_inst < 0 || inst->res_id < 0) { ret = ERROR; } return ret; } /**************************************************************************** * Name: insert_sort ****************************************************************************/ static void insert_sort(FAR uint16_t *array, int sz) { int i; int j; uint16_t tmp; for (i = 1; i < sz; i++) { j = i; while (j > 0 && array[j - 1] > array[j]) { tmp = array[j - 1]; array[j - 1] = array[j]; array[j] = tmp; j--; } } } /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: lte_m2m_connection ****************************************************************************/ int lte_m2m_connection(int cmd) { if (cmd < LWM2MSTUB_CONNECT_REGISTER || cmd > LWM2MSTUB_CONNECT_BOOTSTRAP) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_CONNECT, (FAR void **)cmd, 1, NULL, 0, NULL); } /**************************************************************************** * Name: lte_m2m_readresponse ****************************************************************************/ int lte_m2m_readresponse(int seq_no, FAR struct lwm2mstub_instance_s *inst, int resp, FAR char *readvalue, int len) { FAR void *inarg[5] = { (FAR void *)seq_no, (FAR void *)resp, inst, readvalue, (FAR void *)len }; if (!inst || !readvalue || len <= 0 || check_instance(inst) != OK) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_READRESP, (FAR void *)&inarg, 5, NULL, 0, NULL); } /**************************************************************************** * Name: lte_m2m_writeresponse ****************************************************************************/ int lte_m2m_writeresponse(int seq_no, FAR struct lwm2mstub_instance_s *inst, int resp) { FAR void *inarg[3] = { (FAR void *)seq_no, (FAR void *)resp, inst }; if (!inst || check_instance(inst) != OK) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_WRITERESP, (FAR void *)&inarg, 3, NULL, 0, NULL); } /**************************************************************************** * Name: lte_m2m_executeresp ****************************************************************************/ int lte_m2m_executeresp(int seq_no, FAR struct lwm2mstub_instance_s *inst, int resp) { FAR void *inarg[3] = { (FAR void *)seq_no, (FAR void *)resp, inst }; if (!inst || check_instance(inst) != OK) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_EXECRESP, (FAR void *)&inarg, 3, NULL, 0, NULL); } /**************************************************************************** * Name: lte_m2m_observeresp ****************************************************************************/ int lte_m2m_observeresp(int seq_no, int resp) { FAR void *inarg[2] = { (FAR void *)seq_no, (FAR void *)resp }; return lapi_req(LTE_CMDID_LWM2M_OBSERVERESP, (FAR void *)&inarg, 2, NULL, 0, NULL); } /**************************************************************************** * Name: lte_m2m_observeupdate ****************************************************************************/ int lte_m2m_observeupdate(FAR char *token, FAR struct lwm2mstub_instance_s *inst, FAR char *value, int len) { FAR void *inarg[4] = { token, inst, value, (FAR void *)len }; if (!token || !inst || !value || len <= 0) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_OBSERVEUPDATE, (FAR void *)&inarg, 4, NULL, 0, NULL); } /**************************************************************************** * Name: lte_setm2m_endpointname ****************************************************************************/ int lte_setm2m_endpointname(FAR char *name) { return lapi_req(LTE_CMDID_LWM2M_SETEP, (FAR void **)name, 1, NULL, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_endpointname ****************************************************************************/ int lte_getm2m_endpointname(FAR char *name, int len) { FAR void *outarg[2] = { name, (FAR void *)len }; if (!name || len <= 0) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_GETEP, NULL, 0, (FAR void *)&outarg, 2, NULL); } /**************************************************************************** * Name: lte_getm2m_servernum ****************************************************************************/ int lte_getm2m_servernum(void) { int dummy_arg; /* Dummy for blocking API call */ return lapi_req(LTE_CMDID_LWM2M_GETSRVNUM, NULL, 0, (FAR void **)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_setm2m_servernum ****************************************************************************/ int lte_setm2m_serverinfo(FAR struct lwm2mstub_serverinfo_s *info, int id) { FAR void *inarg[2] = { info, (FAR void *)id }; if (!info) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_SETSRVINFO, &inarg, 2, NULL, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_serverinfo ****************************************************************************/ int lte_getm2m_serverinfo(FAR struct lwm2mstub_serverinfo_s *info, int id) { FAR void *outarg[2] = { info, (FAR void *)id }; if (!info) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_GETSRVINFO, NULL, 0, &outarg, 2, NULL); } /**************************************************************************** * Name: lte_getm2m_enabled_objectnum ****************************************************************************/ int lte_getm2m_enabled_objectnum(void) { int dummy_arg; /* Dummy for blocking API call */ return lapi_req(LTE_CMDID_LWM2M_GETACTIVEOBJNUM, NULL, 0, (FAR void *)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_enabled_objects ****************************************************************************/ int lte_getm2m_enabled_objects(FAR uint16_t *objids, int objnum) { FAR void *outarg[2] = { objids, (FAR void *)objnum }; if (!objids || objnum <= 0) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_GETACTIVEOBJ, NULL, 0, &outarg, 2, NULL); } /**************************************************************************** * Name: lte_enablem2m_objects ****************************************************************************/ int lte_enablem2m_objects(FAR uint16_t *objids, int objnum) { FAR void *inarg[2] = { objids, (FAR void *)objnum }; if (!objids || objnum <= 0) { return -EINVAL; } insert_sort(objids, objnum); return lapi_req(LTE_CMDID_LWM2M_SETACTIVEOBJ, &inarg, 2, NULL, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_objresourcenum ****************************************************************************/ int lte_getm2m_objresourcenum(uint16_t objid) { int dummy_arg; /* Dummy for blocking API call */ return lapi_req(LTE_CMDID_LWM2M_GETOBJRESNUM, &objid, 1, (FAR void *)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_objresourceinfo ****************************************************************************/ int lte_getm2m_objresourceinfo(uint16_t objid, int res_num, FAR struct lwm2mstub_resource_s *reses) { FAR void *outarg[2] = { reses, (FAR void *)res_num }; if (!reses || res_num <= 0) { return -EINVAL; } return lapi_req(LTE_CMDID_LWM2M_GETOBJRESOURCE, &objid, 1, outarg, 2, NULL); } /**************************************************************************** * Name: lte_setm2m_rat ****************************************************************************/ int lte_setm2m_rat(int rat) { int dummy_arg; /* Dummy for blocking API call */ switch (rat) { case LTE_RAT_CATM: case LTE_RAT_NBIOT: break; default: return -EINVAL; break; } return lapi_req(LTE_CMDID_LWM2M_CHANGERAT, &rat, 1, (FAR void *)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_getm2m_rat ****************************************************************************/ int lte_getm2m_rat(void) { int dummy_arg; /* Dummy for blocking API call */ return lapi_req(LTE_CMDID_LWM2M_GETRAT, NULL, 0, (FAR void *)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_setm2m_objectdefinition ****************************************************************************/ int lte_setm2m_objectdefinition(uint16_t objids, int res_num, FAR struct lwm2mstub_resource_s *resucs) { FAR void *inarg[3] = { (FAR void *)(uint32_t)objids, (FAR void *)res_num, resucs }; return lapi_req(LTE_CMDID_LWM2M_SETOBJRESOURCE, inarg, 3, NULL, 0, NULL); } /**************************************************************************** * Name: lte_apply_m2msetting ****************************************************************************/ int lte_apply_m2msetting(void) { return lapi_req(LTE_CMDID_LWM2M_APPLY_SETTING, NULL, 0, NULL, 0, NULL); } /**************************************************************************** * Name: lte_set_report_m2mwrite ****************************************************************************/ int lte_set_report_m2mwrite(lwm2mstub_write_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_WRITE_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2mread ****************************************************************************/ int lte_set_report_m2mread(lwm2mstub_read_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_READ_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2mexec ****************************************************************************/ int lte_set_report_m2mexec(lwm2mstub_exec_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_EXEC_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2movstart ****************************************************************************/ int lte_set_report_m2movstart(lwm2mstub_ovstart_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_OVSTART_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2movstop ****************************************************************************/ int lte_set_report_m2movstop(lwm2mstub_ovstop_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_OVSTOP_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2moperation ****************************************************************************/ int lte_set_report_m2moperation(lwm2mstub_operation_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_SERVEROP_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_set_report_m2mfwupdate ****************************************************************************/ int lte_set_report_m2mfwupdate(lwm2mstub_fwupstate_cb_t cb) { return lapi_req(LTE_CMDID_LWM2M_FWUP_EVT, NULL, 0, NULL, 0, cb); } /**************************************************************************** * Name: lte_getm2m_qmode ****************************************************************************/ bool lte_getm2m_qmode(void) { int dummy_arg; /* Dummy for blocking API call */ return lapi_req(LTE_CMDID_LWM2M_GETQMODE, NULL, 0, (FAR void **)&dummy_arg, 0, NULL); } /**************************************************************************** * Name: lte_set_report_m2mfwupdate ****************************************************************************/ int lte_setm2m_qmode(bool en) { return lapi_req(LTE_CMDID_LWM2M_SETQMODE, (FAR void **)(en ? 1 : 0), 1, NULL, 0, NULL); }