ble_mesh: add Generic/Sensor/Time and Scenes/Lighting Server models
This commit is contained in:
parent
f1850b54f3
commit
a32c72a1b2
45 changed files with 17977 additions and 562 deletions
|
@ -304,6 +304,7 @@ if(CONFIG_BT_ENABLED)
|
|||
"esp_ble_mesh/btc/include"
|
||||
"esp_ble_mesh/mesh_models/common/include"
|
||||
"esp_ble_mesh/mesh_models/client/include"
|
||||
"esp_ble_mesh/mesh_models/server/include"
|
||||
"esp_ble_mesh/api/core/include"
|
||||
"esp_ble_mesh/api/models/include"
|
||||
"esp_ble_mesh/api")
|
||||
|
@ -359,7 +360,15 @@ if(CONFIG_BT_ENABLED)
|
|||
"esp_ble_mesh/mesh_models/client/generic_client.c"
|
||||
"esp_ble_mesh/mesh_models/client/lighting_client.c"
|
||||
"esp_ble_mesh/mesh_models/client/sensor_client.c"
|
||||
"esp_ble_mesh/mesh_models/client/time_scene_client.c")
|
||||
"esp_ble_mesh/mesh_models/client/time_scene_client.c"
|
||||
"esp_ble_mesh/mesh_models/server/device_property.c"
|
||||
"esp_ble_mesh/mesh_models/server/generic_server.c"
|
||||
"esp_ble_mesh/mesh_models/server/lighting_server.c"
|
||||
"esp_ble_mesh/mesh_models/server/sensor_server.c"
|
||||
"esp_ble_mesh/mesh_models/server/server_common.c"
|
||||
"esp_ble_mesh/mesh_models/server/state_binding.c"
|
||||
"esp_ble_mesh/mesh_models/server/state_transition.c"
|
||||
"esp_ble_mesh/mesh_models/server/time_scene_server.c")
|
||||
endif()
|
||||
|
||||
if(CONFIG_BT_NIMBLE_ENABLED)
|
||||
|
|
|
@ -126,6 +126,10 @@ static const btc_func_t profile_tab[BTC_PID_NUM] = {
|
|||
[BTC_PID_LIGHTING_CLIENT] = {btc_ble_mesh_lighting_client_call_handler, btc_ble_mesh_lighting_client_cb_handler },
|
||||
[BTC_PID_SENSOR_CLIENT] = {btc_ble_mesh_sensor_client_call_handler, btc_ble_mesh_sensor_client_cb_handler },
|
||||
[BTC_PID_TIME_SCENE_CLIENT] = {btc_ble_mesh_time_scene_client_call_handler, btc_ble_mesh_time_scene_client_cb_handler},
|
||||
[BTC_PID_GENERIC_SERVER] = {NULL, btc_ble_mesh_generic_server_cb_handler },
|
||||
[BTC_PID_LIGHTING_SERVER] = {NULL, btc_ble_mesh_lighting_server_cb_handler },
|
||||
[BTC_PID_SENSOR_SERVER] = {NULL, btc_ble_mesh_sensor_server_cb_handler },
|
||||
[BTC_PID_TIME_SCENE_SERVER] = {NULL, btc_ble_mesh_time_scene_server_cb_handler},
|
||||
#endif /* #if CONFIG_BLE_MESH */
|
||||
};
|
||||
|
||||
|
|
|
@ -78,6 +78,10 @@ typedef enum {
|
|||
BTC_PID_LIGHTING_CLIENT,
|
||||
BTC_PID_SENSOR_CLIENT,
|
||||
BTC_PID_TIME_SCENE_CLIENT,
|
||||
BTC_PID_GENERIC_SERVER,
|
||||
BTC_PID_LIGHTING_SERVER,
|
||||
BTC_PID_SENSOR_SERVER,
|
||||
BTC_PID_TIME_SCENE_SERVER,
|
||||
#endif /* CONFIG_BLE_MESH */
|
||||
BTC_PID_NUM,
|
||||
} btc_pid_t; //btc profile id
|
||||
|
|
|
@ -143,6 +143,7 @@ COMPONENT_ADD_INCLUDEDIRS += esp_ble_mesh/mesh_core \
|
|||
esp_ble_mesh/btc/include \
|
||||
esp_ble_mesh/mesh_models/common/include \
|
||||
esp_ble_mesh/mesh_models/client/include \
|
||||
esp_ble_mesh/mesh_models/server/include \
|
||||
esp_ble_mesh/api/core/include \
|
||||
esp_ble_mesh/api/models/include \
|
||||
esp_ble_mesh/api
|
||||
|
@ -152,6 +153,7 @@ COMPONENT_SRCDIRS += esp_ble_mesh/mesh_core \
|
|||
esp_ble_mesh/btc \
|
||||
esp_ble_mesh/mesh_models/common \
|
||||
esp_ble_mesh/mesh_models/client \
|
||||
esp_ble_mesh/mesh_models/server \
|
||||
esp_ble_mesh/api/core \
|
||||
esp_ble_mesh/api/models
|
||||
endif
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
#define ESP_BLE_MESH_TX_SDU_MAX ((CONFIG_BLE_MESH_ADV_BUF_COUNT - 3) * 12)
|
||||
|
||||
static esp_err_t ble_mesh_send_msg(esp_ble_mesh_model_t *model,
|
||||
static esp_err_t ble_mesh_model_send_msg(esp_ble_mesh_model_t *model,
|
||||
esp_ble_mesh_msg_ctx_t *ctx,
|
||||
uint32_t opcode,
|
||||
btc_ble_mesh_model_act_t act,
|
||||
|
@ -165,7 +165,7 @@ esp_err_t esp_ble_mesh_server_model_send_msg(esp_ble_mesh_model_t *model,
|
|||
if (!model || !ctx) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ble_mesh_send_msg(model, ctx, opcode, BTC_BLE_MESH_ACT_SERVER_MODEL_SEND,
|
||||
return ble_mesh_model_send_msg(model, ctx, opcode, BTC_BLE_MESH_ACT_SERVER_MODEL_SEND,
|
||||
length, data, 0, false, ROLE_NODE);
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,7 @@ esp_err_t esp_ble_mesh_client_model_send_msg(esp_ble_mesh_model_t *model,
|
|||
if (!model || !ctx) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ble_mesh_send_msg(model, ctx, opcode, BTC_BLE_MESH_ACT_CLIENT_MODEL_SEND,
|
||||
return ble_mesh_model_send_msg(model, ctx, opcode, BTC_BLE_MESH_ACT_CLIENT_MODEL_SEND,
|
||||
length, data, msg_timeout, need_rsp, device_role);
|
||||
}
|
||||
|
||||
|
@ -188,10 +188,35 @@ esp_err_t esp_ble_mesh_model_publish(esp_ble_mesh_model_t *model, uint32_t opcod
|
|||
if (!model || !model->pub || !model->pub->msg) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ble_mesh_send_msg(model, NULL, opcode, BTC_BLE_MESH_ACT_MODEL_PUBLISH,
|
||||
return ble_mesh_model_send_msg(model, NULL, opcode, BTC_BLE_MESH_ACT_MODEL_PUBLISH,
|
||||
length, data, 0, false, device_role);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_server_model_update_state(esp_ble_mesh_model_t *model,
|
||||
esp_ble_mesh_server_state_type_t type,
|
||||
esp_ble_mesh_server_state_value_t *value)
|
||||
{
|
||||
btc_ble_mesh_model_args_t arg = {0};
|
||||
btc_msg_t msg = {0};
|
||||
|
||||
if (!model || !value || type >= ESP_BLE_MESH_SERVER_MODEL_STATE_MAX) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
|
||||
|
||||
arg.model_update_state.model = model;
|
||||
arg.model_update_state.type = type;
|
||||
arg.model_update_state.value = value;
|
||||
|
||||
msg.sig = BTC_SIG_API_CALL;
|
||||
msg.pid = BTC_PID_MODEL;
|
||||
msg.act = BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE;
|
||||
|
||||
return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_mesh_model_args_t), btc_ble_mesh_model_arg_deep_copy)
|
||||
== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_node_local_reset(void)
|
||||
{
|
||||
btc_msg_t msg = {0};
|
||||
|
|
|
@ -134,6 +134,25 @@ esp_err_t esp_ble_mesh_model_publish(esp_ble_mesh_model_t *model, uint32_t opcod
|
|||
uint16_t length, uint8_t *data,
|
||||
esp_ble_mesh_dev_role_t device_role);
|
||||
|
||||
/**
|
||||
* @brief Update a server model state value. If the model publication
|
||||
* state is set properly (e.g. publish address is set to a valid
|
||||
* address), it will publish corresponding status message.
|
||||
*
|
||||
* @note Currently this API is used to update bound state value, not
|
||||
* for all server model states.
|
||||
*
|
||||
* @param[in] model: Server model which is going to update the state.
|
||||
* @param[in] type: Server model state type.
|
||||
* @param[in] value: Server model state value.
|
||||
*
|
||||
* @return ESP_OK on success or error code otherwise.
|
||||
*
|
||||
*/
|
||||
esp_err_t esp_ble_mesh_server_model_update_state(esp_ble_mesh_model_t *model,
|
||||
esp_ble_mesh_server_state_type_t type,
|
||||
esp_ble_mesh_server_state_value_t *value);
|
||||
|
||||
/**
|
||||
* @brief Reset the provisioning procedure of the local BLE Mesh node.
|
||||
*
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -70,3 +70,10 @@ esp_err_t esp_ble_mesh_generic_client_set_state(esp_ble_mesh_client_common_param
|
|||
return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_mesh_generic_client_args_t), btc_ble_mesh_generic_client_arg_deep_copy)
|
||||
== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_register_generic_server_callback(esp_ble_mesh_generic_server_cb_t callback)
|
||||
{
|
||||
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
|
||||
|
||||
return (btc_profile_cb_set(BTC_PID_GENERIC_SERVER, callback) == 0 ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
|
|
@ -71,3 +71,9 @@ esp_err_t esp_ble_mesh_light_client_set_state(esp_ble_mesh_client_common_param_t
|
|||
== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_register_lighting_server_callback(esp_ble_mesh_lighting_server_cb_t callback)
|
||||
{
|
||||
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
|
||||
|
||||
return (btc_profile_cb_set(BTC_PID_LIGHTING_SERVER, callback) == 0 ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
|
|
@ -71,3 +71,11 @@ esp_err_t esp_ble_mesh_sensor_client_set_state(esp_ble_mesh_client_common_param_
|
|||
== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_register_sensor_server_callback(esp_ble_mesh_sensor_server_cb_t callback)
|
||||
{
|
||||
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
|
||||
|
||||
return (btc_profile_cb_set(BTC_PID_SENSOR_SERVER, callback) == 0 ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -71,3 +71,10 @@ esp_err_t esp_ble_mesh_time_scene_client_set_state(esp_ble_mesh_client_common_pa
|
|||
== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
esp_err_t esp_ble_mesh_register_time_scene_server_callback(esp_ble_mesh_time_scene_server_cb_t callback)
|
||||
{
|
||||
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
|
||||
|
||||
return (btc_profile_cb_set(BTC_PID_TIME_SCENE_SERVER, callback) == 0 ? ESP_OK : ESP_FAIL);
|
||||
}
|
||||
|
||||
|
|
|
@ -523,6 +523,775 @@ esp_err_t esp_ble_mesh_generic_client_get_state(esp_ble_mesh_client_common_param
|
|||
esp_err_t esp_ble_mesh_generic_client_set_state(esp_ble_mesh_client_common_param_t *params,
|
||||
esp_ble_mesh_generic_client_set_state_t *set_state);
|
||||
|
||||
/**
|
||||
* @brief Generic Server Models related context.
|
||||
*/
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_ONOFF_SRV
|
||||
*
|
||||
* @brief Define a new Generic OnOff Server Model.
|
||||
*
|
||||
* @note 1. The Generic OnOff Server Model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_onoff_srv_t.
|
||||
*
|
||||
* @return New Generic OnOff Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_ONOFF_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_ONOFF_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_LEVEL_SRV
|
||||
*
|
||||
* @brief Define a new Generic Level Server Model.
|
||||
*
|
||||
* @note 1. The Generic Level Server Model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_level_srv_t.
|
||||
*
|
||||
* @return New Generic Level Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_LEVEL_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_LEVEL_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_DEF_TRANS_TIME_SRV
|
||||
*
|
||||
* @brief Define a new Generic Default Transition Time Server Model.
|
||||
*
|
||||
* @note 1. The Generic Default Transition Time Server Model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_def_trans_time_srv_t.
|
||||
*
|
||||
* @return New Generic Default Transition Time Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_DEF_TRANS_TIME_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_POWER_ONOFF_SRV
|
||||
*
|
||||
* @brief Define a new Generic Power OnOff Server Model.
|
||||
*
|
||||
* @note 1. The Generic Power OnOff Server model extends the Generic OnOff Server
|
||||
* model. When this model is present on an element, the corresponding
|
||||
* Generic Power OnOff Setup Server model shall also be present.
|
||||
* 2. This model may be used to represent a variety of devices that do not
|
||||
* fit any of the model descriptions that have been defined but support
|
||||
* the generic properties of On/Off.
|
||||
* 3. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_power_onoff_srv_t.
|
||||
*
|
||||
* @return New Generic Power OnOff Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_POWER_ONOFF_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_POWER_ONOFF_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Generic Power OnOff Setup Server Model.
|
||||
*
|
||||
* @note 1. The Generic Power OnOff Setup Server model extends the Generic Power
|
||||
* OnOff Server model and the Generic Default Transition Time Server model.
|
||||
* 2. This model shall support model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_power_onoff_setup_srv_t.
|
||||
*
|
||||
* @return New Generic Power OnOff Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_POWER_ONOFF_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_POWER_LEVEL_SRV
|
||||
*
|
||||
* @brief Define a new Generic Power Level Server Model.
|
||||
*
|
||||
* @note 1. The Generic Power Level Server model extends the Generic Power OnOff
|
||||
* Server model and the Generic Level Server model. When this model is
|
||||
* present on an Element, the corresponding Generic Power Level Setup
|
||||
* Server model shall also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_power_level_srv_t.
|
||||
*
|
||||
* @return New Generic Power Level Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_POWER_LEVEL_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_POWER_LEVEL_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Generic Power Level Setup Server Model.
|
||||
*
|
||||
* @note 1. The Generic Power Level Setup Server model extends the Generic Power
|
||||
* Level Server model and the Generic Power OnOff Setup Server model.
|
||||
* 2. This model shall support model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_power_level_setup_srv_t.
|
||||
*
|
||||
* @return New Generic Power Level Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_POWER_LEVEL_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_BATTERY_SRV
|
||||
*
|
||||
* @brief Define a new Generic Battery Server Model.
|
||||
*
|
||||
* @note 1. The Generic Battery Server Model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
* 3. The model may be used to represent an element that is powered by a battery.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_battery_srv_t.
|
||||
*
|
||||
* @return New Generic Battery Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_BATTERY_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_BATTERY_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_LOCATION_SRV
|
||||
*
|
||||
* @brief Define a new Generic Location Server Model.
|
||||
*
|
||||
* @note 1. The Generic Location Server model is a root model. When this model
|
||||
* is present on an Element, the corresponding Generic Location Setup
|
||||
* Server model shall also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
* 3. The model may be used to represent an element that knows its
|
||||
* location (global or local).
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_location_srv_t.
|
||||
*
|
||||
* @return New Generic Location Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_LOCATION_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_LOCATION_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_LOCATION_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Generic Location Setup Server Model.
|
||||
*
|
||||
* @note 1. The Generic Location Setup Server model extends the Generic Location
|
||||
* Server model.
|
||||
* 2. This model shall support model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_location_setup_srv_t.
|
||||
*
|
||||
* @return New Generic Location Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_LOCATION_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_LOCATION_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_USER_PROP_SRV
|
||||
*
|
||||
* @brief Define a new Generic User Property Server Model.
|
||||
*
|
||||
* @note 1. The Generic User Property Server model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_user_prop_srv_t.
|
||||
*
|
||||
* @return New Generic User Property Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_USER_PROP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_USER_PROP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_ADMIN_PROP_SRV
|
||||
*
|
||||
* @brief Define a new Generic Admin Property Server Model.
|
||||
*
|
||||
* @note 1. The Generic Admin Property Server model extends the Generic User
|
||||
* Property Server model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_admin_prop_srv_t.
|
||||
*
|
||||
* @return New Generic Admin Property Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_ADMIN_PROP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_ADMIN_PROP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_MANUFACTURER_PROP_SRV
|
||||
*
|
||||
* @brief Define a new Generic Manufacturer Property Server Model.
|
||||
*
|
||||
* @note 1. The Generic Manufacturer Property Server model extends the Generic
|
||||
* User Property Server model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_manu_prop_srv_t.
|
||||
*
|
||||
* @return New Generic Manufacturer Property Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_MANUFACTURER_PROP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_MANUFACTURER_PROP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_GEN_CLIENT_PROP_SRV
|
||||
*
|
||||
* @brief Define a new Generic User Property Server Model.
|
||||
*
|
||||
* @note 1. The Generic Client Property Server model is a root model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_gen_client_prop_srv_t.
|
||||
*
|
||||
* @return New Generic Client Property Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_GEN_CLIENT_PROP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_CLIENT_PROP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** Parameters of Generic OnOff state */
|
||||
typedef struct {
|
||||
uint8_t onoff; /*!< The present value of the Generic OnOff state */
|
||||
uint8_t target_onoff; /*!< The target value of the Generic OnOff state */
|
||||
} esp_ble_mesh_gen_onoff_state_t;
|
||||
|
||||
/** User data of Generic OnOff Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic OnOff Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_onoff_state_t state; /*!< Parameters of the Generic OnOff state */
|
||||
esp_ble_mesh_last_msg_info_t last; /*!< Parameters of the last received set message */
|
||||
esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
|
||||
} esp_ble_mesh_gen_onoff_srv_t;
|
||||
|
||||
/** Parameters of Generic Level state */
|
||||
typedef struct {
|
||||
int16_t level; /*!< The present value of the Generic Level state */
|
||||
int16_t target_level; /*!< The target value of the Generic Level state */
|
||||
|
||||
/**
|
||||
* When a new transaction starts, level should be set to last_last, and use
|
||||
* "level + incoming delta" to calculate the target level. In another word,
|
||||
* "last_level" is used to record "level" of the last transaction, and
|
||||
* "last_delta" is used to record the previously received delta_level value.
|
||||
*/
|
||||
int16_t last_level; /*!< The last value of the Generic Level state */
|
||||
int32_t last_delta; /*!< The last delta change of the Generic Level state */
|
||||
|
||||
bool move_start; /*!< Indicate if the transition of the Generic Level state has been started */
|
||||
bool positive; /*!< Indicate if the transition is positive or negative */
|
||||
} esp_ble_mesh_gen_level_state_t;
|
||||
|
||||
/** User data of Generic Level Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Level Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_level_state_t state; /*!< Parameters of the Generic Level state */
|
||||
esp_ble_mesh_last_msg_info_t last; /*!< Parameters of the last received set message */
|
||||
esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
|
||||
int32_t tt_delta_level; /*!< Delta change value of level state transition */
|
||||
} esp_ble_mesh_gen_level_srv_t;
|
||||
|
||||
/** Parameter of Generic Default Transition Time state */
|
||||
typedef struct {
|
||||
uint8_t trans_time; /*!< The value of the Generic Default Transition Time state */
|
||||
} esp_ble_mesh_gen_def_trans_time_state_t;
|
||||
|
||||
/** User data of Generic Default Transition Time Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Default Transition Time Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_def_trans_time_state_t state; /*!< Parameters of the Generic Default Transition Time state */
|
||||
} esp_ble_mesh_gen_def_trans_time_srv_t;
|
||||
|
||||
/** Parameter of Generic OnPowerUp state */
|
||||
typedef struct {
|
||||
uint8_t onpowerup; /*!< The value of the Generic OnPowerUp state */
|
||||
} esp_ble_mesh_gen_onpowerup_state_t;
|
||||
|
||||
/** User data of Generic Power OnOff Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Power OnOff Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_onpowerup_state_t *state; /*!< Parameters of the Generic OnPowerUp state */
|
||||
} esp_ble_mesh_gen_power_onoff_srv_t;
|
||||
|
||||
/** User data of Generic Power OnOff Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Power OnOff Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_onpowerup_state_t *state; /*!< Parameters of the Generic OnPowerUp state */
|
||||
} esp_ble_mesh_gen_power_onoff_setup_srv_t;
|
||||
|
||||
/** Parameters of Generic Power Level state */
|
||||
typedef struct {
|
||||
uint16_t power_actual; /*!< The present value of the Generic Power Actual state */
|
||||
uint16_t target_power_actual; /*!< The target value of the Generic Power Actual state */
|
||||
|
||||
uint16_t power_last; /*!< The value of the Generic Power Last state */
|
||||
uint16_t power_default; /*!< The value of the Generic Power Default state */
|
||||
|
||||
uint8_t status_code; /*!< The status code of setting Generic Power Range state */
|
||||
uint16_t power_range_min; /*!< The minimum value of the Generic Power Range state */
|
||||
uint16_t power_range_max; /*!< The maximum value of the Generic Power Range state */
|
||||
} esp_ble_mesh_gen_power_level_state_t;
|
||||
|
||||
/** User data of Generic Power Level Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Power Level Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_power_level_state_t *state; /*!< Parameters of the Generic Power Level state */
|
||||
esp_ble_mesh_last_msg_info_t last; /*!< Parameters of the last received set message */
|
||||
esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
|
||||
int32_t tt_delta_level; /*!< Delta change value of level state transition */
|
||||
} esp_ble_mesh_gen_power_level_srv_t;
|
||||
|
||||
/** User data of Generic Power Level Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Power Level Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_power_level_state_t *state; /*!< Parameters of the Generic Power Level state */
|
||||
} esp_ble_mesh_gen_power_level_setup_srv_t;
|
||||
|
||||
/** Parameters of Generic Battery state */
|
||||
typedef struct {
|
||||
uint32_t battery_level : 8, /*!< The value of the Generic Battery Level state */
|
||||
time_to_discharge : 24; /*!< The value of the Generic Battery Time to Discharge state */
|
||||
uint32_t time_to_charge : 24, /*!< The value of the Generic Battery Time to Charge state */
|
||||
battery_flags : 8; /*!< The value of the Generic Battery Flags state */
|
||||
} esp_ble_mesh_gen_battery_state_t;
|
||||
|
||||
/** User data of Generic Battery Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Battery Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_battery_state_t state; /*!< Parameters of the Generic Battery state */
|
||||
} esp_ble_mesh_gen_battery_srv_t;
|
||||
|
||||
/** Parameters of Generic Location state */
|
||||
typedef struct {
|
||||
int32_t global_latitude; /*!< The value of the Global Latitude field */
|
||||
int32_t global_longitude; /*!< The value of the Global Longtitude field */
|
||||
int16_t global_altitude; /*!< The value of the Global Altitude field */
|
||||
int16_t local_north; /*!< The value of the Local North field */
|
||||
int16_t local_east; /*!< The value of the Local East field */
|
||||
int16_t local_altitude; /*!< The value of the Local Altitude field */
|
||||
uint8_t floor_number; /*!< The value of the Floor Number field */
|
||||
uint16_t uncertainty; /*!< The value of the Uncertainty field */
|
||||
} esp_ble_mesh_gen_location_state_t;
|
||||
|
||||
/** User data of Generic Location Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Location Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_location_state_t *state; /*!< Parameters of the Generic Location state */
|
||||
} esp_ble_mesh_gen_location_srv_t;
|
||||
|
||||
/** User data of Generic Location Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Location Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_gen_location_state_t *state; /*!< Parameters of the Generic Location state */
|
||||
} esp_ble_mesh_gen_location_setup_srv_t;
|
||||
|
||||
/** This enum value is the access vlue of Generic User Property */
|
||||
typedef enum {
|
||||
ESP_BLE_MESH_GEN_USER_ACCESS_PROHIBIT,
|
||||
ESP_BLE_MESH_GEN_USER_ACCESS_READ,
|
||||
ESP_BLE_MESH_GEN_USER_ACCESS_WRITE,
|
||||
ESP_BLE_MESH_GEN_USER_ACCESS_READ_WRITE,
|
||||
} esp_ble_mesh_gen_user_prop_access_t;
|
||||
|
||||
/** This enum value is the access value of Generic Admin Property */
|
||||
typedef enum {
|
||||
ESP_BLE_MESH_GEN_ADMIN_NOT_USER_PROP,
|
||||
ESP_BLE_MESH_GEN_ADMIN_ACCESS_READ,
|
||||
ESP_BLE_MESH_GEN_ADMIN_ACCESS_WRITE,
|
||||
ESP_BLE_MESH_GEN_ADMIN_ACCESS_READ_WRITE,
|
||||
} esp_ble_mesh_gen_admin_prop_access_t;
|
||||
|
||||
/** This enum value is the access value of Generic Manufacturer Property */
|
||||
typedef enum {
|
||||
ESP_BLE_MESH_GEN_MANU_NOT_USER_PROP,
|
||||
ESP_BLE_MESH_GEN_MANU_ACCESS_READ,
|
||||
} esp_ble_mesh_gen_manu_prop_access_t;
|
||||
|
||||
/** Parameters of Generic Property states */
|
||||
typedef struct {
|
||||
uint16_t id; /*!< The value of User/Admin/Manufacturer Property ID */
|
||||
uint8_t user_access; /*!< The value of User Access field */
|
||||
uint8_t admin_access; /*!< The value of Admin Access field */
|
||||
uint8_t manu_access; /*!< The value of Manufacturer Access field */
|
||||
struct net_buf_simple *val; /*!< The value of User/Admin/Manufacturer Property */
|
||||
} esp_ble_mesh_generic_property_t;
|
||||
|
||||
/** User data of Generic User Property Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic User Property Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
uint8_t property_count; /*!< Generic User Property count */
|
||||
esp_ble_mesh_generic_property_t *properties; /*!< Parameters of the Generic User Property state */
|
||||
} esp_ble_mesh_gen_user_prop_srv_t;
|
||||
|
||||
/** User data of Generic Admin Property Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Admin Property Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
uint8_t property_count; /*!< Generic Admin Property count */
|
||||
esp_ble_mesh_generic_property_t *properties; /*!< Parameters of the Generic Admin Property state */
|
||||
} esp_ble_mesh_gen_admin_prop_srv_t;
|
||||
|
||||
/** User data of Generic Manufacturer Property Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Manufacturer Property Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
uint8_t property_count; /*!< Generic Manufacturer Property count */
|
||||
esp_ble_mesh_generic_property_t *properties; /*!< Parameters of the Generic Manufacturer Property state */
|
||||
} esp_ble_mesh_gen_manu_prop_srv_t;
|
||||
|
||||
/** User data of Generic Client Property Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Generic Client Property Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
uint8_t id_count; /*!< Generic Client Property ID count */
|
||||
uint16_t *property_ids; /*!< Parameters of the Generic Client Property state */
|
||||
} esp_ble_mesh_gen_client_prop_srv_t;
|
||||
|
||||
/** Parameter of Generic OnOff Set state change event */
|
||||
typedef struct {
|
||||
uint8_t onoff; /*!< The value of Generic OnOff state */
|
||||
} esp_ble_mesh_state_change_gen_onoff_set_t;
|
||||
|
||||
/** Parameter of Generic Level Set state change event */
|
||||
typedef struct {
|
||||
int16_t level; /*!< The value of Generic Level state */
|
||||
} esp_ble_mesh_state_change_gen_level_set_t;
|
||||
|
||||
/** Parameter of Generic Delta Set state change event */
|
||||
typedef struct {
|
||||
int16_t level; /*!< The value of Generic Level state */
|
||||
} esp_ble_mesh_state_change_gen_delta_set_t;
|
||||
|
||||
/** Parameter of Generic Move Set state change event */
|
||||
typedef struct {
|
||||
int16_t level; /*!< The value of Generic Level state */
|
||||
} esp_ble_mesh_state_change_gen_move_set_t;
|
||||
|
||||
/** Parameter of Generic Default Transition Time Set state change event */
|
||||
typedef struct {
|
||||
uint8_t trans_time; /*!< The value of Generic Default Transition Time state */
|
||||
} esp_ble_mesh_state_change_gen_def_trans_time_set_t;
|
||||
|
||||
/** Parameter of Generic OnPowerUp Set state change event */
|
||||
typedef struct {
|
||||
uint8_t onpowerup; /*!< The value of Generic OnPowerUp state */
|
||||
} esp_ble_mesh_state_change_gen_onpowerup_set_t;
|
||||
|
||||
/** Parameter of Generic Power Level Set state change event */
|
||||
typedef struct {
|
||||
uint16_t power; /*!< The value of Generic Power Actual state */
|
||||
} esp_ble_mesh_state_change_gen_power_level_set_t;
|
||||
|
||||
/** Parameter of Generic Power Default Set state change event */
|
||||
typedef struct {
|
||||
uint16_t power; /*!< The value of Generic Power Default state */
|
||||
} esp_ble_mesh_state_change_gen_power_default_set_t;
|
||||
|
||||
/** Parameters of Generic Power Range Set state change event */
|
||||
typedef struct {
|
||||
uint16_t range_min; /*!< The minimum value of Generic Power Range state */
|
||||
uint16_t range_max; /*!< The maximum value of Generic Power Range state */
|
||||
} esp_ble_mesh_state_change_gen_power_range_set_t;
|
||||
|
||||
/** Parameters of Generic Location Global Set state change event */
|
||||
typedef struct {
|
||||
int32_t latitude; /*!< The Global Latitude value of Generic Location state */
|
||||
int32_t longitude; /*!< The Global Longitude value of Generic Location state */
|
||||
int16_t altitude; /*!< The Global Altitude value of Generic Location state */
|
||||
} esp_ble_mesh_state_change_gen_loc_global_set_t;
|
||||
|
||||
/** Parameters of Generic Location Local Set state change event */
|
||||
typedef struct {
|
||||
int16_t north; /*!< The Local North value of Generic Location state */
|
||||
int16_t east; /*!< The Local East value of Generic Location state */
|
||||
int16_t altitude; /*!< The Local Altitude value of Generic Location state */
|
||||
uint8_t floor_number; /*!< The Floor Number value of Generic Location state */
|
||||
uint16_t uncertainty; /*!< The Uncertainty value of Generic Location state */
|
||||
} esp_ble_mesh_state_change_gen_loc_local_set_t;
|
||||
|
||||
/** Parameters of Generic User Property Set state change event */
|
||||
typedef struct {
|
||||
uint16_t id; /*!< The property id of Generic User Property state */
|
||||
struct net_buf_simple *value; /*!< The property value of Generic User Property state */
|
||||
} esp_ble_mesh_state_change_gen_user_property_set_t;
|
||||
|
||||
/** Parameters of Generic Admin Property Set state change event */
|
||||
typedef struct {
|
||||
uint16_t id; /*!< The property id of Generic Admin Property state */
|
||||
uint8_t access; /*!< The property access of Generic Admin Property state */
|
||||
struct net_buf_simple *value; /*!< The property value of Generic Admin Property state */
|
||||
} esp_ble_mesh_state_change_gen_admin_property_set_t;
|
||||
|
||||
/** Parameters of Generic Manufacturer Property Set state change event */
|
||||
typedef struct {
|
||||
uint16_t id; /*!< The property id of Generic Manufacturer Property state */
|
||||
uint8_t access; /*!< The property value of Generic Manufacturer Property state */
|
||||
} esp_ble_mesh_state_change_gen_manu_property_set_t;
|
||||
|
||||
/**
|
||||
* @brief Generic Server Model state change value union
|
||||
*/
|
||||
typedef union {
|
||||
/**
|
||||
* The recv_op in ctx can be used to decide which state is changed.
|
||||
*/
|
||||
esp_ble_mesh_state_change_gen_onoff_set_t onoff_set; /*!< Generic OnOff Set */
|
||||
esp_ble_mesh_state_change_gen_level_set_t level_set; /*!< Generic Level Set */
|
||||
esp_ble_mesh_state_change_gen_delta_set_t delta_set; /*!< Generic Delta Set */
|
||||
esp_ble_mesh_state_change_gen_move_set_t move_set; /*!< Generic Move Set */
|
||||
esp_ble_mesh_state_change_gen_def_trans_time_set_t def_trans_time_set; /*!< Generic Default Transition Time Set */
|
||||
esp_ble_mesh_state_change_gen_onpowerup_set_t onpowerup_set; /*!< Generic OnPowerUp Set */
|
||||
esp_ble_mesh_state_change_gen_power_level_set_t power_level_set; /*!< Generic Power Level Set */
|
||||
esp_ble_mesh_state_change_gen_power_default_set_t power_default_set; /*!< Generic Power Default Set */
|
||||
esp_ble_mesh_state_change_gen_power_range_set_t power_range_set; /*!< Generic Power Range Set */
|
||||
esp_ble_mesh_state_change_gen_loc_global_set_t loc_global_set; /*!< Generic Location Global Set */
|
||||
esp_ble_mesh_state_change_gen_loc_local_set_t loc_local_set; /*!< Generic Location Local Set */
|
||||
esp_ble_mesh_state_change_gen_user_property_set_t user_property_set; /*!< Generic User Property Set */
|
||||
esp_ble_mesh_state_change_gen_admin_property_set_t admin_property_set; /*!< Generic Admin Property Set */
|
||||
esp_ble_mesh_state_change_gen_manu_property_set_t manu_property_set; /*!< Generic Manufactuer Property Set */
|
||||
} esp_ble_mesh_generic_server_state_change_t;
|
||||
|
||||
/** Context of the received Generic User Property Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic User Property */
|
||||
} esp_ble_mesh_server_recv_gen_user_property_get_t;
|
||||
|
||||
/** Context of the received Generic Admin Property Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic Admin Property */
|
||||
} esp_ble_mesh_server_recv_gen_admin_property_get_t;
|
||||
|
||||
/** Context of the received Generic Manufacturer Property message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic Manufacturer Property */
|
||||
} esp_ble_mesh_server_recv_gen_manufacturer_property_get_t;
|
||||
|
||||
/** Context of the received Generic Client Properties Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< A starting Client Property ID present within an element */
|
||||
} esp_ble_mesh_server_recv_gen_client_properties_get_t;
|
||||
|
||||
/**
|
||||
* @brief Generic Server Model received get message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_gen_user_property_get_t user_property; /*!< Generic User Property Get */
|
||||
esp_ble_mesh_server_recv_gen_admin_property_get_t admin_property; /*!< Generic Admin Property Get */
|
||||
esp_ble_mesh_server_recv_gen_manufacturer_property_get_t manu_property; /*!< Generic Manufacturer Property Get */
|
||||
esp_ble_mesh_server_recv_gen_client_properties_get_t client_properties; /*!< Generic Client Properties Get */
|
||||
} esp_ble_mesh_generic_server_recv_get_msg_t;
|
||||
|
||||
/** Context of the received Generic OnOff Set message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint8_t onoff; /*!< Target value of Generic OnOff state */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_gen_onoff_set_t;
|
||||
|
||||
/** Context of the received Generic Level Set message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
int16_t level; /*!< Target value of Generic Level state */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_gen_level_set_t;
|
||||
|
||||
/** Context of the received Generic Delta Set message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
int32_t delta_level; /*!< Delta change of Generic Level state */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_gen_delta_set_t;
|
||||
|
||||
/** Context of the received Generic Move Set message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
int16_t delta_level; /*!< Delta Level step to calculate Move speed for Generic Level state */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_gen_move_set_t;
|
||||
|
||||
/** Context of the received Generic Default Transition Time Set message */
|
||||
typedef struct {
|
||||
uint8_t trans_time; /*!< The value of the Generic Default Transition Time state */
|
||||
} esp_ble_mesh_server_recv_gen_def_trans_time_set_t;
|
||||
|
||||
/** Context of the received Generic OnPowerUp Set message */
|
||||
typedef struct {
|
||||
uint8_t onpowerup; /*!< The value of the Generic OnPowerUp state */
|
||||
} esp_ble_mesh_server_recv_gen_onpowerup_set_t;
|
||||
|
||||
/** Context of the received Generic Power Level Set message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint16_t power; /*!< Target value of Generic Power Actual state */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_gen_power_level_set_t;
|
||||
|
||||
/** Context of the received Generic Power Default Set message */
|
||||
typedef struct {
|
||||
uint16_t power; /*!< The value of the Generic Power Default state */
|
||||
} esp_ble_mesh_server_recv_gen_power_default_set_t;
|
||||
|
||||
/** Context of the received Generic Power Range Set message */
|
||||
typedef struct {
|
||||
uint16_t range_min; /*!< Value of Range Min field of Generic Power Range state */
|
||||
uint16_t range_max; /*!< Value of Range Max field of Generic Power Range state */
|
||||
} esp_ble_mesh_server_recv_gen_power_range_set_t;
|
||||
|
||||
/** Context of the received Generic Location Global Set message */
|
||||
typedef struct {
|
||||
int32_t global_latitude; /*!< Global Coordinates (Latitude) */
|
||||
int32_t global_longitude; /*!< Global Coordinates (Longitude) */
|
||||
int16_t global_altitude; /*!< Global Altitude */
|
||||
} esp_ble_mesh_server_recv_gen_loc_global_set_t;
|
||||
|
||||
/** Context of the received Generic Location Local Set message */
|
||||
typedef struct {
|
||||
int16_t local_north; /*!< Local Coordinates (North) */
|
||||
int16_t local_east; /*!< Local Coordinates (East) */
|
||||
int16_t local_altitude; /*!< Local Altitude */
|
||||
uint8_t floor_number; /*!< Floor Number */
|
||||
uint16_t uncertainty; /*!< Uncertainty */
|
||||
} esp_ble_mesh_server_recv_gen_loc_local_set_t;
|
||||
|
||||
/** Context of the received Generic User Property Set message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic User Property */
|
||||
struct net_buf_simple *property_value; /*!< Raw value for the User Property */
|
||||
} esp_ble_mesh_server_recv_gen_user_property_set_t;
|
||||
|
||||
/** Context of the received Generic Admin Property Set message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic Admin Property */
|
||||
uint8_t user_access; /*!< Enumeration indicating user accessn */
|
||||
struct net_buf_simple *property_value; /*!< Raw value for the Admin Property */
|
||||
} esp_ble_mesh_server_recv_gen_admin_property_set_t;
|
||||
|
||||
/** Context of the received Generic Manufacturer Property Set message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a Generic Manufacturer Property */
|
||||
uint8_t user_access; /*!< Enumeration indicating user access */
|
||||
} esp_ble_mesh_server_recv_gen_manufacturer_property_set_t;
|
||||
|
||||
/**
|
||||
* @brief Generic Server Model received set message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_gen_onoff_set_t onoff; /*!< Generic OnOff Set/Generic OnOff Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_level_set_t level; /*!< Generic Level Set/Generic Level Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_delta_set_t delta; /*!< Generic Delta Set/Generic Delta Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_move_set_t move; /*!< Generic Move Set/Generic Move Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_def_trans_time_set_t def_trans_time; /*!< Generic Default Transition Time Set/Generic Default Transition Time Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_onpowerup_set_t onpowerup; /*!< Generic OnPowerUp Set/Generic OnPowerUp Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_power_level_set_t power_level; /*!< Generic Power Level Set/Generic Power Level Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_power_default_set_t power_default; /*!< Generic Power Default Set/Generic Power Default Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_power_range_set_t power_range; /*!< Generic Power Range Set/Generic Power Range Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_loc_global_set_t location_global; /*!< Generic Location Global Set/Generic Location Global Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_loc_local_set_t location_local; /*!< Generic Location Local Set/Generic Location Local Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_user_property_set_t user_property; /*!< Generic User Property Set/Generic User Property Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_admin_property_set_t admin_property; /*!< Generic Admin Property Set/Generic Admin Property Set Unack */
|
||||
esp_ble_mesh_server_recv_gen_manufacturer_property_set_t manu_property; /*!< Generic Manufacturer Property Set/Generic Manufacturer Property Set Unack */
|
||||
} esp_ble_mesh_generic_server_recv_set_msg_t;
|
||||
|
||||
/**
|
||||
* @brief Generic Server Model callback value union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_generic_server_state_change_t state_change; /*!< ESP_BLE_MESH_GENERIC_SERVER_STATE_CHANGE_EVT */
|
||||
esp_ble_mesh_generic_server_recv_get_msg_t get; /*!< ESP_BLE_MESH_GENERIC_SERVER_RECV_GET_MSG_EVT */
|
||||
esp_ble_mesh_generic_server_recv_set_msg_t set; /*!< ESP_BLE_MESH_GENERIC_SERVER_RECV_SET_MSG_EVT */
|
||||
} esp_ble_mesh_generic_server_cb_value_t;
|
||||
|
||||
/** Generic Server Model callback parameters */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to Generic Server Models */
|
||||
esp_ble_mesh_msg_ctx_t ctx; /*!< Context of the received messages */
|
||||
esp_ble_mesh_generic_server_cb_value_t value; /*!< Value of the received Generic Messages */
|
||||
} esp_ble_mesh_generic_server_cb_param_t;
|
||||
|
||||
/** This enum value is the event of Generic Server Model */
|
||||
typedef enum {
|
||||
/**
|
||||
* 1. When get_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, no event will be
|
||||
* callback to the application layer when Generic Get messages are received.
|
||||
* 2. When set_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, this event will
|
||||
* be callback to the application layer when Generic Set/Set Unack messages
|
||||
* are received.
|
||||
*/
|
||||
ESP_BLE_MESH_GENERIC_SERVER_STATE_CHANGE_EVT,
|
||||
/**
|
||||
* When get_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Generic Get messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_GENERIC_SERVER_RECV_GET_MSG_EVT,
|
||||
/**
|
||||
* When set_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Generic Set/Set Unack messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_GENERIC_SERVER_RECV_SET_MSG_EVT,
|
||||
ESP_BLE_MESH_GENERIC_SERVER_EVT_MAX,
|
||||
} esp_ble_mesh_generic_server_cb_event_t;
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Mesh Generic Server Model function.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Generic Server Model callback function type
|
||||
* @param event: Event type
|
||||
* @param param: Pointer to callback parameter
|
||||
*/
|
||||
typedef void (* esp_ble_mesh_generic_server_cb_t)(esp_ble_mesh_generic_server_cb_event_t event,
|
||||
esp_ble_mesh_generic_server_cb_param_t *param);
|
||||
|
||||
/**
|
||||
* @brief Register BLE Mesh Generic Server Model callback.
|
||||
*
|
||||
* @param[in] callback: Pointer to the callback function.
|
||||
*
|
||||
* @return ESP_OK on success or error code otherwise.
|
||||
*
|
||||
*/
|
||||
esp_err_t esp_ble_mesh_register_generic_server_callback(esp_ble_mesh_generic_server_cb_t callback);
|
||||
|
||||
#endif /* _ESP_BLE_MESH_GENERIC_MODEL_API_H_ */
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -255,6 +255,372 @@ esp_err_t esp_ble_mesh_sensor_client_get_state(esp_ble_mesh_client_common_param_
|
|||
esp_err_t esp_ble_mesh_sensor_client_set_state(esp_ble_mesh_client_common_param_t *params,
|
||||
esp_ble_mesh_sensor_client_set_state_t *set_state);
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Models related context.
|
||||
*/
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SENSOR_SRV
|
||||
*
|
||||
* @brief Define a new Sensor Server Model.
|
||||
*
|
||||
* @note 1. The Sensor Server model is a root model. When this model is present
|
||||
* on an element, the corresponding Sensor Setup Server model shall
|
||||
* also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_sensor_srv_t.
|
||||
*
|
||||
* @return New Sensor Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SENSOR_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SENSOR_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SENSOR_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Sensor Setup Server Model.
|
||||
*
|
||||
* @note 1. The Sensor Setup Server model extends the Sensor Server model.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_sensor_setup_srv_t.
|
||||
*
|
||||
* @return New Sensor Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SENSOR_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SENSOR_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
#define ESP_BLE_MESH_INVALID_SENSOR_PROPERTY_ID 0x0000 /*!< Invalid Sensor Property ID */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_PROPERTY_ID_LEN 0x02 /*!< Length of Sensor Property ID */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_DESCRIPTOR_LEN 0x08 /*!< Length of Sensor Descriptor state */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_UNSPECIFIED_POS_TOLERANCE 0x000 /*!< Unspecified Sensor Positive Tolerance */
|
||||
#define ESP_BLE_MESH_SENSOR_UNSPECIFIED_NEG_TOLERANCE 0x000 /*!< Unspecified Sensor Negative Tolerance */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_NOT_APPL_MEASURE_PERIOD 0x00 /*!< Not applicable Sensor Measurement Period */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_NOT_APPL_UPDATE_INTERVAL 0x00 /*!< Not applicable Sensor Update Interval */
|
||||
|
||||
#define ESP_BLE_MESH_INVALID_SENSOR_SETTING_PROPERTY_ID 0x0000 /*!< Invalid Sensor Setting Property ID */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_SETTING_PROPERTY_ID_LEN 0x02 /*!< Length of Sensor Setting Property ID */
|
||||
#define ESP_BLE_MESH_SENSOR_SETTING_ACCESS_LEN 0x01 /*!< Length of Sensor Setting Access */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_SETTING_ACCESS_READ 0x01 /*!< Sensor Setting Access - Read */
|
||||
#define ESP_BLE_MESH_SENSOR_SETTING_ACCESS_READ_WRITE 0x03 /*!< Sensor Setting Access - Read & Write */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_DIVISOR_TRIGGER_TYPE_LEN 0x01 /*!< Length of Sensor Divisor Trigger Type */
|
||||
#define ESP_BLE_MESH_SENSOR_STATUS_MIN_INTERVAL_LEN 0x01 /*!< Length of Sensor Status Min Interval */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_PERIOD_DIVISOR_MAX_VALUE 15 /*!< Maximum value of Sensor Period Divisor */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_STATUS_MIN_INTERVAL_MAX 26 /*!< Maximum value of Sensor Status Min Interval */
|
||||
|
||||
/**
|
||||
* Sensor Status Trigger Type - Format Type of the characteristic
|
||||
* that the Sensor Property ID state references
|
||||
*/
|
||||
#define ESP_BLE_MESH_SENSOR_STATUS_TRIGGER_TYPE_CHAR 0
|
||||
/** Sensor Status Trigger Type - Format Type "uint16" */
|
||||
#define ESP_BLE_MESH_SENSOR_STATUS_TRIGGER_TYPE_UINT16 1
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_DATA_FORMAT_A 0x00 /*!< Sensor Data Format A */
|
||||
#define ESP_BLE_MESH_SENSOR_DATA_FORMAT_B 0x01 /*!< Sensor Data Format B */
|
||||
|
||||
#define ESP_BLE_MESH_SENSOR_DATA_FORMAT_A_MPID_LEN 0x02 /*!< MPID length of Sensor Data Format A */
|
||||
#define ESP_BLE_MESH_SENSOR_DATA_FORMAT_B_MPID_LEN 0x03 /*!< MPID length of Sensor Data Format B */
|
||||
|
||||
/**
|
||||
* Zero length of Sensor Data.
|
||||
*
|
||||
* Note:
|
||||
* 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.
|
||||
*/
|
||||
#define ESP_BLE_MESH_SENSOR_DATA_ZERO_LEN 0x7F
|
||||
|
||||
/** This enum value is value of Sensor Sampling Function */
|
||||
enum esp_ble_mesh_sensor_sample_func {
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_UNSPECIFIED,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_INSTANTANEOUS,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_ARITHMETIC_MEAN,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_RMS,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_MAXIMUM,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_MINIMUM,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_ACCUMULATED,
|
||||
ESP_BLE_MESH_SAMPLE_FUNC_COUNT,
|
||||
};
|
||||
|
||||
/** Parameters of Sensor Descriptor state */
|
||||
typedef struct {
|
||||
uint32_t positive_tolerance : 12, /*!< The value of Sensor Positive Tolerance field */
|
||||
negative_tolerance : 12, /*!< The value of Sensor Negative Tolerance field */
|
||||
sampling_function : 8; /*!< The value of Sensor Sampling Function field */
|
||||
uint8_t measure_period; /*!< The value of Sensor Measurement Period field */
|
||||
uint8_t update_interval; /*!< The value of Sensor Update Interval field */
|
||||
} esp_ble_mesh_sensor_descriptor_t;
|
||||
|
||||
/** Parameters of Sensor Setting state */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< The value of Sensor Setting Property ID field */
|
||||
uint8_t access; /*!< The value of Sensor Setting Access field */
|
||||
struct net_buf_simple *raw; /*!< The value of Sensor Setting Raw field */
|
||||
} esp_ble_mesh_sensor_setting_t;
|
||||
|
||||
/** Parameters of Sensor Cadence state */
|
||||
typedef struct {
|
||||
uint8_t period_divisor : 7, /*!< The value of Fast Cadence Period Divisor field */
|
||||
trigger_type : 1; /*!< The value of Status Trigger Type field */
|
||||
/**
|
||||
* Note:
|
||||
* The parameter "size" in trigger_delta_down, trigger_delta_up, fast_cadence_low &
|
||||
* fast_cadence_high indicates the exact length of these four parameters, and they
|
||||
* are associated with the Sensor Property ID. Users need to initialize the "size"
|
||||
* precisely.
|
||||
*/
|
||||
struct net_buf_simple *trigger_delta_down; /*!< The value of Status Trigger Delta Down field */
|
||||
struct net_buf_simple *trigger_delta_up; /*!< The value of Status Trigger Delta Up field */
|
||||
uint8_t min_interval; /*!< The value of Status Min Interval field */
|
||||
struct net_buf_simple *fast_cadence_low; /*!< The value of Fast Cadence Low field */
|
||||
struct net_buf_simple *fast_cadence_high; /*!< The value of Fast Cadence High field */
|
||||
} esp_ble_mesh_sensor_cadence_t;
|
||||
|
||||
/** Parameters of Sensor Data state */
|
||||
typedef struct {
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
uint8_t format : 1, /*!< The value of the Sensor Data format */
|
||||
length : 7; /*!< The value of the Sensor Data length */
|
||||
struct net_buf_simple *raw_value; /*!< The value of Sensor Data raw value */
|
||||
} esp_ble_mesh_sensor_data_t;
|
||||
|
||||
/** Parameters of Sensor Series Column state */
|
||||
typedef struct {
|
||||
struct net_buf_simple *raw_value_x; /*!< The value of Sensor Raw Value X field */
|
||||
struct net_buf_simple *column_width; /*!< The value of Sensor Column Width field */
|
||||
struct net_buf_simple *raw_value_y; /*!< The value of Sensor Raw Value Y field */
|
||||
} esp_ble_mesh_sensor_series_column_t;
|
||||
|
||||
/** Parameters of Sensor states */
|
||||
typedef struct {
|
||||
uint16_t sensor_property_id; /*!< The value of Sensor Property ID field */
|
||||
|
||||
/* Constant throughout the lifetime of an element */
|
||||
esp_ble_mesh_sensor_descriptor_t descriptor; /*!< Parameters of the Sensor Descriptor state */
|
||||
|
||||
/**
|
||||
* 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 uint8_t setting_count; /*!< */
|
||||
esp_ble_mesh_sensor_setting_t *settings; /*!< Parameters of the Sensor Setting state */
|
||||
|
||||
/**
|
||||
* The Sensor Cadence state may be not supported by sensors based
|
||||
* on device properties referencing "non-scalar characteristics"
|
||||
* such as "histograms" or "composite characteristics".
|
||||
*/
|
||||
esp_ble_mesh_sensor_cadence_t *cadence; /*!< Parameters of the Sensor Cadence state */
|
||||
|
||||
esp_ble_mesh_sensor_data_t sensor_data; /*!< Parameters of the Sensor Data state */
|
||||
|
||||
esp_ble_mesh_sensor_series_column_t series_column; /*!< Parameters of the Sensor Series Column state */
|
||||
} esp_ble_mesh_sensor_state_t;
|
||||
|
||||
/** User data of Sensor Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Sensor Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
const uint8_t state_count; /*!< Sensor state count */
|
||||
esp_ble_mesh_sensor_state_t *states; /*!< Parameters of the Sensor states */
|
||||
} esp_ble_mesh_sensor_srv_t;
|
||||
|
||||
/** User data of Sensor Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Sensor Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
const uint8_t state_count; /*!< Sensor state count */
|
||||
esp_ble_mesh_sensor_state_t *states; /*!< Parameters of the Sensor states */
|
||||
} esp_ble_mesh_sensor_setup_srv_t;
|
||||
|
||||
/** Parameters of Sensor Cadence Set state change event */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< The value of Sensor Property ID state */
|
||||
uint8_t period_divisor : 7, /*!< The value of Fast Cadence Period Divisor state */
|
||||
trigger_type : 1; /*!< The value of Status Trigger Type state */
|
||||
struct net_buf_simple *trigger_delta_down; /*!< The value of Status Trigger Delta Down state */
|
||||
struct net_buf_simple *trigger_delta_up; /*!< The value of Status Trigger Delta Up state */
|
||||
uint8_t min_interval; /*!< The value of Status Min Interval state */
|
||||
struct net_buf_simple *fast_cadence_low; /*!< The value of Fast Cadence Low state */
|
||||
struct net_buf_simple *fast_cadence_high; /*!< The value of Fast Cadence High state */
|
||||
} esp_ble_mesh_state_change_sensor_cadence_set_t;
|
||||
|
||||
/** Parameters of Sensor Setting Set state change event */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< The value of Sensor Property ID state */
|
||||
uint16_t setting_property_id; /*!< The value of Sensor Setting Property ID state */
|
||||
struct net_buf_simple *setting_value; /*!< The value of Sensor Property Value state */
|
||||
} esp_ble_mesh_state_change_sensor_setting_set_t;
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Model state change value union
|
||||
*/
|
||||
typedef union {
|
||||
/**
|
||||
* The recv_op in ctx can be used to decide which state is changed.
|
||||
*/
|
||||
esp_ble_mesh_state_change_sensor_cadence_set_t sensor_cadence_set; /*!< Sensor Cadence Set */
|
||||
esp_ble_mesh_state_change_sensor_setting_set_t sensor_setting_set; /*!< Sensor Setting Set */
|
||||
} esp_ble_mesh_sensor_server_state_change_t;
|
||||
|
||||
/** Context of the received Sensor Descriptor Get message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint16_t property_id; /*!< Property ID of a sensor (optional) */
|
||||
} esp_ble_mesh_server_recv_sensor_descriptor_get_t;
|
||||
|
||||
/** Context of the received Sensor Cadence Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID of a sensor */
|
||||
} esp_ble_mesh_server_recv_sensor_cadence_get_t;
|
||||
|
||||
/** Context of the received Sensor Settings Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID of a sensor */
|
||||
} esp_ble_mesh_server_recv_sensor_settings_get_t;
|
||||
|
||||
/** Context of the received Sensor Setting Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID of a sensor */
|
||||
uint16_t setting_property_id; /*!< Setting ID identifying a setting within a sensor */
|
||||
} esp_ble_mesh_server_recv_sensor_setting_get_t;
|
||||
|
||||
/** Context of the received Sensor Get message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint16_t property_id; /*!< Property ID for the sensor (optional) */
|
||||
} esp_ble_mesh_server_recv_sensor_get_t;
|
||||
|
||||
/** Context of the received Sensor Column Get message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property identifying a sensor */
|
||||
struct net_buf_simple *raw_value_x; /*!< Raw value identifying a column */
|
||||
} esp_ble_mesh_server_recv_sensor_column_get_t;
|
||||
|
||||
/** Context of the received Sensor Series Get message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint16_t property_id; /*!< Property identifying a sensor */
|
||||
struct net_buf_simple *raw_value; /*!< Raw value containg X1 and X2 (optional) */
|
||||
} esp_ble_mesh_server_recv_sensor_series_get_t;
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Model received get message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_sensor_descriptor_get_t sensor_descriptor; /*!< Sensor Descriptor Get */
|
||||
esp_ble_mesh_server_recv_sensor_cadence_get_t sensor_cadence; /*!< Sensor Cadence Get */
|
||||
esp_ble_mesh_server_recv_sensor_settings_get_t sensor_settings; /*!< Sensor Settings Get */
|
||||
esp_ble_mesh_server_recv_sensor_setting_get_t sensor_setting; /*!< Sensor Setting Get */
|
||||
esp_ble_mesh_server_recv_sensor_get_t sensor_data; /*!< Sensor Get */
|
||||
esp_ble_mesh_server_recv_sensor_column_get_t sensor_column; /*!< Sensor Column Get */
|
||||
esp_ble_mesh_server_recv_sensor_series_get_t sensor_series; /*!< Sensor Series Get */
|
||||
} esp_ble_mesh_sensor_server_recv_get_msg_t;
|
||||
|
||||
/** Context of the received Sensor Cadence Set message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID for the sensor */
|
||||
struct net_buf_simple *cadence; /*!< Value of Sensor Cadence state */
|
||||
} esp_ble_mesh_server_recv_sensor_cadence_set_t;
|
||||
|
||||
/** Context of the received Sensor Setting Set message */
|
||||
typedef struct {
|
||||
uint16_t property_id; /*!< Property ID identifying a sensor */
|
||||
uint16_t setting_property_id; /*!< Setting ID identifying a setting within a sensor */
|
||||
struct net_buf_simple *setting_raw; /*!< Raw value for the setting */
|
||||
} esp_ble_mesh_server_recv_sensor_setting_set_t;
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Model received set message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_sensor_cadence_set_t sensor_cadence; /*!< Sensor Cadence Set */
|
||||
esp_ble_mesh_server_recv_sensor_setting_set_t sensor_setting; /*!< Sensor Setting Set */
|
||||
} esp_ble_mesh_sensor_server_recv_set_msg_t;
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Model callback value union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_sensor_server_state_change_t state_change; /*!< ESP_BLE_MESH_SENSOR_SERVER_STATE_CHANGE_EVT */
|
||||
esp_ble_mesh_sensor_server_recv_get_msg_t get; /*!< ESP_BLE_MESH_SENSOR_SERVER_RECV_GET_MSG_EVT */
|
||||
esp_ble_mesh_sensor_server_recv_set_msg_t set; /*!< ESP_BLE_MESH_SENSOR_SERVER_RECV_SET_MSG_EVT */
|
||||
} esp_ble_mesh_sensor_server_cb_value_t;
|
||||
|
||||
/** Sensor Server Model callback parameters */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to Sensor Server Models */
|
||||
esp_ble_mesh_msg_ctx_t ctx; /*!< Context of the received messages */
|
||||
esp_ble_mesh_sensor_server_cb_value_t value; /*!< Value of the received Sensor Messages */
|
||||
} esp_ble_mesh_sensor_server_cb_param_t;
|
||||
|
||||
/** This enum value is the event of Sensor Server Model */
|
||||
typedef enum {
|
||||
/**
|
||||
* 1. When get_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, no event will be
|
||||
* callback to the application layer when Sensor Get messages are received.
|
||||
* 2. When set_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, this event will
|
||||
* be callback to the application layer when Sensor Set/Set Unack messages
|
||||
* are received.
|
||||
*/
|
||||
ESP_BLE_MESH_SENSOR_SERVER_STATE_CHANGE_EVT,
|
||||
/**
|
||||
* When get_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Sensor Get messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_SENSOR_SERVER_RECV_GET_MSG_EVT,
|
||||
/**
|
||||
* When set_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Sensor Set/Set Unack messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_SENSOR_SERVER_RECV_SET_MSG_EVT,
|
||||
ESP_BLE_MESH_SENSOR_SERVER_EVT_MAX,
|
||||
} esp_ble_mesh_sensor_server_cb_event_t;
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Mesh Sensor Server Model function.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Sensor Server Model callback function type
|
||||
* @param event: Event type
|
||||
* @param param: Pointer to callback parameter
|
||||
*/
|
||||
typedef void (* esp_ble_mesh_sensor_server_cb_t)(esp_ble_mesh_sensor_server_cb_event_t event,
|
||||
esp_ble_mesh_sensor_server_cb_param_t *param);
|
||||
|
||||
/**
|
||||
* @brief Register BLE Mesh Sensor Server Model callback.
|
||||
*
|
||||
* @param[in] callback: Pointer to the callback function.
|
||||
*
|
||||
* @return ESP_OK on success or error code otherwise.
|
||||
*
|
||||
*/
|
||||
esp_err_t esp_ble_mesh_register_sensor_server_callback(esp_ble_mesh_sensor_server_cb_t callback);
|
||||
|
||||
#endif /* _ESP_BLE_MESH_SENSOR_MODEL_API_H_ */
|
||||
|
||||
|
||||
|
|
|
@ -314,5 +314,599 @@ esp_err_t esp_ble_mesh_time_scene_client_get_state(esp_ble_mesh_client_common_pa
|
|||
esp_err_t esp_ble_mesh_time_scene_client_set_state(esp_ble_mesh_client_common_param_t *params,
|
||||
esp_ble_mesh_time_scene_client_set_state_t *set_state);
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Models related context.
|
||||
*/
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_TIME_SRV
|
||||
*
|
||||
* @brief Define a new Time Server Model.
|
||||
*
|
||||
* @note 1. The Time Server model is a root model. When this model is present on an
|
||||
* Element, the corresponding Time Setup Server model shall also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_time_srv_t.
|
||||
*
|
||||
* @return New Time Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_TIME_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_TIME_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_TIME_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Time Setup Server Model.
|
||||
*
|
||||
* @note 1. The Time Setup Server model extends the Time Server model. Time is
|
||||
* sensitive information that is propagated across a mesh network.
|
||||
* 2. Only an authorized Time Client should be allowed to change the Time
|
||||
* and Time Role states. A dedicated application key Bluetooth SIG
|
||||
* Proprietary should be used on the Time Setup Server to restrict
|
||||
* access to the server to only authorized Time Clients.
|
||||
* 3. This model does not support subscribing nor publishing.
|
||||
*
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_time_setup_srv_t.
|
||||
*
|
||||
* @return New Time Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_TIME_SETUP_SRV(srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_TIME_SETUP_SRV, \
|
||||
NULL, NULL, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SCENE_SRV
|
||||
*
|
||||
* @brief Define a new Scene Server Model.
|
||||
*
|
||||
* @note 1. The Scene Server model is a root model. When this model is present
|
||||
* on an Element, the corresponding Scene Setup Server model shall
|
||||
* also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
* 3. The model may be present only on the Primary element of a node.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_scene_srv_t.
|
||||
*
|
||||
* @return New Scene Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SCENE_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SCENE_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SCENE_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Scene Setup Server Model.
|
||||
*
|
||||
* @note 1. The Scene Setup Server model extends the Scene Server model and
|
||||
* the Generic Default Transition Time Server model.
|
||||
* 2. This model shall support model subscription.
|
||||
* 3. The model may be present only on the Primary element of a node.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_scene_setup_srv_t.
|
||||
*
|
||||
* @return New Scene Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SCENE_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SCENE_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SCHEDULER_SRV
|
||||
*
|
||||
* @brief Define a new Scheduler Server Model.
|
||||
*
|
||||
* @note 1. The Scheduler Server model extends the Scene Server model. When
|
||||
* this model is present on an Element, the corresponding Scheduler
|
||||
* Setup Server model shall also be present.
|
||||
* 2. This model shall support model publication and model subscription.
|
||||
* 3. The model may be present only on the Primary element of a node.
|
||||
* 4. The model requires the Time Server model shall be present on the element.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_scheduler_srv_t.
|
||||
*
|
||||
* @return New Scheduler Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SCHEDULER_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SCHEDULER_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
/** @def ESP_BLE_MESH_MODEL_SCHEDULER_SETUP_SRV
|
||||
*
|
||||
* @brief Define a new Scheduler Setup Server Model.
|
||||
*
|
||||
* @note 1. The Scheduler Setup Server model extends the Scheduler Server and
|
||||
* the Scene Setup Server models.
|
||||
* 2. This model shall support model subscription.
|
||||
* 3. The model may be present only on the Primary element of a node.
|
||||
*
|
||||
* @param srv_pub Pointer to the unique struct esp_ble_mesh_model_pub_t.
|
||||
* @param srv_data Pointer to the unique struct esp_ble_mesh_scheduler_setup_srv_t.
|
||||
*
|
||||
* @return New Scheduler Setup Server Model instance.
|
||||
*/
|
||||
#define ESP_BLE_MESH_MODEL_SCHEDULER_SETUP_SRV(srv_pub, srv_data) \
|
||||
ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_SCHEDULER_SETUP_SRV, \
|
||||
NULL, srv_pub, srv_data)
|
||||
|
||||
#define ESP_BLE_MESH_UNKNOWN_TAI_SECONDS 0x0000000000 /*!< Unknown TAI Seconds */
|
||||
#define ESP_BLE_MESH_UNKNOWN_TAI_ZONE_CHANGE 0x0000000000 /*!< Unknown TAI of Zone Change */
|
||||
#define ESP_BLE_MESH_UNKNOWN_TAI_DELTA_CHANGE 0x0000000000 /*!< Unknown TAI of Delta Change */
|
||||
|
||||
#define ESP_BLE_MESH_TAI_UTC_DELAT_MAX_VALUE 0x7FFF /*!< Maximum TAI-UTC Delta value */
|
||||
|
||||
#define ESP_BLE_MESH_TAI_SECONDS_LEN 0x05 /*!< Length of TAI Seconds */
|
||||
#define ESP_BLE_MESH_TAI_OF_ZONE_CHANGE_LEN 0x05 /*!< Length of TAI of Zone Change */
|
||||
#define ESP_BLE_MESH_TAI_OF_DELAT_CHANGE_LEN 0x05 /*!< Length of TAI of Delta Change */
|
||||
|
||||
#define ESP_BLE_MESH_INVALID_SCENE_NUMBER 0x0000 /*!< Invalid Scene Number */
|
||||
#define ESP_BLE_MESH_SCENE_NUMBER_LEN 0x02 /*!< Length of the Scene Number */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_YEAR_ANY_YEAR 0x64 /*!< Any year of the Scheduled year */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_DAY_ANY_DAY 0x00 /*!< Any day of the Scheduled day */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_HOUR_ANY_HOUR 0x18 /*!< Any hour of the Scheduled hour */
|
||||
#define ESP_BLE_MESH_SCHEDULE_HOUR_ONCE_A_DAY 0x19 /*!< Any hour of the Scheduled Day */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_ANY_OF_HOUR 0x3C /*!< Any minute of the Scheduled hour */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_EVERY_15_MIN 0x3D /*!< Every 15 minutes of the Scheduled hour */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_EVERY_20_MIN 0x3E /*!< Every 20 minutes of the Scheduled hour */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_ONCE_AN_HOUR 0x3F /*!< Once of the Scheduled hour */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_ANY_OF_MIN 0x3C /*!< Any second of the Scheduled minute */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_EVERY_15_SEC 0x3D /*!< Every 15 seconds of the Scheduled minute */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_EVERY_20_SEC 0x3E /*!< Every 20 seconds of the Scheduled minute */
|
||||
#define ESP_BLE_MESH_SCHEDULE_SEC_ONCE_AN_MIN 0x3F /*!< Once of the Scheduled minute */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_ACT_TURN_OFF 0x00 /*!< Scheduled Action - Turn Off */
|
||||
#define ESP_BLE_MESH_SCHEDULE_ACT_TURN_ON 0x01 /*!< Scheduled Action - Turn On */
|
||||
#define ESP_BLE_MESH_SCHEDULE_ACT_SCENE_RECALL 0x02 /*!< Scheduled Action - Scene Recall */
|
||||
#define ESP_BLE_MESH_SCHEDULE_ACT_NO_ACTION 0x0F /*!< Scheduled Action - No Action */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_SCENE_NO_SCENE 0x0000 /*!< Scheduled Scene - No Scene */
|
||||
|
||||
#define ESP_BLE_MESH_SCHEDULE_ENTRY_MAX_INDEX 0x0F /*!< Maximum number of Scheduled entries */
|
||||
|
||||
#define ESP_BLE_MESH_TIME_NONE 0x00 /*!< Time Role - None */
|
||||
#define ESP_BLE_MESH_TIME_AUTHORITY 0x01 /*!< Time Role - Mesh Time Authority */
|
||||
#define ESP_BLE_MESH_TIME_RELAY 0x02 /*!< Time Role - Mesh Time Relay */
|
||||
#define ESP_BLE_MESH_TIME_CLINET 0x03 /*!< Time Role - Mesh Time Client */
|
||||
|
||||
#define ESP_BLE_MESH_SCENE_SUCCESS 0x00 /*!< Scene operation - Success */
|
||||
#define ESP_BLE_MESH_SCENE_REG_FULL 0x01 /*!< Scene operation - Scene Register Full */
|
||||
#define ESP_BLE_MESH_SCENE_NOT_FOUND 0x02 /*!< Scene operation - Scene Not Found */
|
||||
|
||||
/** Parameters of Time state */
|
||||
typedef struct {
|
||||
struct {
|
||||
uint8_t tai_seconds[5]; /*!< The value of the TAI Seconds state */
|
||||
uint8_t subsecond; /*!< The value of the Subsecond field */
|
||||
uint8_t uncertainty; /*!< The value of the Uncertainty field */
|
||||
uint8_t time_zone_offset_curr; /*!< The value of the Time Zone Offset Current field */
|
||||
uint8_t time_zone_offset_new; /*!< The value of the Time Zone Offset New state */
|
||||
uint8_t tai_zone_change[5]; /*!< The value of the TAI of Zone Chaneg field */
|
||||
uint16_t time_authority : 1, /*!< The value of the Time Authority bit */
|
||||
tai_utc_delta_curr : 15; /*!< The value of the TAI-UTC Delta Current state */
|
||||
uint16_t tai_utc_delta_new : 15; /*!< The value of the TAI-UTC Delta New state */
|
||||
uint8_t tai_delta_change[5]; /*!< The value of the TAI of Delta Change field */
|
||||
} time; /*!< Parameters of the Time state */
|
||||
uint8_t time_role; /*!< The value of the Time Role state */
|
||||
} esp_ble_mesh_time_state_t;
|
||||
|
||||
/** User data of Time Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Time Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_time_state_t *state; /*!< Parameters of the Time state */
|
||||
} esp_ble_mesh_time_srv_t;
|
||||
|
||||
/** User data of Time Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Time Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_time_state_t *state; /*!< Parameters of the Time state */
|
||||
} esp_ble_mesh_time_setup_srv_t;
|
||||
|
||||
/**
|
||||
* 1. Scene Store is an operation of storing values of a present state of an element.
|
||||
* 2. The structure and meaning of the stored state is determined by a model. States
|
||||
* to be stored are specified by each model.
|
||||
* 3. The Scene Store operation shall persistently store all values of all states
|
||||
* marked as Stored with Scene for all models present on all elements of a node.
|
||||
* 4. If a model is extending another model, the extending model shall determine the
|
||||
* Stored with Scene behavior of that model.
|
||||
*/
|
||||
|
||||
/** Parameters of Scene Register state */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The value of the Scene Number */
|
||||
uint8_t scene_type; /*!< The value of the Scene Type */
|
||||
/**
|
||||
* Scene value may use a union to represent later, the union contains
|
||||
* structures of all the model states which can be stored in a scene.
|
||||
*/
|
||||
struct net_buf_simple *scene_value; /*!< The value of the Scene Value */
|
||||
} esp_ble_mesh_scene_register_t;
|
||||
|
||||
/**
|
||||
* Parameters of Scenes state.
|
||||
*
|
||||
* Scenes serve as memory banks for storage of states (e.g., a power level
|
||||
* or a light level/color). Values of states of an element can be stored
|
||||
* as a scene and can be recalled later from the scene memory.
|
||||
*
|
||||
* A scene is represented by a Scene Number, which is a 16-bit non-zero,
|
||||
* mesh-wide value. (There can be a maximum of 65535 scenes in a mesh
|
||||
* network.) The meaning of a scene, as well as the state storage container
|
||||
* associated with it, are determined by a model.
|
||||
*
|
||||
* The Scenes state change may start numerous parallel model transitions.
|
||||
* In that case, each individual model handles the transition internally.
|
||||
*
|
||||
* The scene transition is defined as a group of individual model transitions
|
||||
* started by a Scene Recall operation. The scene transition is in progress
|
||||
* when at least one transition from the group of individual model transitions
|
||||
* is in progress.
|
||||
*/
|
||||
typedef struct {
|
||||
const uint16_t scene_count; /*!< The Scenes state's scene count */
|
||||
esp_ble_mesh_scene_register_t *scenes; /*!< Parameters of the Scenes state */
|
||||
|
||||
/**
|
||||
* The Current Scene state is a 16-bit value that contains either the Scene
|
||||
* Number of the currently active scene or a value of 0x0000 when no scene
|
||||
* is active.
|
||||
*
|
||||
* When a Scene Store operation or a Scene Recall operation completes with
|
||||
* success, the Current Scene state value shall be to the Scene Number used
|
||||
* during that operation.
|
||||
*
|
||||
* When the Current Scene Number is deleted from a Scene Register state as a
|
||||
* result of Scene Delete operation, the Current Scene state shall be set to
|
||||
* 0x0000.
|
||||
*
|
||||
* When any of the element's state that is marked as “Stored with Scene” has
|
||||
* changed not as a result of a Scene Recall operation, the value of the
|
||||
* Current Scene state shall be set to 0x0000.
|
||||
*
|
||||
* When a scene transition is in progress, the value of the Current Scene
|
||||
* state shall be set to 0x0000.
|
||||
*/
|
||||
uint16_t current_scene; /*!< The value of the Current Scene state */
|
||||
|
||||
/**
|
||||
* The Target Scene state is a 16-bit value that contains the target Scene
|
||||
* Number when a scene transition is in progress.
|
||||
*
|
||||
* When the scene transition is in progress and the target Scene Number is
|
||||
* deleted from a Scene Register state as a result of Scene Delete operation,
|
||||
* the Target Scene state shall be set to 0x0000.
|
||||
*
|
||||
* When the scene transition is in progress and a new Scene Number is stored
|
||||
* in the Scene Register as a result of Scene Store operation, the Target
|
||||
* Scene state shall be set to the new Scene Number.
|
||||
*
|
||||
* When the scene transition is not in progress, the value of the Target Scene
|
||||
* state shall be set to 0x0000.
|
||||
*/
|
||||
uint16_t target_scene; /*!< The value of the Target Scene state */
|
||||
|
||||
/* Indicate the status code for the last operation */
|
||||
uint8_t status_code; /*!< The status code of the last scene operation */
|
||||
|
||||
/* Indicate if scene transition is in progress */
|
||||
bool in_progress; /*!< Indicate if the scene transition is in progress */
|
||||
} esp_ble_mesh_scenes_state_t;
|
||||
|
||||
/** User data of Scene Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Scene Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_scenes_state_t *state; /*!< Parameters of the Scenes state */
|
||||
esp_ble_mesh_last_msg_info_t last; /*!< Parameters of the last received set message */
|
||||
esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
|
||||
} esp_ble_mesh_scene_srv_t;
|
||||
|
||||
/** User data of Scene Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Scene Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_scenes_state_t *state; /*!< Parameters of the Scenes state */
|
||||
} esp_ble_mesh_scene_setup_srv_t;
|
||||
|
||||
/** Parameters of Scheduler Register state */
|
||||
typedef struct {
|
||||
bool in_use; /*!< Indicate if the registered schedule is in use */
|
||||
uint64_t year : 7, /*!< The value of Scheduled year for the action */
|
||||
month : 12, /*!< The value of Scheduled month for the action */
|
||||
day : 5, /*!< The value of Scheduled day of the month for the action */
|
||||
hour : 5, /*!< The value of Scheduled hour for the action */
|
||||
minute : 6, /*!< The value of Scheduled minute for the action */
|
||||
second : 6, /*!< The value of Scheduled second for the action */
|
||||
day_of_week : 7, /*!< The value of Schedule days of the week for the action */
|
||||
action : 4, /*!< The value of Action to be performed at the scheduled time */
|
||||
trans_time : 8; /*!< The value of Transition time for this action */
|
||||
uint16_t scene_number; /*!< The value of Scene Number to be used for some actions */
|
||||
} esp_ble_mesh_schedule_register_t;
|
||||
|
||||
/** Parameters of Scheduler state */
|
||||
typedef struct {
|
||||
const uint8_t schedule_count; /*!< Scheduler count */
|
||||
esp_ble_mesh_schedule_register_t *schedules; /*!< Up to 16 scheduled entries */
|
||||
} esp_ble_mesh_scheduler_state_t;
|
||||
|
||||
/** User data of Scheduler Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Scheduler Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_scheduler_state_t *state; /*!< Parameters of the Scheduler state */
|
||||
} esp_ble_mesh_scheduler_srv_t;
|
||||
|
||||
/** User data of Scheduler Setup Server Model */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to the Scheduler Setup Server Model. Initialized internally. */
|
||||
esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl; /*!< Response control of the server model received messages */
|
||||
esp_ble_mesh_scheduler_state_t *state; /*!< Parameters of the Scheduler state */
|
||||
} esp_ble_mesh_scheduler_setup_srv_t;
|
||||
|
||||
/** Parameters of Time Set state change event */
|
||||
typedef struct {
|
||||
uint8_t tai_seconds[5]; /*!< The current TAI time in seconds */
|
||||
uint8_t subsecond; /*!< The sub-second time in units of 1/256 second */
|
||||
uint8_t uncertainty; /*!< The estimated uncertainty in 10-millisecond steps */
|
||||
uint16_t time_authority : 1; /*!< 0 = No Time Authority, 1 = Time Authority */
|
||||
uint16_t tai_utc_delta_curr : 15; /*!< Current difference between TAI and UTC in seconds */
|
||||
uint8_t time_zone_offset_curr; /*!< The local time zone offset in 15-minute increments */
|
||||
} esp_ble_mesh_state_change_time_set_t;
|
||||
|
||||
/** Parameters of Time Status state change event */
|
||||
typedef struct {
|
||||
uint8_t tai_seconds[5]; /*!< The current TAI time in seconds */
|
||||
uint8_t subsecond; /*!< The sub-second time in units of 1/256 second */
|
||||
uint8_t uncertainty; /*!< The estimated uncertainty in 10-millisecond steps */
|
||||
uint16_t time_authority : 1; /*!< 0 = No Time Authority, 1 = Time Authority */
|
||||
uint16_t tai_utc_delta_curr : 15; /*!< Current difference between TAI and UTC in seconds */
|
||||
uint8_t time_zone_offset_curr; /*!< The local time zone offset in 15-minute increments */
|
||||
} esp_ble_mesh_state_change_time_status_t;
|
||||
|
||||
/** Parameters of Time Zone Set state change event */
|
||||
typedef struct {
|
||||
uint8_t time_zone_offset_new; /*!< Upcoming local time zone offset */
|
||||
uint8_t tai_zone_change[5]; /*!< TAI Seconds time of the upcoming Time Zone Offset change */
|
||||
} esp_ble_mesh_state_change_time_zone_set_t;
|
||||
|
||||
/** Parameters of TAI UTC Delta Set state change event */
|
||||
typedef struct {
|
||||
uint16_t tai_utc_delta_new : 15; /*!< Upcoming difference between TAI and UTC in seconds */
|
||||
uint8_t tai_delta_change[5]; /*!< TAI Seconds time of the upcoming TAI-UTC Delta change */
|
||||
} esp_ble_mesh_state_change_tai_utc_delta_set_t;
|
||||
|
||||
/** Parameter of Time Role Set state change event */
|
||||
typedef struct {
|
||||
uint8_t time_role; /*!< The Time Role for the element */
|
||||
} esp_ble_mesh_state_change_time_role_set_t;
|
||||
|
||||
/** Parameter of Scene Store state change event */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The number of scenes to be stored */
|
||||
} esp_ble_mesh_state_change_scene_store_t;
|
||||
|
||||
/** Parameter of Scene Recall state change event */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The number of scenes to be recalled */
|
||||
} esp_ble_mesh_state_change_scene_recall_t;
|
||||
|
||||
/** Parameter of Scene Delete state change event */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The number of scenes to be deleted */
|
||||
} esp_ble_mesh_state_change_scene_delete_t;
|
||||
|
||||
/** Parameter of Scheduler Action Set state change event */
|
||||
typedef struct {
|
||||
uint64_t index : 4; /*!< Index of the Schedule Register entry to set */
|
||||
uint64_t year : 7; /*!< Scheduled year for the action */
|
||||
uint64_t month : 12; /*!< Scheduled month for the action */
|
||||
uint64_t day : 5; /*!< Scheduled day of the month for the action */
|
||||
uint64_t hour : 5; /*!< Scheduled hour for the action */
|
||||
uint64_t minute : 6; /*!< Scheduled minute for the action */
|
||||
uint64_t second : 6; /*!< Scheduled second for the action */
|
||||
uint64_t day_of_week : 7; /*!< Schedule days of the week for the action */
|
||||
uint64_t action : 4; /*!< Action to be performed at the scheduled time */
|
||||
uint64_t trans_time : 8; /*!< Transition time for this action */
|
||||
uint16_t scene_number; /*!< Scene number to be used for some actions */
|
||||
} esp_ble_mesh_state_change_scheduler_act_set_t;
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model state change value union
|
||||
*/
|
||||
typedef union {
|
||||
/**
|
||||
* The recv_op in ctx can be used to decide which state is changed.
|
||||
*/
|
||||
esp_ble_mesh_state_change_time_set_t time_set; /*!< Time Set */
|
||||
esp_ble_mesh_state_change_time_status_t time_status; /*!< Time Status */
|
||||
esp_ble_mesh_state_change_time_zone_set_t time_zone_set; /*!< Time Zone Set */
|
||||
esp_ble_mesh_state_change_tai_utc_delta_set_t tai_utc_delta_set; /*!< TAI UTC Delta Set */
|
||||
esp_ble_mesh_state_change_time_role_set_t time_role_set; /*!< Time Role Set */
|
||||
esp_ble_mesh_state_change_scene_store_t scene_store; /*!< Scene Store */
|
||||
esp_ble_mesh_state_change_scene_recall_t scene_recall; /*!< Scene Recall */
|
||||
esp_ble_mesh_state_change_scene_delete_t scene_delete; /*!< Scene Delete */
|
||||
esp_ble_mesh_state_change_scheduler_act_set_t scheduler_act_set; /*!< Scheduler Action Set */
|
||||
} esp_ble_mesh_time_scene_server_state_change_t;
|
||||
|
||||
/** Context of the received Scheduler Action Get message */
|
||||
typedef struct {
|
||||
uint8_t index; /*!< Index of the Schedule Register entry to get */
|
||||
} esp_ble_mesh_server_recv_scheduler_act_get_t;
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model received get message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_scheduler_act_get_t scheduler_act; /*!< Scheduler Action Get */
|
||||
} esp_ble_mesh_time_scene_server_recv_get_msg_t;
|
||||
|
||||
/** Context of the received Time Set message */
|
||||
typedef struct {
|
||||
uint8_t tai_seconds[5]; /*!< The current TAI time in seconds */
|
||||
uint8_t subsecond; /*!< The sub-second time in units of 1/256 second */
|
||||
uint8_t uncertainty; /*!< The estimated uncertainty in 10-millisecond steps */
|
||||
uint16_t time_authority : 1; /*!< 0 = No Time Authority, 1 = Time Authority */
|
||||
uint16_t tai_utc_delta : 15; /*!< Current difference between TAI and UTC in seconds */
|
||||
uint8_t time_zone_offset; /*!< The local time zone offset in 15-minute increments */
|
||||
} esp_ble_mesh_server_recv_time_set_t;
|
||||
|
||||
/** Context of the received Time Zone Set message */
|
||||
typedef struct {
|
||||
uint8_t time_zone_offset_new; /*!< Upcoming local time zone offset */
|
||||
uint8_t tai_zone_change[5]; /*!< TAI Seconds time of the upcoming Time Zone Offset change */
|
||||
} esp_ble_mesh_server_recv_time_zone_set_t;
|
||||
|
||||
/** Context of the received TAI UTC Delta Set message */
|
||||
typedef struct {
|
||||
uint16_t tai_utc_delta_new : 15; /*!< Upcoming difference between TAI and UTC in seconds */
|
||||
uint16_t padding : 1; /*!< Always 0b0. Other values are Prohibited. */
|
||||
uint8_t tai_delta_change[5]; /*!< TAI Seconds time of the upcoming TAI-UTC Delta change */
|
||||
} esp_ble_mesh_server_recv_tai_utc_delta_set_t;
|
||||
|
||||
/** Context of the received Time Role Set message */
|
||||
typedef struct {
|
||||
uint8_t time_role; /*!< The Time Role for the element */
|
||||
} esp_ble_mesh_server_recv_time_role_set_t;
|
||||
|
||||
/** Context of the received Scene Store message */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The number of scenes to be stored */
|
||||
} esp_ble_mesh_server_recv_scene_store_t;
|
||||
|
||||
/** Context of the received Scene Recall message */
|
||||
typedef struct {
|
||||
bool op_en; /*!< Indicate if optional parameters are included */
|
||||
uint16_t scene_number; /*!< The number of scenes to be recalled */
|
||||
uint8_t tid; /*!< Transaction ID */
|
||||
uint8_t trans_time; /*!< Time to complete state transition (optional) */
|
||||
uint8_t delay; /*!< Indicate message execution delay (C.1) */
|
||||
} esp_ble_mesh_server_recv_scene_recall_t;
|
||||
|
||||
/** Context of the received Scene Delete message */
|
||||
typedef struct {
|
||||
uint16_t scene_number; /*!< The number of scenes to be deleted */
|
||||
} esp_ble_mesh_server_recv_scene_delete_t;
|
||||
|
||||
/** Context of the received Scheduler Action Set message */
|
||||
typedef struct {
|
||||
uint64_t index : 4; /*!< Index of the Schedule Register entry to set */
|
||||
uint64_t year : 7; /*!< Scheduled year for the action */
|
||||
uint64_t month : 12; /*!< Scheduled month for the action */
|
||||
uint64_t day : 5; /*!< Scheduled day of the month for the action */
|
||||
uint64_t hour : 5; /*!< Scheduled hour for the action */
|
||||
uint64_t minute : 6; /*!< Scheduled minute for the action */
|
||||
uint64_t second : 6; /*!< Scheduled second for the action */
|
||||
uint64_t day_of_week : 7; /*!< Schedule days of the week for the action */
|
||||
uint64_t action : 4; /*!< Action to be performed at the scheduled time */
|
||||
uint64_t trans_time : 8; /*!< Transition time for this action */
|
||||
uint16_t scene_number; /*!< Scene number to be used for some actions */
|
||||
} esp_ble_mesh_server_recv_scheduler_act_set_t;
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model received set message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_time_set_t time; /*!< Time Set */
|
||||
esp_ble_mesh_server_recv_time_zone_set_t time_zone; /*!< Time Zone Set */
|
||||
esp_ble_mesh_server_recv_tai_utc_delta_set_t tai_utc_delta; /*!< TAI-UTC Delta Set */
|
||||
esp_ble_mesh_server_recv_time_role_set_t time_role; /*!< Time Role Set */
|
||||
esp_ble_mesh_server_recv_scene_store_t scene_store; /*!< Scene Store/Scene Store Unack */
|
||||
esp_ble_mesh_server_recv_scene_recall_t scene_recall; /*!< Scene Recall/Scene Recall Unack */
|
||||
esp_ble_mesh_server_recv_scene_delete_t scene_delete; /*!< Scene Delete/Scene Delete Unack */
|
||||
esp_ble_mesh_server_recv_scheduler_act_set_t scheduler_act; /*!< Scheduler Action Set/Scheduler Action Set Unack */
|
||||
} esp_ble_mesh_time_scene_server_recv_set_msg_t;
|
||||
|
||||
/** Context of the received Time Status message */
|
||||
typedef struct {
|
||||
uint8_t tai_seconds[5]; /*!< The current TAI time in seconds */
|
||||
uint8_t subsecond; /*!< The sub-second time in units of 1/256 second */
|
||||
uint8_t uncertainty; /*!< The estimated uncertainty in 10-millisecond steps */
|
||||
uint16_t time_authority : 1; /*!< 0 = No Time Authority, 1 = Time Authority */
|
||||
uint16_t tai_utc_delta : 15; /*!< Current difference between TAI and UTC in seconds */
|
||||
uint8_t time_zone_offset; /*!< The local time zone offset in 15-minute increments */
|
||||
} esp_ble_mesh_server_recv_time_status_t;
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model received status message union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_server_recv_time_status_t time_status; /*!< Time Status */
|
||||
} esp_ble_mesh_time_scene_server_recv_status_msg_t;
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model callback value union
|
||||
*/
|
||||
typedef union {
|
||||
esp_ble_mesh_time_scene_server_state_change_t state_change; /*!< ESP_BLE_MESH_TIME_SCENE_SERVER_STATE_CHANGE_EVT */
|
||||
esp_ble_mesh_time_scene_server_recv_get_msg_t get; /*!< ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_GET_MSG_EVT */
|
||||
esp_ble_mesh_time_scene_server_recv_set_msg_t set; /*!< ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_SET_MSG_EVT */
|
||||
esp_ble_mesh_time_scene_server_recv_status_msg_t status; /*!< ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_STATUS_MSG_EVT */
|
||||
} esp_ble_mesh_time_scene_server_cb_value_t;
|
||||
|
||||
/** Time Scene Server Model callback parameters */
|
||||
typedef struct {
|
||||
esp_ble_mesh_model_t *model; /*!< Pointer to Time and Scenes Server Models */
|
||||
esp_ble_mesh_msg_ctx_t ctx; /*!< Context of the received messages */
|
||||
esp_ble_mesh_time_scene_server_cb_value_t value; /*!< Value of the received Time and Scenes Messages */
|
||||
} esp_ble_mesh_time_scene_server_cb_param_t;
|
||||
|
||||
/** This enum value is the event of Time Scene Server Model */
|
||||
typedef enum {
|
||||
/**
|
||||
* 1. When get_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, no event will be
|
||||
* callback to the application layer when Time Scene Get messages are received.
|
||||
* 2. When set_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, this event will
|
||||
* be callback to the application layer when Time Scene Set/Set Unack messages
|
||||
* are received.
|
||||
*/
|
||||
ESP_BLE_MESH_TIME_SCENE_SERVER_STATE_CHANGE_EVT,
|
||||
/**
|
||||
* When get_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Time Scene Get messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_GET_MSG_EVT,
|
||||
/**
|
||||
* When set_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
|
||||
* callback to the application layer when Time Scene Set/Set Unack messages are received.
|
||||
*/
|
||||
ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_SET_MSG_EVT,
|
||||
/**
|
||||
* When status_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will
|
||||
* be callback to the application layer when TIme Status message is received.
|
||||
*/
|
||||
ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_STATUS_MSG_EVT,
|
||||
ESP_BLE_MESH_TIME_SCENE_SERVER_EVT_MAX,
|
||||
} esp_ble_mesh_time_scene_server_cb_event_t;
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Mesh Time and Scenes Server Model function.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Time Scene Server Model callback function type
|
||||
* @param event: Event type
|
||||
* @param param: Pointer to callback parameter
|
||||
*/
|
||||
typedef void (* esp_ble_mesh_time_scene_server_cb_t)(esp_ble_mesh_time_scene_server_cb_event_t event,
|
||||
esp_ble_mesh_time_scene_server_cb_param_t *param);
|
||||
|
||||
/**
|
||||
* @brief Register BLE Mesh Time and Scenes Server Model callback.
|
||||
*
|
||||
* @param[in] callback: Pointer to the callback function.
|
||||
*
|
||||
* @return ESP_OK on success or error code otherwise.
|
||||
*
|
||||
*/
|
||||
esp_err_t esp_ble_mesh_register_time_scene_server_callback(esp_ble_mesh_time_scene_server_cb_t callback);
|
||||
|
||||
#endif /* _ESP_BLE_MESH_TIME_SCENE_MODEL_API_H_ */
|
||||
|
||||
|
|
|
@ -534,3 +534,227 @@ void btc_ble_mesh_generic_client_cb_handler(btc_msg_t *msg)
|
|||
btc_ble_mesh_generic_client_free_req_data(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Generic Server Models related functions */
|
||||
|
||||
static inline void btc_ble_mesh_generic_server_cb_to_app(
|
||||
esp_ble_mesh_generic_server_cb_event_t event,
|
||||
esp_ble_mesh_generic_server_cb_param_t *param)
|
||||
{
|
||||
esp_ble_mesh_generic_server_cb_t btc_ble_mesh_cb =
|
||||
(esp_ble_mesh_generic_server_cb_t)btc_profile_cb_get(BTC_PID_GENERIC_SERVER);
|
||||
if (btc_ble_mesh_cb) {
|
||||
btc_ble_mesh_cb(event, param);
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_generic_server_copy_req_data(btc_msg_t *msg, void *p_dest, void *p_src)
|
||||
{
|
||||
esp_ble_mesh_generic_server_cb_param_t *p_dest_data = (esp_ble_mesh_generic_server_cb_param_t *)p_dest;
|
||||
esp_ble_mesh_generic_server_cb_param_t *p_src_data = (esp_ble_mesh_generic_server_cb_param_t *)p_src;
|
||||
u16_t length;
|
||||
|
||||
if (!msg || !p_src_data || !p_dest_data) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_GENERIC_SERVER_STATE_CHANGE_EVT:
|
||||
switch (p_src_data->ctx.recv_op) {
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET_UNACK:
|
||||
if (p_src_data->value.state_change.user_property_set.value) {
|
||||
length = p_src_data->value.state_change.user_property_set.value->len;
|
||||
p_dest_data->value.state_change.user_property_set.value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.user_property_set.value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.user_property_set.value,
|
||||
p_src_data->value.state_change.user_property_set.value->data,
|
||||
p_src_data->value.state_change.user_property_set.value->len);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET_UNACK:
|
||||
if (p_src_data->value.state_change.admin_property_set.value) {
|
||||
length = p_src_data->value.state_change.admin_property_set.value->len;
|
||||
p_dest_data->value.state_change.admin_property_set.value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.admin_property_set.value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.admin_property_set.value,
|
||||
p_src_data->value.state_change.admin_property_set.value->data,
|
||||
p_src_data->value.state_change.admin_property_set.value->len);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_GENERIC_SERVER_RECV_SET_MSG_EVT:
|
||||
switch (p_src_data->ctx.recv_op) {
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET_UNACK:
|
||||
if (p_src_data->value.set.user_property.property_value) {
|
||||
length = p_src_data->value.set.user_property.property_value->len;
|
||||
p_dest_data->value.set.user_property.property_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.set.user_property.property_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.set.user_property.property_value,
|
||||
p_src_data->value.set.user_property.property_value->data,
|
||||
p_src_data->value.set.user_property.property_value->len);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET_UNACK:
|
||||
if (p_src_data->value.set.admin_property.property_value) {
|
||||
length = p_src_data->value.set.admin_property.property_value->len;
|
||||
p_dest_data->value.set.admin_property.property_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.set.admin_property.property_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.set.admin_property.property_value,
|
||||
p_src_data->value.set.admin_property.property_value->data,
|
||||
p_src_data->value.set.admin_property.property_value->len);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_generic_server_free_req_data(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_generic_server_cb_param_t *arg = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
arg = (esp_ble_mesh_generic_server_cb_param_t *)(msg->arg);
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_GENERIC_SERVER_STATE_CHANGE_EVT:
|
||||
switch (arg->ctx.recv_op) {
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET_UNACK:
|
||||
bt_mesh_free_buf(arg->value.state_change.user_property_set.value);
|
||||
break;
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET_UNACK:
|
||||
bt_mesh_free_buf(arg->value.state_change.admin_property_set.value);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_GENERIC_SERVER_RECV_SET_MSG_EVT:
|
||||
switch (arg->ctx.recv_op) {
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_USER_PROPERTY_SET_UNACK:
|
||||
bt_mesh_free_buf(arg->value.set.user_property.property_value);
|
||||
break;
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET:
|
||||
case ESP_BLE_MESH_MODEL_OP_GEN_ADMIN_PROPERTY_SET_UNACK:
|
||||
bt_mesh_free_buf(arg->value.set.admin_property.property_value);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_generic_server_callback(esp_ble_mesh_generic_server_cb_param_t *cb_params, uint8_t act)
|
||||
{
|
||||
btc_msg_t msg = {0};
|
||||
|
||||
LOG_DEBUG("%s", __func__);
|
||||
|
||||
msg.sig = BTC_SIG_API_CB;
|
||||
msg.pid = BTC_PID_GENERIC_SERVER;
|
||||
msg.act = act;
|
||||
|
||||
btc_transfer_context(&msg, cb_params,
|
||||
sizeof(esp_ble_mesh_generic_server_cb_param_t), btc_ble_mesh_generic_server_copy_req_data);
|
||||
}
|
||||
|
||||
void bt_mesh_generic_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len)
|
||||
{
|
||||
esp_ble_mesh_generic_server_cb_param_t cb_params = {0};
|
||||
size_t length;
|
||||
uint8_t act;
|
||||
|
||||
if (model == NULL || ctx == NULL) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (evt_type) {
|
||||
case BTC_BLE_MESH_EVT_GENERIC_SERVER_STATE_CHANGE:
|
||||
act = ESP_BLE_MESH_GENERIC_SERVER_STATE_CHANGE_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_GENERIC_SERVER_RECV_GET_MSG:
|
||||
act = ESP_BLE_MESH_GENERIC_SERVER_RECV_GET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_GENERIC_SERVER_RECV_SET_MSG:
|
||||
act = ESP_BLE_MESH_GENERIC_SERVER_RECV_SET_MSG_EVT;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("%s, Unknown Generic Server event type", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
cb_params.model = (esp_ble_mesh_model_t *)model;
|
||||
cb_params.ctx.net_idx = ctx->net_idx;
|
||||
cb_params.ctx.app_idx = ctx->app_idx;
|
||||
cb_params.ctx.addr = ctx->addr;
|
||||
cb_params.ctx.recv_ttl = ctx->recv_ttl;
|
||||
cb_params.ctx.recv_op = ctx->recv_op;
|
||||
cb_params.ctx.recv_dst = ctx->recv_dst;
|
||||
|
||||
if (val && len) {
|
||||
length = (len <= sizeof(cb_params.value)) ? len : sizeof(cb_params.value);
|
||||
memcpy(&cb_params.value, val, length);
|
||||
}
|
||||
|
||||
btc_ble_mesh_generic_server_callback(&cb_params, act);
|
||||
return;
|
||||
}
|
||||
|
||||
void btc_ble_mesh_generic_server_cb_handler(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_generic_server_cb_param_t *param = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
param = (esp_ble_mesh_generic_server_cb_param_t *)(msg->arg);
|
||||
|
||||
if (msg->act < ESP_BLE_MESH_GENERIC_SERVER_EVT_MAX) {
|
||||
btc_ble_mesh_generic_server_cb_to_app(msg->act, param);
|
||||
} else {
|
||||
LOG_ERROR("%s, Unknown msg->act = %d", __func__, msg->act);
|
||||
}
|
||||
|
||||
btc_ble_mesh_generic_server_free_req_data(msg);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -379,3 +379,197 @@ void btc_ble_mesh_lighting_client_cb_handler(btc_msg_t *msg)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Lighting Server Models related functions */
|
||||
|
||||
static inline void btc_ble_mesh_lighting_server_cb_to_app(
|
||||
esp_ble_mesh_lighting_server_cb_event_t event,
|
||||
esp_ble_mesh_lighting_server_cb_param_t *param)
|
||||
{
|
||||
esp_ble_mesh_lighting_server_cb_t btc_ble_mesh_cb =
|
||||
(esp_ble_mesh_lighting_server_cb_t)btc_profile_cb_get(BTC_PID_LIGHTING_SERVER);
|
||||
if (btc_ble_mesh_cb) {
|
||||
btc_ble_mesh_cb(event, param);
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_lighting_server_copy_req_data(btc_msg_t *msg, void *p_dest, void *p_src)
|
||||
{
|
||||
esp_ble_mesh_lighting_server_cb_param_t *p_dest_data = (esp_ble_mesh_lighting_server_cb_param_t *)p_dest;
|
||||
esp_ble_mesh_lighting_server_cb_param_t *p_src_data = (esp_ble_mesh_lighting_server_cb_param_t *)p_src;
|
||||
u16_t length;
|
||||
|
||||
if (!msg || !p_src_data || !p_dest_data) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_STATE_CHANGE_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET_UNACK) {
|
||||
if (p_src_data->value.state_change.lc_property_set.property_value) {
|
||||
length = p_src_data->value.state_change.lc_property_set.property_value->len;
|
||||
p_dest_data->value.state_change.lc_property_set.property_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.lc_property_set.property_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.lc_property_set.property_value,
|
||||
p_src_data->value.state_change.lc_property_set.property_value->data,
|
||||
p_src_data->value.state_change.lc_property_set.property_value->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_RECV_SET_MSG_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET_UNACK) {
|
||||
if (p_src_data->value.set.lc_property.property_value) {
|
||||
length = p_src_data->value.set.lc_property.property_value->len;
|
||||
p_dest_data->value.set.lc_property.property_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.set.lc_property.property_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.set.lc_property.property_value,
|
||||
p_src_data->value.set.lc_property.property_value->data,
|
||||
p_src_data->value.set.lc_property.property_value->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_RECV_STATUS_MSG_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_STATUS) {
|
||||
if (p_src_data->value.status.sensor_status.data) {
|
||||
length = p_src_data->value.status.sensor_status.data->len;
|
||||
p_dest_data->value.status.sensor_status.data = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.status.sensor_status.data == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.status.sensor_status.data,
|
||||
p_src_data->value.status.sensor_status.data->data,
|
||||
p_src_data->value.status.sensor_status.data->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_lighting_server_free_req_data(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_lighting_server_cb_param_t *arg = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
arg = (esp_ble_mesh_lighting_server_cb_param_t *)(msg->arg);
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_STATE_CHANGE_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.state_change.lc_property_set.property_value);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_RECV_SET_MSG_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.set.lc_property.property_value);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_LIGHTING_SERVER_RECV_STATUS_MSG_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_STATUS) {
|
||||
bt_mesh_free_buf(arg->value.status.sensor_status.data);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_lighting_server_callback(esp_ble_mesh_lighting_server_cb_param_t *cb_params, uint8_t act)
|
||||
{
|
||||
btc_msg_t msg = {0};
|
||||
|
||||
LOG_DEBUG("%s", __func__);
|
||||
|
||||
msg.sig = BTC_SIG_API_CB;
|
||||
msg.pid = BTC_PID_LIGHTING_SERVER;
|
||||
msg.act = act;
|
||||
|
||||
btc_transfer_context(
|
||||
&msg, cb_params, sizeof(esp_ble_mesh_lighting_server_cb_param_t), btc_ble_mesh_lighting_server_copy_req_data);
|
||||
}
|
||||
|
||||
void bt_mesh_lighting_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len)
|
||||
{
|
||||
esp_ble_mesh_lighting_server_cb_param_t cb_params = {0};
|
||||
size_t length;
|
||||
uint8_t act;
|
||||
|
||||
if (model == NULL || ctx == NULL) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (evt_type) {
|
||||
case BTC_BLE_MESH_EVT_LIGHTING_SERVER_STATE_CHANGE:
|
||||
act = ESP_BLE_MESH_LIGHTING_SERVER_STATE_CHANGE_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_GET_MSG:
|
||||
act = ESP_BLE_MESH_LIGHTING_SERVER_RECV_GET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_SET_MSG:
|
||||
act = ESP_BLE_MESH_LIGHTING_SERVER_RECV_SET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_STATUS_MSG:
|
||||
act = ESP_BLE_MESH_LIGHTING_SERVER_RECV_STATUS_MSG_EVT;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("%s, Unknown Lighting Server event type", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
cb_params.model = (esp_ble_mesh_model_t *)model;
|
||||
cb_params.ctx.net_idx = ctx->net_idx;
|
||||
cb_params.ctx.app_idx = ctx->app_idx;
|
||||
cb_params.ctx.addr = ctx->addr;
|
||||
cb_params.ctx.recv_ttl = ctx->recv_ttl;
|
||||
cb_params.ctx.recv_op = ctx->recv_op;
|
||||
cb_params.ctx.recv_dst = ctx->recv_dst;
|
||||
|
||||
if (val && len) {
|
||||
length = (len <= sizeof(cb_params.value)) ? len : sizeof(cb_params.value);
|
||||
memcpy(&cb_params.value, val, length);
|
||||
}
|
||||
|
||||
btc_ble_mesh_lighting_server_callback(&cb_params, act);
|
||||
return;
|
||||
}
|
||||
|
||||
void btc_ble_mesh_lighting_server_cb_handler(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_lighting_server_cb_param_t *param = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
param = (esp_ble_mesh_lighting_server_cb_param_t *)(msg->arg);
|
||||
|
||||
if (msg->act < ESP_BLE_MESH_LIGHTING_SERVER_EVT_MAX) {
|
||||
btc_ble_mesh_lighting_server_cb_to_app(msg->act, param);
|
||||
} else {
|
||||
LOG_ERROR("%s, Unknown msg->act = %d", __func__, msg->act);
|
||||
}
|
||||
|
||||
btc_ble_mesh_lighting_server_free_req_data(msg);
|
||||
return;
|
||||
}
|
|
@ -48,6 +48,7 @@
|
|||
#include "sensor_client.h"
|
||||
#include "time_scene_client.h"
|
||||
#include "client_common.h"
|
||||
#include "state_binding.h"
|
||||
|
||||
#include "btc_ble_mesh_prov.h"
|
||||
#include "btc_ble_mesh_config_model.h"
|
||||
|
@ -176,6 +177,16 @@ void btc_ble_mesh_model_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE:
|
||||
LOG_DEBUG("%s, BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE", __func__);
|
||||
dst->model_update_state.value = osi_malloc(sizeof(esp_ble_mesh_server_state_value_t));
|
||||
if (dst->model_update_state.value) {
|
||||
memcpy(dst->model_update_state.value, src->model_update_state.value,
|
||||
sizeof(esp_ble_mesh_server_state_value_t));
|
||||
} else {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG_DEBUG("%s, Unknown deep copy act %d", __func__, msg->act);
|
||||
break;
|
||||
|
@ -203,6 +214,11 @@ static void btc_ble_mesh_model_arg_deep_free(btc_msg_t *msg)
|
|||
osi_free(arg->model_send.ctx);
|
||||
}
|
||||
break;
|
||||
case BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE:
|
||||
if (arg->model_update_state.value) {
|
||||
osi_free(arg->model_update_state.value);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -457,6 +473,29 @@ static void btc_ble_mesh_model_publish_comp_cb(esp_ble_mesh_model_t *model, int
|
|||
return;
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_server_model_update_state_comp_cb(esp_ble_mesh_model_t *model,
|
||||
esp_ble_mesh_server_state_type_t type, int err)
|
||||
{
|
||||
esp_ble_mesh_model_cb_param_t mesh_param = {0};
|
||||
btc_msg_t msg = {0};
|
||||
bt_status_t ret;
|
||||
|
||||
mesh_param.server_model_update_state.err_code = err;
|
||||
mesh_param.server_model_update_state.model = model;
|
||||
mesh_param.server_model_update_state.type = type;
|
||||
|
||||
msg.sig = BTC_SIG_API_CB;
|
||||
msg.pid = BTC_PID_MODEL;
|
||||
msg.act = ESP_BLE_MESH_SERVER_MODEL_UPDATE_STATE_COMP_EVT;
|
||||
ret = btc_transfer_context(&msg, &mesh_param,
|
||||
sizeof(esp_ble_mesh_model_cb_param_t), NULL);
|
||||
|
||||
if (ret != BT_STATUS_SUCCESS) {
|
||||
LOG_ERROR("%s btc_transfer_context failed", __func__);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#if CONFIG_BLE_MESH_NODE
|
||||
static void btc_ble_mesh_oob_pub_key_cb(void)
|
||||
{
|
||||
|
@ -1230,6 +1269,45 @@ extern const struct bt_mesh_model_op sensor_cli_op[];
|
|||
extern const struct bt_mesh_model_op time_cli_op[];
|
||||
extern const struct bt_mesh_model_op scene_cli_op[];
|
||||
extern const struct bt_mesh_model_op scheduler_cli_op[];
|
||||
/* Generic Server Models */
|
||||
extern const struct bt_mesh_model_op gen_onoff_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_level_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_def_trans_time_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_power_onoff_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_power_onoff_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_power_level_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_power_level_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_battery_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_location_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_location_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_user_prop_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_admin_prop_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_manu_prop_srv_op[];
|
||||
extern const struct bt_mesh_model_op gen_client_prop_srv_op[];
|
||||
/* Lighting Server Models */
|
||||
extern const struct bt_mesh_model_op light_lightness_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_lightness_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_ctl_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_ctl_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_ctl_temp_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_hsl_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_hsl_hue_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_hsl_sat_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_hsl_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_xyl_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_xyl_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_lc_srv_op[];
|
||||
extern const struct bt_mesh_model_op light_lc_setup_srv_op[];
|
||||
/* Time and Scenes Server Models */
|
||||
extern const struct bt_mesh_model_op time_srv_op[];
|
||||
extern const struct bt_mesh_model_op time_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op scene_srv_op[];
|
||||
extern const struct bt_mesh_model_op scene_setup_srv_op[];
|
||||
extern const struct bt_mesh_model_op scheduler_srv_op[];
|
||||
extern const struct bt_mesh_model_op scheduler_setup_srv_op[];
|
||||
/* Sensor Server Models */
|
||||
extern const struct bt_mesh_model_op sensor_srv_op[];
|
||||
extern const struct bt_mesh_model_op sensor_setup_srv_op[];
|
||||
|
||||
static void btc_ble_mesh_model_op_add(esp_ble_mesh_model_t *model)
|
||||
{
|
||||
|
@ -1240,8 +1318,8 @@ static void btc_ble_mesh_model_op_add(esp_ble_mesh_model_t *model)
|
|||
return;
|
||||
}
|
||||
|
||||
/* 1. For SIG client models, model->op will be NULL and initialized here.
|
||||
* 2. The vendor model opcode is 3 bytes.
|
||||
/* For SIG client and server models, model->op will be NULL and initialized here.
|
||||
* For vendor models whose opcode is 3 bytes, model->op will be initialized here.
|
||||
*/
|
||||
if ((model->op != NULL) && (model->op->opcode >= 0x10000)) {
|
||||
goto add_model_op;
|
||||
|
@ -1419,9 +1497,220 @@ static void btc_ble_mesh_model_op_add(esp_ble_mesh_model_t *model)
|
|||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
goto add_model_op;
|
||||
case BLE_MESH_MODEL_ID_GEN_ONOFF_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_onoff_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_LEVEL_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_level_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_def_trans_time_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_power_onoff_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_power_onoff_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_power_level_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_power_level_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_BATTERY_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_battery_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_LOCATION_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_location_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_USER_PROP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_user_prop_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_ADMIN_PROP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_admin_prop_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_MANUFACTURER_PROP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_manu_prop_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_CLIENT_PROP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_client_prop_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_GEN_LOCATION_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)gen_location_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_lightness_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_lightness_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_CTL_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_ctl_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_CTL_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_ctl_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_ctl_temp_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_HSL_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_hsl_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_hsl_hue_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_hsl_sat_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_HSL_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_hsl_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_XYL_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_xyl_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_XYL_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_xyl_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_LC_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_lc_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_LIGHT_LC_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)light_lc_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_TIME_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)time_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_TIME_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)time_setup_srv_op;
|
||||
if (model->pub) {
|
||||
/* Time Setup Server model does not support subscribing nor publishing. */
|
||||
LOG_ERROR("%s, Time Setup Server shall not support publication", __func__);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SCENE_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)scene_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SCENE_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)scene_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SCHEDULER_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)scheduler_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SCHEDULER_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)scheduler_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SENSOR_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)sensor_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
case BLE_MESH_MODEL_ID_SENSOR_SETUP_SRV:
|
||||
model->op = (esp_ble_mesh_model_op_t *)sensor_setup_srv_op;
|
||||
if (model->pub) {
|
||||
model->pub->update = (esp_ble_mesh_cb_t)btc_ble_mesh_model_publish_update;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto add_model_op;
|
||||
}
|
||||
return;
|
||||
|
||||
|
@ -1447,6 +1736,7 @@ void btc_ble_mesh_prov_call_handler(btc_msg_t *msg)
|
|||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
arg = (btc_ble_mesh_prov_args_t *)(msg->arg);
|
||||
|
||||
switch (msg->act) {
|
||||
|
@ -1887,6 +2177,13 @@ void btc_ble_mesh_model_call_handler(btc_msg_t *msg)
|
|||
arg->model_send.opcode, err);
|
||||
break;
|
||||
}
|
||||
case BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE:
|
||||
err = bt_mesh_update_binding_state(
|
||||
(struct bt_mesh_model *)arg->model_update_state.model, arg->model_update_state.type,
|
||||
(bt_mesh_server_state_value_t *)arg->model_update_state.value);
|
||||
btc_ble_mesh_server_model_update_state_comp_cb(arg->model_update_state.model,
|
||||
arg->model_update_state.type, err);
|
||||
break;
|
||||
default:
|
||||
LOG_WARN("%s, Unknown msg->act %d", __func__, msg->act);
|
||||
break;
|
||||
|
|
|
@ -624,3 +624,276 @@ void btc_ble_mesh_sensor_client_cb_handler(btc_msg_t *msg)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Sensor Server Models related functions */
|
||||
|
||||
static inline void btc_ble_mesh_sensor_server_cb_to_app(
|
||||
esp_ble_mesh_sensor_server_cb_event_t event,
|
||||
esp_ble_mesh_sensor_server_cb_param_t *param)
|
||||
{
|
||||
esp_ble_mesh_sensor_server_cb_t btc_ble_mesh_cb =
|
||||
(esp_ble_mesh_sensor_server_cb_t)btc_profile_cb_get(BTC_PID_SENSOR_SERVER);
|
||||
if (btc_ble_mesh_cb) {
|
||||
btc_ble_mesh_cb(event, param);
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_sensor_server_copy_req_data(btc_msg_t *msg, void *p_dest, void *p_src)
|
||||
{
|
||||
esp_ble_mesh_sensor_server_cb_param_t *p_dest_data = (esp_ble_mesh_sensor_server_cb_param_t *)p_dest;
|
||||
esp_ble_mesh_sensor_server_cb_param_t *p_src_data = (esp_ble_mesh_sensor_server_cb_param_t *)p_src;
|
||||
u16_t length;
|
||||
|
||||
if (!msg || !p_src_data || !p_dest_data) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_STATE_CHANGE_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET_UNACK) {
|
||||
if (p_src_data->value.state_change.sensor_cadence_set.trigger_delta_down) {
|
||||
length = p_src_data->value.state_change.sensor_cadence_set.trigger_delta_down->len;
|
||||
p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_down = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_down == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_down,
|
||||
p_src_data->value.state_change.sensor_cadence_set.trigger_delta_down->data,
|
||||
p_src_data->value.state_change.sensor_cadence_set.trigger_delta_down->len);
|
||||
}
|
||||
if (p_src_data->value.state_change.sensor_cadence_set.trigger_delta_up) {
|
||||
length = p_src_data->value.state_change.sensor_cadence_set.trigger_delta_up->len;
|
||||
p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_up = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_up == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.sensor_cadence_set.trigger_delta_up,
|
||||
p_src_data->value.state_change.sensor_cadence_set.trigger_delta_up->data,
|
||||
p_src_data->value.state_change.sensor_cadence_set.trigger_delta_up->len);
|
||||
}
|
||||
if (p_src_data->value.state_change.sensor_cadence_set.fast_cadence_low) {
|
||||
length = p_src_data->value.state_change.sensor_cadence_set.fast_cadence_low->len;
|
||||
p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_low = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_low == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_low,
|
||||
p_src_data->value.state_change.sensor_cadence_set.fast_cadence_low->data,
|
||||
p_src_data->value.state_change.sensor_cadence_set.fast_cadence_low->len);
|
||||
}
|
||||
if (p_src_data->value.state_change.sensor_cadence_set.fast_cadence_high) {
|
||||
length = p_src_data->value.state_change.sensor_cadence_set.fast_cadence_high->len;
|
||||
p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_high = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_high == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.sensor_cadence_set.fast_cadence_high,
|
||||
p_src_data->value.state_change.sensor_cadence_set.fast_cadence_high->data,
|
||||
p_src_data->value.state_change.sensor_cadence_set.fast_cadence_high->len);
|
||||
}
|
||||
} else if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET_UNACK) {
|
||||
if (p_src_data->value.state_change.sensor_setting_set.setting_value) {
|
||||
length = p_src_data->value.state_change.sensor_setting_set.setting_value->len;
|
||||
p_dest_data->value.state_change.sensor_setting_set.setting_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.state_change.sensor_setting_set.setting_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.state_change.sensor_setting_set.setting_value,
|
||||
p_src_data->value.state_change.sensor_setting_set.setting_value->data,
|
||||
p_src_data->value.state_change.sensor_setting_set.setting_value->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_RECV_GET_MSG_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_COLUMN_GET) {
|
||||
if (p_src_data->value.get.sensor_column.raw_value_x) {
|
||||
length = p_src_data->value.get.sensor_column.raw_value_x->len;
|
||||
p_dest_data->value.get.sensor_column.raw_value_x = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.get.sensor_column.raw_value_x == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.get.sensor_column.raw_value_x,
|
||||
p_src_data->value.get.sensor_column.raw_value_x->data,
|
||||
p_src_data->value.get.sensor_column.raw_value_x->len);
|
||||
}
|
||||
} else if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SERIES_GET) {
|
||||
if (p_src_data->value.get.sensor_series.raw_value) {
|
||||
length = p_src_data->value.get.sensor_series.raw_value->len;
|
||||
p_dest_data->value.get.sensor_series.raw_value = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.get.sensor_series.raw_value == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.get.sensor_series.raw_value,
|
||||
p_src_data->value.get.sensor_series.raw_value->data,
|
||||
p_src_data->value.get.sensor_series.raw_value->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_RECV_SET_MSG_EVT:
|
||||
if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET_UNACK) {
|
||||
if (p_src_data->value.set.sensor_cadence.cadence) {
|
||||
length = p_src_data->value.set.sensor_cadence.cadence->len;
|
||||
p_dest_data->value.set.sensor_cadence.cadence = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.set.sensor_cadence.cadence == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.set.sensor_cadence.cadence,
|
||||
p_src_data->value.set.sensor_cadence.cadence->data,
|
||||
p_src_data->value.set.sensor_cadence.cadence->len);
|
||||
}
|
||||
} else if (p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET ||
|
||||
p_src_data->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET_UNACK) {
|
||||
if (p_src_data->value.set.sensor_setting.setting_raw) {
|
||||
length = p_src_data->value.set.sensor_setting.setting_raw->len;
|
||||
p_dest_data->value.set.sensor_setting.setting_raw = bt_mesh_alloc_buf(length);
|
||||
if (p_dest_data->value.set.sensor_setting.setting_raw == NULL) {
|
||||
LOG_ERROR("%s, Failed to allocate memory, act %d", __func__, msg->act);
|
||||
return;
|
||||
}
|
||||
net_buf_simple_add_mem(p_dest_data->value.set.sensor_setting.setting_raw,
|
||||
p_src_data->value.set.sensor_setting.setting_raw->data,
|
||||
p_src_data->value.set.sensor_setting.setting_raw->len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_sensor_server_free_req_data(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_sensor_server_cb_param_t *arg = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
arg = (esp_ble_mesh_sensor_server_cb_param_t *)(msg->arg);
|
||||
|
||||
switch (msg->act) {
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_STATE_CHANGE_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.state_change.sensor_cadence_set.trigger_delta_down);
|
||||
bt_mesh_free_buf(arg->value.state_change.sensor_cadence_set.trigger_delta_up);
|
||||
bt_mesh_free_buf(arg->value.state_change.sensor_cadence_set.fast_cadence_low);
|
||||
bt_mesh_free_buf(arg->value.state_change.sensor_cadence_set.fast_cadence_high);
|
||||
} else if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.state_change.sensor_setting_set.setting_value);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_RECV_GET_MSG_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_COLUMN_GET) {
|
||||
bt_mesh_free_buf(arg->value.get.sensor_column.raw_value_x);
|
||||
} else if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SERIES_GET) {
|
||||
bt_mesh_free_buf(arg->value.get.sensor_series.raw_value);
|
||||
}
|
||||
break;
|
||||
case ESP_BLE_MESH_SENSOR_SERVER_RECV_SET_MSG_EVT:
|
||||
if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_CADENCE_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.set.sensor_cadence.cadence);
|
||||
} else if (arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET ||
|
||||
arg->ctx.recv_op == ESP_BLE_MESH_MODEL_OP_SENSOR_SETTING_SET_UNACK) {
|
||||
bt_mesh_free_buf(arg->value.set.sensor_setting.setting_raw);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_sensor_server_callback(esp_ble_mesh_sensor_server_cb_param_t *cb_params, uint8_t act)
|
||||
{
|
||||
btc_msg_t msg = {0};
|
||||
|
||||
LOG_DEBUG("%s", __func__);
|
||||
|
||||
msg.sig = BTC_SIG_API_CB;
|
||||
msg.pid = BTC_PID_SENSOR_SERVER;
|
||||
msg.act = act;
|
||||
|
||||
btc_transfer_context(
|
||||
&msg, cb_params, sizeof(esp_ble_mesh_sensor_server_cb_param_t), btc_ble_mesh_sensor_server_copy_req_data);
|
||||
}
|
||||
|
||||
void bt_mesh_sensor_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len)
|
||||
{
|
||||
esp_ble_mesh_sensor_server_cb_param_t cb_params = {0};
|
||||
size_t length;
|
||||
uint8_t act;
|
||||
|
||||
if (model == NULL || ctx == NULL) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (evt_type) {
|
||||
case BTC_BLE_MESH_EVT_SENSOR_SERVER_STATE_CHANGE:
|
||||
act = ESP_BLE_MESH_SENSOR_SERVER_STATE_CHANGE_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_SENSOR_SERVER_RECV_GET_MSG:
|
||||
act = ESP_BLE_MESH_SENSOR_SERVER_RECV_GET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_SENSOR_SERVER_RECV_SET_MSG:
|
||||
act = ESP_BLE_MESH_SENSOR_SERVER_RECV_SET_MSG_EVT;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("%s, Unknown Sensor Server event type", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
cb_params.model = (esp_ble_mesh_model_t *)model;
|
||||
cb_params.ctx.net_idx = ctx->net_idx;
|
||||
cb_params.ctx.app_idx = ctx->app_idx;
|
||||
cb_params.ctx.addr = ctx->addr;
|
||||
cb_params.ctx.recv_ttl = ctx->recv_ttl;
|
||||
cb_params.ctx.recv_op = ctx->recv_op;
|
||||
cb_params.ctx.recv_dst = ctx->recv_dst;
|
||||
|
||||
if (val && len) {
|
||||
length = (len <= sizeof(cb_params.value)) ? len : sizeof(cb_params.value);
|
||||
memcpy(&cb_params.value, val, length);
|
||||
}
|
||||
|
||||
btc_ble_mesh_sensor_server_callback(&cb_params, act);
|
||||
return;
|
||||
}
|
||||
|
||||
void btc_ble_mesh_sensor_server_cb_handler(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_sensor_server_cb_param_t *param = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
param = (esp_ble_mesh_sensor_server_cb_param_t *)(msg->arg);
|
||||
|
||||
if (msg->act < ESP_BLE_MESH_SENSOR_SERVER_EVT_MAX) {
|
||||
btc_ble_mesh_sensor_server_cb_to_app(msg->act, param);
|
||||
} else {
|
||||
LOG_ERROR("%s, Unknown msg->act = %d", __func__, msg->act);
|
||||
}
|
||||
|
||||
btc_ble_mesh_sensor_server_free_req_data(msg);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -381,3 +381,99 @@ void btc_ble_mesh_time_scene_client_cb_handler(btc_msg_t *msg)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Time and Scenes Server Models related functions */
|
||||
|
||||
static inline void btc_ble_mesh_time_scene_server_cb_to_app(
|
||||
esp_ble_mesh_time_scene_server_cb_event_t event,
|
||||
esp_ble_mesh_time_scene_server_cb_param_t *param)
|
||||
{
|
||||
esp_ble_mesh_time_scene_server_cb_t btc_ble_mesh_cb =
|
||||
(esp_ble_mesh_time_scene_server_cb_t)btc_profile_cb_get(BTC_PID_TIME_SCENE_SERVER);
|
||||
if (btc_ble_mesh_cb) {
|
||||
btc_ble_mesh_cb(event, param);
|
||||
}
|
||||
}
|
||||
|
||||
static void btc_ble_mesh_time_scene_server_callback(esp_ble_mesh_time_scene_server_cb_param_t *cb_params, uint8_t act)
|
||||
{
|
||||
btc_msg_t msg = {0};
|
||||
|
||||
LOG_DEBUG("%s", __func__);
|
||||
|
||||
msg.sig = BTC_SIG_API_CB;
|
||||
msg.pid = BTC_PID_TIME_SCENE_SERVER;
|
||||
msg.act = act;
|
||||
|
||||
btc_transfer_context(
|
||||
&msg, cb_params, sizeof(esp_ble_mesh_time_scene_server_cb_param_t), NULL);
|
||||
}
|
||||
|
||||
void bt_mesh_time_scene_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len)
|
||||
{
|
||||
esp_ble_mesh_time_scene_server_cb_param_t cb_params = {0};
|
||||
size_t length;
|
||||
uint8_t act;
|
||||
|
||||
if (model == NULL || ctx == NULL) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (evt_type) {
|
||||
case BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_STATE_CHANGE:
|
||||
act = ESP_BLE_MESH_TIME_SCENE_SERVER_STATE_CHANGE_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_GET_MSG:
|
||||
act = ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_GET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_SET_MSG:
|
||||
act = ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_SET_MSG_EVT;
|
||||
break;
|
||||
case BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_STATUS_MSG:
|
||||
act = ESP_BLE_MESH_TIME_SCENE_SERVER_RECV_STATUS_MSG_EVT;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("%s, Unknown Time Scene Server event type", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
cb_params.model = (esp_ble_mesh_model_t *)model;
|
||||
cb_params.ctx.net_idx = ctx->net_idx;
|
||||
cb_params.ctx.app_idx = ctx->app_idx;
|
||||
cb_params.ctx.addr = ctx->addr;
|
||||
cb_params.ctx.recv_ttl = ctx->recv_ttl;
|
||||
cb_params.ctx.recv_op = ctx->recv_op;
|
||||
cb_params.ctx.recv_dst = ctx->recv_dst;
|
||||
|
||||
if (val && len) {
|
||||
length = (len <= sizeof(cb_params.value)) ? len : sizeof(cb_params.value);
|
||||
memcpy(&cb_params.value, val, length);
|
||||
}
|
||||
|
||||
btc_ble_mesh_time_scene_server_callback(&cb_params, act);
|
||||
return;
|
||||
}
|
||||
|
||||
void btc_ble_mesh_time_scene_server_cb_handler(btc_msg_t *msg)
|
||||
{
|
||||
esp_ble_mesh_time_scene_server_cb_param_t *param = NULL;
|
||||
|
||||
if (!msg || !msg->arg) {
|
||||
LOG_ERROR("%s, Invalid parameter", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
param = (esp_ble_mesh_time_scene_server_cb_param_t *)(msg->arg);
|
||||
|
||||
if (msg->act < ESP_BLE_MESH_TIME_SCENE_SERVER_EVT_MAX) {
|
||||
btc_ble_mesh_time_scene_server_cb_to_app(msg->act, param);
|
||||
} else {
|
||||
LOG_ERROR("%s, Unknown msg->act = %d", __func__, msg->act);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,4 +60,18 @@ void bt_mesh_generic_client_cb_evt_to_btc(u32_t opcode, u8_t evt_type,
|
|||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
typedef enum {
|
||||
BTC_BLE_MESH_EVT_GENERIC_SERVER_STATE_CHANGE,
|
||||
BTC_BLE_MESH_EVT_GENERIC_SERVER_RECV_GET_MSG,
|
||||
BTC_BLE_MESH_EVT_GENERIC_SERVER_RECV_SET_MSG,
|
||||
BTC_BLE_MESH_EVT_GENERIC_SERVER_MAX,
|
||||
} btc_ble_mesh_generic_server_evt_t;
|
||||
|
||||
void bt_mesh_generic_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
void btc_ble_mesh_generic_server_cb_handler(btc_msg_t *msg);
|
||||
|
||||
#endif /* _BTC_BLE_MESH_GENERIC_MODEL_H_ */
|
||||
|
|
|
@ -60,5 +60,20 @@ void bt_mesh_lighting_client_cb_evt_to_btc(u32_t opcode, u8_t evt_type,
|
|||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
typedef enum {
|
||||
BTC_BLE_MESH_EVT_LIGHTING_SERVER_STATE_CHANGE,
|
||||
BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_GET_MSG,
|
||||
BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_SET_MSG,
|
||||
BTC_BLE_MESH_EVT_LIGHTING_SERVER_RECV_STATUS_MSG,
|
||||
BTC_BLE_MESH_EVT_LIGHTING_SERVER_MAX,
|
||||
} btc_ble_mesh_lighting_server_evt_t;
|
||||
|
||||
void bt_mesh_lighting_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
void btc_ble_mesh_lighting_server_cb_handler(btc_msg_t *msg);
|
||||
|
||||
#endif /* _BTC_BLE_MESH_LIGHTING_MODEL_H_ */
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ typedef enum {
|
|||
BTC_BLE_MESH_ACT_MODEL_PUBLISH,
|
||||
BTC_BLE_MESH_ACT_SERVER_MODEL_SEND,
|
||||
BTC_BLE_MESH_ACT_CLIENT_MODEL_SEND,
|
||||
BTC_BLE_MESH_ACT_SERVER_MODEL_UPDATE_STATE,
|
||||
} btc_ble_mesh_model_act_t;
|
||||
|
||||
typedef union {
|
||||
|
@ -215,6 +216,11 @@ typedef union {
|
|||
uint8_t device_role;
|
||||
int32_t msg_timeout;
|
||||
} model_send;
|
||||
struct ble_mesh_server_model_update_state_args {
|
||||
esp_ble_mesh_model_t *model;
|
||||
esp_ble_mesh_server_state_type_t type;
|
||||
esp_ble_mesh_server_state_value_t *value;
|
||||
} model_update_state;
|
||||
} btc_ble_mesh_model_args_t;
|
||||
|
||||
void btc_ble_mesh_prov_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
|
||||
|
|
|
@ -60,5 +60,19 @@ void bt_mesh_sensor_client_cb_evt_to_btc(u32_t opcode, u8_t evt_type,
|
|||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
typedef enum {
|
||||
BTC_BLE_MESH_EVT_SENSOR_SERVER_STATE_CHANGE,
|
||||
BTC_BLE_MESH_EVT_SENSOR_SERVER_RECV_GET_MSG,
|
||||
BTC_BLE_MESH_EVT_SENSOR_SERVER_RECV_SET_MSG,
|
||||
BTC_BLE_MESH_EVT_SENSOR_SERVER_MAX,
|
||||
} btc_ble_mesh_sensor_server_evt_t;
|
||||
|
||||
void bt_mesh_sensor_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
void btc_ble_mesh_sensor_server_cb_handler(btc_msg_t *msg);
|
||||
|
||||
#endif /* _BTC_BLE_MESH_SENSOR_MODEL_H_ */
|
||||
|
||||
|
|
|
@ -60,5 +60,20 @@ void bt_mesh_time_scene_client_cb_evt_to_btc(u32_t opcode, u8_t evt_type,
|
|||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
typedef enum {
|
||||
BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_STATE_CHANGE,
|
||||
BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_GET_MSG,
|
||||
BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_SET_MSG,
|
||||
BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_RECV_STATUS_MSG,
|
||||
BTC_BLE_MESH_EVT_TIME_SCENE_SERVER_MAX,
|
||||
} btc_ble_mesh_time_scene_server_evt_t;
|
||||
|
||||
void bt_mesh_time_scene_server_cb_evt_to_btc(u8_t evt_type,
|
||||
struct bt_mesh_model *model,
|
||||
struct bt_mesh_msg_ctx *ctx,
|
||||
const u8_t *val, size_t len);
|
||||
|
||||
void btc_ble_mesh_time_scene_server_cb_handler(btc_msg_t *msg);
|
||||
|
||||
#endif /* _BTC_BLE_MESH_TIME_SCENE_MODEL_H_ */
|
||||
|
||||
|
|
|
@ -27,13 +27,18 @@
|
|||
#include "transport.h"
|
||||
#include "access.h"
|
||||
#include "foundation.h"
|
||||
|
||||
#include "mesh_common.h"
|
||||
#include "provisioner_main.h"
|
||||
|
||||
#include "generic_client.h"
|
||||
#include "sensor_client.h"
|
||||
#include "time_scene_client.h"
|
||||
#include "lighting_client.h"
|
||||
#include "provisioner_main.h"
|
||||
|
||||
#include "generic_server.h"
|
||||
#include "sensor_server.h"
|
||||
#include "time_scene_server.h"
|
||||
#include "lighting_server.h"
|
||||
|
||||
#define BLE_MESH_SDU_MAX_LEN 384
|
||||
|
||||
|
@ -103,6 +108,41 @@ static const struct {
|
|||
#if defined(CONFIG_BLE_MESH_LIGHT_LC_CLI)
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_LC_CLI, bt_mesh_light_lc_cli_init },
|
||||
#endif
|
||||
{ BLE_MESH_MODEL_ID_GEN_ONOFF_SRV, bt_mesh_gen_onoff_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_LEVEL_SRV, bt_mesh_gen_level_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV, bt_mesh_gen_def_trans_time_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV, bt_mesh_gen_power_onoff_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SETUP_SRV, bt_mesh_gen_power_onoff_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV, bt_mesh_gen_power_level_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SETUP_SRV, bt_mesh_gen_power_level_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_BATTERY_SRV, bt_mesh_gen_battery_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_LOCATION_SRV, bt_mesh_gen_location_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_LOCATION_SETUP_SRV, bt_mesh_gen_location_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_USER_PROP_SRV, bt_mesh_gen_user_prop_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_ADMIN_PROP_SRV, bt_mesh_gen_admin_prop_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_MANUFACTURER_PROP_SRV, bt_mesh_gen_manu_prop_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_GEN_CLIENT_PROP_SRV, bt_mesh_gen_client_prop_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV, bt_mesh_light_lightness_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SETUP_SRV, bt_mesh_light_lightness_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_CTL_SRV, bt_mesh_light_ctl_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_CTL_SETUP_SRV, bt_mesh_light_ctl_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV, bt_mesh_light_ctl_temp_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_HSL_SRV, bt_mesh_light_hsl_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV, bt_mesh_light_hsl_hue_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV, bt_mesh_light_hsl_sat_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_HSL_SETUP_SRV, bt_mesh_light_hsl_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_XYL_SRV, bt_mesh_light_xyl_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_XYL_SETUP_SRV, bt_mesh_light_xyl_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_LC_SRV, bt_mesh_light_lc_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_LIGHT_LC_SETUP_SRV, bt_mesh_light_lc_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_TIME_SRV, bt_mesh_time_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_TIME_SETUP_SRV, bt_mesh_time_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SCENE_SRV, bt_mesh_scene_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SCENE_SETUP_SRV, bt_mesh_scene_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SCHEDULER_SRV, bt_mesh_scheduler_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SCHEDULER_SETUP_SRV, bt_mesh_scheduler_setup_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SENSOR_SRV, bt_mesh_sensor_srv_init },
|
||||
{ BLE_MESH_MODEL_ID_SENSOR_SETUP_SRV, bt_mesh_sensor_setup_srv_init },
|
||||
};
|
||||
|
||||
void bt_mesh_model_foreach(void (*func)(struct bt_mesh_model *mod,
|
||||
|
|
|
@ -182,6 +182,8 @@ struct k_delayed_work {
|
|||
*/
|
||||
int k_delayed_work_submit(struct k_delayed_work *work, s32_t delay);
|
||||
|
||||
int k_delayed_work_submit_periodic(struct k_delayed_work *work, s32_t period);
|
||||
|
||||
/**
|
||||
* @brief Get time remaining before a delayed work gets scheduled.
|
||||
*
|
||||
|
|
|
@ -124,8 +124,7 @@ void k_delayed_work_init(struct k_delayed_work *work, k_work_handler_t handler)
|
|||
return;
|
||||
}
|
||||
|
||||
int k_delayed_work_submit(struct k_delayed_work *work,
|
||||
s32_t delay)
|
||||
int k_delayed_work_submit(struct k_delayed_work *work, s32_t delay)
|
||||
{
|
||||
assert(work != NULL && bm_alarm_hash_map != NULL);
|
||||
|
||||
|
@ -141,6 +140,23 @@ int k_delayed_work_submit(struct k_delayed_work *work,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int k_delayed_work_submit_periodic(struct k_delayed_work *work, s32_t period)
|
||||
{
|
||||
assert(work != NULL && bm_alarm_hash_map != NULL);
|
||||
|
||||
osi_alarm_t *alarm = hash_map_get(bm_alarm_hash_map, (void *)work);
|
||||
if (alarm == NULL) {
|
||||
BT_WARN("%s, Unable to find expected alarm in hash map", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Cancel the alarm first before starting it. */
|
||||
osi_alarm_cancel(alarm);
|
||||
osi_alarm_set_periodic(alarm, period);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int k_delayed_work_cancel(struct k_delayed_work *work)
|
||||
{
|
||||
assert(work != NULL && bm_alarm_hash_map != NULL);
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef _MODEL_COMMON_H_
|
||||
#define _MODEL_COMMON_H_
|
||||
#ifndef _CLIENT_COMMON_H_
|
||||
#define _CLIENT_COMMON_H_
|
||||
|
||||
#include "mesh_access.h"
|
||||
|
||||
|
@ -136,5 +136,5 @@ typedef struct {
|
|||
*/
|
||||
int bt_mesh_set_client_model_role(bt_mesh_role_param_t *common);
|
||||
|
||||
#endif /* _MODEL_COMMON_H_ */
|
||||
#endif /* _CLIENT_COMMON_H_ */
|
||||
|
||||
|
|
150
components/bt/esp_ble_mesh/mesh_models/server/device_property.c
Normal file
150
components/bt/esp_ble_mesh/mesh_models/server/device_property.c
Normal file
|
@ -0,0 +1,150 @@
|
|||
// 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.
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "mesh_types.h"
|
||||
|
||||
#include "server_common.h"
|
||||
#include "device_property.h"
|
||||
|
||||
static struct bt_mesh_dev_prop {
|
||||
u16_t prop_id;
|
||||
u8_t len;
|
||||
} device_properties [] = {
|
||||
{ BLE_MESH_INVALID_DEVICE_PROPERTY_ID, 0xFF },
|
||||
{ BLE_MESH_AVERAGE_AMBIENT_TEMPERATURE_IN_A_PERIOD_OF_DAY, 0x03 },
|
||||
{ BLE_MESH_AVERAGE_INPUT_CURRENT, 0x03 },
|
||||
{ BLE_MESH_AVERAGE_INPUT_VOLTAGE, 0x03 },
|
||||
{ BLE_MESH_AVERAGE_OUTPUT_CURRENT, 0x03 },
|
||||
{ BLE_MESH_AVERAGE_OUTPUT_VOLTAGE, 0x03 },
|
||||
{ BLE_MESH_CENTER_BEAM_INTENSITY_AT_FULL_POWER, 0x02 },
|
||||
{ BLE_MESH_CHROMATICITY_TOLERANCE, 0x01 },
|
||||
{ BLE_MESH_COLOR_RENDERING_INDEX_R9, 0x01 },
|
||||
{ BLE_MESH_COLOR_RENDERING_INDEX_RA, 0x01 },
|
||||
{ BLE_MESH_DEVICE_APPEARANCE, 0x02 },
|
||||
{ BLE_MESH_DEVICE_COUNTRY_OF_ORIGIN, 0x02 },
|
||||
{ BLE_MESH_DEVICE_DATE_OF_MANUFACTURE, 0x04 },
|
||||
{ BLE_MESH_DEVICE_ENERGY_USE_SINCE_TURN_ON, 0x04 },
|
||||
{ BLE_MESH_DEVICE_FIRMWARE_REVISION, 0x08 },
|
||||
{ BLE_MESH_DEVICE_GLOBAL_TRADE_ITEM_NUMBER, 0x08 },
|
||||
{ BLE_MESH_DEVICE_HARDWARE_REVISION, 0x16 },
|
||||
{ BLE_MESH_DEVICE_MANUFACTURER_NAME, 0x36 },
|
||||
{ BLE_MESH_DEVICE_MODEL_NUMBER, 0x24 },
|
||||
{ BLE_MESH_DEVICE_OPERATING_TEMPERATURE_RANGE_SPECIFICATION, 0x04 },
|
||||
{ BLE_MESH_DEVICE_OPERATING_TEMPERATURE_STATISTICAL_VALUES, 0x09 },
|
||||
{ BLE_MESH_DEVICE_OVER_TEMPERATURE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_DEVICE_POWER_RANGE_SPECIFICATION, 0x12 },
|
||||
{ BLE_MESH_DEVICE_RUNTIME_SINCE_TURN_ON, 0x04 },
|
||||
{ BLE_MESH_DEVICE_RUNTIME_WARRANTY, 0x04 },
|
||||
{ BLE_MESH_DEVICE_SERIAL_NUMBER, 0x16 },
|
||||
{ BLE_MESH_DEVICE_SOFTWARE_REVISION, 0x08 },
|
||||
{ BLE_MESH_DEVICE_UNDER_TEMPERATURE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INDOOR_AMBIENT_TEMPERATURE_STATISTICAL_VALUES, 0x05 },
|
||||
{ BLE_MESH_INITIAL_CIE_1931_CHROMATICITY_COORDINATES, 0x04 },
|
||||
{ BLE_MESH_INITIAL_CORRELATED_COLOR_TEMPERATURE, 0x02 },
|
||||
{ BLE_MESH_INITIAL_LUMINOUS_FLUX, 0x02 },
|
||||
{ BLE_MESH_INITIAL_PLANCKIAN_DISTANCE, 0x02 },
|
||||
{ BLE_MESH_INPUT_CURRENT_RANGE_SPECIFICATION, 0x06 },
|
||||
{ BLE_MESH_INPUT_CURRENT_STATISTICS, 0x09 },
|
||||
{ BLE_MESH_INPUT_OVER_CURRENT_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INPUT_OVER_RIPPLE_VOLTAGE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INPUT_OVER_VOLTAGE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INPUT_UNDER_CURRENT_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INPUT_UNDER_VOLTAGE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_INPUT_VOLTAGE_RANGE_SPECIFICATION, 0x06 },
|
||||
{ BLE_MESH_INPUT_VOLTAGE_RIPPLE_SPECIFICATION, 0x01 },
|
||||
{ BLE_MESH_INPUT_VOLTAGE_STATISTICS, 0x09 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_LIGHTNESS_ON, 0x02 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_LIGHTNESS_PROLONG, 0x02 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_LIGHTNESS_STANDBY, 0x02 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_REGULATOR_ACCURACY, 0x01 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_REGULATOR_KID, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_REGULATOR_KIU, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_REGULATOR_KPD, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_REGULATOR_KPU, 0x04 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_FADE, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_FADE_ON, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_OCCUPANCY_DELAY, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_PROLONG, 0x03 },
|
||||
{ BLE_MESH_LIGHT_CONTROL_TIME_RUN_ON, 0x03 },
|
||||
{ BLE_MESH_LUMEN_MAINTENANCE_FACTOR, 0x01 },
|
||||
{ BLE_MESH_LUMINOUS_EFFICACY, 0x02 },
|
||||
{ BLE_MESH_LUMINOUS_ENERGY_SINCE_TURN_ON, 0x04 },
|
||||
{ BLE_MESH_LUMINOUS_EXPOSURE, 0x04 },
|
||||
{ BLE_MESH_LUMINOUS_FLUX_RANGE, 0x04 },
|
||||
{ BLE_MESH_MOTION_SENSED, 0x01 },
|
||||
{ BLE_MESH_MOTION_THRESHOLD, 0x01 },
|
||||
{ BLE_MESH_OPEN_CIRCUIT_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_OUTDOOR_STATISTICAL_VALUES, 0x05 },
|
||||
{ BLE_MESH_OUTPUT_CURRENT_RANGE, 0x04 },
|
||||
{ BLE_MESH_OUTPUT_CURRENT_STATISTICS, 0x09 },
|
||||
{ BLE_MESH_OUTPUT_RIPPLE_VOLTAGE_SPECIFICATION, 0x01 },
|
||||
{ BLE_MESH_OUTPUT_VOLTAGE_RANGE, 0x06 },
|
||||
{ BLE_MESH_OUTPUT_VOLTAGE_STATISTICS, 0x09 },
|
||||
{ BLE_MESH_OVER_OUTPUT_RIPPLE_VOLTAGE_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_PEOPLE_COUNT, 0x02 },
|
||||
{ BLE_MESH_PRESENCE_DETECTED, 0x01 },
|
||||
{ BLE_MESH_PRESENT_AMBIENT_LIGHT_LEVEL, 0x04 },
|
||||
{ BLE_MESH_PRESENT_AMBIENT_TEMPERATURE, 0x01 },
|
||||
{ BLE_MESH_PRESENT_CIE_1931_CHROMATICITY, 0x04 },
|
||||
{ BLE_MESH_PRESENT_CORRELATED_COLOR_TEMPERATURE, 0x02 },
|
||||
{ BLE_MESH_PRESENT_DEVICE_INPUT_POWER, 0x04 },
|
||||
{ BLE_MESH_PRESENT_DEVICE_OPERATING_EFFICIENCY, 0x01 },
|
||||
{ BLE_MESH_PRESENT_DEVICE_OPERATING_TEMPERATURE, 0x02 },
|
||||
{ BLE_MESH_PRESENT_ILLUMINANCE, 0x04 },
|
||||
{ BLE_MESH_PRESENT_INDOOR_AMBIENT_TEMPERATURE, 0x01 },
|
||||
{ BLE_MESH_PRESENT_INPUT_CURRENT, 0x02 },
|
||||
{ BLE_MESH_PRESENT_INPUT_RIPPLE_VOLTAGE, 0x01 },
|
||||
{ BLE_MESH_PRESENT_INPUT_VOLTAGE, 0x02 },
|
||||
{ BLE_MESH_PRESENT_LUMINOUS_FLUX, 0x02 },
|
||||
{ BLE_MESH_PRESENT_OUTDOOR_AMBIENT_TEMPERATURE, 0x01 },
|
||||
{ BLE_MESH_PRESENT_OUTPUT_CURRENT, 0x02 },
|
||||
{ BLE_MESH_PRESENT_OUTPUT_VOLTAGE, 0x02 },
|
||||
{ BLE_MESH_PRESENT_PLANCKIAN_DISTANCE, 0x02 },
|
||||
{ BLE_MESH_PRESENT_RELATIVE_OUTPUT_RIPPLE_VOLTAGE, 0x01 },
|
||||
{ BLE_MESH_RELATIVE_DEVICE_ENERGY_USE_IN_A_PERIOD_OF_DAY, 0x06 },
|
||||
{ BLE_MESH_RELATIVE_DEVICE_RUNTIME_IN_A_GENERIC_LEVEL_RANGE, 0x05 },
|
||||
{ BLE_MESH_RELATIVE_EXPOSURE_TIME_IN_AN_ILLUMINANCE_RANGE, 0x09 },
|
||||
{ BLE_MESH_RELATIVE_RUNTIME_IN_A_CORRELATED_COLOR_TEMPERATURE_RANGE, 0x04 },
|
||||
{ BLE_MESH_RELATIVE_RUNTIME_IN_A_DEVICE_OPERATING_TEMPERATURE_RANGE, 0x05 },
|
||||
{ BLE_MESH_RELATIVE_RUNTIME_IN_AN_INPUT_CURRENT_RANGE, 0x05 },
|
||||
{ BLE_MESH_RELATIVE_RUNTIME_IN_AN_INPUT_VOLTAGE_RANGE, 0x05 },
|
||||
{ BLE_MESH_SHORT_CIRCUIT_EVENT_STATISTICS, 0x06 },
|
||||
{ BLE_MESH_TIME_SINCE_MOTION_SENSED, 0x02 },
|
||||
{ BLE_MESH_TIME_SINCE_PRESENCE_DETECTED, 0x02 },
|
||||
{ BLE_MESH_TOTAL_DEVICE_ENERGY_USE, 0x04 },
|
||||
{ BLE_MESH_TOTAL_DEVICE_OFF_ON_CYCLES, 0x04 },
|
||||
{ BLE_MESH_TOTAL_DEVICE_POWER_ON_CYCLES, 0x04 },
|
||||
{ BLE_MESH_TOTAL_DEVICE_POWER_ON_TIME, 0x04 },
|
||||
{ BLE_MESH_TOTAL_DEVICE_RUNTIME, 0x04 },
|
||||
{ BLE_MESH_TOTAL_LIGHT_EXPOSURE_TIME, 0x04 },
|
||||
{ BLE_MESH_TOTAL_LUMINOUS_ENERGY, 0x04 },
|
||||
};
|
||||
|
||||
u8_t bt_mesh_get_dev_prop_len(u16_t prop_id)
|
||||
{
|
||||
if (prop_id > BLE_MESH_TOTAL_LUMINOUS_ENERGY) {
|
||||
BT_ERR("%s, Unknown Device Property ID 0x%04x", __func__, prop_id);
|
||||
return UINT8_MAX;
|
||||
}
|
||||
|
||||
return device_properties[prop_id].len;
|
||||
}
|
2629
components/bt/esp_ble_mesh/mesh_models/server/generic_server.c
Normal file
2629
components/bt/esp_ble_mesh/mesh_models/server/generic_server.c
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,374 @@
|
|||
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
||||
*
|
||||
* Copyright (c) 2018 Vikrant More
|
||||
* Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _GENERIC_SERVER_H_
|
||||
#define _GENERIC_SERVER_H_
|
||||
|
||||
#include "server_common.h"
|
||||
|
||||
struct bt_mesh_gen_onoff_state {
|
||||
u8_t onoff;
|
||||
u8_t target_onoff;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_onoff_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_onoff_state state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_level_state {
|
||||
s16_t level;
|
||||
s16_t target_level;
|
||||
|
||||
s16_t last_level;
|
||||
s32_t last_delta;
|
||||
|
||||
bool move_start;
|
||||
bool positive;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_level_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_level_state state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_level;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_def_trans_time_state {
|
||||
u8_t trans_time;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_def_trans_time_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_def_trans_time_state state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_onpowerup_state {
|
||||
u8_t onpowerup;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_power_onoff_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_onpowerup_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_power_onoff_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_onpowerup_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_power_level_state {
|
||||
u16_t power_actual;
|
||||
u16_t target_power_actual;
|
||||
|
||||
u16_t power_last;
|
||||
u16_t power_default;
|
||||
|
||||
u8_t status_code;
|
||||
u16_t power_range_min;
|
||||
u16_t power_range_max;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_power_level_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_power_level_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_level;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_power_level_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_power_level_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_battery_state {
|
||||
u32_t battery_level : 8,
|
||||
time_to_discharge : 24;
|
||||
u32_t time_to_charge : 24,
|
||||
battery_flags : 8;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_battery_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_battery_state state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_location_state {
|
||||
s32_t global_latitude;
|
||||
s32_t global_longitude;
|
||||
s16_t global_altitude;
|
||||
s16_t local_north;
|
||||
s16_t local_east;
|
||||
s16_t local_altitude;
|
||||
u8_t floor_number;
|
||||
u16_t uncertainty;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_location_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_location_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_location_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_gen_location_state *state;
|
||||
};
|
||||
|
||||
/**
|
||||
* According to the hierarchy of Generic Property states (Model Spec section 3.1.8),
|
||||
* the Manufacturer Properties and Admin Properties may contain multiple Property
|
||||
* states. User Properties just a collection of which can be accessed.
|
||||
*
|
||||
* property_count: Number of the properties contained in the table
|
||||
* properties: Table of the properties
|
||||
*
|
||||
* These variables need to be initialized in the application layer, the precise
|
||||
* number of the properties should be set and memories used to store the property
|
||||
* values should be allocated.
|
||||
*/
|
||||
|
||||
enum bt_mesh_gen_user_prop_access {
|
||||
USER_ACCESS_PROHIBIT,
|
||||
USER_ACCESS_READ,
|
||||
USER_ACCESS_WRITE,
|
||||
USER_ACCESS_READ_WRITE,
|
||||
};
|
||||
|
||||
enum bt_mesh_gen_admin_prop_access {
|
||||
ADMIN_NOT_USER_PROP,
|
||||
ADMIN_ACCESS_READ,
|
||||
ADMIN_ACCESS_WRITE,
|
||||
ADMIN_ACCESS_READ_WRITE,
|
||||
};
|
||||
|
||||
enum bt_mesh_gen_manu_prop_access {
|
||||
MANU_NOT_USER_PROP,
|
||||
MANU_ACCESS_READ,
|
||||
};
|
||||
|
||||
struct bt_mesh_generic_property {
|
||||
u16_t id;
|
||||
u8_t user_access;
|
||||
u8_t admin_access;
|
||||
u8_t manu_access;
|
||||
struct net_buf_simple *val;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_user_prop_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
u8_t property_count;
|
||||
struct bt_mesh_generic_property *properties;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_admin_prop_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
u8_t property_count;
|
||||
struct bt_mesh_generic_property *properties;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_manu_prop_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
u8_t property_count;
|
||||
struct bt_mesh_generic_property *properties;
|
||||
};
|
||||
|
||||
struct bt_mesh_gen_client_prop_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
u8_t id_count;
|
||||
u16_t *property_ids;
|
||||
};
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t onoff;
|
||||
} gen_onoff_set;
|
||||
struct {
|
||||
s16_t level;
|
||||
} gen_level_set;
|
||||
struct {
|
||||
s16_t level;
|
||||
} gen_delta_set;
|
||||
struct {
|
||||
s16_t level;
|
||||
} gen_move_set;
|
||||
struct {
|
||||
u8_t trans_time;
|
||||
} gen_def_trans_time_set;
|
||||
struct {
|
||||
u8_t onpowerup;
|
||||
} gen_onpowerup_set;
|
||||
struct {
|
||||
u16_t power;
|
||||
} gen_power_level_set;
|
||||
struct {
|
||||
u16_t power;
|
||||
} gen_power_default_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} gen_power_range_set;
|
||||
struct {
|
||||
s32_t latitude;
|
||||
s32_t longitude;
|
||||
s16_t altitude;
|
||||
} gen_loc_global_set;
|
||||
struct {
|
||||
s16_t north;
|
||||
s16_t east;
|
||||
s16_t altitude;
|
||||
u8_t floor_number;
|
||||
u16_t uncertainty;
|
||||
} gen_loc_local_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
struct net_buf_simple *value;
|
||||
} gen_user_prop_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
u8_t access;
|
||||
struct net_buf_simple *value;
|
||||
} gen_admin_prop_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
u8_t access;
|
||||
} gen_manu_prop_set;
|
||||
} bt_mesh_gen_server_state_change_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u16_t id;
|
||||
} user_property_get;
|
||||
struct {
|
||||
u16_t id;
|
||||
} admin_property_get;
|
||||
struct {
|
||||
u16_t id;
|
||||
} manu_property_get;
|
||||
struct {
|
||||
u16_t id;
|
||||
} client_properties_get;
|
||||
} bt_mesh_gen_server_recv_get_msg_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
bool op_en;
|
||||
u8_t onoff;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} onoff_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
s16_t level;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} level_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
s32_t delta_level;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} delta_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
s16_t delta_level;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} move_set;
|
||||
struct {
|
||||
u8_t trans_time;
|
||||
} def_trans_time_set;
|
||||
struct {
|
||||
u8_t onpowerup;
|
||||
} onpowerup_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t power;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} power_level_set;
|
||||
struct {
|
||||
u16_t power;
|
||||
} power_default_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} power_range_set;
|
||||
struct {
|
||||
s32_t latitude;
|
||||
s32_t longitude;
|
||||
s16_t altitude;
|
||||
} loc_global_set;
|
||||
struct {
|
||||
s16_t north;
|
||||
s16_t east;
|
||||
s16_t altitude;
|
||||
u8_t floor_number;
|
||||
u16_t uncertainty;
|
||||
} loc_local_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
struct net_buf_simple *value;
|
||||
} user_property_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
u8_t access;
|
||||
struct net_buf_simple *value;
|
||||
} admin_property_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
u8_t access;
|
||||
} manu_property_set;
|
||||
} bt_mesh_gen_server_recv_set_msg_t;
|
||||
|
||||
void bt_mesh_generic_server_lock(void);
|
||||
void bt_mesh_generic_server_unlock(void);
|
||||
|
||||
void gen_onoff_publish(struct bt_mesh_model *model);
|
||||
void gen_level_publish(struct bt_mesh_model *model);
|
||||
void gen_onpowerup_publish(struct bt_mesh_model *model);
|
||||
void gen_power_level_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
|
||||
int bt_mesh_gen_onoff_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_level_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_def_trans_time_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_power_onoff_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_power_onoff_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_power_level_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_power_level_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_battery_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_location_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_location_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_user_prop_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_admin_prop_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_manu_prop_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_gen_client_prop_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
|
||||
#endif /* _GENERIC_SERVER_H_ */
|
|
@ -0,0 +1,516 @@
|
|||
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
||||
*
|
||||
* Copyright (c) 2018 Vikrant More
|
||||
* Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _LIGHTING_SERVER_H_
|
||||
#define _LIGHTING_SERVER_H_
|
||||
|
||||
#include "server_common.h"
|
||||
|
||||
struct bt_mesh_light_lightness_state {
|
||||
u16_t lightness_linear;
|
||||
u16_t target_lightness_linear;
|
||||
|
||||
u16_t lightness_actual;
|
||||
u16_t target_lightness_actual;
|
||||
|
||||
u16_t lightness_last;
|
||||
u16_t lightness_default;
|
||||
|
||||
u8_t status_code;
|
||||
u16_t lightness_range_min;
|
||||
u16_t lightness_range_max;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lightness_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_lightness_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition actual_transition;
|
||||
struct bt_mesh_state_transition linear_transition;
|
||||
s32_t tt_delta_lightness_actual;
|
||||
s32_t tt_delta_lightness_linear;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lightness_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_lightness_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_ctl_state {
|
||||
u16_t lightness;
|
||||
u16_t target_lightness;
|
||||
|
||||
u16_t temperature;
|
||||
u16_t target_temperature;
|
||||
|
||||
s16_t delta_uv;
|
||||
s16_t target_delta_uv;
|
||||
|
||||
u8_t status_code;
|
||||
u16_t temperature_range_min;
|
||||
u16_t temperature_range_max;
|
||||
|
||||
u16_t lightness_default;
|
||||
u16_t temperature_default;
|
||||
s16_t delta_uv_default;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_ctl_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_ctl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_lightness;
|
||||
s32_t tt_delta_temperature;
|
||||
s32_t tt_delta_delta_uv;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_ctl_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_ctl_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_ctl_temp_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_ctl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_temperature;
|
||||
s32_t tt_delta_delta_uv;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_hsl_state {
|
||||
u16_t lightness;
|
||||
u16_t target_lightness;
|
||||
|
||||
u16_t hue;
|
||||
u16_t target_hue;
|
||||
|
||||
u16_t saturation;
|
||||
u16_t target_saturation;
|
||||
|
||||
u16_t lightness_default;
|
||||
u16_t hue_default;
|
||||
u16_t saturation_default;
|
||||
|
||||
u8_t status_code;
|
||||
u16_t hue_range_min;
|
||||
u16_t hue_range_max;
|
||||
u16_t saturation_range_min;
|
||||
u16_t saturation_range_max;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_hsl_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_hsl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_lightness;
|
||||
s32_t tt_delta_hue;
|
||||
s32_t tt_delta_saturation;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_hsl_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_hsl_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_hsl_hue_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_hsl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_hue;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_hsl_sat_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_hsl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_saturation;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_xyl_state {
|
||||
u16_t lightness;
|
||||
u16_t target_lightness;
|
||||
|
||||
u16_t x;
|
||||
u16_t target_x;
|
||||
|
||||
u16_t y;
|
||||
u16_t target_y;
|
||||
|
||||
u16_t lightness_default;
|
||||
u16_t x_default;
|
||||
u16_t y_default;
|
||||
|
||||
u8_t status_code;
|
||||
u16_t x_range_min;
|
||||
u16_t x_range_max;
|
||||
u16_t y_range_min;
|
||||
u16_t y_range_max;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_xyl_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_xyl_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
s32_t tt_delta_lightness;
|
||||
s32_t tt_delta_x;
|
||||
s32_t tt_delta_y;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_xyl_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_xyl_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lc_state {
|
||||
u32_t mode : 1, /* default 0 */
|
||||
occupancy_mode : 1, /* default 1 */
|
||||
light_onoff : 1,
|
||||
target_light_onoff : 1,
|
||||
occupancy : 1,
|
||||
ambient_luxlevel : 24; /* 0x000000 ~ 0xFFFFFF */
|
||||
|
||||
u16_t linear_output; /* 0x0000 ~ 0xFFFF */
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lc_property_state {
|
||||
u32_t time_occupancy_delay; /* 0x003A */
|
||||
u32_t time_fade_on; /* 0x0037 */
|
||||
u32_t time_run_on; /* 0x003C */
|
||||
u32_t time_fade; /* 0x0036 */
|
||||
u32_t time_prolong; /* 0x003B */
|
||||
u32_t time_fade_standby_auto; /* 0x0038 */
|
||||
u32_t time_fade_standby_manual; /* 0x0039 */
|
||||
|
||||
u16_t lightness_on; /* 0x002E */
|
||||
u16_t lightness_prolong; /* 0x002F */
|
||||
u16_t lightness_standby; /* 0x0030 */
|
||||
|
||||
u16_t ambient_luxlevel_on; /* 0x002B, 0x0000 ~ 0xFFFF */
|
||||
u16_t ambient_luxlevel_prolong; /* 0x002C, 0x0000 ~ 0xFFFF */
|
||||
u16_t ambient_luxlevel_standby; /* 0x002D, 0x0000 ~ 0xFFFF */
|
||||
|
||||
float regulator_kiu; /* 0x0033, 0.0 ~ 1000.0, default 250.0 */
|
||||
float regulator_kid; /* 0x0032, 0.0 ~ 1000.0, default 25.0 */
|
||||
float regulator_kpu; /* 0x0035, 0.0 ~ 1000.0, default 80.0 */
|
||||
float regulator_kpd; /* 0x0034, 0.0 ~ 1000.0, default 80.0 */
|
||||
s8_t regulator_accuracy; /* 0x0031, 0.0 ~ 100.0, default 2.0 */
|
||||
|
||||
u32_t set_occupancy_to_1_delay;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
LC_OFF,
|
||||
LC_STANDBY,
|
||||
LC_FADE_ON,
|
||||
LC_RUN,
|
||||
LC_FADE,
|
||||
LC_PROLONG,
|
||||
LC_FADE_STANDBY_AUTO,
|
||||
LC_FADE_STANDBY_MANUAL,
|
||||
} bt_mesh_lc_state;
|
||||
|
||||
struct bt_mesh_light_lc_state_machine {
|
||||
struct {
|
||||
u8_t fade_on;
|
||||
u8_t fade;
|
||||
u8_t fade_standby_auto;
|
||||
u8_t fade_standby_manual;
|
||||
} trans_time;
|
||||
bt_mesh_lc_state state;
|
||||
struct k_delayed_work timer;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_control {
|
||||
struct bt_mesh_light_lc_state state;
|
||||
struct bt_mesh_light_lc_property_state prop_state;
|
||||
struct bt_mesh_light_lc_state_machine state_machine;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lc_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_control *lc;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
};
|
||||
|
||||
struct bt_mesh_light_lc_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_light_control *lc;
|
||||
};
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} lightness_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} lightness_linear_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} lightness_default_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} lightness_range_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
} ctl_set;
|
||||
struct {
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
} ctl_temp_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} ctl_temp_range_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
} ctl_default_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t hue;
|
||||
u16_t saturation;
|
||||
} hsl_set;
|
||||
struct {
|
||||
u16_t hue;
|
||||
} hsl_hue_set;
|
||||
struct {
|
||||
u16_t saturation;
|
||||
} hsl_saturation_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t hue;
|
||||
u16_t saturation;
|
||||
} hsl_default_set;
|
||||
struct {
|
||||
u16_t hue_range_min;
|
||||
u16_t hue_range_max;
|
||||
u16_t sat_range_min;
|
||||
u16_t sat_range_max;
|
||||
} hsl_range_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t x;
|
||||
u16_t y;
|
||||
} xyl_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t x;
|
||||
u16_t y;
|
||||
} xyl_default_set;
|
||||
struct {
|
||||
u16_t x_range_min;
|
||||
u16_t x_range_max;
|
||||
u16_t y_range_min;
|
||||
u16_t y_range_max;
|
||||
} xyl_range_set;
|
||||
struct {
|
||||
u8_t mode;
|
||||
} lc_mode_set;
|
||||
struct {
|
||||
u8_t mode;
|
||||
} lc_om_set;
|
||||
struct {
|
||||
u8_t onoff;
|
||||
} lc_light_onoff_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
struct net_buf_simple *value;
|
||||
} lc_property_set;
|
||||
struct {
|
||||
u16_t property_id;
|
||||
union {
|
||||
u8_t occupancy;
|
||||
u32_t set_occupancy_to_1_delay;
|
||||
u32_t ambient_luxlevel;
|
||||
} state;
|
||||
} sensor_status;
|
||||
} bt_mesh_light_server_state_change_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u16_t id;
|
||||
} lc_property_get;
|
||||
} bt_mesh_light_server_recv_get_msg_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t lightness;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} lightness_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t lightness;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} lightness_linear_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} lightness_default_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} lightness_range_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t lightness;
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} ctl_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} ctl_temp_set;
|
||||
struct {
|
||||
u16_t range_min;
|
||||
u16_t range_max;
|
||||
} ctl_temp_range_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
} ctl_default_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t lightness;
|
||||
u16_t hue;
|
||||
u16_t saturation;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} hsl_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t hue;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} hsl_hue_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t saturation;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} hsl_saturation_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t hue;
|
||||
u16_t saturation;
|
||||
} hsl_default_set;
|
||||
struct {
|
||||
u16_t hue_range_min;
|
||||
u16_t hue_range_max;
|
||||
u16_t sat_range_min;
|
||||
u16_t sat_range_max;
|
||||
} hsl_range_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t lightness;
|
||||
u16_t x;
|
||||
u16_t y;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} xyl_set;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
u16_t x;
|
||||
u16_t y;
|
||||
} xyl_default_set;
|
||||
struct {
|
||||
u16_t x_range_min;
|
||||
u16_t x_range_max;
|
||||
u16_t y_range_min;
|
||||
u16_t y_range_max;
|
||||
} xyl_range_set;
|
||||
struct {
|
||||
u8_t mode;
|
||||
} lc_mode_set;
|
||||
struct {
|
||||
u8_t mode;
|
||||
} lc_om_set;
|
||||
struct {
|
||||
bool op_en;
|
||||
u8_t light_onoff;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} lc_light_onoff_set;
|
||||
struct {
|
||||
u16_t id;
|
||||
struct net_buf_simple *value;
|
||||
} lc_property_set;
|
||||
} bt_mesh_light_server_recv_set_msg_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
struct net_buf_simple *data;
|
||||
} sensor_status;
|
||||
} bt_mesh_light_server_recv_status_msg_t;
|
||||
|
||||
void bt_mesh_light_server_lock(void);
|
||||
void bt_mesh_light_server_unlock(void);
|
||||
|
||||
u8_t *bt_mesh_get_lc_prop_value(struct bt_mesh_model *model, u16_t prop_id);
|
||||
|
||||
void light_lightness_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
void light_ctl_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
void light_hsl_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
void light_xyl_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
void light_lc_publish(struct bt_mesh_model *model, u16_t opcode);
|
||||
|
||||
int bt_mesh_light_lightness_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_lightness_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_ctl_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_ctl_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_ctl_temp_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_hsl_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_hsl_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_hsl_hue_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_hsl_sat_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_xyl_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_xyl_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_lc_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_light_lc_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
|
||||
#endif /* _LIGHTING_SERVER_H_ */
|
|
@ -0,0 +1,249 @@
|
|||
// 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_ */
|
|
@ -0,0 +1,127 @@
|
|||
// 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 _SERVER_COMMON_H_
|
||||
#define _SERVER_COMMON_H_
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "mesh_buf.h"
|
||||
#include "mesh_access.h"
|
||||
#include "mesh_kernel.h"
|
||||
|
||||
#define BLE_MESH_SERVER_RSP_MAX_LEN 384
|
||||
|
||||
#define BLE_MESH_SERVER_TRANS_MIC_SIZE 4
|
||||
|
||||
#define BLE_MESH_CHECK_SEND_STATUS(_func) do { \
|
||||
int __status = (_func); \
|
||||
if (__status) { \
|
||||
BT_ERR("%s, Send failed, err %d", __func__, __status); \
|
||||
} \
|
||||
} while(0);
|
||||
|
||||
#define BLE_MESH_STATE_OFF 0x00
|
||||
#define BLE_MESH_STATE_ON 0x01
|
||||
#define BLE_MESH_STATE_RESTORE 0x02
|
||||
|
||||
/* Following 4 values are as per Mesh Model specification */
|
||||
#define BLE_MESH_LIGHTNESS_MIN 0x0001
|
||||
#define BLE_MESH_LIGHTNESS_MAX 0xFFFF
|
||||
#define BLE_MESH_TEMPERATURE_MIN 0x0320
|
||||
#define BLE_MESH_TEMPERATURE_MAX 0x4E20
|
||||
#define BLE_MESH_TEMPERATURE_UNKNOWN 0xFFFF
|
||||
|
||||
/* Refer 7.2 of Mesh Model Specification */
|
||||
#define BLE_MESH_RANGE_UPDATE_SUCCESS 0x00
|
||||
#define BLE_MESH_CANNOT_SET_RANGE_MIN 0x01
|
||||
#define BLE_MESH_CANNOT_SET_RANGE_MAX 0x02
|
||||
|
||||
#define BLE_MESH_UNKNOWN_REMAIN_TIME 0x3F
|
||||
#define BLE_MESH_DEVICE_SPECIFIC_RESOLUTION 10
|
||||
|
||||
#define BLE_MESH_INVALID_DEVICE_PROPERTY_ID 0x0000
|
||||
|
||||
enum {
|
||||
BLE_MESH_TRANS_TIMER_START, /* Proper transition timer has been started */
|
||||
BLE_MESH_TRANS_FLAG_MAX,
|
||||
};
|
||||
|
||||
struct bt_mesh_state_transition {
|
||||
bool just_started;
|
||||
|
||||
u8_t trans_time;
|
||||
u8_t remain_time;
|
||||
u8_t delay;
|
||||
u32_t quo_tt;
|
||||
u32_t counter;
|
||||
u32_t total_duration;
|
||||
s64_t start_timestamp;
|
||||
|
||||
BLE_MESH_ATOMIC_DEFINE(flag, BLE_MESH_TRANS_FLAG_MAX);
|
||||
struct k_delayed_work timer;
|
||||
};
|
||||
|
||||
struct bt_mesh_last_msg_info {
|
||||
u8_t tid;
|
||||
u16_t src;
|
||||
u16_t dst;
|
||||
s64_t timestamp;
|
||||
};
|
||||
|
||||
#define BLE_MESH_SERVER_RSP_BY_APP 0
|
||||
#define BLE_MESH_SERVER_AUTO_RSP 1
|
||||
|
||||
struct bt_mesh_server_rsp_ctrl {
|
||||
/**
|
||||
* @brief BLE Mesh Server Response Option
|
||||
* 1. If get_auto_rsp is set to BLE_MESH_SERVER_RSP_BY_APP, then the response
|
||||
* of Client Get messages need to be replied by the application;
|
||||
* 2. If get_auto_rsp is set to BLE_MESH_SERVER_AUTO_RSP, then the response
|
||||
* of Client Get messages will be replied by the server models;
|
||||
* 3. If set_auto_rsp is set to BLE_MESH_SERVER_RSP_BY_APP, then the response
|
||||
* of Client Set messages need to be replied by the application;
|
||||
* 4. If set_auto_rsp is set to BLE_MESH_SERVER_AUTO_RSP, then the response
|
||||
* of Client Set messages will be replied by the server models;
|
||||
* 5. If status_auto_rsp is set to BLE_MESH_SERVER_RSP_BY_APP, then the response
|
||||
* of Server Status messages need to be replied by the application;
|
||||
* 6. If status_auto_rsp is set to BLE_MESH_SERVER_AUTO_RSP, then the response
|
||||
* of Server status messages will be replied by the server models;
|
||||
*/
|
||||
u8_t get_auto_rsp : 1, /* Response for Client Get messages */
|
||||
set_auto_rsp : 1, /* Response for Client Set messages */
|
||||
status_auto_rsp : 1; /* Response for Server Status messages */
|
||||
};
|
||||
|
||||
u8_t bt_mesh_get_default_trans_time(struct bt_mesh_model *model);
|
||||
|
||||
int bt_mesh_get_light_lc_trans_time(struct bt_mesh_model *model, u8_t *trans_time);
|
||||
|
||||
int bt_mesh_server_get_optional(struct bt_mesh_model *model,
|
||||
struct net_buf_simple *buf,
|
||||
u8_t *trans_time, u8_t *delay,
|
||||
bool *optional);
|
||||
|
||||
void bt_mesh_server_alloc_ctx(struct k_work *work);
|
||||
|
||||
bool bt_mesh_is_server_recv_last_msg(struct bt_mesh_last_msg_info *last,
|
||||
u8_t tid, u16_t src, u16_t dst, s64_t *now);
|
||||
|
||||
void bt_mesh_server_update_last_msg(struct bt_mesh_last_msg_info *last,
|
||||
u8_t tid, u16_t src, u16_t dst, s64_t *now);
|
||||
|
||||
struct net_buf_simple *bt_mesh_server_get_pub_msg(struct bt_mesh_model *model, u16_t msg_len);
|
||||
|
||||
#endif /* _SERVER_COMMON_H_ */
|
|
@ -0,0 +1,92 @@
|
|||
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
||||
*
|
||||
* Copyright (c) 2018 Vikrant More
|
||||
* Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _STATE_BINDING_H_
|
||||
#define _STATE_BINDING_H_
|
||||
|
||||
typedef enum {
|
||||
GENERIC_ONOFF_STATE,
|
||||
GENERIC_LEVEL_STATE,
|
||||
GENERIC_ONPOWERUP_STATE,
|
||||
GENERIC_POWER_ACTUAL_STATE,
|
||||
LIGHT_LIGHTNESS_ACTUAL_STATE,
|
||||
LIGHT_LIGHTNESS_LINEAR_STATE,
|
||||
LIGHT_CTL_LIGHTNESS_STATE,
|
||||
LIGHT_CTL_TEMP_DELTA_UV_STATE,
|
||||
LIGHT_HSL_LIGHTNESS_STATE,
|
||||
LIGHT_HSL_HUE_STATE,
|
||||
LIGHT_HSL_SATURATION_STATE,
|
||||
LIGHT_XYL_LIGHTNESS_STATE,
|
||||
LIGHT_LC_LIGHT_ONOFF_STATE,
|
||||
BIND_STATE_MAX,
|
||||
} bt_mesh_server_state_type_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t onoff;
|
||||
} gen_onoff;
|
||||
struct {
|
||||
s16_t level;
|
||||
} gen_level;
|
||||
struct {
|
||||
u8_t onpowerup;
|
||||
} gen_onpowerup;
|
||||
struct {
|
||||
u16_t power;
|
||||
} gen_power_actual;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} light_lightness_actual;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} light_lightness_linear;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} light_ctl_lightness;
|
||||
struct {
|
||||
u16_t temperature;
|
||||
s16_t delta_uv;
|
||||
} light_ctl_temp_delta_uv;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} light_hsl_lightness;
|
||||
struct {
|
||||
u16_t hue;
|
||||
} light_hsl_hue;
|
||||
struct {
|
||||
u16_t saturation;
|
||||
} light_hsl_saturation;
|
||||
struct {
|
||||
u16_t lightness;
|
||||
} light_xyl_lightness;
|
||||
struct {
|
||||
u8_t onoff;
|
||||
} light_lc_light_onoff;
|
||||
} bt_mesh_server_state_value_t;
|
||||
|
||||
u16_t bt_mesh_convert_lightness_actual_to_linear(u16_t actual);
|
||||
|
||||
u16_t bt_mesh_convert_lightness_linear_to_actual(u16_t linear);
|
||||
|
||||
s16_t bt_mesh_convert_temperature_to_gen_level(u16_t temp, u16_t min, u16_t max);
|
||||
|
||||
u16_t bt_mesh_covert_gen_level_to_temperature(s16_t level, u16_t min, u16_t max);
|
||||
|
||||
s16_t bt_mesh_convert_hue_to_level(u16_t hue);
|
||||
|
||||
u16_t bt_mesh_convert_level_to_hue(s16_t level);
|
||||
|
||||
s16_t bt_mesh_convert_saturation_to_level(u16_t saturation);
|
||||
|
||||
u16_t bt_mesh_convert_level_to_saturation(s16_t level);
|
||||
|
||||
int bt_mesh_update_binding_state(struct bt_mesh_model *model,
|
||||
bt_mesh_server_state_type_t type,
|
||||
bt_mesh_server_state_value_t *value);
|
||||
|
||||
#endif /* _STATE_BINDING_H_ */
|
|
@ -0,0 +1,91 @@
|
|||
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
||||
*
|
||||
* Copyright (c) 2018 Vikrant More
|
||||
* Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _STATE_TRANSITION_H_
|
||||
#define _STATE_TRANSITION_H_
|
||||
|
||||
#include "server_common.h"
|
||||
#include "generic_server.h"
|
||||
#include "lighting_server.h"
|
||||
#include "time_scene_server.h"
|
||||
|
||||
void bt_mesh_server_calc_remain_time(struct bt_mesh_state_transition *transition);
|
||||
|
||||
/* APIs used to get server model transtion time values */
|
||||
|
||||
void generic_onoff_tt_values(struct bt_mesh_gen_onoff_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void generic_level_tt_values(struct bt_mesh_gen_level_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void generic_power_level_tt_values(struct bt_mesh_gen_power_level_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_lightness_actual_tt_values(struct bt_mesh_light_lightness_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_lightness_linear_tt_values(struct bt_mesh_light_lightness_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_ctl_tt_values(struct bt_mesh_light_ctl_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_ctl_temp_tt_values(struct bt_mesh_light_ctl_temp_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_hsl_tt_values(struct bt_mesh_light_hsl_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_hsl_hue_tt_values(struct bt_mesh_light_hsl_hue_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_hsl_sat_tt_values(struct bt_mesh_light_hsl_sat_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_xyl_tt_values(struct bt_mesh_light_xyl_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void light_lc_tt_values(struct bt_mesh_light_lc_srv *srv,
|
||||
u8_t trans_time, u8_t delay);
|
||||
|
||||
void scene_tt_values(struct bt_mesh_scene_srv *srv, u8_t trans_time, u8_t delay);
|
||||
|
||||
/* Server model transtion timer handlers */
|
||||
|
||||
void generic_onoff_work_handler(struct k_work *work);
|
||||
|
||||
void generic_level_work_handler(struct k_work *work);
|
||||
|
||||
void generic_power_level_work_handler(struct k_work *work);
|
||||
|
||||
void light_lightness_actual_work_handler(struct k_work *work);
|
||||
|
||||
void light_lightness_linear_work_handler(struct k_work *work);
|
||||
|
||||
void light_ctl_work_handler(struct k_work *work);
|
||||
|
||||
void light_ctl_temp_work_handler(struct k_work *work);
|
||||
|
||||
void light_hsl_work_handler(struct k_work *work);
|
||||
|
||||
void light_hsl_hue_work_handler(struct k_work *work);
|
||||
|
||||
void light_hsl_sat_work_handler(struct k_work *work);
|
||||
|
||||
void light_xyl_work_handler(struct k_work *work);
|
||||
|
||||
void light_lc_work_handler(struct k_work *work);
|
||||
|
||||
void scene_recall_work_handler(struct k_work *work);
|
||||
|
||||
void bt_mesh_server_stop_transition(struct bt_mesh_state_transition *transition);
|
||||
|
||||
void bt_mesh_server_start_transition(struct bt_mesh_state_transition *transition);
|
||||
|
||||
#endif /* _STATE_TRANSITION_H_ */
|
|
@ -0,0 +1,393 @@
|
|||
// 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 _TIME_SCENE_SERVER_H_
|
||||
#define _TIME_SCENE_SERVER_H_
|
||||
|
||||
#include "mesh_slist.h"
|
||||
#include "mesh_kernel.h"
|
||||
#include "server_common.h"
|
||||
|
||||
/**
|
||||
* 1. Mesh defines times based on International Atomic Time (TAI). The base
|
||||
* representation of times is the number of seconds after 00:00:00 TAI
|
||||
* on 2000-01-01 (that is, 1999-12-31 T23:59:28 UTC).
|
||||
* 2. UTC: Coordinated Universal Time. For more information, please refer
|
||||
* to https://time.is/zh/UTC
|
||||
* 3. For the algorithm used for the transfer between TAI and UTC, please
|
||||
* refer to Mesh Model Spec Section 5.1.1
|
||||
*/
|
||||
|
||||
#define UNKNOWN_TAI_SECONDS 0x0000000000
|
||||
#define UNKNOWN_TAI_ZONE_CHANGE 0x0000000000
|
||||
#define UNKNOWN_TAI_DELTA_CHANGE 0x0000000000
|
||||
#define TAI_UTC_DELAT_MAX_VALUE 0x7FFF
|
||||
#define TAI_SECONDS_LEN 0x05
|
||||
#define TAI_OF_ZONE_CHANGE_LEN 0x05
|
||||
#define TAI_OF_DELTA_CHANGE_LEN 0x05
|
||||
|
||||
#define INVALID_SCENE_NUMBER 0x0000
|
||||
#define SCENE_NUMBER_LEN 0x02
|
||||
|
||||
#define SCHEDULE_YEAR_ANY_YEAR 0x64
|
||||
|
||||
#define SCHEDULE_DAY_ANY_DAY 0x00
|
||||
|
||||
#define SCHEDULE_HOUR_ANY_HOUR 0x18
|
||||
#define SCHEDULE_HOUR_ONCE_A_DAY 0x19
|
||||
|
||||
#define SCHEDULE_SEC_ANY_OF_HOUR 0x3C
|
||||
#define SCHEDULE_SEC_EVERY_15_MIN 0x3D
|
||||
#define SCHEDULE_SEC_EVERY_20_MIN 0x3E
|
||||
#define SCHEDULE_SEC_ONCE_AN_HOUR 0x3F
|
||||
|
||||
#define SCHEDULE_SEC_ANY_OF_MIN 0x3C
|
||||
#define SCHEDULE_SEC_EVERY_15_SEC 0x3D
|
||||
#define SCHEDULE_SEC_EVERY_20_SEC 0x3E
|
||||
#define SCHEDULE_SEC_ONCE_AN_MIN 0x3F
|
||||
|
||||
#define SCHEDULE_ACT_TURN_OFF 0x00
|
||||
#define SCHEDULE_ACT_TURN_ON 0x01
|
||||
#define SCHEDULE_ACT_SCENE_RECALL 0x02
|
||||
#define SCHEDULE_ACT_NO_ACTION 0x0F
|
||||
|
||||
#define SCHEDULE_SCENE_NO_SCENE 0x0000
|
||||
|
||||
#define SCHEDULE_ENTRY_MAX_INDEX 0x0F
|
||||
|
||||
#define TIME_NONE 0x00
|
||||
#define TIME_AUTHORITY 0x01
|
||||
#define TIME_RELAY 0x02
|
||||
#define TIME_CLINET 0x03
|
||||
|
||||
#define SCENE_SUCCESS 0x00
|
||||
#define SCENE_REG_FULL 0x01
|
||||
#define SCENE_NOT_FOUND 0x02
|
||||
|
||||
/**
|
||||
* The Time state represents the present TAI time, the current TAI-UTC Delta
|
||||
* and local time zone offset, and the next change to each of the latter
|
||||
* (e.g., because of a switch from winter to summer time or an announced leap
|
||||
* second). It consists of 10 fields with a total size of 183 bits.
|
||||
*/
|
||||
struct bt_mesh_time_state {
|
||||
struct {
|
||||
u8_t tai_seconds[5];
|
||||
u8_t subsecond;
|
||||
u8_t uncertainty;
|
||||
u8_t time_zone_offset_curr;
|
||||
u8_t time_zone_offset_new;
|
||||
u8_t tai_zone_change[5];
|
||||
u16_t time_authority : 1,
|
||||
tai_utc_delta_curr : 15;
|
||||
u16_t tai_utc_delta_new : 15;
|
||||
u8_t tai_delta_change[5];
|
||||
} time;
|
||||
u8_t time_role;
|
||||
};
|
||||
|
||||
struct bt_mesh_time_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_time_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_time_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_time_state *state;
|
||||
};
|
||||
|
||||
struct scene_register {
|
||||
u16_t scene_number;
|
||||
u8_t scene_type; /* Indicate the type of scene value */
|
||||
/**
|
||||
* Scene value may use a union to represent later, the union contains
|
||||
* structures of all the model states which can be stored in a scene.
|
||||
*/
|
||||
struct net_buf_simple *scene_value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Scenes serve as memory banks for storage of states (e.g., a power level
|
||||
* or a light level/color). Values of states of an element can be stored
|
||||
* as a scene and can be recalled later from the scene memory.
|
||||
*
|
||||
* A scene is represented by a Scene Number, which is a 16-bit non-zero,
|
||||
* mesh-wide value. (There can be a maximum of 65535 scenes in a mesh
|
||||
* network.) The meaning of a scene, as well as the state storage container
|
||||
* associated with it, are determined by a model.
|
||||
*
|
||||
* The Scenes state change may start numerous parallel model transitions.
|
||||
* In that case, each individual model handles the transition internally.
|
||||
*
|
||||
* The scene transition is defined as a group of individual model transitions
|
||||
* started by a Scene Recall operation. The scene transition is in progress
|
||||
* when at least one transition from the group of individual model transitions
|
||||
* is in progress.
|
||||
*/
|
||||
struct bt_mesh_scenes_state {
|
||||
const u16_t scene_count;
|
||||
struct scene_register *scenes;
|
||||
|
||||
/**
|
||||
* The Current Scene state is a 16-bit value that contains either the Scene
|
||||
* Number of the currently active scene or a value of 0x0000 when no scene
|
||||
* is active.
|
||||
*
|
||||
* When a Scene Store operation or a Scene Recall operation completes with
|
||||
* success, the Current Scene state value shall be to the Scene Number used
|
||||
* during that operation.
|
||||
*
|
||||
* When the Current Scene Number is deleted from a Scene Register state as a
|
||||
* result of Scene Delete operation, the Current Scene state shall be set to
|
||||
* 0x0000.
|
||||
*
|
||||
* When any of the element's state that is marked as “Stored with Scene” has
|
||||
* changed not as a result of a Scene Recall operation, the value of the
|
||||
* Current Scene state shall be set to 0x0000.
|
||||
*
|
||||
* When a scene transition is in progress, the value of the Current Scene
|
||||
* state shall be set to 0x0000.
|
||||
*/
|
||||
u16_t current_scene;
|
||||
|
||||
/**
|
||||
* The Target Scene state is a 16-bit value that contains the target Scene
|
||||
* Number when a scene transition is in progress.
|
||||
*
|
||||
* When the scene transition is in progress and the target Scene Number is
|
||||
* deleted from a Scene Register state as a result of Scene Delete operation,
|
||||
* the Target Scene state shall be set to 0x0000.
|
||||
*
|
||||
* When the scene transition is in progress and a new Scene Number is stored
|
||||
* in the Scene Register as a result of Scene Store operation, the Target
|
||||
* Scene state shall be set to the new Scene Number.
|
||||
*
|
||||
* When the scene transition is not in progress, the value of the Target Scene
|
||||
* state shall be set to 0x0000.
|
||||
*/
|
||||
u16_t target_scene;
|
||||
|
||||
/* Indicate the status code for the last operation */
|
||||
u8_t status_code;
|
||||
|
||||
/* Indicate if scene transition is in progress */
|
||||
bool in_progress;
|
||||
};
|
||||
|
||||
struct bt_mesh_scene_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_scenes_state *state;
|
||||
struct bt_mesh_last_msg_info last;
|
||||
struct bt_mesh_state_transition transition;
|
||||
};
|
||||
|
||||
struct bt_mesh_scene_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_scenes_state *state;
|
||||
};
|
||||
|
||||
struct schedule_register {
|
||||
bool in_use;
|
||||
u64_t year : 7,
|
||||
month : 12,
|
||||
day : 5,
|
||||
hour : 5,
|
||||
minute : 6,
|
||||
second : 6,
|
||||
day_of_week : 7,
|
||||
action : 4,
|
||||
trans_time : 8;
|
||||
u16_t scene_number;
|
||||
};
|
||||
|
||||
struct bt_mesh_scheduler_state {
|
||||
const u8_t schedule_count;
|
||||
struct schedule_register *schedules; /* Up to 16 scheduled entries */
|
||||
|
||||
/**
|
||||
* A recommended implementation of the Scheduler should calculate the
|
||||
* value of the TAI Seconds of the next scheduled event and put it in
|
||||
* a queue of scheduled events sorted by time.
|
||||
*
|
||||
* Every second, the first event in the queue is compared with the value
|
||||
* of the Time state. The first event is executed if it is less than or
|
||||
* equal to the Time state and then removed from the queue. After
|
||||
* execution, the Repeat Flag shall be checked, and the next occurrence
|
||||
* of the scheduled event is calculated and put in the queue.
|
||||
*
|
||||
* One second timeout value, and compare the first event in queue with the
|
||||
* Time state. If it is satisfied, then execute the first event. Also the
|
||||
* Repeat Flag need to be checked, if it is set then the event needs to
|
||||
* be put into the end of queue.
|
||||
*
|
||||
* sys_slist_t event_queue;
|
||||
*
|
||||
* For each event_queue item, it can use the following struct:
|
||||
* struct schedule_event {
|
||||
* sys_snode_t node;
|
||||
* u8_t event_index;
|
||||
* };
|
||||
*
|
||||
* Also we need a "struct k_delayed_work track_timer" which can be used to
|
||||
* track the schedule timer and handle proper scheduled events.
|
||||
*/
|
||||
};
|
||||
|
||||
struct bt_mesh_scheduler_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_scheduler_state *state;
|
||||
};
|
||||
|
||||
struct bt_mesh_scheduler_setup_srv {
|
||||
struct bt_mesh_model *model;
|
||||
struct bt_mesh_server_rsp_ctrl rsp_ctrl;
|
||||
struct bt_mesh_scheduler_state *state;
|
||||
};
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t tai_seconds[5];
|
||||
u8_t subsecond;
|
||||
u8_t uncertainty;
|
||||
u16_t time_authority : 1;
|
||||
u16_t tai_utc_delta_curr : 15;
|
||||
u8_t time_zone_offset_curr;
|
||||
} time_set;
|
||||
struct {
|
||||
u8_t tai_seconds[5];
|
||||
u8_t subsecond;
|
||||
u8_t uncertainty;
|
||||
u16_t time_authority : 1;
|
||||
u16_t tai_utc_delta_curr : 15;
|
||||
u8_t time_zone_offset_curr;
|
||||
} time_status;
|
||||
struct {
|
||||
u8_t time_zone_offset_new;
|
||||
u8_t tai_zone_change[5];
|
||||
} time_zone_set;
|
||||
struct {
|
||||
u16_t tai_utc_delta_new : 15;
|
||||
u8_t tai_delta_change[5];
|
||||
} tai_utc_delta_set;
|
||||
struct {
|
||||
u8_t role;
|
||||
} time_role_set;
|
||||
struct {
|
||||
u16_t scene_number;
|
||||
} scene_store;
|
||||
struct {
|
||||
u16_t scene_number;
|
||||
} scene_recall;
|
||||
struct {
|
||||
u16_t scene_number;
|
||||
} scene_delete;
|
||||
struct {
|
||||
u64_t index : 4,
|
||||
year : 7,
|
||||
month : 12,
|
||||
day : 5,
|
||||
hour : 5,
|
||||
minute : 6,
|
||||
second : 6,
|
||||
day_of_week : 7,
|
||||
action : 4,
|
||||
trans_time : 8;
|
||||
u16_t scene_number;
|
||||
} scheduler_act_set;
|
||||
} bt_mesh_time_scene_server_state_change_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t index;
|
||||
} scheduler_act_get;
|
||||
} bt_mesh_time_scene_server_recv_get_msg_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t tai_seconds[5];
|
||||
u8_t subsecond;
|
||||
u8_t uncertainty;
|
||||
u16_t time_authority : 1;
|
||||
u16_t tai_utc_delta : 15;
|
||||
u8_t time_zone_offset;
|
||||
} time_set;
|
||||
struct {
|
||||
u8_t time_zone_offset_new;
|
||||
u8_t tai_zone_change[5];
|
||||
} time_zone_set;
|
||||
struct {
|
||||
u16_t tai_utc_delta_new : 15;
|
||||
u16_t padding : 1;
|
||||
u8_t tai_delta_change[5];
|
||||
} tai_utc_delta_set;
|
||||
struct {
|
||||
u8_t time_role;
|
||||
} time_role_set;
|
||||
struct {
|
||||
u16_t scene_number;
|
||||
} scene_store;
|
||||
struct {
|
||||
bool op_en;
|
||||
u16_t scene_number;
|
||||
u8_t tid;
|
||||
u8_t trans_time;
|
||||
u8_t delay;
|
||||
} scene_recall;
|
||||
struct {
|
||||
u16_t scene_number;
|
||||
} scene_delete;
|
||||
struct {
|
||||
u64_t index : 4,
|
||||
year : 7,
|
||||
month : 12,
|
||||
day : 5,
|
||||
hour : 5,
|
||||
minute : 6,
|
||||
second : 6,
|
||||
day_of_week : 7,
|
||||
action : 4,
|
||||
trans_time : 8;
|
||||
u16_t scene_number;
|
||||
} scheduler_act_set;
|
||||
} bt_mesh_time_scene_server_recv_set_msg_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u8_t tai_seconds[5];
|
||||
u8_t subsecond;
|
||||
u8_t uncertainty;
|
||||
u16_t time_authority : 1;
|
||||
u16_t tai_utc_delta : 15;
|
||||
u8_t time_zone_offset;
|
||||
} time_status;
|
||||
} bt_mesh_time_scene_server_recv_status_msg_t;
|
||||
|
||||
void bt_mesh_time_scene_server_lock(void);
|
||||
void bt_mesh_time_scene_server_unlock(void);
|
||||
|
||||
void scene_publish(struct bt_mesh_model *model, struct bt_mesh_msg_ctx *ctx, u16_t opcode);
|
||||
|
||||
int bt_mesh_time_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_time_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_scene_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_scene_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_scheduler_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
int bt_mesh_scheduler_setup_srv_init(struct bt_mesh_model *model, bool primary);
|
||||
|
||||
#endif /* _TIME_SCENE_SERVER_H_ */
|
3333
components/bt/esp_ble_mesh/mesh_models/server/lighting_server.c
Normal file
3333
components/bt/esp_ble_mesh/mesh_models/server/lighting_server.c
Normal file
File diff suppressed because it is too large
Load diff
1088
components/bt/esp_ble_mesh/mesh_models/server/sensor_server.c
Normal file
1088
components/bt/esp_ble_mesh/mesh_models/server/sensor_server.c
Normal file
File diff suppressed because it is too large
Load diff
237
components/bt/esp_ble_mesh/mesh_models/server/server_common.c
Normal file
237
components/bt/esp_ble_mesh/mesh_models/server/server_common.c
Normal file
|
@ -0,0 +1,237 @@
|
|||
// 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.
|
||||
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "osi/allocator.h"
|
||||
|
||||
#include "mesh_types.h"
|
||||
#include "mesh_kernel.h"
|
||||
#include "mesh_trace.h"
|
||||
#include "mesh.h"
|
||||
#include "access.h"
|
||||
#include "model_opcode.h"
|
||||
|
||||
#include "server_common.h"
|
||||
#include "state_binding.h"
|
||||
#include "state_transition.h"
|
||||
|
||||
/**
|
||||
* According to Mesh Model Spec:
|
||||
* If the Transition Time field is not present and the Generic Default Transition
|
||||
* Time state is supported, the Generic Default Transition Time state shall be
|
||||
* used. Otherwise the transition shall be instantaneous.
|
||||
*/
|
||||
#define INSTANTANEOUS_TRANS_TIME 0
|
||||
|
||||
u8_t bt_mesh_get_default_trans_time(struct bt_mesh_model *model)
|
||||
{
|
||||
/**
|
||||
* 1. If a Generic Default Transition Time Server model is present on the
|
||||
* main element of the model, that model instance shall be used.
|
||||
* 2. If a Generic Default Transition Time Server model is not present on
|
||||
* the main element of the model, then the Generic Default Transition
|
||||
* Time Server model instance that is present on the element with the
|
||||
* largest address that is smaller than the address of the main element
|
||||
* of the node shall be used; if no model instance is present on any
|
||||
* element with an address smaller than the address of the main element,
|
||||
* then the Generic Default Transition Time Server is not supported.
|
||||
*/
|
||||
struct bt_mesh_elem *element = bt_mesh_model_elem(model);
|
||||
struct bt_mesh_gen_def_trans_time_srv *state = NULL;
|
||||
u16_t primary_addr = bt_mesh_primary_addr();
|
||||
struct bt_mesh_model *srv = NULL;
|
||||
|
||||
for (u16_t addr = element->addr; addr >= primary_addr; addr--) {
|
||||
element = bt_mesh_elem_find(addr);
|
||||
if (element) {
|
||||
srv = bt_mesh_model_find(element, BLE_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV);
|
||||
if (srv) {
|
||||
state = (struct bt_mesh_gen_def_trans_time_srv *)srv->user_data;
|
||||
if (state) {
|
||||
return state->state.trans_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return INSTANTANEOUS_TRANS_TIME;
|
||||
}
|
||||
|
||||
int bt_mesh_get_light_lc_trans_time(struct bt_mesh_model *model, u8_t *trans_time)
|
||||
{
|
||||
struct bt_mesh_light_lc_srv *srv = NULL;
|
||||
u32_t value;
|
||||
|
||||
if (model == NULL || trans_time == NULL) {
|
||||
BT_ERR("%s, Invalid parameter", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_LC_SRV) {
|
||||
BT_ERR("%s, Not a Light LC Server", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
srv = (struct bt_mesh_light_lc_srv *)model->user_data;
|
||||
if (srv == NULL) {
|
||||
BT_ERR("%s, Invalid Light LC Server user_data", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Set transition time to 0x54 for BQB test case MESH/SR/LLC/BV-04-C.
|
||||
* Light LC Property Set: 0x3C, 0x004E20 -> Light LC Time Run On
|
||||
* Light LC Property Set: 0x37, 0x004E20 -> Light LC Time Fade On
|
||||
* Light LC Property Set: 0x39, 0x004E20 -> Light LC Time Fade Standby Manual
|
||||
*
|
||||
* 2. Set transition time to 0x0 for BQB test case MESH/SR/LLC/BV-08-C.
|
||||
*
|
||||
* TODO: Based on Light LC state and choose property property value as the
|
||||
* transition time. Currently directly use Light LC Time Run On property value.
|
||||
* Unit: Millisecond, range: [0, 16777214(0xFFFFFE)]
|
||||
*/
|
||||
value = srv->lc->prop_state.time_run_on & 0xFFFFFF;
|
||||
|
||||
/**
|
||||
* Convert value into Default Transition Time state format.
|
||||
* 0b00: 0 ~ 6.2s, 100 millisecond step resolution
|
||||
* 0b01: 0 ~ 62s, 1 second step resolution
|
||||
* 0b10: 0 ~ 620s, 10 seconds step resolution
|
||||
* 0b11: 0 ~ 620m, 10 minutes step resolution
|
||||
*/
|
||||
if (value <= 6200) {
|
||||
*trans_time = (0 << 6) | (value / 100);
|
||||
} else if (value <= 62000) {
|
||||
*trans_time = (1 << 6) | (value / 1000);
|
||||
} else if (value <= 620000) {
|
||||
*trans_time = (2 << 6) | (value / 10000);
|
||||
} else {
|
||||
*trans_time = (3 << 6) | (value / 600000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bt_mesh_server_get_optional(struct bt_mesh_model *model,
|
||||
struct net_buf_simple *buf,
|
||||
u8_t *trans_time, u8_t *delay,
|
||||
bool *optional)
|
||||
{
|
||||
if (model == NULL || buf == NULL || trans_time == NULL ||
|
||||
delay == NULL || optional == NULL) {
|
||||
BT_ERR("%s, Invalid parameter", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (buf->len != 0x00 && buf->len != 0x02) {
|
||||
BT_ERR("%s, Invalid optional message length %d", __func__, buf->len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* No optional fields are available */
|
||||
if (buf->len == 0x00) {
|
||||
if (model->id == BLE_MESH_MODEL_ID_LIGHT_LC_SRV) {
|
||||
/**
|
||||
* Both messages(i.e. Light LC OnOff Set/Set Unack) may optionally include
|
||||
* a Transition Time field indicating the transition time to the target state.
|
||||
* If the Transition Time is not included, the Light LC Server shall use
|
||||
* its appropriate transition times defined by the Light LC Property states.
|
||||
*/
|
||||
if (bt_mesh_get_light_lc_trans_time(model, trans_time)) {
|
||||
BT_ERR("%s, Failed to get Light LC transition time", __func__);
|
||||
return -EIO;
|
||||
}
|
||||
} else {
|
||||
*trans_time = bt_mesh_get_default_trans_time(model);
|
||||
}
|
||||
*delay = 0U;
|
||||
*optional = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Optional fields are available */
|
||||
*trans_time = net_buf_simple_pull_u8(buf);
|
||||
if ((*trans_time & 0x3F) == 0x3F) {
|
||||
BT_ERR("%s, Invalid Transaction Number of Steps 0x3F", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*delay = net_buf_simple_pull_u8(buf);
|
||||
*optional = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bt_mesh_server_alloc_ctx(struct k_work *work)
|
||||
{
|
||||
/**
|
||||
* This function is used to allocate memory for storing "struct bt_mesh_msg_ctx"
|
||||
* of the received messages, because some server models will callback the "struct
|
||||
* bt_mesh_msg_ctx" info to the application layer after a certain delay.
|
||||
* Here we use the allocated heap memory to store the "struct bt_mesh_msg_ctx".
|
||||
*/
|
||||
__ASSERT(work, "%s, Invalid parameter", __func__);
|
||||
work->_reserved = osi_calloc(sizeof(struct bt_mesh_msg_ctx));
|
||||
__ASSERT(work->_reserved, "%s, Failed to allocate memory", __func__);
|
||||
}
|
||||
|
||||
bool bt_mesh_is_server_recv_last_msg(struct bt_mesh_last_msg_info *last,
|
||||
u8_t tid, u16_t src, u16_t dst, s64_t *now)
|
||||
{
|
||||
*now = k_uptime_get();
|
||||
|
||||
if (last->tid == tid && last->src == src && last->dst == dst &&
|
||||
(*now - last->timestamp <= K_SECONDS(6))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void bt_mesh_server_update_last_msg(struct bt_mesh_last_msg_info *last,
|
||||
u8_t tid, u16_t src, u16_t dst, s64_t *now)
|
||||
{
|
||||
last->tid = tid;
|
||||
last->src = src;
|
||||
last->dst = dst;
|
||||
last->timestamp = *now;
|
||||
return;
|
||||
}
|
||||
|
||||
struct net_buf_simple *bt_mesh_server_get_pub_msg(struct bt_mesh_model *model, u16_t msg_len)
|
||||
{
|
||||
struct net_buf_simple *buf = NULL;
|
||||
|
||||
if (model == NULL) {
|
||||
BT_ERR("%s, Invalid parameter", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (model->pub == NULL || model->pub->msg == NULL ||
|
||||
model->pub->addr == BLE_MESH_ADDR_UNASSIGNED) {
|
||||
BT_DBG("%s, Model 0x%04x has no publication support", __func__, model->id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf = model->pub->msg;
|
||||
if (buf->size < msg_len) {
|
||||
BT_ERR("%s, Too small publication msg size %d, model 0x%04x",
|
||||
__func__, buf->size, model->id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
342
components/bt/esp_ble_mesh/mesh_models/server/state_binding.c
Normal file
342
components/bt/esp_ble_mesh/mesh_models/server/state_binding.c
Normal file
|
@ -0,0 +1,342 @@
|
|||
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
||||
*
|
||||
* Copyright (c) 2018 Vikrant More
|
||||
* Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "mesh_types.h"
|
||||
#include "mesh_kernel.h"
|
||||
#include "mesh_trace.h"
|
||||
#include "mesh.h"
|
||||
|
||||
#include "model_opcode.h"
|
||||
#include "server_common.h"
|
||||
#include "state_binding.h"
|
||||
#include "state_transition.h"
|
||||
#include "generic_server.h"
|
||||
#include "lighting_server.h"
|
||||
|
||||
#define MINDIFF (2.25e-308)
|
||||
|
||||
static float bt_mesh_sqrt(float square)
|
||||
{
|
||||
float root, last, diff;
|
||||
|
||||
root = square / 3.0;
|
||||
diff = 1;
|
||||
|
||||
if (square <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
do {
|
||||
last = root;
|
||||
root = (root + square / root) / 2.0;
|
||||
diff = root - last;
|
||||
} while (diff > MINDIFF || diff < -MINDIFF);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
static s32_t bt_mesh_ceiling(float num)
|
||||
{
|
||||
s32_t inum = (s32_t)num;
|
||||
|
||||
if (num == (float)inum) {
|
||||
return inum;
|
||||
}
|
||||
|
||||
return inum + 1;
|
||||
}
|
||||
|
||||
u16_t bt_mesh_convert_lightness_actual_to_linear(u16_t actual)
|
||||
{
|
||||
float tmp = ((float) actual / UINT16_MAX);
|
||||
|
||||
return bt_mesh_ceiling(UINT16_MAX * tmp * tmp);
|
||||
}
|
||||
|
||||
u16_t bt_mesh_convert_lightness_linear_to_actual(u16_t linear)
|
||||
{
|
||||
return (u16_t) (UINT16_MAX * bt_mesh_sqrt(((float) linear / UINT16_MAX)));
|
||||
}
|
||||
|
||||
s16_t bt_mesh_convert_temperature_to_gen_level(u16_t temp, u16_t min, u16_t max)
|
||||
{
|
||||
float tmp = (temp - min) * UINT16_MAX / (max - min);
|
||||
return (s16_t) (tmp + INT16_MIN);
|
||||
}
|
||||
|
||||
u16_t bt_mesh_covert_gen_level_to_temperature(s16_t level, u16_t min, u16_t max)
|
||||
{
|
||||
float diff = (float) (max - min) / UINT16_MAX;
|
||||
u16_t tmp = (u16_t) ((level - INT16_MIN) * diff);
|
||||
return (u16_t) (min + tmp);
|
||||
}
|
||||
|
||||
s16_t bt_mesh_convert_hue_to_level(u16_t hue)
|
||||
{
|
||||
return (s16_t) (hue + INT16_MIN);
|
||||
}
|
||||
|
||||
u16_t bt_mesh_convert_level_to_hue(s16_t level)
|
||||
{
|
||||
return (u16_t) (level - INT16_MIN);
|
||||
}
|
||||
|
||||
s16_t bt_mesh_convert_saturation_to_level(u16_t saturation)
|
||||
{
|
||||
return (s16_t) (saturation + INT16_MIN);
|
||||
}
|
||||
|
||||
u16_t bt_mesh_convert_level_to_saturation(s16_t level)
|
||||
{
|
||||
return (u16_t) (level - INT16_MIN);
|
||||
}
|
||||
|
||||
int bt_mesh_update_binding_state(struct bt_mesh_model *model,
|
||||
bt_mesh_server_state_type_t type,
|
||||
bt_mesh_server_state_value_t *value)
|
||||
{
|
||||
if (model == NULL || model->user_data == NULL ||
|
||||
value == NULL || type > BIND_STATE_MAX) {
|
||||
BT_ERR("%s, Invalid parameter", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case GENERIC_ONOFF_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_GEN_ONOFF_SRV) {
|
||||
BT_ERR("%s, Not a Generic OnOff Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_gen_onoff_srv *srv = model->user_data;
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state.onoff = value->gen_onoff.onoff;
|
||||
gen_onoff_publish(model);
|
||||
break;
|
||||
}
|
||||
case GENERIC_LEVEL_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_GEN_LEVEL_SRV) {
|
||||
BT_ERR("%s, Not a Generic Level Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_gen_level_srv *srv = model->user_data;
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state.level = value->gen_level.level;
|
||||
gen_level_publish(model);
|
||||
break;
|
||||
}
|
||||
case GENERIC_ONPOWERUP_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV) {
|
||||
BT_ERR("%s, Not a Generic Power OnOff Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_gen_power_onoff_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Generic Power OnOff Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
srv->state->onpowerup = value->gen_onpowerup.onpowerup;
|
||||
gen_onpowerup_publish(model);
|
||||
break;
|
||||
}
|
||||
case GENERIC_POWER_ACTUAL_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV) {
|
||||
BT_ERR("%s, Not a Generic Power Level Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_gen_power_level_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Generic Power Level Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->power_actual = value->gen_power_actual.power;
|
||||
/**
|
||||
* Whenever the Generic Power Actual state is changed to a non-zero value
|
||||
* as a result of a non-transactional message or a completed sequence of
|
||||
* transactional messages, the value of the Generic Power Last state shall
|
||||
* be set to the value of the Generic Power Actual state.
|
||||
*/
|
||||
if (srv->state->power_actual) {
|
||||
srv->state->power_last = srv->state->power_actual;
|
||||
}
|
||||
gen_power_level_publish(model, BLE_MESH_MODEL_OP_GEN_POWER_LEVEL_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_LIGHTNESS_ACTUAL_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV) {
|
||||
BT_ERR("%s, Not a Light Lightness Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_lightness_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light Lightness Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->actual_transition);
|
||||
srv->state->lightness_actual = value->light_lightness_actual.lightness;
|
||||
light_lightness_publish(model, BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_LIGHTNESS_LINEAR_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV) {
|
||||
BT_ERR("%s, Not a Light Lightness Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_lightness_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light Lightness Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->linear_transition);
|
||||
srv->state->lightness_linear = value->light_lightness_linear.lightness;
|
||||
light_lightness_publish(model, BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_LINEAR_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_CTL_LIGHTNESS_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_CTL_SRV) {
|
||||
BT_ERR("%s, Not a Light CTL Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_ctl_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light CTL Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->lightness = value->light_ctl_lightness.lightness;
|
||||
light_ctl_publish(model, BLE_MESH_MODEL_OP_LIGHT_CTL_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_CTL_TEMP_DELTA_UV_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV) {
|
||||
BT_ERR("%s, Not a Light CTL Temperature Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_ctl_temp_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light CTL Temperature Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->temperature = value->light_ctl_temp_delta_uv.temperature;
|
||||
srv->state->delta_uv = value->light_ctl_temp_delta_uv.delta_uv;
|
||||
light_ctl_publish(model, BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_HSL_LIGHTNESS_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_HSL_SRV) {
|
||||
BT_ERR("%s, Not a Light HSL Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_hsl_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light HSL Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->lightness = value->light_hsl_lightness.lightness;
|
||||
light_hsl_publish(model, BLE_MESH_MODEL_OP_LIGHT_HSL_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_HSL_HUE_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV) {
|
||||
BT_ERR("%s, Not a Light HSL Hue Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_hsl_hue_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light HSL Hue Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->hue = value->light_hsl_hue.hue;
|
||||
light_hsl_publish(model, BLE_MESH_MODEL_OP_LIGHT_HSL_HUE_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_HSL_SATURATION_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV) {
|
||||
BT_ERR("%s, Not a Light HSL Saturation Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_hsl_sat_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light HSL Saturation Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->saturation = value->light_hsl_saturation.saturation;
|
||||
light_hsl_publish(model, BLE_MESH_MODEL_OP_LIGHT_HSL_SATURATION_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_XYL_LIGHTNESS_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_XYL_SRV) {
|
||||
BT_ERR("%s, Not a Light xyL Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_xyl_srv *srv = model->user_data;
|
||||
if (srv->state == NULL) {
|
||||
BT_ERR("%s, Invalid Light xyL Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->state->lightness = value->light_xyl_lightness.lightness;
|
||||
light_xyl_publish(model, BLE_MESH_MODEL_OP_LIGHT_XYL_STATUS);
|
||||
break;
|
||||
}
|
||||
case LIGHT_LC_LIGHT_ONOFF_STATE: {
|
||||
if (model->id != BLE_MESH_MODEL_ID_LIGHT_LC_SRV) {
|
||||
BT_ERR("%s, Not a Light LC Server Model, id 0x%04x", __func__, model->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct bt_mesh_light_lc_srv *srv = model->user_data;
|
||||
if (srv->lc == NULL) {
|
||||
BT_ERR("%s, Invalid Light LC Server state", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_mesh_server_stop_transition(&srv->transition);
|
||||
srv->lc->state.light_onoff = value->light_lc_light_onoff.onoff;
|
||||
light_lc_publish(model, BLE_MESH_MODEL_OP_LIGHT_LC_LIGHT_ONOFF_STATUS);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BT_WARN("%s, Unknown binding state type 0x%02x", __func__, type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
1034
components/bt/esp_ble_mesh/mesh_models/server/state_transition.c
Normal file
1034
components/bt/esp_ble_mesh/mesh_models/server/state_transition.c
Normal file
File diff suppressed because it is too large
Load diff
1424
components/bt/esp_ble_mesh/mesh_models/server/time_scene_server.c
Normal file
1424
components/bt/esp_ble_mesh/mesh_models/server/time_scene_server.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue