AC63_BT_SDK/apps/mesh/MshMDL/gen_lvl_cli.c
2025-02-18 15:40:42 +08:00

237 lines
7.0 KiB
C

/*
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include "btstack/bluetooth.h"
#include "system/includes.h"
#include "bt_common.h"
#include "api/sig_mesh_api.h"
#include "model_api.h"
#include "msg.h"
#include "api/gen_lvl.h"
#include "api/gen_lvl_cli.h"
#include "model_utils.h"
#if (CONFIG_BT_MESH_GEN_LVL_CLI)
#define LOG_TAG "[Gen_lvl_cli]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
static int handle_status(const struct bt_mesh_model *model,
struct bt_mesh_msg_ctx *ctx,
struct net_buf_simple *buf)
{
if (buf->len != BT_MESH_LVL_MSG_MINLEN_STATUS &&
buf->len != BT_MESH_LVL_MSG_MAXLEN_STATUS) {
return -EMSGSIZE;
}
log_info("handle_status");
return 0;
}
const struct bt_mesh_model_op _bt_mesh_lvl_cli_op[] = {
{
BT_MESH_LVL_OP_STATUS,
BT_MESH_LEN_MIN(BT_MESH_LVL_MSG_MINLEN_STATUS),
handle_status,
},
BT_MESH_MODEL_OP_END,
};
static int bt_mesh_lvl_init(const struct bt_mesh_model *model)
{
log_info("bt_mesh_lvl_init");
return 0;
}
static void bt_mesh_lvl_reset(const struct bt_mesh_model *model)
{
log_info("bt_mesh_lvl_reset");
}
const struct bt_mesh_model_cb _bt_mesh_lvl_cli_cb = {
.init = bt_mesh_lvl_init,
.reset = bt_mesh_lvl_reset,
};
int bt_mesh_lvl_cli_get(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
struct bt_mesh_lvl_status *rsp)
{
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_GET,
BT_MESH_LVL_MSG_LEN_GET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_GET);
struct bt_mesh_msg_rsp_ctx rsp_ctx = {
.ack = &cli->ack_ctx,
.op = BT_MESH_LVL_OP_STATUS,
.user_data = rsp,
.timeout = model_ackd_timeout_get(cli->model, ctx),
};
return bt_mesh_msg_ackd_send(cli->model, ctx, &msg, rsp ? &rsp_ctx : NULL);
}
int bt_mesh_lvl_cli_set(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_set *set,
struct bt_mesh_lvl_status *rsp)
{
if (set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_SET,
BT_MESH_LVL_MSG_MAXLEN_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_SET);
net_buf_simple_add_le16(&msg, set->lvl);
net_buf_simple_add_u8(&msg, cli->tid);
if (set->transition) {
model_transition_buf_add(&msg, set->transition);
}
struct bt_mesh_msg_rsp_ctx rsp_ctx = {
.ack = &cli->ack_ctx,
.op = BT_MESH_LVL_OP_STATUS,
.user_data = rsp,
.timeout = model_ackd_timeout_get(cli->model, ctx),
};
return bt_mesh_msg_ackd_send(cli->model, ctx, &msg, rsp ? &rsp_ctx : NULL);
}
int bt_mesh_lvl_cli_set_unack(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_set *set)
{
if (set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_SET_UNACK,
BT_MESH_LVL_MSG_MAXLEN_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_SET_UNACK);
net_buf_simple_add_le16(&msg, set->lvl);
net_buf_simple_add_u8(&msg, cli->tid);
if (set->transition) {
model_transition_buf_add(&msg, set->transition);
}
return bt_mesh_msg_send(cli->model, ctx, &msg);
}
int bt_mesh_lvl_cli_delta_set(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_delta_set *delta_set,
struct bt_mesh_lvl_status *rsp)
{
if (delta_set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_DELTA_SET,
BT_MESH_LVL_MSG_MAXLEN_DELTA_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_DELTA_SET);
net_buf_simple_add_le32(&msg, delta_set->delta);
net_buf_simple_add_u8(&msg, cli->tid);
if (delta_set->transition) {
model_transition_buf_add(&msg, delta_set->transition);
}
struct bt_mesh_msg_rsp_ctx rsp_ctx = {
.ack = &cli->ack_ctx,
.op = BT_MESH_LVL_OP_STATUS,
.user_data = rsp,
.timeout = model_ackd_timeout_get(cli->model, ctx),
};
return bt_mesh_msg_ackd_send(cli->model, ctx, &msg, rsp ? &rsp_ctx : NULL);
}
int bt_mesh_lvl_cli_delta_set_unack(
struct bt_mesh_lvl_cli *cli, struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_delta_set *delta_set)
{
if (delta_set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_DELTA_SET_UNACK,
BT_MESH_LVL_MSG_MAXLEN_DELTA_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_DELTA_SET_UNACK);
net_buf_simple_add_le32(&msg, delta_set->delta);
net_buf_simple_add_u8(&msg, cli->tid);
if (delta_set->transition) {
model_transition_buf_add(&msg, delta_set->transition);
}
return bt_mesh_msg_send(cli->model, ctx, &msg);
}
int bt_mesh_lvl_cli_move_set(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_move_set *move_set,
struct bt_mesh_lvl_status *rsp)
{
if (move_set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_MOVE_SET,
BT_MESH_LVL_MSG_MAXLEN_MOVE_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_MOVE_SET);
net_buf_simple_add_le16(&msg, move_set->delta);
net_buf_simple_add_u8(&msg, cli->tid);
if (move_set->transition) {
model_transition_buf_add(&msg, move_set->transition);
}
struct bt_mesh_msg_rsp_ctx rsp_ctx = {
.ack = &cli->ack_ctx,
.op = BT_MESH_LVL_OP_STATUS,
.user_data = rsp,
.timeout = model_ackd_timeout_get(cli->model, ctx),
};
log_info(">>>>>>>>>>bt_mesh_lvl_cli_move_set");
return bt_mesh_msg_ackd_send(cli->model, ctx, &msg, rsp ? &rsp_ctx : NULL);
}
int bt_mesh_lvl_cli_move_set_unack(struct bt_mesh_lvl_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_lvl_move_set *move_set)
{
log_info(">>>>>>>>>>bt_mesh_lvl_cli_move_set_unack");
if (move_set->new_transaction) {
cli->tid++;
}
BT_MESH_MODEL_BUF_DEFINE(msg, BT_MESH_LVL_OP_MOVE_SET_UNACK,
BT_MESH_LVL_MSG_MAXLEN_MOVE_SET);
bt_mesh_model_msg_init(&msg, BT_MESH_LVL_OP_MOVE_SET_UNACK);
net_buf_simple_add_le16(&msg, move_set->delta);
net_buf_simple_add_u8(&msg, cli->tid);
if (move_set->transition) {
model_transition_buf_add(&msg, move_set->transition);
}
return bt_mesh_msg_send(cli->model, ctx, &msg);
}
#endif