ble_hogp_app.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "bsal.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "bsal_osif.h"
  5. #include "bsal_srv_hid.h"
  6. #include "bsal_srv_dis.h"
  7. #define BSAL_STACK_NAME PKG_BSAL_STACK_NAME
  8. static void *bsal_stack_ptr = NULL;
  9. static uint16_t bsal_app_conn_handle;
  10. static rt_uint8_t gap_conn_state = BSAL_GAP_CONN_STATE_CONNECTED;
  11. static void bsa_app_set_adv_data(void *stack_ptr)
  12. {
  13. uint8_t tmp_data[32] = {0} ; //must be zero
  14. bsal_le_adv_data_add_flag(tmp_data, BSAL_GAP_ADTYPE_FLAGS_LIMITED | BSAL_GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED);
  15. char *adv_name = (char *)bsal_get_device_name(stack_ptr);
  16. bsal_adv_data_add_name(tmp_data, strlen(adv_name), adv_name);
  17. //bsal_adv_data_add_uuid16(tmp_data, BSAL_GATT_SERVICE_BATTERY_SERVICE);
  18. bsal_set_le_adv_data_user(stack_ptr, tmp_data);
  19. }
  20. static void bsal_app_all_callback(void *stack_ptr, uint8_t cb_layer, uint16_t cb_sub_event, uint8_t value_length, void *value)
  21. {
  22. T_BSAL_GAP_MSG_DATA *bsal_gap_msg_data = (T_BSAL_GAP_MSG_DATA *)value;
  23. uint8_t bd_addr[6];
  24. switch (cb_layer)
  25. {
  26. case BSAL_CB_LAYER_GAP:
  27. switch (cb_sub_event)
  28. {
  29. case BSAL_CB_STACK_READY:
  30. //get mac address
  31. bsal_osif_printf_info("============stack ready===========\r\n");
  32. bsa_app_set_adv_data(stack_ptr);
  33. bsal_stack_start_adv(stack_ptr);
  34. break;
  35. case BSAL_CB_CONNECT_STATUS:
  36. bsal_osif_printf_info("============stack connect id %d===========\r\n", bsal_gap_msg_data->gap_conn_state_change.conn_id);
  37. if (bsal_gap_msg_data->gap_conn_state_change.new_state == BSAL_GAP_CONN_STATE_CONNECTED)
  38. {
  39. bsal_app_conn_handle = bsal_gap_msg_data->gap_conn_state_change.conn_id;
  40. }
  41. else if (bsal_gap_msg_data->gap_conn_state_change.new_state == BSAL_GAP_CONN_STATE_DISCONNECTED)
  42. {
  43. bsal_stack_start_adv(stack_ptr);
  44. }
  45. bsal_osif_printf_info("BSAL: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
  46. 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);
  47. break;
  48. default:
  49. break;
  50. }
  51. if (cb_sub_event == BSAL_CB_STACK_READY)
  52. {
  53. //stack ready
  54. }
  55. break;
  56. case BSAL_CB_LAYER_GATT_PROFILE:
  57. switch (cb_sub_event)
  58. {
  59. //save the service start_handle
  60. //case uuid profile save start_handle
  61. //case SRV_CALLBACK66
  62. //save the identity
  63. }
  64. break;
  65. case BSAL_CB_LAYER_SM:
  66. break;
  67. case BSAL_CB_LAYER_COMMON:
  68. //connected save the connect id
  69. break;
  70. case BSAL_CB_LAYER_UNKNOWN:
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. static void bsal_app_profile_callback(void *p)
  77. {
  78. bsal_callbak_data_t *bsal_param = (bsal_callbak_data_t *)p;
  79. if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_READ_CHAR_VALUE)
  80. {
  81. bsal_osif_printf_info("========callback read from %x====%x=======\r\n", bsal_param->off_handle, bsal_param->srv_uuid.u16.value);
  82. }
  83. else if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_INDIFICATION_NOTIFICATION)
  84. {
  85. uint16_t cccbits = bsal_param->value;
  86. 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);
  87. // if (nus_is_uuid(&(bsal_param->srv_uuid), BSAL_UUID128_DECLARE(0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0,
  88. // 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e)))//uart_uuid
  89. // {
  90. // if (cccbits & BSAL_GATT_CCC_NOTIFY)
  91. // {
  92. // 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);
  93. // }
  94. // else
  95. // {
  96. // 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);
  97. // }
  98. // }
  99. }
  100. else if (bsal_param->msg_type == BSAL_CALLBACK_TYPE_WRITE_CHAR_VALUE)
  101. {
  102. bsal_osif_printf_info("\r\n BSAL: THE DATA IS :%s\r\n", bsal_param->data);
  103. }
  104. }
  105. int bsal_hogp_app(void)
  106. {
  107. void *stack_ptr = bsal_find_stack_ptr(BSAL_STACK_NAME);
  108. if (stack_ptr == NULL)
  109. {
  110. //print error;
  111. return 1;
  112. }
  113. //set iocapability
  114. bsal_stack_ptr = stack_ptr;
  115. //1. init stack
  116. bsal_stack_init(stack_ptr, bsal_app_all_callback); // init param not start stack
  117. // set device name
  118. char *device_name = "ble_rtt_hogp";
  119. bsal_set_device_name(stack_ptr, strlen(device_name), (uint8_t *)device_name);
  120. //2. bond type
  121. bsal_set_device_le_bond_type(stack_ptr, false, BSAL_NO_INPUT, BSAL_NO_OUTPUT, BSAL_GAP_AUTHEN_BIT_NO_BONDING, false);
  122. //set the bond flag:
  123. //3. service begin
  124. bsal_stack_le_srv_begin(stack_ptr, 1, bsal_app_profile_callback); //will add 1 service
  125. //4. uart init
  126. bsal_le_hid_svr_init(stack_ptr, bsal_app_profile_callback);
  127. // bsal_le_dis_svr_init(stack_ptr, bsal_app_profile_callback);
  128. //5. srv_end
  129. bsal_stack_le_srv_end(stack_ptr); //end srv add
  130. //6. start stack
  131. bsal_stack_startup(stack_ptr); //start she
  132. // bsal_bleuart_init(stack_ptr, &bsal_app_conn_handle);
  133. return 0;
  134. }
  135. MSH_CMD_EXPORT_ALIAS(bsal_hogp_app, bsal_hogp_app, "bluetoooth hogp sample");