// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD // // Licensed 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. #ifndef _SENSOR_SERVER_H_ #define _SENSOR_SERVER_H_ #include "server_common.h" #ifdef __cplusplus extern "C" { #endif /* Sensor Property ID related */ #define INVALID_SENSOR_PROPERTY_ID 0x0000 #define SENSOR_PROPERTY_ID_LEN 0x02 /* Sensor Descriptor state related */ #define SENSOR_DESCRIPTOR_LEN 0x08 #define SENSOR_UNSPECIFIED_POS_TOLERANCE 0x000 #define SENSOR_UNSPECIFIED_NEG_TOLERANCE 0x000 #define SENSOR_NOT_APPL_MEASURE_PERIOD 0x00 #define SENSOR_NOT_APPL_UPDATE_INTERVAL 0x00 /* Sensor Setting state related */ #define INVALID_SENSOR_SETTING_PROPERTY_ID 0x0000 #define SENSOR_SETTING_PROPERTY_ID_LEN 0x02 #define SENSOR_SETTING_ACCESS_LEN 0x01 #define SENSOR_SETTING_ACCESS_READ 0x01 #define SENSOR_SETTING_ACCESS_READ_WRITE 0x03 /* Sensor Cadence state related */ #define SENSOR_DIVISOR_TRIGGER_TYPE_LEN 0x01 #define SENSOR_STATUS_MIN_INTERVAL_LEN 0x01 #define SENSOR_PERIOD_DIVISOR_MAX_VALUE 15 #define SENSOR_STATUS_MIN_INTERVAL_MAX 26 #define SENSOR_STATUS_TRIGGER_TYPE_CHAR 0 #define SENSOR_STATUS_TRIGGER_TYPE_UINT16 1 #define SENSOR_STATUS_TRIGGER_UINT16_LEN 0x02 /* Sensor Data state related */ #define SENSOR_DATA_FORMAT_A 0x00 #define SENSOR_DATA_FORMAT_B 0x01 #define SENSOR_DATA_FORMAT_A_MPID_LEN 0x02 #define SENSOR_DATA_FORMAT_B_MPID_LEN 0x03 #define SENSOR_DATA_ZERO_LEN 0x7F enum bt_mesh_sensor_sample_func { UNSPECIFIED, INSTANTANEOUS, ARITHMETIC_MEAN, RMS, MAXIMUM, MINIMUM, ACCUMULATED, COUNT, }; struct sensor_descriptor { u32_t positive_tolerance : 12, negative_tolerance : 12, sample_function : 8; u8_t measure_period; u8_t update_interval; }; struct sensor_setting { u16_t property_id; u8_t access; /* Or use union to include all possible types */ struct net_buf_simple *raw; }; struct sensor_cadence { u8_t period_divisor : 7, trigger_type : 1; struct net_buf_simple *trigger_delta_down; struct net_buf_simple *trigger_delta_up; u8_t min_interval; struct net_buf_simple *fast_cadence_low; struct net_buf_simple *fast_cadence_high; }; struct sensor_data { /** * Format A: The Length field is a 1-based uint4 value (valid range 0x0–0xF, * representing range of 1 – 16). * Format B: The Length field is a 1-based uint7 value (valid range 0x0–0x7F, * representing range of 1 – 127). The value 0x7F represents a * length of zero. */ u8_t format : 1, length : 7; struct net_buf_simple *raw_value; }; struct sensor_series_column { struct net_buf_simple *raw_value_x; struct net_buf_simple *column_width; struct net_buf_simple *raw_value_y; }; struct bt_mesh_sensor_state { u16_t sensor_property_id; /* Constant throughout the lifetime of an element */ struct sensor_descriptor descriptor; /* Multiple Sensor Setting states may be present for each sensor. * The Sensor Setting Property ID values shall be unique for each * Sensor Property ID that identifies a sensor within an element. */ const u8_t setting_count; struct sensor_setting *settings; /* The Sensor Cadence state may be not supported by sensors based * on device properties referencing "non-scalar characteristics" * such as "histograms" or "composite characteristics". */ struct sensor_cadence *cadence; struct sensor_data sensor_data; /* Values measured by sensors may be organized as arrays (and * represented as series of columns, such as histograms). * 1. The Sensor Raw Value X field has a size and representation * defined by the Sensor Property ID and represents the left * corner of the column on the X axis. * 2. The Sensor Column Width field has a size and representation * defined by the Sensor Property ID and represents the width * of the column on the X axis. * 3. The Sensor Raw Value Y field has a size and representation * defined by the Sensor Property ID and represents the height * of the column on the Y axis. * Note: Values outside the bins defined by a Sensor Property are * not included. For example, if the histogram is defined as 3 bins * representing “lamp operating hours in a given temperature range” * and the bins are [40,60), [60, 80), and [80,100], then any hours * outside that [40, 100] range would not be included. */ struct sensor_series_column series_column; }; /* 1. Multiple instances of the Sensor states may be present within the * same model, provided that each instance has a unique value of the * Sensor Property ID to allow the instances to be differentiated. * 2. Note: The number of sensors within a multisensor is limited by the * size of the message payload for the Sensor Descriptor Status message. * A single Sensor Descriptor may be sent using a single Unsegmented * Access message. Using Segmentation and Reassembly (SAR), up to 38 * Sensor Descriptor states may be sent. */ struct bt_mesh_sensor_srv { struct bt_mesh_model *model; struct bt_mesh_server_rsp_ctrl rsp_ctrl; const u8_t state_count; struct bt_mesh_sensor_state *states; }; struct bt_mesh_sensor_setup_srv { struct bt_mesh_model *model; struct bt_mesh_server_rsp_ctrl rsp_ctrl; const u8_t state_count; struct bt_mesh_sensor_state *states; }; typedef union { struct { u16_t id; u8_t period_divisor : 7, trigger_type : 1; struct net_buf_simple *trigger_delta_down; struct net_buf_simple *trigger_delta_up; u8_t min_interval; struct net_buf_simple *fast_cadence_low; struct net_buf_simple *fast_cadence_high; } sensor_cadence_set; struct { u16_t id; u16_t setting_id; struct net_buf_simple *value; } sensor_setting_set; } bt_mesh_sensor_server_state_change_t; typedef union { struct { bool op_en; u16_t id; } sensor_descriptor_get; struct { u16_t id; } sensor_cadence_get; struct { u16_t id; } sensor_settings_get; struct { u16_t id; u16_t setting_id; } sensor_setting_get; struct { bool op_en; u16_t id; } sensor_get; struct { u16_t id; struct net_buf_simple *raw_x; } sensor_column_get; struct { bool op_en; u16_t id; struct net_buf_simple *raw; } sensor_series_get; } bt_mesh_sensor_server_recv_get_msg_t; typedef union { struct { u16_t id; struct net_buf_simple *cadence; } sensor_cadence_set; struct { u16_t id; u16_t setting_id; struct net_buf_simple *raw; } sensor_setting_set; } bt_mesh_sensor_server_recv_set_msg_t; int bt_mesh_sensor_srv_init(struct bt_mesh_model *model, bool primary); int bt_mesh_sensor_setup_srv_init(struct bt_mesh_model *model, bool primary); int bt_mesh_sensor_srv_deinit(struct bt_mesh_model *model, bool primary); int bt_mesh_sensor_setup_srv_deinit(struct bt_mesh_model *model, bool primary); #ifdef __cplusplus } #endif #endif /* _SENSOR_SERVER_H_ */