bsal.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-28 Supperthomas the first version
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "bsal.h"
  13. #include "bsal_osif.h"
  14. #include "bsal_int.h"
  15. //======================================BSAL UTILS======DEPEND NOTHING======================================================
  16. void bsal_gatt_read_callback_event(void *stack_ptr, uint16_t conn_handle, uint16_t start_handle, uint16_t offset_handle, uint16_t *length , uint8_t **value)
  17. {
  18. bsal_callbak_data_t p_param;
  19. p_param.stack_ptr = stack_ptr;
  20. p_param.conn_id = conn_handle;
  21. p_param.start_handle = start_handle;
  22. p_param.off_handle = offset_handle;
  23. p_param.msg_type = BSAL_CALLBACK_TYPE_READ_CHAR_VALUE;
  24. bsal_srv_callback_t *p_bsal_srv = bsal_profile_get(p_param.stack_ptr, p_param.start_handle);
  25. p_bsal_srv->bsal_srv_fn_cb((void *)&p_param);
  26. bsal_srv_read_data(p_param.stack_ptr, p_param.start_handle, p_param.off_handle, length, value);
  27. }
  28. void bsal_gatt_write_callback_event(void *stack_ptr, uint16_t conn_handle, uint16_t start_handle, uint16_t offset_handle, uint16_t length , uint8_t *value)
  29. {
  30. bsal_callbak_data_t p_param;
  31. p_param.stack_ptr = stack_ptr;
  32. p_param.conn_id = conn_handle;
  33. p_param.start_handle = start_handle;
  34. p_param.off_handle = offset_handle;
  35. p_param.msg_type = BSAL_CALLBACK_TYPE_WRITE_CHAR_VALUE;
  36. p_param.data = value;
  37. p_param.length = length;
  38. bsal_srv_callback_t *p_bsal_srv = bsal_profile_get(p_param.stack_ptr, p_param.start_handle);
  39. memcpy(&p_param.srv_uuid, &p_bsal_srv->srv_uuid, sizeof(bsal_uuid_any_t));
  40. p_bsal_srv->bsal_srv_fn_cb((void *)&p_param);
  41. }
  42. void bsal_gatt_cccd_callback_event(void *stack_ptr, uint16_t conn_handle, uint16_t start_handle, uint16_t offset_handle, uint16_t value)
  43. {
  44. bsal_callbak_data_t p_param;
  45. p_param.stack_ptr = stack_ptr;
  46. p_param.conn_id = conn_handle;
  47. p_param.start_handle = start_handle;
  48. p_param.off_handle = offset_handle;
  49. p_param.msg_type = BSAL_CALLBACK_TYPE_INDIFICATION_NOTIFICATION;
  50. p_param.length = 2;
  51. p_param.value = value;
  52. bsal_srv_callback_t *p_bsal_srv = bsal_profile_get(p_param.stack_ptr, p_param.start_handle);
  53. memcpy(&p_param.srv_uuid, &p_bsal_srv->srv_uuid, sizeof(bsal_uuid_any_t));
  54. p_bsal_srv->bsal_srv_fn_cb((void *)&p_param);
  55. }
  56. void bsal_gatt_read_callback_event_by_handle(void *stack_ptr, uint16_t conn_handle, uint16_t u_handle, uint16_t *length , uint8_t **value)
  57. {
  58. uint16_t start_handle = bsal_profile_get_start_handle(stack_ptr, u_handle);
  59. uint16_t offset_handle = u_handle - start_handle;
  60. bsal_gatt_read_callback_event(stack_ptr, conn_handle, start_handle, offset_handle, length, value);
  61. }
  62. void bsal_gatt_write_callback_event_by_handle(void *stack_ptr, uint16_t conn_handle, uint16_t u_handle, uint16_t length , uint8_t *value)
  63. {
  64. uint16_t start_handle = bsal_profile_get_start_handle(stack_ptr, u_handle);
  65. uint16_t offset_handle = u_handle - start_handle;
  66. bsal_gatt_write_callback_event(stack_ptr, conn_handle, start_handle, offset_handle, length, value);
  67. }
  68. void bsal_gatt_cccd_callback_event_by_handle(void *stack_ptr, uint16_t conn_handle, uint16_t u_handle , uint16_t value)
  69. {
  70. uint16_t start_handle = bsal_profile_get_start_handle(stack_ptr, u_handle);
  71. uint16_t offset_handle = u_handle - start_handle;
  72. bsal_gatt_cccd_callback_event(stack_ptr, conn_handle, start_handle, offset_handle, value);
  73. }
  74. void bsal_le_adv_data_add_ltv(uint8_t *adv_data, le_adv_ltv_t *ltv)
  75. {
  76. BSAL_ASSERT_PTR(data);
  77. BSAL_ASSERT_PTR(ltv);
  78. uint8_t index = 0;
  79. index = adv_data[0] + 1;
  80. adv_data[index++] = ltv->length;
  81. adv_data[index++] = ltv->type;
  82. memcpy(&adv_data[index], ltv->value, ltv->length - 1);
  83. index += ltv->length - 1;
  84. adv_data[0] = index - 1;
  85. }
  86. void bsal_le_adv_data_add_flag(uint8_t *adv_data , uint8_t flag)
  87. {
  88. BSAL_ASSERT_PTR(ptr);
  89. le_adv_ltv_t ltv;
  90. ltv.length = 2;
  91. uint8_t value = flag;
  92. ltv.value = (uint8_t *)&value;
  93. ltv.type = BSAL_GAP_TYPE_FLAGS;
  94. bsal_le_adv_data_add_ltv(adv_data, &ltv);
  95. }
  96. void bsal_adv_data_add_name(uint8_t *adv_data, uint8_t name_length, char *name)
  97. {
  98. BSAL_ASSERT_PTR(adv_data);
  99. le_adv_ltv_t ltv;
  100. ltv.length = name_length + 1;
  101. ltv.value = (uint8_t *)name;
  102. ltv.type = BSAL_GAP_TYPE_COMPLETE_LOCAL_NAME;
  103. bsal_le_adv_data_add_ltv(adv_data, &ltv);
  104. }
  105. void bsal_adv_data_add_uuid16(uint8_t *adv_data, uint16_t uuid)
  106. {
  107. BSAL_ASSERT_PTR(adv_data);
  108. le_adv_ltv_t ltv;
  109. ltv.length = 3;
  110. ltv.type = BSAL_GAP_TYPE_COMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS;
  111. uint16_t tmp_uuid = uuid;
  112. ltv.value = (uint8_t *)&tmp_uuid;
  113. bsal_le_adv_data_add_ltv(adv_data, &ltv);
  114. }
  115. static bsal_gatt_value_entry_t *bsal_read_att(bsal_gatt_value_entry_t *p_db, uint32_t u_handle)
  116. {
  117. BSAL_ASSERT_PTR(p_db);
  118. bsal_gatt_value_entry_t *tmp_db = p_db;
  119. while (tmp_db != NULL)
  120. {
  121. if (tmp_db->u_handle == u_handle)
  122. {
  123. return tmp_db;
  124. }
  125. else
  126. {
  127. tmp_db = tmp_db->next_entry;
  128. }
  129. }
  130. bsal_osif_printf_err("could not find the att:%d", u_handle);
  131. return NULL;
  132. }
  133. static int bsal_insert_att(void *stack_ptr, uint32_t u_handle, uint16_t value_length)
  134. {
  135. BSAL_ASSERT_PTR(stack_ptr);
  136. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  137. bsal_gatt_value_entry_t *p_db = p_ops->db;
  138. if (p_db == NULL)
  139. {
  140. //first INIT
  141. bsal_gatt_value_entry_t *temp_db = bsal_osif_malloc(sizeof(bsal_gatt_value_entry_t));
  142. temp_db->next_entry = NULL;
  143. temp_db->u_handle = u_handle;
  144. temp_db->value = bsal_osif_malloc(value_length);
  145. temp_db->alloc_size = value_length;
  146. if (temp_db->value != NULL)
  147. {
  148. //first time
  149. p_ops->db = temp_db;
  150. return 0;
  151. }
  152. bsal_osif_printf_err("temp_db->value malloc failed1 value_length:%x", value_length);
  153. return 1;
  154. }
  155. bsal_gatt_value_entry_t *last_db = p_db;
  156. //find the end
  157. while (p_db != NULL)
  158. {
  159. last_db = p_db;
  160. p_db = p_db->next_entry;
  161. }
  162. if (p_db == NULL)
  163. {
  164. // the last one
  165. bsal_gatt_value_entry_t *temp_db = bsal_osif_malloc(sizeof(bsal_gatt_value_entry_t));
  166. last_db->next_entry = temp_db;
  167. temp_db->next_entry = NULL;
  168. temp_db->u_handle = u_handle;
  169. temp_db->value = bsal_osif_malloc(value_length);
  170. temp_db->alloc_size = value_length;
  171. if (temp_db->value != NULL)
  172. {
  173. return 0;
  174. }
  175. bsal_osif_printf_err("temp_db->value %x malloc value_length:%x", u_handle, value_length);
  176. return 0;
  177. }
  178. return 2;
  179. }
  180. int bsal_att_create_entry(void *stack_ptr, uint32_t u_handle, uint16_t value_length)
  181. {
  182. //SAVE THE DATA
  183. BSAL_ASSERT_PTR(stack_ptr);
  184. BSAL_ASSERT_PTR(value_length);
  185. BSAL_ASSERT_PTR(u_handle);
  186. return bsal_insert_att(stack_ptr, u_handle, value_length);//just use the length malloc data
  187. }
  188. int bsal_att_read_entry(void *stack_ptr, uint32_t u_handle, uint16_t *value_length, uint8_t **value)
  189. {
  190. //READ THE DATE
  191. BSAL_ASSERT_PTR(stack_ptr);
  192. BSAL_ASSERT_PTR(value_length);
  193. BSAL_ASSERT_PTR(value);
  194. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  195. bsal_gatt_value_entry_t *p_db = p_ops->db;
  196. bsal_gatt_value_entry_t *p_value = bsal_read_att(p_db, u_handle);//just use the length malloc data
  197. *value = p_value->value;
  198. *value_length = p_value->value_length;
  199. return 0;
  200. }
  201. int bsal_att_write_entry(void *stack_ptr, uint32_t u_handle, uint16_t value_length, uint8_t *value)
  202. {
  203. //WRITE THE DATA
  204. BSAL_ASSERT_PTR(stack_ptr);
  205. BSAL_ASSERT_PTR(value_length);
  206. BSAL_ASSERT_PTR(value);
  207. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  208. bsal_gatt_value_entry_t *p_db = p_ops->db;
  209. bsal_gatt_value_entry_t *p_value = bsal_read_att(p_db, u_handle);//just use the length malloc data
  210. if (value_length <= p_value->alloc_size)
  211. {
  212. memcpy(p_value->value, value, value_length);
  213. }
  214. else
  215. {
  216. //size out of reset value ,fail
  217. //FAILED
  218. bsal_osif_printf_err("bsal_att_write_entry: FAIL WRITE THE DATA THE LENGTH IS %dLESS THAN ALLOCATED %d", value_length, p_value->alloc_size);
  219. return 1;
  220. }
  221. p_value->value_length = value_length;
  222. return 0;
  223. }
  224. int bsal_att_resize_entry(void *stack_ptr, uint32_t u_handle, uint16_t value_length, bool append)
  225. {
  226. //RESIZE THE DATA
  227. BSAL_ASSERT_PTR(stack_ptr);
  228. BSAL_ASSERT_PTR(value_length);
  229. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  230. bsal_gatt_value_entry_t *p_db = p_ops->db;
  231. bsal_gatt_value_entry_t *p_value = bsal_read_att(p_db, u_handle);//just use the length malloc data
  232. bsal_osif_free(p_value->value);
  233. p_value->value = bsal_osif_malloc(value_length);
  234. p_value->append = append;
  235. return 0;
  236. }
  237. void bsal_util_sum_handle_num(bsal_gatt_app_srv_def_t *p_srv, bsal_gatt_res_t *att_res)
  238. {
  239. // const struct bsal_gatt_app_srv_def *svc;
  240. // const struct bsal_gatt_app_chr_def *chr;
  241. BSAL_ASSERT_PTR(p_srv);
  242. BSAL_ASSERT_PTR(att_res);
  243. bsal_gatt_app_srv_def_t *tmp_srv;
  244. bsal_gatt_chr_def_t *tmp_chr;
  245. uint8_t i = 0;
  246. uint8_t j = 0;
  247. uint8_t x = 0;
  248. uint8_t y = 0;
  249. memset(att_res, 0, sizeof(bsal_gatt_res_t));
  250. for (i = 0; p_srv[i].type != 0; i++)
  251. {
  252. //service
  253. tmp_srv = p_srv + i;
  254. if ((tmp_srv->type != BSAL_GATT_UUID_PRIMARY_SERVICE) &&
  255. (tmp_srv->type != BSAL_GATT_UUID_SECONDARY_SERVICE))
  256. {
  257. bsal_osif_printf_err("wrong tmp_srv->type:%x", tmp_srv->type);
  258. return;
  259. }
  260. att_res->attrs++;
  261. att_res->svcs++;
  262. if (tmp_srv->includes != NULL)
  263. {
  264. for (j = 0; tmp_srv->includes[j] != NULL; j++)
  265. {
  266. att_res->attrs++;
  267. att_res->incs++;
  268. }
  269. }
  270. if (tmp_srv->characteristics != NULL)
  271. {
  272. for (x = 0; tmp_srv->characteristics[x].uuid != NULL; x++)
  273. {
  274. tmp_chr = tmp_srv->characteristics + x;
  275. att_res->chrs++;
  276. att_res->attrs += 2;
  277. if ((tmp_chr->properties & BSAL_ATT_P_NOTIFY) ||
  278. (tmp_chr->properties & BSAL_ATT_P_INDICATE))
  279. {
  280. att_res->dscs++;
  281. att_res->cccds++;
  282. att_res->attrs++;
  283. }
  284. if (tmp_chr->descriptors != NULL)
  285. {
  286. for (y = 0; tmp_chr->descriptors[y].uuid != NULL; y++)
  287. {
  288. att_res->dscs++;
  289. att_res->attrs++;
  290. }
  291. }
  292. }
  293. }
  294. }
  295. }
  296. uint16_t bsal_profile_get_start_handle(void *stack_ptr, uint16_t value_handle)
  297. {
  298. BSAL_ASSERT_PTR(stack_ptr);
  299. BSAL_ASSERT_PTR(start_handle);
  300. uint8_t i = 0;
  301. static uint16_t last_handle;
  302. bsal_stack_obj_t *p_bsal_stack = stack_ptr;
  303. last_handle = p_bsal_stack->bsal_srv_objs[0].start_handle;
  304. for (i = 0; i < p_bsal_stack->srv_num; i++)
  305. {
  306. if (value_handle < p_bsal_stack->bsal_srv_objs[i].start_handle) //find the next value handle
  307. {
  308. if (value_handle > last_handle)
  309. {
  310. return last_handle;
  311. }
  312. }
  313. else
  314. {
  315. last_handle = p_bsal_stack->bsal_srv_objs[i].start_handle;
  316. }
  317. }
  318. }
  319. uint16_t bsal_srv_get_start_handle(void *stack_ptr, bsal_uuid_any_t uuid)
  320. {
  321. BSAL_ASSERT_PTR(stack_ptr);
  322. if (uuid.u_type == 16)
  323. {
  324. return bsal_profile_get_start_handle_by_16_uuid(stack_ptr, uuid.u16.value);
  325. }
  326. else
  327. {
  328. /* TODO deal with the 128 bit*/
  329. }
  330. return 0;
  331. }
  332. BSAL_STATUS bsal_profile_insert(void *stack_ptr, uint16_t handle, void *callback, bsal_uuid_any_t uuid)
  333. {
  334. BSAL_ASSERT_PTR(stack_ptr);
  335. uint8_t i = 0;
  336. bsal_stack_obj_t *p_bsal_stack = stack_ptr;
  337. if (handle == 0xffff)
  338. {
  339. //add the end
  340. i = p_bsal_stack->srv_num - 1;
  341. p_bsal_stack->bsal_srv_objs[i].bsal_srv_fn_cb = (P_BSAL_PROFILE_CB)callback;
  342. p_bsal_stack-> bsal_srv_objs[i].start_handle = handle;
  343. memcpy(&p_bsal_stack-> bsal_srv_objs[i].srv_uuid, &uuid, sizeof(bsal_uuid_any_t));
  344. return BSAL_RESULT_SUCCESS;
  345. }
  346. for (i = 0 ; i < p_bsal_stack->srv_num; i++)
  347. {
  348. if (p_bsal_stack->bsal_srv_objs[i].start_handle == 0)
  349. {
  350. p_bsal_stack->bsal_srv_objs[i].bsal_srv_fn_cb = (P_BSAL_PROFILE_CB)callback;
  351. p_bsal_stack-> bsal_srv_objs[i].start_handle = handle;
  352. memcpy(&p_bsal_stack-> bsal_srv_objs[i].srv_uuid, &uuid, sizeof(bsal_uuid_any_t));
  353. //find device
  354. return BSAL_RESULT_SUCCESS;
  355. }
  356. }
  357. return BSAL_RESULT_FAIL;
  358. }
  359. bsal_srv_callback_t *bsal_profile_get(void *stack_ptr, uint16_t start_handle)
  360. {
  361. BSAL_ASSERT_PTR(stack_ptr);
  362. BSAL_ASSERT_PTR(start_handle);
  363. uint8_t i = 0;
  364. bsal_stack_obj_t *p_bsal_stack = stack_ptr;
  365. for (i = 0 ; i < p_bsal_stack->srv_num; i++)
  366. {
  367. if (p_bsal_stack->bsal_srv_objs[i].start_handle == start_handle)
  368. {
  369. return &(p_bsal_stack->bsal_srv_objs[i]);
  370. }
  371. }
  372. return NULL;
  373. }
  374. uint16_t bsal_profile_get_start_handle_by_16_uuid(void *stack_ptr, uint16_t uuid)
  375. {
  376. BSAL_ASSERT_PTR(stack_ptr);
  377. uint8_t i = 0;
  378. bsal_stack_obj_t *p_bsal_stack = stack_ptr;
  379. for (i = 0 ; i < p_bsal_stack->srv_num; i++)
  380. {
  381. if ((p_bsal_stack->bsal_srv_objs[i].srv_uuid.u_type == 16) && (p_bsal_stack->bsal_srv_objs[i].srv_uuid.u16.value == uuid))
  382. {
  383. return p_bsal_stack->bsal_srv_objs[i].start_handle;
  384. }
  385. }
  386. return NULL;
  387. }
  388. //bond about
  389. uint8_t io_capablity[3][2] =
  390. {
  391. {BSAL_GAP_IO_CAP_NO_INPUT_NO_OUTPUT, BSAL_GAP_IO_CAP_DISPLAY_ONLY},
  392. {BSAL_GAP_IO_CAP_NO_INPUT_NO_OUTPUT, BSAL_GAP_IO_CAP_DISPLAY_YES_NO},
  393. {BSAL_GAP_IO_CAP_KEYBOARD_ONLY, BSAL_GAP_IO_CAP_KEYBOARD_DISPLAY},
  394. };
  395. static uint8_t bsal_get_in_out_capability(uint8_t input, uint8_t output)
  396. {
  397. return io_capablity[input][output];
  398. }
  399. //=======================ATT====OPERATE==========================
  400. int bsal_srv_write_data_by_handle(void *stack_ptr, uint16_t u_handle, uint16_t value_length, uint8_t *value)
  401. {
  402. BSAL_ASSERT_PTR(stack_ptr);
  403. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  404. BSAL_ASSERT_PTR(p_ops->bsal_ops.cov_handle_to_u_handle);
  405. return bsal_att_write_entry(stack_ptr, u_handle, value_length , value);
  406. }
  407. int bsal_srv_read_data_by_handle(void *stack_ptr, uint16_t u_handle, uint16_t *value_length, uint8_t **value)
  408. {
  409. BSAL_ASSERT_PTR(stack_ptr);
  410. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  411. return bsal_att_read_entry(stack_ptr, u_handle, value_length , value);
  412. }
  413. int bsal_srv_create_att_by_handle(void *stack_ptr, uint16_t u_handle, uint16_t value_length)
  414. {
  415. BSAL_ASSERT_PTR(stack_ptr);
  416. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  417. return bsal_att_create_entry(stack_ptr, u_handle, value_length);
  418. }
  419. int bsal_srv_write_data(void *stack_ptr, uint16_t start_handle, uint16_t offset_handle, uint16_t value_length, uint8_t *value)
  420. {
  421. BSAL_ASSERT_PTR(stack_ptr);
  422. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  423. BSAL_ASSERT_PTR(p_ops->bsal_ops.cov_handle_to_u_handle);
  424. return bsal_att_write_entry(stack_ptr, p_ops->bsal_ops.cov_handle_to_u_handle(start_handle, offset_handle), value_length , value);
  425. }
  426. int bsal_srv_read_data(void *stack_ptr, uint16_t start_handle, uint16_t offset_handle, uint16_t *value_length, uint8_t **value)
  427. {
  428. BSAL_ASSERT_PTR(stack_ptr);
  429. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  430. return bsal_att_read_entry(stack_ptr, p_ops->bsal_ops.cov_handle_to_u_handle(start_handle, offset_handle), value_length , value);
  431. }
  432. int bsal_srv_create_att(void *stack_ptr, uint16_t start_handle, uint16_t offset_handle, uint16_t value_length)
  433. {
  434. BSAL_ASSERT_PTR(stack_ptr);
  435. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  436. return bsal_att_create_entry(stack_ptr, p_ops->bsal_ops.cov_handle_to_u_handle(start_handle, offset_handle), value_length);
  437. }
  438. int bsal_srv_send_notify_data(void *stack_ptr, uint16_t conn_id, uint16_t start_handle, uint16_t offset_handle, uint16_t value_length, uint8_t *value)
  439. {
  440. BSAL_ASSERT_PTR(stack_ptr);
  441. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  442. //check the MTU SIZE
  443. BSAL_ASSERT_PTR(p_ops->bsal_ops.le_srv_send_data);
  444. return p_ops->bsal_ops.le_srv_send_data(conn_id, start_handle, offset_handle, value_length , value, BSAL_SEND_DATA_TYPE_ANY);
  445. }
  446. int bsal_srv_send_ind_data(void *stack_ptr, uint16_t conn_id, uint16_t service_id, uint16_t offset_handle, uint16_t value_length, uint8_t *value)
  447. {
  448. BSAL_ASSERT_PTR(stack_ptr);
  449. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  450. //TODO check the MTU SIZE
  451. BSAL_ASSERT_PTR(p_ops->bsal_ops.le_srv_send_data);
  452. return p_ops->bsal_ops.le_srv_send_data(conn_id, service_id, offset_handle, value_length , value, BSAL_SEND_DATA_TYPE_ANY);
  453. }
  454. //===============================================================STACK OPERATE=============================================
  455. void *bsal_find_stack_ptr(char *stack_name)
  456. {
  457. bsal_osif_printf_dbg("%s line:%d: param %s", __FUNCTION__, __LINE__, stack_name);
  458. //find the device name
  459. //When init the rtk object has been insert the object
  460. /*TODO */
  461. #ifdef PKG_BSAL_NIMBLE_STACK
  462. extern bsal_stack_obj_t nimble_obj;
  463. return &nimble_obj;
  464. #else
  465. extern bsal_stack_obj_t rtk_obj;
  466. return &rtk_obj;
  467. #endif
  468. }
  469. void bsal_stack_le_srv_begin(void *stack_ptr, uint8_t num, void *p_fun_cb)
  470. {
  471. BSAL_ASSERT_PTR(stack_ptr);
  472. bsal_osif_printf_dbg("%s line:%d: param %d", __FUNCTION__, __LINE__, num);
  473. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  474. p_ops->bsal_ops.le_srv_reg_begin(false, num, p_fun_cb);
  475. p_ops->bsal_srv_objs = bsal_osif_malloc((num + 1) * sizeof(bsal_srv_callback_t));
  476. p_ops->srv_num = num + 1;
  477. //add common service callback
  478. bsal_uuid_any_t srv_uuid;
  479. srv_uuid.u_type = BSAL_UUID_TYPE_16BIT;
  480. srv_uuid.u16.value = BSAL_SRV_UUID_GENERAL;
  481. // add the generate uuid for except common profile
  482. bsal_profile_insert(stack_ptr, 0xffff, p_fun_cb, srv_uuid);
  483. }
  484. int bsal_stack_le_srv_reg_func(void *stack_ptr, void *srv_def, P_SRV_GENERAL_CB *callback)
  485. {
  486. BSAL_ASSERT_PTR(stack_ptr);
  487. bsal_osif_printf_dbg("%s line:%d: param srv_def :%p, callback: %p", __FUNCTION__, __LINE__, srv_def, callback);
  488. //reg the serverice
  489. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  490. //parse the struct
  491. BSAL_ASSERT_PTR(p_ops->bsal_ops.le_srv_reg_fun);
  492. return p_ops->bsal_ops.le_srv_reg_fun(srv_def, callback);
  493. }
  494. void bsal_stack_le_srv_end(void *stack_ptr)
  495. {
  496. BSAL_ASSERT_PTR(stack_ptr);
  497. bsal_osif_printf_dbg("%s line:%d: param statck:%p", __FUNCTION__, __LINE__, stack_ptr);
  498. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  499. BSAL_ASSERT_PTR(p_ops->bsal_ops.le_srv_reg_end);
  500. p_ops->bsal_ops.le_srv_reg_end();
  501. }
  502. int bsal_stack_init(void *stack_ptr, void *callback)
  503. {
  504. BSAL_ASSERT_PTR(stack_ptr);
  505. BSAL_ASSERT_PTR(callback);
  506. bsal_osif_printf_dbg("%s line:%d: param callback %p", __FUNCTION__, __LINE__, callback);
  507. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  508. #define BSAL_BLE_STACK 0x01
  509. #define BSAL_LEGACY_STACK 0x02
  510. #define BSAL_MESH_STACK 0x04
  511. p_ops->bsal_ops.init(BSAL_BLE_STACK);
  512. //save the callback to the ops
  513. p_ops->app_all_callbak = callback;
  514. //set default param
  515. //1. set scan respnse data
  516. uint8_t tmp_data[32] = {0};
  517. le_adv_ltv_t ltv;
  518. ltv.length = 3;
  519. ltv.type = BSAL_GAP_TYPE_APPEARANCE;
  520. uint16_t tmp_uuid = BSAL_GAP_APPEARANCE_UNKNOWN;
  521. ltv.value = (uint8_t *)&tmp_uuid;
  522. bsal_le_adv_data_add_ltv(tmp_data, &ltv);
  523. bsal_set_le_scan_rsp_data_user(stack_ptr, tmp_data);
  524. //2. set adv param
  525. /** @brief Default minimum advertising interval when device is discoverable (units of 625us, 160=100ms) */
  526. #define DEFAULT_ADVERTISING_INTERVAL_MIN 320
  527. /** @brief Default maximum advertising interval */
  528. #define DEFAULT_ADVERTISING_INTERVAL_MAX 320
  529. bsal_adv_param_t temp_adv_param;
  530. memset(&temp_adv_param, 0, sizeof(bsal_adv_param_t));
  531. temp_adv_param.adv_int_max = DEFAULT_ADVERTISING_INTERVAL_MAX;
  532. temp_adv_param.adv_int_min = DEFAULT_ADVERTISING_INTERVAL_MIN;
  533. temp_adv_param.adv_type = BSAL_GAP_ADTYPE_ADV_IND;
  534. temp_adv_param.own_address_type = BSAL_GAP_REMOTE_ADDR_LE_PUBLIC;
  535. temp_adv_param.direct_address_type = BSAL_GAP_REMOTE_ADDR_LE_PUBLIC;
  536. temp_adv_param.channel_map = BSAL_GAP_ADVCHAN_ALL;
  537. temp_adv_param.filter_policy = BSAL_GAP_ADV_FILTER_ANY;
  538. bsal_set_le_adv_parm(stack_ptr, &temp_adv_param);
  539. //SET GAP NAME
  540. //
  541. bsal_gaps_param_t gaps_param =
  542. {
  543. // .name = bsal_get_device_name(stack_ptr),
  544. .apperance = BSAL_GAP_APPEARANCE_UNKNOWN,
  545. };
  546. memcpy(gaps_param.name, bsal_get_device_name(stack_ptr), BSAL_MAX_NAME_LENGTH);
  547. bsal_set_gap_param(stack_ptr, &gaps_param);
  548. //load default;
  549. bsal_set_device_le_bond_type(stack_ptr, false, BSAL_NO_INPUT, BSAL_NO_OUTPUT, BSAL_GAP_AUTHEN_BIT_NO_BONDING, false);
  550. p_ops->g_att_index = 0;
  551. return 0;
  552. }
  553. void bsal_stack_startup(void *stack_ptr)
  554. {
  555. BSAL_ASSERT_PTR(stack_ptr);
  556. bsal_osif_printf_dbg("%s line:%d: param stack_ptr %p", __FUNCTION__, __LINE__, stack_ptr);
  557. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  558. p_ops->bsal_ops.startup();
  559. }
  560. ///PARAM
  561. //name
  562. int bsal_stack_set_gap_name(void *stack_ptr, uint8_t length, uint8_t *name)
  563. {
  564. BSAL_ASSERT_PTR(stack_ptr);
  565. bsal_osif_printf_dbg("%s line:%d: param stack_ptr %p: length:%d, name:%s", __FUNCTION__, __LINE__, stack_ptr, length, name);
  566. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  567. // p_ops->bsal_ops.set_gaps_param(length, name);
  568. return 0;
  569. }
  570. int bsal_stack_get_gap_name(void *stack_ptr, uint8_t *name, uint8_t *length)
  571. {
  572. BSAL_ASSERT_PTR(stack_ptr);
  573. return 0;
  574. }
  575. //mac address only get
  576. int bsal_stack_get_mac_addr(void *stack_ptr, uint8_t *bd_addr)
  577. {
  578. // BSAL_ASSERT_PTR(stack_ptr);
  579. // BSAL_ASSERT_PTR(bd_addr);
  580. // bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  581. return 0;
  582. }
  583. //adv
  584. int bsal_le_set_adv_param(void *stack_ptr, uint16_t value_length, bsal_adv_param_t *adv_param)
  585. {
  586. BSAL_ASSERT_PTR(stack_ptr);
  587. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  588. p_ops->bsal_ops.le_set_adv_param(adv_param);
  589. return 0;
  590. }
  591. int bsal_le_get_adv_param(void *stack_ptr, bsal_adv_param_t *adv_param)
  592. {
  593. BSAL_ASSERT_PTR(stack_ptr);
  594. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  595. p_ops->bsal_ops.le_get_adv_param(adv_param);
  596. return 0;
  597. }
  598. int bsal_set_device_name(void *stack_ptr, uint8_t length, uint8_t *name)
  599. {
  600. BSAL_ASSERT_PTR(stack_ptr);
  601. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  602. memcpy(p_ops->bsal_info.device_name, name, length);
  603. return 0;
  604. }
  605. uint8_t *bsal_get_device_name(void *stack_ptr)
  606. {
  607. BSAL_ASSERT_PTR(stack_ptr);
  608. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  609. return p_ops->bsal_info.device_name;
  610. }
  611. int bsal_sm_set_bond_mode(void *stack_ptr, bsal_bond_param_t *bond_type)
  612. {
  613. BSAL_ASSERT_PTR(stack_ptr);
  614. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  615. p_ops->bsal_ops.set_bond_param(bond_type);
  616. return 0;
  617. }
  618. int bsal_sm_get_bond_mode(void *stack_ptr, bsal_bond_param_t *bond_type)
  619. {
  620. BSAL_ASSERT_PTR(stack_ptr);
  621. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  622. p_ops->bsal_ops.get_bond_param(bond_type);
  623. return 0;
  624. }
  625. int bsal_get_bd_address(void *stack_ptr, uint8_t *bd_addr)
  626. {
  627. BSAL_ASSERT_PTR(stack_ptr);
  628. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  629. p_ops->bsal_ops.get_mac_address(BSAL_GAP_REMOTE_ADDR_LE_PUBLIC, bd_addr);
  630. return 0;
  631. }
  632. int bsal_stack_start_adv(void *stack_ptr)
  633. {
  634. BSAL_ASSERT_PTR(stack_ptr);
  635. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  636. p_ops->bsal_ops.le_adv_enable(true);
  637. return 0;
  638. }
  639. int bsal_stack_stop_adv(void *stack_ptr)
  640. {
  641. BSAL_ASSERT_PTR(stack_ptr);
  642. bsal_stack_obj_t *p_ops = (struct bsal_stack_obj *)stack_ptr;
  643. p_ops->bsal_ops.le_adv_enable(false);
  644. return 0;
  645. }
  646. uint16_t bsal_set_device_le_bond_type(void *stack_ptr, bool is_bond, uint8_t input, uint8_t output, uint8_t bond_type, bool oob_enable)
  647. {
  648. BSAL_ASSERT_PTR(stack_ptr);
  649. bsal_bond_param_t temp_bond_type;
  650. temp_bond_type.bonding_flag = is_bond;
  651. temp_bond_type.auth_type = bond_type;
  652. temp_bond_type.oob_flag = oob_enable;
  653. temp_bond_type.io_capability = bsal_get_in_out_capability(input, output);
  654. temp_bond_type.sm_req_enable = false;
  655. temp_bond_type.force_auth_type = 0;
  656. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  657. p_ops->bsal_ops.set_bond_param(&temp_bond_type);
  658. return 0;
  659. }
  660. uint16_t bsal_set_device_le_bond_param(void *stack_ptr, bsal_bond_param_t *bond_param)
  661. {
  662. BSAL_ASSERT_PTR(stack_ptr);
  663. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  664. p_ops->bsal_ops.set_bond_param(bond_param);
  665. return 0;
  666. }
  667. void bsal_set_le_adv_data(void *stack_ptr, uint8_t length, uint8_t *data)
  668. {
  669. BSAL_ASSERT_PTR(stack_ptr);
  670. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  671. bsal_adv_param_t temp_adv_param;
  672. temp_adv_param.set_param_flag = BSAL_SET_LE_ADV_DATA;
  673. memcpy(temp_adv_param.adv_data, data, length);
  674. if (length < 31)
  675. {
  676. p_ops->bsal_ops.le_set_adv_param(&temp_adv_param);
  677. }
  678. else
  679. {
  680. //ERROR
  681. }
  682. }
  683. void bsal_set_le_adv_data_user(void *stack_ptr, uint8_t *adv_data)
  684. {
  685. BSAL_ASSERT_PTR(stack_ptr);
  686. bsal_set_le_adv_data(stack_ptr, adv_data[0] + 1 , adv_data);
  687. }
  688. void bsal_set_le_srp_data(void *stack_ptr, uint8_t length, uint8_t *data)
  689. {
  690. BSAL_ASSERT_PTR(stack_ptr);
  691. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  692. bsal_adv_param_t temp_adv_param;
  693. temp_adv_param.set_param_flag = BSAL_SET_LE_SCAN_RSP_DATA;
  694. memcpy(temp_adv_param.scan_rsp_data, data, length);
  695. if (length < 31)
  696. {
  697. p_ops->bsal_ops.le_set_adv_param(&temp_adv_param);
  698. }
  699. else
  700. {
  701. //ERROR
  702. }
  703. }
  704. void bsal_set_le_scan_rsp_data_user(void *stack_ptr, uint8_t *scan_rsp_data)
  705. {
  706. BSAL_ASSERT_PTR(stack_ptr);
  707. bsal_set_le_srp_data(stack_ptr, scan_rsp_data[0] + 1 , scan_rsp_data);
  708. }
  709. void bsal_set_le_adv_parm(void *stack_ptr, bsal_adv_param_t *adv_param)
  710. {
  711. BSAL_ASSERT_PTR(stack_ptr);
  712. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  713. adv_param->set_param_flag = BSAL_SET_LE_ADV_PARAM;
  714. p_ops->bsal_ops.le_set_adv_param(adv_param);
  715. }
  716. void bsal_set_gap_param(void *stack_ptr, bsal_gaps_param_t *gaps_param)
  717. {
  718. BSAL_ASSERT_PTR(stack_ptr);
  719. bsal_stack_obj_t *p_ops = (bsal_stack_obj_t *)stack_ptr;
  720. p_ops->bsal_ops.set_gaps_param(gaps_param);
  721. }
  722. //API FOR CALLBACK CALLED BY STACK
  723. int bsal_stack_ready(void *stack_ptr, bool status)
  724. {
  725. BSAL_ASSERT_PTR(stack_ptr);
  726. //true is ready
  727. //false is fail
  728. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  729. if (status == true)
  730. {
  731. p_ops->app_all_callbak(p_ops, BSAL_CB_LAYER_GAP, BSAL_CB_STACK_READY, 0 , NULL);
  732. }
  733. else
  734. {
  735. p_ops->app_all_callbak(p_ops, BSAL_CB_LAYER_GAP, BSAL_CB_STACK_ERROR, 0 , NULL);
  736. }
  737. return 0;
  738. }
  739. int bsal_gap_connect_status(void *stack_ptr, uint16_t conn_handle, uint8_t connect_status, uint16_t disconnect_status)
  740. {
  741. BSAL_ASSERT_PTR(stack_ptr);
  742. T_BSAL_GAP_MSG_DATA bsal_gap_msg_data;
  743. bsal_gap_msg_data.gap_conn_state_change.new_state = connect_status;
  744. bsal_gap_msg_data.gap_conn_state_change.conn_id = conn_handle;
  745. bsal_gap_msg_data.gap_conn_state_change.disc_cause = disconnect_status;
  746. struct bsal_stack_obj *p_ops = (struct bsal_stack_obj *)stack_ptr;
  747. p_ops->app_all_callbak(p_ops, BSAL_CB_LAYER_GAP, BSAL_CB_CONNECT_STATUS, sizeof(bsal_gap_msg_data) , &bsal_gap_msg_data);
  748. return 0;
  749. }