ble_bas_blufi_app.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 "bsal.h"
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include "bsal_osif.h"
  14. #include "bsal_srv_blufi.h"
  15. #include "bsal_srv_bas.h"
  16. #define BSAL_STACK_NAME PKG_BSAL_STACK_NAME
  17. static void *bsal_stack_ptr = NULL;
  18. uint16_t bsal_app_conn_handle;
  19. static uint8_t battery_flag = 0;
  20. static uint8_t gap_conn_state = BSAL_GAP_CONN_STATE_DISCONNECTED; /**< GAP connection state */
  21. void bsa_app_set_adv_data(void *stack_ptr)
  22. {
  23. uint8_t tmp_data[32] = {0} ; //must be zero
  24. bsal_le_adv_data_add_flag(tmp_data, BSAL_GAP_ADTYPE_FLAGS_LIMITED | BSAL_GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED);
  25. char *adv_name = (char *)bsal_get_device_name(stack_ptr);
  26. bsal_adv_data_add_name(tmp_data, strlen(adv_name), adv_name);
  27. //bsal_adv_data_add_uuid16(tmp_data, BSAL_GATT_SERVICE_BATTERY_SERVICE);
  28. bsal_set_le_adv_data_user(stack_ptr, tmp_data);
  29. }
  30. void bsal_app_all_callback(void *stack_ptr, uint8_t cb_layer, uint16_t cb_sub_event, uint8_t value_length , void *value)
  31. {
  32. T_BSAL_GAP_MSG_DATA *bsal_gap_msg_data = (T_BSAL_GAP_MSG_DATA *)value;
  33. uint8_t bd_addr[6];
  34. switch (cb_layer)
  35. {
  36. case BSAL_CB_LAYER_GAP:
  37. switch (cb_sub_event)
  38. {
  39. case BSAL_CB_STACK_READY:
  40. //get mac address
  41. bsal_osif_printf_info("============stack ready===========\r\n");
  42. bsa_app_set_adv_data(stack_ptr);
  43. bsal_stack_start_adv(stack_ptr);
  44. break;
  45. case BSAL_CB_CONNECT_STATUS:
  46. bsal_osif_printf_info("============stack connect id %d===========\r\n", bsal_gap_msg_data->gap_conn_state_change.conn_id);
  47. if (bsal_gap_msg_data->gap_conn_state_change.new_state == BSAL_GAP_CONN_STATE_CONNECTED)
  48. {
  49. bsal_app_conn_handle = bsal_gap_msg_data->gap_conn_state_change.conn_id;
  50. }
  51. else if (bsal_gap_msg_data->gap_conn_state_change.new_state == BSAL_GAP_CONN_STATE_DISCONNECTED)
  52. {
  53. bsal_stack_start_adv(stack_ptr);
  54. battery_flag = 0;
  55. }
  56. bsal_osif_printf_info("BSAL: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
  57. bsal_gap_msg_data->gap_conn_state_change.conn_id , gap_conn_state, bsal_gap_msg_data->gap_conn_state_change.new_state, bsal_gap_msg_data->gap_conn_state_change.disc_cause);
  58. break;
  59. default:
  60. break;
  61. }
  62. if (cb_sub_event == BSAL_CB_STACK_READY)
  63. {
  64. //stack ready
  65. // APP_PRINT_INFO0("GAP stack ready");
  66. }
  67. break;
  68. case BSAL_CB_LAYER_GATT_PROFILE:
  69. switch (cb_sub_event)
  70. {
  71. //save the service start_handle
  72. //case uuid profile save start_handle
  73. //case SRV_CALLBACK66
  74. //save the identity
  75. }
  76. break;
  77. case BSAL_CB_LAYER_SM:
  78. break;
  79. case BSAL_CB_LAYER_COMMON:
  80. //connected save the connect id
  81. break;
  82. case BSAL_CB_LAYER_UNKNOWN:
  83. break;
  84. default:
  85. break;
  86. }
  87. }
  88. void bsal_app_profile_callback(void *p)
  89. {
  90. bsal_callbak_data_t *bsal_param = (bsal_callbak_data_t *)p;
  91. if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_READ_CHAR_VALUE)
  92. {
  93. bsal_osif_printf_info("========callback read from %x====%x=======\r\n", bsal_param->off_handle, bsal_param->srv_uuid.u16.value);
  94. }
  95. else if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_INDIFICATION_NOTIFICATION)
  96. {
  97. uint16_t cccbits = bsal_param->value;
  98. bsal_osif_printf_info("======callback notify from %x===data cccd %x====%x=====\r\n", bsal_param->off_handle, cccbits, bsal_param->srv_uuid.u16.value);
  99. if (bsal_param->srv_uuid.u16.value == BSAL_GATT_SERVICE_BATTERY_SERVICE)
  100. {
  101. if (cccbits & BSAL_GATT_CCC_NOTIFY)
  102. {
  103. bsal_osif_printf_info("=========NOTIFY ENABLE from %x===data cccd %x====%x=====\r\n", bsal_param->off_handle, cccbits, bsal_param->srv_uuid.u16.value);
  104. battery_flag = 1;
  105. }
  106. else
  107. {
  108. bsal_osif_printf_info("========NOTIFY DISABLE from %x===data cccd %x====%x=====\r\n", bsal_param->off_handle, cccbits, bsal_param->srv_uuid.u16.value);
  109. battery_flag = 0;
  110. }
  111. }
  112. else if (bsal_param->srv_uuid.u16.value == GATT_UUID_BLUFI_PROFILE)
  113. {
  114. if (cccbits & BSAL_GATT_CCC_NOTIFY)
  115. {
  116. bsal_osif_printf_info("=========NOTIFY ENABLE from %x===data cccd %x====%x=====\r\n", bsal_param->off_handle, cccbits, bsal_param->srv_uuid.u16.value);
  117. }
  118. else
  119. {
  120. bsal_osif_printf_info("========NOTIFY DISABLE from %x===data cccd %x====%x=====\r\n", bsal_param->off_handle, cccbits, bsal_param->srv_uuid.u16.value);
  121. }
  122. }
  123. }
  124. else if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_WRITE_CHAR_VALUE)
  125. {
  126. bsal_osif_printf_info("\r\n BSAL: THE DATA IS :%s\r\n", bsal_param->data);
  127. }
  128. }
  129. //add the db for
  130. void bsal_ble_loop(void *p_param)
  131. {
  132. uint8_t count = 0;
  133. battery_flag = 1;
  134. while (1)
  135. {
  136. bsal_osif_delay(20000);
  137. bsal_osif_printf_info("====hello world===%d=\r\n", battery_flag);
  138. if (battery_flag == 1)
  139. {
  140. uint8_t battery_level = 90 - count * 10;
  141. count++;
  142. bsal_bas_send_notify_level(bsal_stack_ptr, bsal_app_conn_handle, battery_level);
  143. }
  144. bsal_osif_delay(2000);
  145. }
  146. }
  147. int bsal_bas_blufi_app(void)
  148. {
  149. void *stack_ptr = bsal_find_stack_ptr(BSAL_STACK_NAME);
  150. if (stack_ptr == NULL)
  151. {
  152. //print error;
  153. return 1;
  154. }
  155. //set iocapability
  156. bsal_stack_ptr = stack_ptr;
  157. //1. init stack
  158. bsal_stack_init(stack_ptr, bsal_app_all_callback); // init param not start stack
  159. // set device name
  160. char *device_name = "ble_rtt";
  161. bsal_set_device_name(stack_ptr, strlen(device_name), (uint8_t *)device_name);
  162. //2. bond type
  163. bsal_set_device_le_bond_type(stack_ptr, false, BSAL_NO_INPUT, BSAL_NO_OUTPUT, BSAL_GAP_AUTHEN_BIT_NO_BONDING, false);
  164. //set the bond flag:
  165. //3. service begin
  166. bsal_stack_le_srv_begin(stack_ptr, 2, bsal_app_profile_callback); //will add 1 service
  167. //4. bas_init
  168. bsal_le_bas_svr_init(stack_ptr, bsal_app_profile_callback); //add battery servcie
  169. //5. blufi_init
  170. bsal_le_blufi_svr_init(stack_ptr, bsal_app_profile_callback);
  171. //6. srv_end
  172. bsal_stack_le_srv_end(stack_ptr); //end srv add
  173. //start stack
  174. bsal_stack_startup(stack_ptr); //start she
  175. return 0;
  176. }
  177. MSH_CMD_EXPORT_ALIAS(bsal_bas_blufi_app, bsal_bas_blufi_app, "bluetoooth blufi and bas sample");
  178. //CMD