zephyr/subsys/bluetooth/services/ots/ots_internal.h

149 lines
4.4 KiB
C

/*
* Copyright (c) 2020-2022 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef BT_GATT_OTS_INTERNAL_H_
#define BT_GATT_OTS_INTERNAL_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <zephyr/types.h>
#include "ots_l2cap_internal.h"
#include "ots_oacp_internal.h"
#include "ots_olcp_internal.h"
/**
* Both OACP and OLCP have same max size of 7 bytes
*
* Table 3.10: Format of OACP Response Value
* OACP Response Value contains
* 1 octet Procedure code
* 1 octet Request op code
* 1 octet Result Code
* 4 octet CRC checksum (if present)
*
* Table 3.24: Format of the OLCP Response Value
* 1 octet Procedure code
* 1 octet Request op code
* 1 octet Result Code
* 0 or 4 octets Response Parameter
*
**/
#define OACP_OLCP_RES_MAX_SIZE 7
#define BT_OTS_VALID_OBJ_ID(id) (IN_RANGE((id), BT_OTS_OBJ_ID_MIN, BT_OTS_OBJ_ID_MAX) || \
(id) == OTS_OBJ_ID_DIR_LIST)
#define BT_OTS_SET_METADATA_REQ_NAME(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_NAME)
#define BT_OTS_SET_METADATA_REQ_TYPE(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_TYPE)
#define BT_OTS_SET_METADATA_REQ_SIZE(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_SIZE)
#define BT_OTS_SET_METADATA_REQ_CREATED(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_CREATED)
#define BT_OTS_SET_METADATA_REQ_MODIFIED(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_MODIFIED)
#define BT_OTS_SET_METADATA_REQ_ID(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_ID)
#define BT_OTS_SET_METADATA_REQ_PROPS(metadata) \
((metadata) = (metadata) | BT_OTS_METADATA_REQ_PROPS)
#define BT_OTS_GET_METADATA_REQ_NAME(metadata) \
((metadata) & BT_OTS_METADATA_REQ_NAME)
#define BT_OTS_GET_METADATA_REQ_TYPE(metadata) \
((metadata) & BT_OTS_METADATA_REQ_TYPE)
#define BT_OTS_GET_METADATA_REQ_SIZE(metadata) \
((metadata) & BT_OTS_METADATA_REQ_SIZE)
#define BT_OTS_GET_METADATA_REQ_CREATED(metadata) \
((metadata) & BT_OTS_METADATA_REQ_CREATED)
#define BT_OTS_GET_METADATA_REQ_MODIFIED(metadata) \
((metadata) & BT_OTS_METADATA_REQ_MODIFIED)
#define BT_OTS_GET_METADATA_REQ_ID(metadata) \
((metadata) & BT_OTS_METADATA_REQ_ID)
#define BT_OTS_GET_METADATA_REQ_PROPS(metadata) \
((metadata) & BT_OTS_METADATA_REQ_PROPS)
/**@brief OTS Attribute Protocol Application Error codes. */
enum bt_gatt_ots_att_err_codes {
/** An attempt was made to write a value that is invalid or
* not supported by this Server for a reason other than
* the attribute permissions.
*/
BT_GATT_OTS_WRITE_REQUEST_REJECTED = 0x80,
/** An attempt was made to read or write to an Object Metadata
* characteristic while the Current Object was an Invalid Object.
*/
BT_GATT_OTS_OBJECT_NOT_SELECTED = 0x81,
/** The Server is unable to service the Read Request or Write Request
* because it exceeds the concurrency limit of the service.
*/
BT_GATT_OTS_CONCURRENCY_LIMIT_EXCEEDED = 0x82,
/** The requested object name was rejected because
* the name was already in use by an existing object on the Server.
*/
BT_GATT_OTS_OBJECT_NAME_ALREADY_EXISTS = 0x83,
};
enum bt_gatt_ots_object_state_type {
BT_GATT_OTS_OBJECT_IDLE_STATE,
BT_GATT_OTS_OBJECT_READ_OP_STATE,
BT_GATT_OTS_OBJECT_WRITE_OP_STATE,
};
struct bt_gatt_ots_object_state {
enum bt_gatt_ots_object_state_type type;
union {
struct bt_gatt_ots_object_read_op {
struct bt_gatt_ots_oacp_read_params oacp_params;
uint32_t sent_len;
} read_op;
struct bt_gatt_ots_object_write_op {
struct bt_gatt_ots_oacp_write_params oacp_params;
uint32_t recv_len;
} write_op;
};
};
struct bt_gatt_ots_object {
uint64_t id;
struct bt_ots_obj_metadata metadata;
struct bt_gatt_ots_object_state state;
};
struct bt_gatt_ots_indicate {
struct bt_gatt_indicate_params params;
struct bt_gatt_attr attr;
struct _bt_gatt_ccc ccc;
bool is_enabled;
struct k_work work;
uint8_t res[OACP_OLCP_RES_MAX_SIZE];
};
struct bt_ots {
struct bt_ots_feat features;
struct bt_gatt_ots_object *cur_obj;
struct bt_gatt_service *service;
struct bt_gatt_ots_indicate oacp_ind;
struct bt_gatt_ots_indicate olcp_ind;
struct bt_gatt_ots_l2cap l2cap;
struct bt_ots_cb *cb;
struct bt_ots_dir_list *dir_list;
void *obj_manager;
};
int bt_ots_obj_add_internal(struct bt_ots *ots, struct bt_conn *conn,
const struct bt_ots_obj_add_param *param,
struct bt_gatt_ots_object **obj);
#ifdef __cplusplus
}
#endif
#endif /* BT_GATT_OTS_INTERNAL_H_ */