mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-08 07:32:35 +00:00
Initial implementation of IPSO Timer object #3340 Based on: http://www.openmobilealliance.org/tech/profiles/lwm2m/3340.xml "This IPSO object is used to time events and actions, using patterns common to industrial timers. A POST to the trigger resource or On/Off input state change starts the timing operation, and the timer remaining time shows zero when the operation is complete. The patterns supported are One-Shot (mode 1), On-Time or Interval (mode 2), Time delay on pick-up or TDPU (tmode 3), and Time Delay on Drop-Out or TDDO (mode 4). Mode 0 disables the timer, so the output follows the input with no delay. A counter is provided to count occurrences of the timer output changing from 0 to 1. Writing a value of zero resets the counter. The Digital Input State resource reports the state of the timer output." NOTE: Only One-Shot Mode (mode 1) is implemented in this patch. Signed-off-by: Michael Scott <mike@foundries.io>
252 lines
7.9 KiB
C
252 lines
7.9 KiB
C
/*
|
|
* Copyright (c) 2017 Linaro Limited
|
|
* Copyright (c) 2017-2019 Foundries.io
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_NET_LWM2M_H_
|
|
#define ZEPHYR_INCLUDE_NET_LWM2M_H_
|
|
|
|
#include <kernel.h>
|
|
#include <net/coap.h>
|
|
|
|
/**
|
|
* @brief LwM2M high-level API
|
|
* @defgroup lwm2m_api LwM2M high-level API
|
|
* @{
|
|
*/
|
|
|
|
/* LWM2M Objects defined by OMA */
|
|
|
|
#define LWM2M_OBJECT_SECURITY_ID 0
|
|
#define LWM2M_OBJECT_SERVER_ID 1
|
|
#define LWM2M_OBJECT_ACCESS_CONTROL_ID 2
|
|
#define LWM2M_OBJECT_DEVICE_ID 3
|
|
#define LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID 4
|
|
#define LWM2M_OBJECT_FIRMWARE_ID 5
|
|
#define LWM2M_OBJECT_LOCATION_ID 6
|
|
#define LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID 7
|
|
|
|
/* IPSO Alliance Objects */
|
|
|
|
#define IPSO_OBJECT_TEMP_SENSOR_ID 3303
|
|
#define IPSO_OBJECT_LIGHT_CONTROL_ID 3311
|
|
#define IPSO_OBJECT_TIMER_ID 3340
|
|
|
|
/**
|
|
* @brief LwM2M context structure
|
|
*
|
|
* @details Context structure for the LwM2M high-level API.
|
|
*
|
|
* @param remote_addr Stored remote IP address of the LwM2M client
|
|
*/
|
|
struct lwm2m_ctx {
|
|
/** destination address storage */
|
|
struct sockaddr remote_addr;
|
|
|
|
/** Private CoAP and networking structures */
|
|
struct coap_pending pendings[CONFIG_LWM2M_ENGINE_MAX_PENDING];
|
|
struct coap_reply replies[CONFIG_LWM2M_ENGINE_MAX_REPLIES];
|
|
struct k_delayed_work retransmit_work;
|
|
|
|
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
|
|
/** DTLS settings */
|
|
int tls_tag;
|
|
#endif
|
|
bool use_dtls;
|
|
|
|
/** Current security object index */
|
|
int sec_obj_inst;
|
|
bool bootstrap_mode;
|
|
|
|
/** Packet Flow Settings */
|
|
bool handle_separate_response;
|
|
|
|
/** Socket File Descriptor */
|
|
int sock_fd;
|
|
};
|
|
|
|
typedef void *(*lwm2m_engine_get_data_cb_t)(u16_t obj_inst_id,
|
|
size_t *data_len);
|
|
/* callbacks return 0 on success and error code otherwise */
|
|
typedef int (*lwm2m_engine_set_data_cb_t)(u16_t obj_inst_id,
|
|
u8_t *data, u16_t data_len,
|
|
bool last_block, size_t total_size);
|
|
typedef int (*lwm2m_engine_user_cb_t)(u16_t obj_inst_id);
|
|
|
|
|
|
/* LWM2M Device Object */
|
|
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_DC_POWER 0
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_INT 1
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_EXT 2
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_UNUSED 3
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_PWR_OVER_ETH 4
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_USB 5
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_AC_POWER 6
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_SOLAR 7
|
|
#define LWM2M_DEVICE_PWR_SRC_TYPE_MAX 8
|
|
|
|
#define LWM2M_DEVICE_ERROR_NONE 0
|
|
#define LWM2M_DEVICE_ERROR_LOW_POWER 1
|
|
#define LWM2M_DEVICE_ERROR_EXT_POWER_SUPPLY_OFF 2
|
|
#define LWM2M_DEVICE_ERROR_GPS_FAILURE 3
|
|
#define LWM2M_DEVICE_ERROR_LOW_SIGNAL_STRENGTH 4
|
|
#define LWM2M_DEVICE_ERROR_OUT_OF_MEMORY 5
|
|
#define LWM2M_DEVICE_ERROR_SMS_FAILURE 6
|
|
#define LWM2M_DEVICE_ERROR_NETWORK_FAILURE 7
|
|
#define LWM2M_DEVICE_ERROR_PERIPHERAL_FAILURE 8
|
|
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_NORMAL 0
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGING 1
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGE_COMP 2
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_DAMAGED 3
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_LOW 4
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_NOT_INST 5
|
|
#define LWM2M_DEVICE_BATTERY_STATUS_UNKNOWN 6
|
|
|
|
int lwm2m_device_add_pwrsrc(u8_t pwr_src_type); /* returns index */
|
|
int lwm2m_device_remove_pwrsrc(int index);
|
|
int lwm2m_device_set_pwrsrc_voltage_mv(int index, int voltage_mv);
|
|
int lwm2m_device_set_pwrsrc_current_ma(int index, int current_ma);
|
|
int lwm2m_device_add_err(u8_t error_code);
|
|
|
|
|
|
/* LWM2M Firemware Update Object */
|
|
|
|
#define STATE_IDLE 0
|
|
#define STATE_DOWNLOADING 1
|
|
#define STATE_DOWNLOADED 2
|
|
#define STATE_UPDATING 3
|
|
|
|
#define RESULT_DEFAULT 0
|
|
#define RESULT_SUCCESS 1
|
|
#define RESULT_NO_STORAGE 2
|
|
#define RESULT_OUT_OF_MEM 3
|
|
#define RESULT_CONNECTION_LOST 4
|
|
#define RESULT_INTEGRITY_FAILED 5
|
|
#define RESULT_UNSUP_FW 6
|
|
#define RESULT_INVALID_URI 7
|
|
#define RESULT_UPDATE_FAILED 8
|
|
#define RESULT_UNSUP_PROTO 9
|
|
|
|
#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_OBJ_SUPPORT)
|
|
void lwm2m_firmware_set_write_cb(lwm2m_engine_set_data_cb_t cb);
|
|
lwm2m_engine_set_data_cb_t lwm2m_firmware_get_write_cb(void);
|
|
|
|
#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT)
|
|
void lwm2m_firmware_set_update_cb(lwm2m_engine_user_cb_t cb);
|
|
lwm2m_engine_user_cb_t lwm2m_firmware_get_update_cb(void);
|
|
#endif
|
|
#endif
|
|
|
|
/* LWM2M Engine */
|
|
|
|
/*
|
|
* float type below use the following logic:
|
|
* val1 is the whole number portion of decimal
|
|
* val2 is the decimal portion *1000000 for 32bit, *1000000000 for 64bit
|
|
* Example: 123.456 == val1: 123, val2:456000
|
|
* Example: 123.000456 = val1: 123, val2:456
|
|
*/
|
|
|
|
#define LWM2M_FLOAT32_DEC_MAX 1000000
|
|
typedef struct float32_value {
|
|
s32_t val1;
|
|
s32_t val2;
|
|
} float32_value_t;
|
|
|
|
#define LWM2M_FLOAT64_DEC_MAX 1000000000LL
|
|
typedef struct float64_value {
|
|
s64_t val1;
|
|
s64_t val2;
|
|
} float64_value_t;
|
|
|
|
int lwm2m_engine_create_obj_inst(char *pathstr);
|
|
|
|
int lwm2m_engine_set_opaque(char *pathstr, char *data_ptr, u16_t data_len);
|
|
int lwm2m_engine_set_string(char *path, char *data_ptr);
|
|
int lwm2m_engine_set_u8(char *path, u8_t value);
|
|
int lwm2m_engine_set_u16(char *path, u16_t value);
|
|
int lwm2m_engine_set_u32(char *path, u32_t value);
|
|
int lwm2m_engine_set_u64(char *path, u64_t value);
|
|
int lwm2m_engine_set_s8(char *path, s8_t value);
|
|
int lwm2m_engine_set_s16(char *path, s16_t value);
|
|
int lwm2m_engine_set_s32(char *path, s32_t value);
|
|
int lwm2m_engine_set_s64(char *path, s64_t value);
|
|
int lwm2m_engine_set_bool(char *path, bool value);
|
|
int lwm2m_engine_set_float32(char *pathstr, float32_value_t *value);
|
|
int lwm2m_engine_set_float64(char *pathstr, float64_value_t *value);
|
|
|
|
int lwm2m_engine_get_opaque(char *pathstr, void *buf, u16_t buflen);
|
|
int lwm2m_engine_get_string(char *path, void *str, u16_t strlen);
|
|
int lwm2m_engine_get_u8(char *path, u8_t *value);
|
|
int lwm2m_engine_get_u16(char *path, u16_t *value);
|
|
int lwm2m_engine_get_u32(char *path, u32_t *value);
|
|
int lwm2m_engine_get_u64(char *path, u64_t *value);
|
|
int lwm2m_engine_get_s8(char *path, s8_t *value);
|
|
int lwm2m_engine_get_s16(char *path, s16_t *value);
|
|
int lwm2m_engine_get_s32(char *path, s32_t *value);
|
|
int lwm2m_engine_get_s64(char *path, s64_t *value);
|
|
int lwm2m_engine_get_bool(char *path, bool *value);
|
|
int lwm2m_engine_get_float32(char *pathstr, float32_value_t *buf);
|
|
int lwm2m_engine_get_float64(char *pathstr, float64_value_t *buf);
|
|
|
|
int lwm2m_engine_register_read_callback(char *path,
|
|
lwm2m_engine_get_data_cb_t cb);
|
|
int lwm2m_engine_register_pre_write_callback(char *path,
|
|
lwm2m_engine_get_data_cb_t cb);
|
|
int lwm2m_engine_register_post_write_callback(char *path,
|
|
lwm2m_engine_set_data_cb_t cb);
|
|
int lwm2m_engine_register_exec_callback(char *path,
|
|
lwm2m_engine_user_cb_t cb);
|
|
int lwm2m_engine_register_create_callback(u16_t obj_id,
|
|
lwm2m_engine_user_cb_t cb);
|
|
int lwm2m_engine_register_delete_callback(u16_t obj_id,
|
|
lwm2m_engine_user_cb_t cb);
|
|
|
|
/* resource data bit values */
|
|
#define LWM2M_RES_DATA_READ_ONLY 0
|
|
|
|
/* resource data flags */
|
|
#define LWM2M_RES_DATA_FLAG_RO BIT(LWM2M_RES_DATA_READ_ONLY)
|
|
|
|
/* helper macro to read resource flag */
|
|
#define LWM2M_HAS_RES_FLAG(res, f) ((res->data_flags & f) == f)
|
|
|
|
int lwm2m_engine_set_res_data(char *pathstr, void *data_ptr, u16_t data_len,
|
|
u8_t data_flags);
|
|
int lwm2m_engine_get_res_data(char *pathstr, void **data_ptr, u16_t *data_len,
|
|
u8_t *data_flags);
|
|
|
|
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx);
|
|
|
|
/* LWM2M RD Client */
|
|
|
|
/* Client events */
|
|
enum lwm2m_rd_client_event {
|
|
LWM2M_RD_CLIENT_EVENT_NONE,
|
|
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE,
|
|
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_COMPLETE,
|
|
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_TRANSFER_COMPLETE,
|
|
LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE,
|
|
LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE,
|
|
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
|
|
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
|
|
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
|
|
LWM2M_RD_CLIENT_EVENT_DISCONNECT
|
|
};
|
|
|
|
/* Event callback */
|
|
typedef void (*lwm2m_ctx_event_cb_t)(struct lwm2m_ctx *ctx,
|
|
enum lwm2m_rd_client_event event);
|
|
|
|
void lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
|
|
lwm2m_ctx_event_cb_t event_cb);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
#endif /* ZEPHYR_INCLUDE_NET_LWM2M_H_ */
|