esp_gattc_api.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <string.h>
  7. #include "esp_gattc_api.h"
  8. #include "esp_bt_main.h"
  9. #include "btc/btc_manage.h"
  10. #include "btc_gattc.h"
  11. #include "btc_gatt_util.h"
  12. #include "stack/l2cdefs.h"
  13. #include "stack/l2c_api.h"
  14. #if (GATTC_INCLUDED == TRUE)
  15. esp_err_t esp_ble_gattc_register_callback(esp_gattc_cb_t callback)
  16. {
  17. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  18. if (callback == NULL) {
  19. return ESP_FAIL;
  20. }
  21. btc_profile_cb_set(BTC_PID_GATTC, callback);
  22. return ESP_OK;
  23. }
  24. esp_err_t esp_ble_gattc_app_register(uint16_t app_id)
  25. {
  26. btc_msg_t msg = {0};
  27. btc_ble_gattc_args_t arg;
  28. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  29. if (app_id > ESP_APP_ID_MAX) {
  30. return ESP_ERR_INVALID_ARG;
  31. }
  32. msg.sig = BTC_SIG_API_CALL;
  33. msg.pid = BTC_PID_GATTC;
  34. msg.act = BTC_GATTC_ACT_APP_REGISTER;
  35. arg.app_reg.app_id = app_id;
  36. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  37. }
  38. esp_err_t esp_ble_gattc_app_unregister(esp_gatt_if_t gattc_if)
  39. {
  40. btc_msg_t msg = {0};
  41. btc_ble_gattc_args_t arg;
  42. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  43. msg.sig = BTC_SIG_API_CALL;
  44. msg.pid = BTC_PID_GATTC;
  45. msg.act = BTC_GATTC_ACT_APP_UNREGISTER;
  46. arg.app_unreg.gattc_if = gattc_if;
  47. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  48. }
  49. esp_err_t esp_ble_gattc_open(esp_gatt_if_t gattc_if, esp_bd_addr_t remote_bda, esp_ble_addr_type_t remote_addr_type, bool is_direct)
  50. {
  51. btc_msg_t msg = {0};
  52. btc_ble_gattc_args_t arg;
  53. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  54. msg.sig = BTC_SIG_API_CALL;
  55. msg.pid = BTC_PID_GATTC;
  56. msg.act = BTC_GATTC_ACT_OPEN;
  57. arg.open.gattc_if = gattc_if;
  58. memcpy(arg.open.remote_bda, remote_bda, ESP_BD_ADDR_LEN);
  59. arg.open.remote_addr_type = remote_addr_type;
  60. arg.open.is_direct = is_direct;
  61. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  62. }
  63. esp_err_t esp_ble_gattc_close (esp_gatt_if_t gattc_if, uint16_t conn_id)
  64. {
  65. btc_msg_t msg = {0};
  66. btc_ble_gattc_args_t arg;
  67. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  68. msg.sig = BTC_SIG_API_CALL;
  69. msg.pid = BTC_PID_GATTC;
  70. msg.act = BTC_GATTC_ACT_CLOSE;
  71. arg.close.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  72. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  73. }
  74. esp_err_t esp_ble_gattc_send_mtu_req (esp_gatt_if_t gattc_if, uint16_t conn_id)
  75. {
  76. btc_msg_t msg = {0};
  77. btc_ble_gattc_args_t arg;
  78. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  79. msg.sig = BTC_SIG_API_CALL;
  80. msg.pid = BTC_PID_GATTC;
  81. msg.act = BTC_GATTC_ACT_CFG_MTU;
  82. arg.cfg_mtu.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  83. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  84. }
  85. esp_err_t esp_ble_gattc_search_service(esp_gatt_if_t gattc_if, uint16_t conn_id, esp_bt_uuid_t *filter_uuid)
  86. {
  87. btc_msg_t msg = {0};
  88. btc_ble_gattc_args_t arg;
  89. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  90. msg.sig = BTC_SIG_API_CALL;
  91. msg.pid = BTC_PID_GATTC;
  92. msg.act = BTC_GATTC_ACT_SEARCH_SERVICE;
  93. arg.search_srvc.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  94. if (filter_uuid) {
  95. arg.search_srvc.filter_uuid_enable = true;
  96. memcpy(&arg.search_srvc.filter_uuid, filter_uuid, sizeof(esp_bt_uuid_t));
  97. } else {
  98. arg.search_srvc.filter_uuid_enable = false;
  99. }
  100. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  101. }
  102. esp_gatt_status_t esp_ble_gattc_get_service(esp_gatt_if_t gattc_if, uint16_t conn_id, esp_bt_uuid_t *svc_uuid,
  103. esp_gattc_service_elem_t *result, uint16_t *count, uint16_t offset)
  104. {
  105. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  106. if (result == NULL || count == NULL || *count == 0) {
  107. return ESP_GATT_INVALID_PDU;
  108. }
  109. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  110. return btc_ble_gattc_get_service(conn_hdl, svc_uuid, result, count, offset);
  111. }
  112. esp_gatt_status_t esp_ble_gattc_get_all_char(esp_gatt_if_t gattc_if,
  113. uint16_t conn_id,
  114. uint16_t start_handle,
  115. uint16_t end_handle,
  116. esp_gattc_char_elem_t *result,
  117. uint16_t *count, uint16_t offset)
  118. {
  119. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  120. if ((start_handle == 0) && (end_handle == 0)) {
  121. *count = 0;
  122. return ESP_GATT_INVALID_HANDLE;
  123. }
  124. if (result == NULL || count == NULL || *count == 0) {
  125. return ESP_GATT_INVALID_PDU;
  126. }
  127. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  128. return btc_ble_gattc_get_all_char(conn_hdl, start_handle, end_handle, result, count, offset);
  129. }
  130. esp_gatt_status_t esp_ble_gattc_get_all_descr(esp_gatt_if_t gattc_if,
  131. uint16_t conn_id,
  132. uint16_t char_handle,
  133. esp_gattc_descr_elem_t *result,
  134. uint16_t *count, uint16_t offset)
  135. {
  136. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  137. if (char_handle == 0) {
  138. return ESP_GATT_INVALID_HANDLE;
  139. }
  140. if (result == NULL || count == NULL || *count == 0) {
  141. return ESP_GATT_INVALID_PDU;
  142. }
  143. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  144. return btc_ble_gattc_get_all_descr(conn_hdl, char_handle, result, count, offset);
  145. }
  146. esp_gatt_status_t esp_ble_gattc_get_char_by_uuid(esp_gatt_if_t gattc_if,
  147. uint16_t conn_id,
  148. uint16_t start_handle,
  149. uint16_t end_handle,
  150. esp_bt_uuid_t char_uuid,
  151. esp_gattc_char_elem_t *result,
  152. uint16_t *count)
  153. {
  154. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  155. if (start_handle == 0 && end_handle == 0) {
  156. *count = 0;
  157. return ESP_GATT_INVALID_HANDLE;
  158. }
  159. if (result == NULL || count == NULL || *count == 0) {
  160. return ESP_GATT_INVALID_PDU;
  161. }
  162. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if,conn_id);
  163. return btc_ble_gattc_get_char_by_uuid(conn_hdl, start_handle, end_handle, char_uuid, result, count);
  164. }
  165. esp_gatt_status_t esp_ble_gattc_get_descr_by_uuid(esp_gatt_if_t gattc_if,
  166. uint16_t conn_id,
  167. uint16_t start_handle,
  168. uint16_t end_handle,
  169. esp_bt_uuid_t char_uuid,
  170. esp_bt_uuid_t descr_uuid,
  171. esp_gattc_descr_elem_t *result,
  172. uint16_t *count)
  173. {
  174. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  175. if (result == NULL || count == NULL || *count == 0) {
  176. return ESP_GATT_INVALID_PDU;
  177. }
  178. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  179. return btc_ble_gattc_get_descr_by_uuid(conn_hdl, start_handle, end_handle, char_uuid, descr_uuid, result, count);
  180. }
  181. esp_gatt_status_t esp_ble_gattc_get_descr_by_char_handle(esp_gatt_if_t gattc_if,
  182. uint16_t conn_id,
  183. uint16_t char_handle,
  184. esp_bt_uuid_t descr_uuid,
  185. esp_gattc_descr_elem_t *result,
  186. uint16_t *count)
  187. {
  188. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  189. if (char_handle == 0) {
  190. *count = 0;
  191. return ESP_GATT_INVALID_HANDLE;
  192. }
  193. if (result == NULL || count == NULL || *count == 0) {
  194. return ESP_GATT_INVALID_PDU;
  195. }
  196. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  197. return btc_ble_gattc_get_descr_by_char_handle(conn_hdl, char_handle, descr_uuid, result, count);
  198. }
  199. esp_gatt_status_t esp_ble_gattc_get_include_service(esp_gatt_if_t gattc_if,
  200. uint16_t conn_id,
  201. uint16_t start_handle,
  202. uint16_t end_handle,
  203. esp_bt_uuid_t *incl_uuid,
  204. esp_gattc_incl_svc_elem_t *result,
  205. uint16_t *count)
  206. {
  207. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  208. if (start_handle == 0 && end_handle == 0) {
  209. *count = 0;
  210. return ESP_GATT_INVALID_HANDLE;
  211. }
  212. if (result == NULL || count == NULL || *count == 0) {
  213. return ESP_GATT_INVALID_PDU;
  214. }
  215. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  216. return btc_ble_gattc_get_include_service(conn_hdl, start_handle, end_handle, incl_uuid, result, count);
  217. }
  218. esp_gatt_status_t esp_ble_gattc_get_attr_count(esp_gatt_if_t gattc_if,
  219. uint16_t conn_id,
  220. esp_gatt_db_attr_type_t type,
  221. uint16_t start_handle,
  222. uint16_t end_handle,
  223. uint16_t char_handle,
  224. uint16_t *count)
  225. {
  226. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  227. if ((start_handle == 0 && end_handle == 0) && (type != ESP_GATT_DB_DESCRIPTOR)) {
  228. *count = 0;
  229. return ESP_GATT_INVALID_HANDLE;
  230. }
  231. if (count == NULL) {
  232. return ESP_GATT_INVALID_PDU;
  233. }
  234. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  235. return btc_ble_gattc_get_attr_count(conn_hdl, type, start_handle, end_handle, char_handle, count);
  236. }
  237. esp_gatt_status_t esp_ble_gattc_get_db(esp_gatt_if_t gattc_if, uint16_t conn_id, uint16_t start_handle, uint16_t end_handle,
  238. esp_gattc_db_elem_t *db, uint16_t *count)
  239. {
  240. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  241. if (start_handle == 0 && end_handle == 0) {
  242. *count = 0;
  243. return ESP_GATT_INVALID_HANDLE;
  244. }
  245. if (db == NULL || count == NULL || *count == 0) {
  246. return ESP_GATT_INVALID_PDU;
  247. }
  248. uint16_t conn_hdl = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  249. return btc_ble_gattc_get_db(conn_hdl, start_handle, end_handle, db, count);
  250. }
  251. esp_err_t esp_ble_gattc_read_char (esp_gatt_if_t gattc_if,
  252. uint16_t conn_id, uint16_t handle,
  253. esp_gatt_auth_req_t auth_req)
  254. {
  255. btc_msg_t msg = {0};
  256. btc_ble_gattc_args_t arg;
  257. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  258. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  259. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  260. return ESP_FAIL;
  261. }
  262. msg.sig = BTC_SIG_API_CALL;
  263. msg.pid = BTC_PID_GATTC;
  264. msg.act = BTC_GATTC_ACT_READ_CHAR;
  265. arg.read_char.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  266. arg.read_char.handle = handle;
  267. arg.read_char.auth_req = auth_req;
  268. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  269. }
  270. esp_err_t esp_ble_gattc_read_by_type (esp_gatt_if_t gattc_if,
  271. uint16_t conn_id,
  272. uint16_t start_handle,
  273. uint16_t end_handle,
  274. esp_bt_uuid_t *uuid,
  275. esp_gatt_auth_req_t auth_req)
  276. {
  277. btc_msg_t msg = {0};
  278. btc_ble_gattc_args_t arg;
  279. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  280. if (uuid == NULL) {
  281. return ESP_GATT_ILLEGAL_PARAMETER;
  282. }
  283. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  284. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  285. return ESP_FAIL;
  286. }
  287. msg.sig = BTC_SIG_API_CALL;
  288. msg.pid = BTC_PID_GATTC;
  289. msg.act = BTC_GATTC_ACT_READ_BY_TYPE;
  290. arg.read_by_type.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  291. arg.read_by_type.s_handle = start_handle;
  292. arg.read_by_type.e_handle = end_handle;
  293. arg.read_by_type.auth_req = auth_req;
  294. memcpy(&(arg.read_by_type.uuid), uuid, sizeof(esp_bt_uuid_t));
  295. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  296. }
  297. esp_err_t esp_ble_gattc_read_multiple(esp_gatt_if_t gattc_if,
  298. uint16_t conn_id, esp_gattc_multi_t *read_multi,
  299. esp_gatt_auth_req_t auth_req)
  300. {
  301. btc_msg_t msg = {0};
  302. btc_ble_gattc_args_t arg;
  303. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  304. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  305. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  306. return ESP_FAIL;
  307. }
  308. msg.sig = BTC_SIG_API_CALL;
  309. msg.pid = BTC_PID_GATTC;
  310. msg.act = BTC_GATTC_ACT_READ_MULTIPLE_CHAR;
  311. arg.read_multiple.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  312. arg.read_multiple.num_attr = read_multi->num_attr;
  313. arg.read_multiple.auth_req = auth_req;
  314. if (read_multi->num_attr > 0) {
  315. memcpy(arg.read_multiple.handles, read_multi->handles, sizeof(uint16_t)*read_multi->num_attr);
  316. } else {
  317. LOG_ERROR("%s(), the num_attr should not be 0.", __func__);
  318. return ESP_FAIL;
  319. }
  320. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  321. }
  322. esp_err_t esp_ble_gattc_read_char_descr (esp_gatt_if_t gattc_if,
  323. uint16_t conn_id, uint16_t handle,
  324. esp_gatt_auth_req_t auth_req)
  325. {
  326. btc_msg_t msg = {0};
  327. btc_ble_gattc_args_t arg;
  328. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  329. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  330. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  331. return ESP_FAIL;
  332. }
  333. msg.sig = BTC_SIG_API_CALL;
  334. msg.pid = BTC_PID_GATTC;
  335. msg.act = BTC_GATTC_ACT_READ_CHAR_DESCR;
  336. arg.read_descr.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  337. arg.read_descr.handle = handle;
  338. arg.read_descr.auth_req = auth_req;
  339. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  340. }
  341. esp_err_t esp_ble_gattc_write_char(esp_gatt_if_t gattc_if,
  342. uint16_t conn_id, uint16_t handle,
  343. uint16_t value_len,
  344. uint8_t *value,
  345. esp_gatt_write_type_t write_type,
  346. esp_gatt_auth_req_t auth_req)
  347. {
  348. btc_msg_t msg = {0};
  349. btc_ble_gattc_args_t arg;
  350. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  351. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  352. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  353. return ESP_FAIL;
  354. }
  355. msg.sig = BTC_SIG_API_CALL;
  356. msg.pid = BTC_PID_GATTC;
  357. msg.act = BTC_GATTC_ACT_WRITE_CHAR;
  358. arg.write_char.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  359. arg.write_char.handle = handle;
  360. arg.write_char.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len;
  361. arg.write_char.value = value;
  362. arg.write_char.write_type = write_type;
  363. arg.write_char.auth_req = auth_req;
  364. if(write_type == ESP_GATT_WRITE_TYPE_NO_RSP){
  365. l2ble_update_att_acl_pkt_num(L2CA_ADD_BTC_NUM, NULL);
  366. }
  367. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  368. }
  369. esp_err_t esp_ble_gattc_write_char_descr (esp_gatt_if_t gattc_if,
  370. uint16_t conn_id, uint16_t handle,
  371. uint16_t value_len,
  372. uint8_t *value,
  373. esp_gatt_write_type_t write_type,
  374. esp_gatt_auth_req_t auth_req)
  375. {
  376. btc_msg_t msg = {0};
  377. btc_ble_gattc_args_t arg;
  378. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  379. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  380. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  381. return ESP_FAIL;
  382. }
  383. msg.sig = BTC_SIG_API_CALL;
  384. msg.pid = BTC_PID_GATTC;
  385. msg.act = BTC_GATTC_ACT_WRITE_CHAR_DESCR;
  386. arg.write_descr.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  387. arg.write_descr.handle = handle;
  388. arg.write_descr.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len;
  389. arg.write_descr.value = value;
  390. arg.write_descr.write_type = write_type;
  391. arg.write_descr.auth_req = auth_req;
  392. if(write_type == ESP_GATT_WRITE_TYPE_NO_RSP){
  393. l2ble_update_att_acl_pkt_num(L2CA_ADD_BTC_NUM, NULL);
  394. }
  395. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  396. }
  397. esp_err_t esp_ble_gattc_prepare_write(esp_gatt_if_t gattc_if,
  398. uint16_t conn_id, uint16_t handle,
  399. uint16_t offset,
  400. uint16_t value_len,
  401. uint8_t *value,
  402. esp_gatt_auth_req_t auth_req)
  403. {
  404. btc_msg_t msg = {0};
  405. btc_ble_gattc_args_t arg;
  406. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  407. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  408. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  409. return ESP_FAIL;
  410. }
  411. msg.sig = BTC_SIG_API_CALL;
  412. msg.pid = BTC_PID_GATTC;
  413. msg.act = BTC_GATTC_ACT_PREPARE_WRITE;
  414. arg.prep_write.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  415. arg.prep_write.handle = handle;
  416. arg.prep_write.offset = offset;
  417. arg.prep_write.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len; // length check ?
  418. arg.prep_write.value = value;
  419. arg.prep_write.auth_req = auth_req;
  420. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  421. }
  422. esp_err_t esp_ble_gattc_prepare_write_char_descr(esp_gatt_if_t gattc_if,
  423. uint16_t conn_id, uint16_t handle,
  424. uint16_t offset,
  425. uint16_t value_len,
  426. uint8_t *value,
  427. esp_gatt_auth_req_t auth_req)
  428. {
  429. btc_msg_t msg = {0};
  430. btc_ble_gattc_args_t arg;
  431. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  432. if (L2CA_CheckIsCongest(L2CAP_ATT_CID, conn_id)) {
  433. LOG_DEBUG("%s, the l2cap chanel is congest.", __func__);
  434. return ESP_FAIL;
  435. }
  436. msg.sig = BTC_SIG_API_CALL;
  437. msg.pid = BTC_PID_GATTC;
  438. msg.act = BTC_GATTC_ACT_PREPARE_WRITE_CHAR_DESCR;
  439. arg.prep_write_descr.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  440. arg.prep_write_descr.handle = handle;
  441. arg.prep_write_descr.offset = offset;
  442. arg.prep_write_descr.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len; // length check ?
  443. arg.prep_write_descr.value = value;
  444. arg.prep_write_descr.auth_req = auth_req;
  445. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  446. }
  447. esp_err_t esp_ble_gattc_execute_write (esp_gatt_if_t gattc_if, uint16_t conn_id, bool is_execute)
  448. {
  449. btc_msg_t msg = {0};
  450. btc_ble_gattc_args_t arg;
  451. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  452. msg.sig = BTC_SIG_API_CALL;
  453. msg.pid = BTC_PID_GATTC;
  454. msg.act = BTC_GATTC_ACT_EXECUTE_WRITE;
  455. arg.exec_write.conn_id = BTC_GATT_CREATE_CONN_ID(gattc_if, conn_id);
  456. arg.exec_write.is_execute = is_execute;
  457. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  458. }
  459. esp_err_t esp_ble_gattc_register_for_notify (esp_gatt_if_t gattc_if,
  460. esp_bd_addr_t server_bda, uint16_t handle)
  461. {
  462. btc_msg_t msg = {0};
  463. btc_ble_gattc_args_t arg;
  464. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  465. msg.sig = BTC_SIG_API_CALL;
  466. msg.pid = BTC_PID_GATTC;
  467. msg.act = BTC_GATTC_ACT_REG_FOR_NOTIFY;
  468. arg.reg_for_notify.gattc_if = gattc_if;
  469. memcpy(arg.reg_for_notify.remote_bda, server_bda, sizeof(esp_bd_addr_t));
  470. arg.reg_for_notify.handle = handle;
  471. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  472. }
  473. esp_err_t esp_ble_gattc_unregister_for_notify (esp_gatt_if_t gattc_if,
  474. esp_bd_addr_t server_bda, uint16_t handle)
  475. {
  476. btc_msg_t msg = {0};
  477. btc_ble_gattc_args_t arg;
  478. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  479. msg.sig = BTC_SIG_API_CALL;
  480. msg.pid = BTC_PID_GATTC;
  481. msg.act = BTC_GATTC_ACT_UNREG_FOR_NOTIFY;
  482. arg.unreg_for_notify.gattc_if = gattc_if;
  483. arg.unreg_for_notify.handle = handle;
  484. memcpy(arg.unreg_for_notify.remote_bda, server_bda, sizeof(esp_bd_addr_t));
  485. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  486. }
  487. esp_err_t esp_ble_gattc_cache_refresh(esp_bd_addr_t remote_bda)
  488. {
  489. btc_msg_t msg = {0};
  490. btc_ble_gattc_args_t arg;
  491. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  492. msg.sig = BTC_SIG_API_CALL;
  493. msg.pid = BTC_PID_GATTC;
  494. msg.act = BTC_GATTC_ACT_CACHE_REFRESH;
  495. memcpy(arg.cache_refresh.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
  496. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  497. }
  498. esp_err_t esp_ble_gattc_cache_clean(esp_bd_addr_t remote_bda)
  499. {
  500. btc_msg_t msg = {0};
  501. btc_ble_gattc_args_t arg;
  502. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  503. msg.sig = BTC_SIG_API_CALL;
  504. msg.pid = BTC_PID_GATTC;
  505. msg.act = BTC_GATTC_ACT_CACHE_CLEAN;
  506. memcpy(arg.cache_clean.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
  507. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  508. }
  509. esp_err_t esp_ble_gattc_cache_assoc(esp_gatt_if_t gattc_if, esp_bd_addr_t src_addr, esp_bd_addr_t assoc_addr, bool is_assoc)
  510. {
  511. btc_msg_t msg = {0};
  512. btc_ble_gattc_args_t arg;
  513. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  514. msg.sig = BTC_SIG_API_CALL;
  515. msg.pid = BTC_PID_GATTC;
  516. msg.act = BTC_GATTC_ACT_CACHE_ASSOC;
  517. arg.cache_assoc.is_assoc = is_assoc;
  518. arg.cache_assoc.gattc_if = gattc_if;
  519. memcpy(arg.cache_assoc.src_addr, src_addr, sizeof(esp_bd_addr_t));
  520. memcpy(arg.cache_assoc.assoc_addr, assoc_addr, sizeof(esp_bd_addr_t));
  521. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  522. }
  523. esp_err_t esp_ble_gattc_cache_get_addr_list(esp_gatt_if_t gattc_if)
  524. {
  525. btc_msg_t msg = {0};
  526. btc_ble_gattc_args_t arg;
  527. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  528. msg.sig = BTC_SIG_API_CALL;
  529. msg.pid = BTC_PID_GATTC;
  530. msg.act = BTC_GATTC_ATC_CACHE_GET_ADDR_LIST;
  531. arg.get_addr_list.gattc_if = gattc_if;
  532. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  533. }
  534. #endif ///GATTC_INCLUDED == TRUE