712 lines
19 KiB
C
712 lines
19 KiB
C
#ifndef GATTC_TASK_H_
|
|
#define GATTC_TASK_H_
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @addtogroup GATTCTASK Task
|
|
* @ingroup GATTC
|
|
* @brief Handles ALL messages to/from GATT Controller block.
|
|
*
|
|
* The GATTCTASK is responsible for managing the messages coming from
|
|
* the attribute layer and host-level layers for dedicated connection.
|
|
* The task includes services and characteristic discovery, configuration exchanges
|
|
* and attribute value access operations (reading, writing, notification and indication).
|
|
*
|
|
* Messages may originate from @ref ATTC "ATTC", @ref ATTS "ATTS", @ref GAP "GAP"
|
|
* and Application.
|
|
*
|
|
* @{
|
|
****************************************************************************************
|
|
*/
|
|
/*
|
|
* INCLUDE FILES
|
|
****************************************************************************************
|
|
*/
|
|
#include "att.h"
|
|
#include "rwip_task.h" // Task definitions
|
|
#include "compiler.h"
|
|
#include <stdbool.h>
|
|
/*
|
|
* DEFINES
|
|
****************************************************************************************
|
|
*/
|
|
#ifndef TILE_ID_LEN
|
|
#define TILE_ID_LEN 8
|
|
#endif
|
|
|
|
/// GATT Task messages
|
|
enum gattc_msg_id
|
|
{
|
|
/* Default event */
|
|
/// Command Complete event
|
|
GATTC_CMP_EVT = TASK_FIRST_MSG(TASK_ID_GATTC),
|
|
|
|
/* ATTRIBUTE CLIENT */
|
|
/// Server configuration request
|
|
GATTC_EXC_MTU_CMD,
|
|
/// Indicate that the ATT MTU has been updated (negotiated)
|
|
GATTC_MTU_CHANGED_IND,
|
|
|
|
/*Discover All Services */
|
|
/*Discover Services by Service UUID*/
|
|
/*Find Included Services*/
|
|
/*Discover Characteristics by UUID*/
|
|
/*Discover All Characteristics of a Service*/
|
|
/*Discover All Characteristic Descriptors*/
|
|
/// Discovery command
|
|
GATTC_DISC_CMD,
|
|
/* GATT -> HL: Events to Upper layer */
|
|
/*Discover All Services*/
|
|
/// Discovery services indication
|
|
GATTC_DISC_SVC_IND,
|
|
/*Find Included Services*/
|
|
/// Discover included services indication
|
|
GATTC_DISC_SVC_INCL_IND,
|
|
/*Discover All Characteristics of a Service*/
|
|
/// Discover characteristic indication
|
|
GATTC_DISC_CHAR_IND,
|
|
/*Discover All Characteristic Descriptors*/
|
|
/// Discovery characteristic descriptor indication
|
|
GATTC_DISC_CHAR_DESC_IND,
|
|
|
|
/*Read Value*/
|
|
/*Read Using UUID*/
|
|
/*Read Long Value*/
|
|
/*Read Multiple Values*/
|
|
/// Read command
|
|
GATTC_READ_CMD,
|
|
/// Read response
|
|
GATTC_READ_IND,
|
|
|
|
/*Write without response*/
|
|
/*Write without response with Authentication*/
|
|
/*Write Characteristic Value*/
|
|
/*Signed Write Characteristic Value*/
|
|
/*Write Long Characteristic Value*/
|
|
/*Characteristic Value Reliable Write*/
|
|
/*Write Characteristic Descriptors*/
|
|
/*Write Long Characteristic Descriptors*/
|
|
/*Characteristic Value Reliable Write*/
|
|
/// Write command request
|
|
GATTC_WRITE_CMD,
|
|
|
|
/* Cancel / Execute pending write operations */
|
|
/// Execute write characteristic request
|
|
GATTC_EXECUTE_WRITE_CMD,
|
|
|
|
/* Reception of an indication or notification from peer device. */
|
|
/// peer device triggers an event (notification)
|
|
GATTC_EVENT_IND,
|
|
/// peer device triggers an event that requires a confirmation (indication)
|
|
GATTC_EVENT_REQ_IND,
|
|
/// Confirm reception of event (trigger a confirmation message)
|
|
GATTC_EVENT_CFM,
|
|
|
|
/// Registration to peer device events (Indication/Notification).
|
|
GATTC_REG_TO_PEER_EVT_CMD,
|
|
|
|
/* -------------------------- ATTRIBUTE SERVER ------------------------------- */
|
|
/*Notify Characteristic*/
|
|
/*Indicate Characteristic*/
|
|
/// send an event to peer device
|
|
GATTC_SEND_EVT_CMD,
|
|
|
|
/* Service Changed Characteristic Indication */
|
|
/**
|
|
* Send a Service Changed indication to a device
|
|
* (message structure is struct gattm_svc_changed_ind_req)
|
|
*/
|
|
GATTC_SEND_SVC_CHANGED_CMD,
|
|
/**
|
|
* Inform the application when sending of Service Changed indications has been
|
|
* enabled or disabled
|
|
*/
|
|
GATTC_SVC_CHANGED_CFG_IND,
|
|
|
|
/* Indicate that read operation is requested. */
|
|
/// Read command indicated to upper layers.
|
|
GATTC_READ_REQ_IND,
|
|
/// REad command confirmation from upper layers.
|
|
GATTC_READ_CFM,
|
|
|
|
/* Indicate that write operation is requested. */
|
|
/// Write command indicated to upper layers.
|
|
GATTC_WRITE_REQ_IND,
|
|
/// Write command confirmation from upper layers.
|
|
GATTC_WRITE_CFM,
|
|
|
|
/* Indicate that write operation is requested. */
|
|
/// Request Attribute info to upper layer - could be trigger during prepare write
|
|
GATTC_ATT_INFO_REQ_IND,
|
|
/// Attribute info from upper layer confirmation
|
|
GATTC_ATT_INFO_CFM,
|
|
|
|
/* ----------------------- SERVICE DISCOVERY PROCEDURE --------------------------- */
|
|
/// Service Discovery command
|
|
GATTC_SDP_SVC_DISC_CMD,
|
|
/// Service Discovery indicate that a service has been found.
|
|
GATTC_SDP_SVC_IND,
|
|
|
|
/* -------------------------- TRANSACTION ERROR EVENT ----------------------------- */
|
|
/// Transaction Timeout Error Event no more transaction will be accepted
|
|
GATTC_TRANSACTION_TO_ERROR_IND,
|
|
|
|
/* ------------------------------- Internal API ----------------------------------- */
|
|
/// Client Response timeout indication
|
|
GATTC_CLIENT_RTX_IND,
|
|
/// Server indication confirmation timeout indication
|
|
GATTC_SERVER_RTX_IND,
|
|
};
|
|
|
|
|
|
/// request operation type - application interface
|
|
enum gattc_operation
|
|
{
|
|
/* Attribute Client Flags */
|
|
/* No Operation (if nothing has been requested) */
|
|
/* ************************************************ */
|
|
/// No operation
|
|
GATTC_NO_OP = 0x00,
|
|
|
|
/* Operation flags for MTU Exchange */
|
|
/* ************************************************ */
|
|
/// Perform MTU exchange
|
|
GATTC_MTU_EXCH,
|
|
|
|
/* Operation flags for discovery operation */
|
|
/* ************************************************ */
|
|
/// Discover all services
|
|
GATTC_DISC_ALL_SVC,
|
|
/// Discover services by UUID
|
|
GATTC_DISC_BY_UUID_SVC,
|
|
/// Discover included services
|
|
GATTC_DISC_INCLUDED_SVC,
|
|
/// Discover all characteristics
|
|
GATTC_DISC_ALL_CHAR,
|
|
/// Discover characteristic by UUID
|
|
GATTC_DISC_BY_UUID_CHAR,
|
|
/// Discover characteristic descriptor
|
|
GATTC_DISC_DESC_CHAR,
|
|
|
|
/* Operation flags for reading attributes */
|
|
/* ************************************************ */
|
|
/// Read attribute
|
|
GATTC_READ,
|
|
/// Read long attribute
|
|
GATTC_READ_LONG,
|
|
/// Read attribute by UUID
|
|
GATTC_READ_BY_UUID,
|
|
/// Read multiple attribute
|
|
GATTC_READ_MULTIPLE,
|
|
|
|
/* Operation flags for writing/modifying attributes */
|
|
/* ************************************************ */
|
|
/// Write attribute
|
|
GATTC_WRITE,
|
|
/// Write no response
|
|
GATTC_WRITE_NO_RESPONSE,
|
|
/// Write signed
|
|
GATTC_WRITE_SIGNED,
|
|
/// Execute write
|
|
GATTC_EXEC_WRITE,
|
|
|
|
/* Operation flags for registering to peer device */
|
|
/* events */
|
|
/* ************************************************ */
|
|
/// Register to peer device events
|
|
GATTC_REGISTER,
|
|
/// Unregister from peer device events
|
|
GATTC_UNREGISTER,
|
|
|
|
/* Operation flags for sending events to peer device*/
|
|
/* ************************************************ */
|
|
/// Send an attribute notification
|
|
GATTC_NOTIFY,
|
|
/// Send an attribute indication
|
|
GATTC_INDICATE,
|
|
/// Send a service changed indication
|
|
GATTC_SVC_CHANGED,
|
|
|
|
/* Service Discovery Procedure */
|
|
/* ************************************************ */
|
|
/// Search specific service
|
|
GATTC_SDP_DISC_SVC,
|
|
/// Search for all services
|
|
GATTC_SDP_DISC_SVC_ALL,
|
|
/// Cancel Service Discovery Procedure
|
|
GATTC_SDP_DISC_CANCEL,
|
|
};
|
|
|
|
/// Service Discovery Attribute type
|
|
enum gattc_sdp_att_type
|
|
{
|
|
/// No Attribute Information
|
|
GATTC_SDP_NONE,
|
|
/// Included Service Information
|
|
GATTC_SDP_INC_SVC,
|
|
/// Characteristic Declaration
|
|
GATTC_SDP_ATT_CHAR,
|
|
/// Attribute Value
|
|
GATTC_SDP_ATT_VAL,
|
|
/// Attribute Descriptor
|
|
GATTC_SDP_ATT_DESC,
|
|
};
|
|
|
|
/// Command complete event data structure
|
|
struct gattc_op_cmd
|
|
{
|
|
/// GATT request type
|
|
uint8_t operation;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
};
|
|
|
|
/// Command complete event data structure
|
|
struct gattc_cmp_evt
|
|
{
|
|
/// GATT request type
|
|
uint8_t operation;
|
|
/// Status of the request
|
|
uint8_t status;
|
|
/// operation sequence number - provided when operation is started
|
|
uint16_t seq_num;
|
|
};
|
|
|
|
|
|
/// Service Discovery Command Structure
|
|
struct gattc_exc_mtu_cmd
|
|
{
|
|
/// GATT request type
|
|
uint8_t operation;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
};
|
|
|
|
/// Indicate that the ATT MTU has been updated (negotiated)
|
|
struct gattc_mtu_changed_ind
|
|
{
|
|
/// Exchanged MTU value
|
|
uint16_t mtu;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
};
|
|
|
|
/// Service Discovery Command Structure
|
|
struct gattc_disc_cmd
|
|
{
|
|
/// GATT request type
|
|
uint8_t operation;
|
|
/// UUID length
|
|
uint8_t uuid_len;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// start handle range
|
|
uint16_t start_hdl;
|
|
/// start handle range
|
|
uint16_t end_hdl;
|
|
/// UUID
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
|
|
/// Discover Service indication Structure
|
|
struct gattc_disc_svc_ind
|
|
{
|
|
/// start handle
|
|
uint16_t start_hdl;
|
|
/// end handle
|
|
uint16_t end_hdl;
|
|
/// UUID length
|
|
uint8_t uuid_len;
|
|
/// service UUID
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Discover Service indication Structure
|
|
struct gattc_disc_svc_incl_ind
|
|
{
|
|
/// element handle
|
|
uint16_t attr_hdl;
|
|
/// start handle
|
|
uint16_t start_hdl;
|
|
/// end handle
|
|
uint16_t end_hdl;
|
|
/// UUID length
|
|
uint8_t uuid_len;
|
|
/// included service UUID
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Discovery All Characteristic indication Structure
|
|
struct gattc_disc_char_ind
|
|
{
|
|
/// database element handle
|
|
uint16_t attr_hdl;
|
|
/// pointer attribute handle to UUID
|
|
uint16_t pointer_hdl;
|
|
/// properties
|
|
uint8_t prop;
|
|
/// UUID length
|
|
uint8_t uuid_len;
|
|
/// characteristic UUID
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Discovery Characteristic Descriptor indication Structure
|
|
struct gattc_disc_char_desc_ind
|
|
{
|
|
/// database element handle
|
|
uint16_t attr_hdl;
|
|
/// UUID length
|
|
uint8_t uuid_len;
|
|
/// Descriptor UUID
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
|
|
/// Simple Read (GATTC_READ or GATTC_READ_LONG)
|
|
struct gattc_read_simple
|
|
{
|
|
/// attribute handle
|
|
uint16_t handle;
|
|
/// start offset in data payload
|
|
uint16_t offset;
|
|
/// Length of data to read (0 = read all)
|
|
uint16_t length;
|
|
};
|
|
|
|
/// Read by UUID: search UUID and read it's characteristic value (GATTC_READ_BY_UUID)
|
|
/// Note: it doesn't perform an automatic read long.
|
|
struct gattc_read_by_uuid
|
|
{
|
|
/// Start handle
|
|
uint16_t start_hdl;
|
|
/// End handle
|
|
uint16_t end_hdl;
|
|
/// Size of UUID
|
|
uint8_t uuid_len;
|
|
/// UUID value
|
|
uint8_t uuid[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Read Multiple short characteristic (GATTC_READ_MULTIPLE)
|
|
struct gattc_read_multiple
|
|
{
|
|
/// attribute handle
|
|
uint16_t handle;
|
|
/// Known Handle length (shall be != 0)
|
|
uint16_t len;
|
|
};
|
|
|
|
/// Read command (Simple, Long, Multiple, or by UUID)
|
|
struct gattc_read_cmd
|
|
{
|
|
/// request type
|
|
uint8_t operation;
|
|
/// number of read (only used for multiple read)
|
|
uint8_t nb;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
|
|
/// request union according to read type
|
|
union gattc_read_req
|
|
{
|
|
/// Simple Read (GATTC_READ or GATTC_READ_LONG)
|
|
struct gattc_read_simple simple;
|
|
/// Read by UUID (GATTC_READ_BY_UUID)
|
|
struct gattc_read_by_uuid by_uuid;
|
|
/// Read Multiple short characteristic (GATTC_READ_MULTIPLE)
|
|
struct gattc_read_multiple multiple[1];
|
|
} req;
|
|
};
|
|
|
|
/// Attribute value read indication
|
|
struct gattc_read_ind
|
|
{
|
|
/// Attribute handle
|
|
uint16_t handle;
|
|
/// Read offset
|
|
uint16_t offset;
|
|
/// Read length
|
|
uint16_t length;
|
|
/// Handle value
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Write peer attribute value command
|
|
struct gattc_write_cmd
|
|
{
|
|
/// Request type
|
|
uint8_t operation;
|
|
/// Perform automatic execution
|
|
/// (if false, an ATT Prepare Write will be used this shall be use for reliable write)
|
|
bool auto_execute;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// Attribute handle
|
|
uint16_t handle;
|
|
/// Write offset
|
|
uint16_t offset;
|
|
/// Write length
|
|
uint16_t length;
|
|
/// Internal write cursor shall be initialized to 0
|
|
uint16_t cursor;
|
|
/// Value to write
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Write peer attribute value command
|
|
struct gattc_execute_write_cmd
|
|
{
|
|
/// Request type
|
|
uint8_t operation;
|
|
|
|
/// [True = perform/False cancel] pending write operations
|
|
bool execute;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
};
|
|
/// peer device triggers an event (notification)
|
|
struct gattc_event_ind
|
|
{
|
|
/// Event Type
|
|
uint8_t type;
|
|
/// Data length
|
|
uint16_t length;
|
|
/// Attribute handle
|
|
uint16_t handle;
|
|
/// Event Value
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// peer device triggers an event that requires a confirmation (indication)
|
|
struct gattc_event_req_ind
|
|
{
|
|
/// Event Type
|
|
uint8_t type;
|
|
/// Data length
|
|
uint16_t length;
|
|
/// Attribute handle
|
|
uint16_t handle;
|
|
/// Event Value
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Confirm reception of event (trigger a confirmation message)
|
|
struct gattc_event_cfm
|
|
{
|
|
/// Attribute handle
|
|
uint16_t handle;
|
|
};
|
|
|
|
/// Register to peer device events command
|
|
struct gattc_reg_to_peer_evt_cmd
|
|
{
|
|
/// Request type
|
|
uint8_t operation;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// attribute start handle
|
|
uint16_t start_hdl;
|
|
/// attribute end handle
|
|
uint16_t end_hdl;
|
|
};
|
|
|
|
/// Send an event to peer device
|
|
struct gattc_send_evt_cmd
|
|
{
|
|
/// Request type (notification / indication)
|
|
uint8_t operation;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// characteristic handle
|
|
uint16_t handle;
|
|
/// length of packet to send
|
|
uint16_t length;
|
|
/// data value
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Inform that attribute value is requested by lower layers.
|
|
struct gattc_read_req_ind
|
|
{
|
|
/// Handle of the attribute that has to be read
|
|
uint16_t handle;
|
|
};
|
|
|
|
/// Confirm Read Request requested by GATT to profile
|
|
struct gattc_read_cfm
|
|
{
|
|
/// Handle of the attribute read
|
|
uint16_t handle;
|
|
/// Data length read
|
|
uint16_t length;
|
|
/// Status of read command execution by upper layers
|
|
uint8_t status;
|
|
/// attribute data value
|
|
uint8_t value[TILE_ID_LEN];
|
|
};
|
|
|
|
/// Inform that a modification of database has been requested by peer device.
|
|
struct gattc_write_req_ind
|
|
{
|
|
/// Handle of the attribute that has to be written
|
|
uint16_t handle;
|
|
/// offset at which the data has to be written
|
|
uint16_t offset;
|
|
/// Data length to be written
|
|
uint16_t length;
|
|
/// Data to be written in attribute database
|
|
uint8_t value[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// Confirm modification of database from upper layer when requested by peer device.
|
|
struct gattc_write_cfm
|
|
{
|
|
/// Handle of the attribute written
|
|
uint16_t handle;
|
|
/// Status of write command execution by upper layers
|
|
uint8_t status;
|
|
};
|
|
|
|
/// Parameters for @ref GATTC_SEND_SVC_CHANGED_CMD message
|
|
struct gattc_send_svc_changed_cmd
|
|
{
|
|
/// Request Type
|
|
uint8_t operation;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// Start of Affected Attribute Handle Range
|
|
uint16_t svc_shdl;
|
|
/// End of Affected Attribute Handle Range
|
|
uint16_t svc_ehdl;
|
|
};
|
|
|
|
/// Parameters for @ref GATTC_SVC_CHANGED_CFG_IND and @ref GATTC_SVC_CHANGED_SET_CFG_REQ message
|
|
struct gattc_svc_changed_cfg
|
|
{
|
|
/**
|
|
* Current value of the Client Characteristic Configuration descriptor for the Service
|
|
* Changed characteristic
|
|
*/
|
|
uint16_t ind_cfg;
|
|
};
|
|
|
|
|
|
/// Request Attribute info to upper layer - could be trigger during prepare write
|
|
struct gattc_att_info_req_ind
|
|
{
|
|
/// Handle of the attribute for which info are requested
|
|
uint16_t handle;
|
|
};
|
|
|
|
/// Attribute info from upper layer confirmation
|
|
struct gattc_att_info_cfm
|
|
{
|
|
/// Handle of the attribute
|
|
uint16_t handle;
|
|
/// Current length of the attribute
|
|
uint16_t length;
|
|
/// use to know if it's possible to modify the attribute
|
|
/// can contains authorization or application error code.
|
|
uint8_t status;
|
|
};
|
|
|
|
|
|
/// Service Discovery command
|
|
struct gattc_sdp_svc_disc_cmd
|
|
{
|
|
/// GATT Request Type
|
|
/// - GATTC_SDP_DISC_SVC Search specific service
|
|
/// - GATTC_SDP_DISC_SVC_ALL Search for all services
|
|
/// - GATTC_SDP_DISC_CANCEL Cancel Service Discovery Procedure
|
|
uint8_t operation;
|
|
/// Service UUID Length
|
|
uint8_t uuid_len;
|
|
/// operation sequence number
|
|
uint16_t seq_num;
|
|
/// Search start handle
|
|
uint16_t start_hdl;
|
|
/// Search end handle
|
|
uint16_t end_hdl;
|
|
/// Service UUID
|
|
uint8_t uuid[ATT_UUID_128_LEN];
|
|
};
|
|
|
|
|
|
/// Information about included service
|
|
struct gattc_sdp_include_svc
|
|
{
|
|
/// Attribute Type
|
|
/// - GATTC_SDP_INC_SVC: Included Service Information
|
|
uint8_t att_type;
|
|
/// Included service UUID Length
|
|
uint8_t uuid_len;
|
|
/// Included Service UUID
|
|
uint8_t uuid[ATT_UUID_128_LEN];
|
|
/// Included service Start Handle
|
|
uint16_t start_hdl;
|
|
/// Included service End Handle
|
|
uint16_t end_hdl;
|
|
};
|
|
|
|
/// Information about attribute characteristic
|
|
struct gattc_sdp_att_char
|
|
{
|
|
/// Attribute Type
|
|
/// - GATTC_SDP_ATT_CHAR: Characteristic Declaration
|
|
uint8_t att_type;
|
|
/// Value property
|
|
uint8_t prop;
|
|
/// Value Handle
|
|
uint16_t handle;
|
|
};
|
|
|
|
/// Information about attribute
|
|
struct gattc_sdp_att
|
|
{
|
|
/// Attribute Type
|
|
/// - GATTC_SDP_ATT_VAL: Attribute Value
|
|
/// - GATTC_SDP_ATT_DESC: Attribute Descriptor
|
|
uint8_t att_type;
|
|
/// Attribute UUID Length
|
|
uint8_t uuid_len;
|
|
/// Attribute UUID
|
|
uint8_t uuid[ATT_UUID_128_LEN];
|
|
};
|
|
|
|
/// Attribute information
|
|
union gattc_sdp_att_info
|
|
{
|
|
/// Attribute Type
|
|
uint8_t att_type;
|
|
/// Information about attribute characteristic
|
|
struct gattc_sdp_att_char att_char;
|
|
/// Information about included service
|
|
struct gattc_sdp_include_svc inc_svc;
|
|
/// Information about attribute
|
|
struct gattc_sdp_att att;
|
|
};
|
|
|
|
|
|
/// Service Discovery indicate that a service has been found.
|
|
struct gattc_sdp_svc_ind
|
|
{
|
|
/// Service UUID Length
|
|
uint8_t uuid_len;
|
|
/// Service UUID
|
|
uint8_t uuid[ATT_UUID_128_LEN];
|
|
/// Service start handle
|
|
uint16_t start_hdl;
|
|
/// Service end handle
|
|
uint16_t end_hdl;
|
|
/// attribute information present in the service
|
|
/// (length = end_hdl - start_hdl)
|
|
union gattc_sdp_att_info info[__ARRAY_EMPTY];
|
|
};
|
|
|
|
|
|
|
|
/// @} GATTCTASK
|
|
#endif // GATTC_TASK_H_
|