223 lines
7.3 KiB
C
223 lines
7.3 KiB
C
/*
|
|
* Copyright (c) 2020 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @defgroup bt_mesh_chat_cli
|
|
* @{
|
|
* @brief API for the Bluetooth Mesh Chat Client model.
|
|
*/
|
|
|
|
#ifndef BT_MESH_CHAT_CLI_H__
|
|
#define BT_MESH_CHAT_CLI_H__
|
|
|
|
#include <zephyr/bluetooth/mesh.h>
|
|
#include <bluetooth/mesh/model_types.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* .. include_startingpoint_chat_cli_rst_1 */
|
|
/** Company ID of the Bluetooth Mesh Chat Client model. */
|
|
#define BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID CONFIG_BT_COMPANY_ID_NORDIC
|
|
|
|
/** Model ID of the Bluetooth Mesh Chat Client model. */
|
|
#define BT_MESH_CHAT_CLI_VENDOR_MODEL_ID 0x000A
|
|
|
|
/** Non-private message opcode. */
|
|
#define BT_MESH_CHAT_CLI_OP_MESSAGE BT_MESH_MODEL_OP_3(0x0A, \
|
|
BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID)
|
|
|
|
/** Private message opcode. */
|
|
#define BT_MESH_CHAT_CLI_OP_PRIVATE_MESSAGE BT_MESH_MODEL_OP_3(0x0B, \
|
|
BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID)
|
|
|
|
/** Message reply opcode. */
|
|
#define BT_MESH_CHAT_CLI_OP_MESSAGE_REPLY BT_MESH_MODEL_OP_3(0x0C, \
|
|
BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID)
|
|
|
|
/** Presence message opcode. */
|
|
#define BT_MESH_CHAT_CLI_OP_PRESENCE BT_MESH_MODEL_OP_3(0x0D, \
|
|
BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID)
|
|
|
|
/** Presence get message opcode. */
|
|
#define BT_MESH_CHAT_CLI_OP_PRESENCE_GET BT_MESH_MODEL_OP_3(0x0E, \
|
|
BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID)
|
|
/* .. include_endpoint_chat_cli_rst_1 */
|
|
|
|
#define BT_MESH_CHAT_CLI_MSG_MINLEN_MESSAGE 1
|
|
#define BT_MESH_CHAT_CLI_MSG_MAXLEN_MESSAGE (\
|
|
CONFIG_BT_MESH_CHAT_CLI_MESSAGE_LENGTH \
|
|
+ 1) /* + \0 */
|
|
#define BT_MESH_CHAT_CLI_MSG_LEN_MESSAGE_REPLY 0
|
|
#define BT_MESH_CHAT_CLI_MSG_LEN_PRESENCE 1
|
|
#define BT_MESH_CHAT_CLI_MSG_LEN_PRESENCE_GET 0
|
|
|
|
/** Bluetooth Mesh Chat Client Presence values. */
|
|
enum bt_mesh_chat_cli_presence {
|
|
BT_MESH_CHAT_CLI_PRESENCE_AVAILABLE,
|
|
BT_MESH_CHAT_CLI_PRESENCE_AWAY,
|
|
BT_MESH_CHAT_CLI_PRESENCE_INACTIVE,
|
|
BT_MESH_CHAT_CLI_PRESENCE_DO_NOT_DISTURB
|
|
};
|
|
|
|
/* Forward declaration of the Bluetooth Mesh Chat Client model context. */
|
|
struct bt_mesh_chat_cli;
|
|
|
|
/* .. include_startingpoint_chat_cli_rst_2 */
|
|
/** @def BT_MESH_MODEL_CHAT_CLI
|
|
*
|
|
* @brief Bluetooth Mesh Chat Client model composition data entry.
|
|
*
|
|
* @param[in] _chat Pointer to a @ref bt_mesh_chat_cli instance.
|
|
*/
|
|
#define BT_MESH_MODEL_CHAT_CLI(_chat) \
|
|
BT_MESH_MODEL_VND_CB(BT_MESH_CHAT_CLI_VENDOR_COMPANY_ID, \
|
|
BT_MESH_CHAT_CLI_VENDOR_MODEL_ID, \
|
|
_bt_mesh_chat_cli_op, &(_chat)->pub, \
|
|
BT_MESH_MODEL_USER_DATA(struct bt_mesh_chat_cli, \
|
|
_chat), \
|
|
&_bt_mesh_chat_cli_cb)
|
|
/* .. include_endpoint_chat_cli_rst_2 */
|
|
|
|
/** Bluetooth Mesh Chat Client model handlers. */
|
|
struct bt_mesh_chat_cli_handlers {
|
|
/** @brief Called after the node has been provisioned, or after all
|
|
* mesh data has been loaded from persistent storage.
|
|
*
|
|
* @param[in] cli Chat Client instance that has been started.
|
|
*/
|
|
void (*const start)(struct bt_mesh_chat_cli *chat);
|
|
|
|
/** @brief Handler for a presence message.
|
|
*
|
|
* @param[in] cli Chat client instance that received the text message.
|
|
* @param[in] ctx Context of the incoming message.
|
|
* @param[in] presence Presence of a Chat Client that published
|
|
* the message.
|
|
*/
|
|
void (*const presence)(struct bt_mesh_chat_cli *chat,
|
|
struct bt_mesh_msg_ctx *ctx,
|
|
enum bt_mesh_chat_cli_presence presence);
|
|
|
|
/** @brief Handler for a non-private text message.
|
|
*
|
|
* @param[in] cli Chat client instance that received the text message.
|
|
* @param[in] ctx Context of the incoming message.
|
|
* @param[in] msg Pointer to a received text message terminated with
|
|
* a null character, '\0'.
|
|
*/
|
|
void (*const message)(struct bt_mesh_chat_cli *chat,
|
|
struct bt_mesh_msg_ctx *ctx,
|
|
const uint8_t *msg);
|
|
|
|
/** @brief Handler for a private message.
|
|
*
|
|
* @param[in] cli Chat client that received the text message.
|
|
* @param[in] ctx Context of the incoming message.
|
|
* @param[in] msg Pointer to a received text message terminated with
|
|
* a null character, '\0'.
|
|
*/
|
|
void (*const private_message)(struct bt_mesh_chat_cli *chat,
|
|
struct bt_mesh_msg_ctx *ctx,
|
|
const uint8_t *msg);
|
|
|
|
/** @brief Handler for a reply on a private message.
|
|
*
|
|
* @param[in] cli Chat client instance that received the reply.
|
|
* @param[in] ctx Context of the incoming message.
|
|
*/
|
|
void (*const message_reply)(struct bt_mesh_chat_cli *chat,
|
|
struct bt_mesh_msg_ctx *ctx);
|
|
};
|
|
|
|
/* .. include_startingpoint_chat_cli_rst_3 */
|
|
/**
|
|
* Bluetooth Mesh Chat Client model context.
|
|
*/
|
|
struct bt_mesh_chat_cli {
|
|
/** Access model pointer. */
|
|
const struct bt_mesh_model *model;
|
|
/** Publish parameters. */
|
|
struct bt_mesh_model_pub pub;
|
|
/** Publication message. */
|
|
struct net_buf_simple pub_msg;
|
|
/** Publication message buffer. */
|
|
uint8_t buf[BT_MESH_MODEL_BUF_LEN(BT_MESH_CHAT_CLI_OP_MESSAGE,
|
|
BT_MESH_CHAT_CLI_MSG_MAXLEN_MESSAGE)];
|
|
/** Handler function structure. */
|
|
const struct bt_mesh_chat_cli_handlers *handlers;
|
|
/** Current Presence value. */
|
|
enum bt_mesh_chat_cli_presence presence;
|
|
};
|
|
/* .. include_endpoint_chat_cli_rst_3 */
|
|
|
|
/** @brief Set the client presence and publish the presence to the mesh network.
|
|
*
|
|
* @param[in] chat Chat Client model instance to set presence on.
|
|
* @param[in] presence Presence status to be published.
|
|
*
|
|
* @retval 0 Successfully set the preceive and sent the message.
|
|
* @retval -EADDRNOTAVAIL Publishing is not configured.
|
|
* @retval -EAGAIN The device has not been provisioned.
|
|
*/
|
|
int bt_mesh_chat_cli_presence_set(struct bt_mesh_chat_cli *chat,
|
|
enum bt_mesh_chat_cli_presence presence);
|
|
|
|
/** @brief Get current presence value of a chat client.
|
|
*
|
|
* @param[in] chat Chat Client model instance to send the message.
|
|
* @param[in] addr Address of the chat client to get presence value of.
|
|
*
|
|
* @retval 0 Successfully sent the message.
|
|
* @retval -EINVAL The model is not bound to an application key.
|
|
* @retval -EAGAIN The device has not been provisioned.
|
|
*/
|
|
int bt_mesh_chat_cli_presence_get(struct bt_mesh_chat_cli *chat,
|
|
uint16_t addr);
|
|
|
|
/** @brief Send a text message.
|
|
*
|
|
* @param[in] cli Chat Client model instance to send the message.
|
|
* @param[in] msg Pointer to a text message to send. Must be terminated with
|
|
* a null character, '\0'.
|
|
*
|
|
* @retval 0 Successfully sent the message.
|
|
* @retval -EADDRNOTAVAIL Publishing is not configured.
|
|
* @retval -EAGAIN The device has not been provisioned.
|
|
*/
|
|
int bt_mesh_chat_cli_message_send(struct bt_mesh_chat_cli *chat,
|
|
const uint8_t *msg);
|
|
|
|
/** @brief Send a text message to a specified destination.
|
|
*
|
|
* @param[in] cli Chat Client model instance to send the message.
|
|
* @param[in] addr Address of the chat client to send message to.
|
|
* @param[in] msg Pointer to a text message to send. Must be terminated with
|
|
* a null character, '\0'.
|
|
*
|
|
* @retval 0 Successfully sent the message.
|
|
* @retval -EINVAL The model is not bound to an application key.
|
|
* @retval -EAGAIN The device has not been provisioned.
|
|
*/
|
|
int bt_mesh_chat_cli_private_message_send(struct bt_mesh_chat_cli *chat,
|
|
uint16_t addr,
|
|
const uint8_t *msg);
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
extern const struct bt_mesh_model_op _bt_mesh_chat_cli_op[];
|
|
extern const struct bt_mesh_model_cb _bt_mesh_chat_cli_cb;
|
|
/** @endcond */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* BT_MESH_CHAT_CLI_H__ */
|
|
|
|
/** @} */
|