aboutsummaryrefslogtreecommitdiff
path: root/platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h')
-rw-r--r--platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h784
1 files changed, 784 insertions, 0 deletions
diff --git a/platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h b/platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h
new file mode 100644
index 0000000..c016a6d
--- /dev/null
+++ b/platform/atm2/ATM22xx-x1x/include/ble/gattc_task.h
@@ -0,0 +1,784 @@
+/**
+ ****************************************************************************************
+ *
+ * @file gattc_task.h
+ *
+ * @brief Header file - GATTCTASK.
+ *
+ * Copyright (C) RivieraWaves 2009-2016
+ *
+ *
+ ****************************************************************************************
+ */
+
+#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>
+#include "ke_msg.h"
+/*
+ * DEFINES
+ ****************************************************************************************
+ */
+
+/// GATT Task messages
+/*@TRACE*/
+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,
+
+ /// Indication to the task that sends the unknown message
+ GATTC_UNKNOWN_MSG_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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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)
+/*@TRACE*/
+struct gattc_mtu_changed_ind
+{
+ /// Exchanged MTU value
+ uint16_t mtu;
+ /// operation sequence number
+ uint16_t seq_num;
+};
+
+/// Service Discovery Command Structure
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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)
+/*@TRACE
+ gattc_read = gattc_read_simple
+ gattc_read_long = gattc_read_simple*/
+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.
+/*@TRACE*/
+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)
+/*@TRACE*/
+struct gattc_read_multiple
+{
+ /// attribute handle
+ uint16_t handle;
+ /// Known Handle length (shall be != 0)
+ uint16_t len;
+};
+
+/// request union according to read type
+/*@TRACE
+ @trc_ref gattc_operation
+ */
+union gattc_read_req
+{
+ /// Simple Read (GATTC_READ or GATTC_READ_LONG)
+ //@trc_union parent.operation == GATTC_READ or parent.operation == GATTC_READ_LONG
+ struct gattc_read_simple simple;
+ /// Read by UUID (GATTC_READ_BY_UUID)
+ //@trc_union parent.operation == GATTC_READ_BY_UUID
+ struct gattc_read_by_uuid by_uuid;
+ /// Read Multiple short characteristic (GATTC_READ_MULTIPLE)
+ //@trc_union parent.operation == GATTC_READ_MULTIPLE
+ struct gattc_read_multiple multiple[1];
+};
+
+/// Read command (Simple, Long, Multiple, or by UUID)
+/*@TRACE*/
+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 req;
+};
+
+/// Attribute value read indication
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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)
+/*@TRACE*/
+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)
+/*@TRACE*/
+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)
+/*@TRACE*/
+struct gattc_event_cfm
+{
+ /// Attribute handle
+ uint16_t handle;
+};
+
+/// Register to peer device events command
+/*@TRACE*/
+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
+/*@TRACE*/
+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.
+/*@TRACE*/
+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
+/*@TRACE*/
+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[__ARRAY_EMPTY];
+};
+
+/// Inform that a modification of database has been requested by peer device.
+/*@TRACE*/
+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.
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+struct gattc_att_info_req_ind
+{
+ /// Handle of the attribute for which info are requested
+ uint16_t handle;
+};
+
+/// Attribute info from upper layer confirmation
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE*/
+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
+/*@TRACE
+ @trc_ref gattc_sdp_att_type
+ */
+union gattc_sdp_att_info
+{
+ /// Attribute Type
+ uint8_t att_type;
+ /// Information about attribute characteristic
+ //@trc_union att_type == GATTC_SDP_ATT_CHAR
+ struct gattc_sdp_att_char att_char;
+ /// Information about included service
+ //@trc_union att_type == GATTC_SDP_INC_SVC
+ struct gattc_sdp_include_svc inc_svc;
+ /// Information about attribute
+ //@trc_union att_type == GATTC_SDP_ATT_VAL or att_type == GATTC_SDP_ATT_DESC
+ struct gattc_sdp_att att;
+};
+
+
+/// Service Discovery indicate that a service has been found.
+/*@TRACE
+ @trc_arr info $end_hdl - $start_hdl
+ */
+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];
+};
+
+/// Indicate that an unknown message has been received
+/*@TRACE*/
+struct gattc_unknown_msg_ind
+{
+ /// Unknown message id
+ ke_msg_id_t unknown_msg_id;
+};
+
+/// @} GATTCTASK
+#endif // GATTC_TASK_H_