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_GATTC_H__
  #define __BTC_GATTC_H__
  
  #include "btc_task.h"
  #include "esp_bt_defs.h"
  #include "esp_gatt_defs.h"
  #include "esp_gattc_api.h"
  
  typedef enum {
      BTC_GATTC_ACT_APP_REGISTER = 0,
      BTC_GATTC_ACT_APP_UNREGISTER,
      BTC_GATTC_ACT_OPEN,
      BTC_GATTC_ACT_CLOSE,
      BTC_GATTC_ACT_CFG_MTU,
      BTC_GATTC_ACT_SEARCH_SERVICE,
      BTC_GATTC_ACT_GET_FIRST_CHAR,
      BTC_GATTC_ACT_GET_NEXT_CHAR,
      BTC_GATTC_ACT_GET_FIRST_DESCR,
      BTC_GATTC_ACT_GET_NEXT_DESCR,
      BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE,
      BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE,
      BTC_GATTC_ACT_READ_CHAR,
      BTC_GATTC_ACT_READ_CHAR_DESCR,
      BTC_GATTC_ACT_WRITE_CHAR,
      BTC_GATTC_ACT_WRITE_CHAR_DESCR,
      BTC_GATTC_ACT_PREPARE_WRITE,
      BTC_GATTC_ACT_PREPARE_WRITE_CHAR_DESCR,
      BTC_GATTC_ACT_EXECUTE_WRITE,
      BTC_GATTC_ACT_REG_FOR_NOTIFY,
      BTC_GATTC_ACT_UNREG_FOR_NOTIFY,
      BTC_GATTC_ACT_CACHE_REFRESH,
  } btc_gattc_act_t;
  
  /* btc_ble_gattc_args_t */
  typedef union {
      //BTC_GATTC_ACT_APP_REGISTER,
      struct app_reg_arg {
          uint16_t app_id;
      } app_reg;
      //BTC_GATTC_ACT_APP_UNREGISTER,
      struct app_unreg_arg {
          esp_gatt_if_t gattc_if;
      } app_unreg;
      //BTC_GATTC_ACT_OPEN,
      struct open_arg {
          esp_gatt_if_t gattc_if;
          esp_bd_addr_t remote_bda;
          bool is_direct;
      } open;
      //BTC_GATTC_ACT_CLOSE,
      struct close_arg {
          uint16_t conn_id;
      } close;
      //BTC_GATTC_ACT_CFG_MTU,
      struct cfg_mtu_arg {
          uint16_t conn_id;
      } cfg_mtu;
      //BTC_GATTC_ACT_SEARCH_SERVICE,
      struct search_srvc_arg {
          uint16_t conn_id;
          bool filter_uuid_enable;
          esp_bt_uuid_t filter_uuid;
      } search_srvc;
      //BTC_GATTC_ACT_GET_FIRST_CHAR,
      struct get_first_char_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
      } get_first_char;
      //BTC_GATTC_ACT_GET_NEXT_CHAR,
      struct get_next_char_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
      } get_next_char;
      //BTC_GATTC_ACT_GET_FIRST_DESCR,
      struct get_first_descr_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
      } get_first_descr;
      //BTC_GATTC_ACT_GET_NEXT_DESCR,
      struct get_next_descr_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          esp_gatt_id_t descr_id;
      } get_next_descr;
      //BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE,
      struct get_first_incl_srvc_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
      } get_first_incl_srvc;
      //BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE,
      struct get_next_incl_srvc_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_srvc_id_t start_service_id;
      } get_next_incl_srvc;
      //BTC_GATTC_ACT_READ_CHAR,
      struct read_char_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          esp_gatt_auth_req_t auth_req;
      } read_char;
      //BTC_GATTC_ACT_READ_CHAR_DESCR,
      struct read_descr_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          esp_gatt_id_t descr_id;
          esp_gatt_auth_req_t auth_req;
      } read_descr;
      //BTC_GATTC_ACT_WRITE_CHAR,
      struct write_char_arg {
          uint16_t conn_id;
          uint16_t value_len;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          uint8_t *value;
  		esp_gatt_write_type_t write_type;
          esp_gatt_auth_req_t auth_req;
      } write_char;
      //BTC_GATTC_ACT_WRITE_CHAR_DESCR,
      struct write_descr_arg {
          uint16_t conn_id;
          uint16_t value_len;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          esp_gatt_id_t descr_id;
          uint8_t *value;
  		esp_gatt_write_type_t write_type;
          esp_gatt_auth_req_t auth_req;
      } write_descr;
      //BTC_GATTC_ACT_PREPARE_WRITE,
      struct prep_write_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          uint16_t offset;
          uint16_t value_len;
          uint8_t *value;
          esp_gatt_auth_req_t auth_req;
      } prep_write;
      //BTC_GATTC_ACT_PREPARE_WRITE_CHAR_DESCR,
      struct prep_write_descr_arg {
          uint16_t conn_id;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
          esp_gatt_id_t descr_id;
          uint16_t offset;
          uint16_t value_len;
          uint8_t *value;
          esp_gatt_auth_req_t auth_req;
      } prep_write_descr;
      //BTC_GATTC_ACT_EXECUTE_WRITE,
      struct exec_write_arg {
          uint16_t conn_id;
          bool is_execute;
      } exec_write;
      //BTC_GATTC_ACT_REG_FOR_NOTIFY,
      struct reg_for_notify_arg {
          esp_gatt_if_t gattc_if;
          esp_bd_addr_t remote_bda;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
      } reg_for_notify;
      //BTC_GATTC_ACT_UNREG_FOR_NOTIFY
      struct unreg_for_notify_arg {
          esp_gatt_if_t gattc_if;
          esp_bd_addr_t remote_bda;
          esp_gatt_srvc_id_t service_id;
          esp_gatt_id_t char_id;
      } unreg_for_notify;
      //BTC_GATTC_ACT_CACHE_REFRESH,
      struct cache_refresh_arg {
          esp_bd_addr_t remote_bda;
      } cache_refresh;
  } btc_ble_gattc_args_t;
  
  void btc_gattc_call_handler(btc_msg_t *msg);
  void btc_gattc_cb_handler(btc_msg_t *msg);
  void btc_gattc_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
  
  #endif /* __BTC_GATTC_H__ */
  