ble_bas_only_app.c 6.2 KB

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