text: // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  
  //     http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  #ifndef __BTC_GATTS_H__
  #define __BTC_GATTS_H__
  
  #include "btc_task.h"
  #include "esp_bt_defs.h"
  #include "esp_gatt_defs.h"
  #include "esp_gatts_api.h"
  
  typedef enum {
      BTC_GATTS_ACT_APP_REGISTER = 0,
      BTC_GATTS_ACT_APP_UNREGISTER,
      BTC_GATTS_ACT_CREATE_SERVICE,
      BTC_GATTS_ACT_CREATE_ATTR_TAB,
      BTC_GATTS_ACT_DELETE_SERVICE,
      BTC_GATTS_ACT_START_SERVICE,
      BTC_GATTS_ACT_STOP_SERVICE,
      BTC_GATTS_ACT_ADD_INCLUDE_SERVICE,
      BTC_GATTS_ACT_ADD_CHAR,
      BTC_GATTS_ACT_ADD_CHAR_DESCR,
      BTC_GATTS_ACT_SEND_INDICATE,
      BTC_GATTS_ACT_SEND_RESPONSE,
      BTC_GATTS_ACT_SET_ATTR_VALUE,
      BTC_GATTS_ACT_OPEN,
      BTC_GATTS_ACT_CLOSE,
  } btc_gatts_act_t;
  
  /* btc_ble_gatts_args_t */
  typedef union {
      //BTC_GATTS_ACT_APP_REGISTER = 0,
      struct app_reg_args {
          uint16_t app_id;
      } app_reg;
  
      //BTC_GATTS_ACT_APP_UNREGISTER,
      struct app_unreg_args {
          esp_gatt_if_t gatts_if;
      } app_unreg;
  
      //BTC_GATTS_ACT_CREATE_SERVICE,
      struct create_srvc_args {
          esp_gatt_if_t gatts_if;
          esp_gatt_srvc_id_t service_id;
          uint16_t num_handle;
      } create_srvc;
  
      //BTC_GATTS_ACT_CREATE_ATTR_TAB
      struct create_attr_tab_args{
          esp_gatt_if_t gatts_if;
          uint8_t srvc_inst_id;
          uint8_t max_nb_attr;
          esp_gatts_attr_db_t *gatts_attr_db;
      }create_attr_tab;
  
      //BTC_GATTS_ACT_DELETE_SERVICE,
      struct delete_srvc_args {
          uint16_t service_handle;
      } delete_srvc;
  
      //BTC_GATTS_ACT_START_SERVICE,
      struct start_srvc_args {
          uint16_t service_handle;
      } start_srvc;
  
      //BTC_GATTS_ACT_STOP_SERVICE,
      struct stop_srvc_args {
          uint16_t service_handle;
      } stop_srvc;
  
      //BTC_GATTS_ACT_ADD_INCLUDE_SERVICE,
      struct add_incl_srvc_args {
          uint16_t service_handle;
          uint16_t included_service_handle;
      } add_incl_srvc;
  
      //BTC_GATTS_ACT_ADD_CHAR,
      struct add_char_args {
          uint16_t service_handle;
          esp_bt_uuid_t char_uuid;
          esp_gatt_perm_t perm;
          esp_gatt_char_prop_t property;
          esp_attr_control_t attr_control;
          esp_attr_value_t char_val;
      } add_char;
  
      //BTC_GATTS_ACT_ADD_CHAR_DESCR,
      struct add_descr_args {
          uint16_t  service_handle;
          esp_bt_uuid_t descr_uuid;
          esp_gatt_perm_t perm;
          esp_attr_control_t attr_control;
          esp_attr_value_t descr_val;
      } add_descr;
  
      //BTC_GATTS_ACT_SEND_INDICATE,
      struct send_indicate_args {
          uint16_t conn_id;
          uint16_t attr_handle;
          bool need_confirm;
          uint16_t value_len;
          uint8_t *value;
      } send_ind;
  
      //BTC_GATTS_ACT_SEND_RESPONSE,
      struct send_rsp_args {
          uint16_t conn_id;
          uint32_t trans_id;
          esp_gatt_status_t status;
          esp_gatt_rsp_t *rsp;
      } send_rsp;
  
      //BTC_GATTS_SET_ATTR_VALUE
      struct set_attr_val_args {
          uint16_t handle;
          uint16_t length;
          uint8_t *value;
      } set_attr_val;
  
      //BTC_GATTS_ACT_OPEN,
      struct open_args {
          esp_gatt_if_t gatts_if;
          esp_bd_addr_t remote_bda;
          bool is_direct;
      } open;
  
      //BTC_GATTS_ACT_CLOSE,
      struct close_args {
          uint16_t conn_id;
      } close;
  
  } btc_ble_gatts_args_t;
  
  
  void btc_gatts_call_handler(btc_msg_t *msg);
  void btc_gatts_cb_handler(btc_msg_t *msg);
  void btc_gatts_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
  void btc_gatts_get_attr_value(uint16_t attr_handle, uint16_t *length, uint8_t **value);
  
  
  #endif /* __BTC_GATTS_H__ */
  