250 lines
7.6 KiB
C
250 lines
7.6 KiB
C
|
// 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"
|
|||
|
|
|||
|
/* 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);
|
|||
|
|
|||
|
#endif /* _SENSOR_SERVER_H_ */
|