bsal_srv_dis.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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 <string.h>
  11. #include <stdint.h>
  12. #include <stdio.h>
  13. #include "bsal.h"
  14. #include "bsal_osif.h"
  15. #include "bsal_srv_blufi.h"
  16. #define GATT_UUID_BLUFI_PROFILE 0xFFFF
  17. #define GATT_UUID_CHAR_BLUFI_V2_WRITE 0xFF01
  18. #define GATT_UUID_CHAR_BLUFI_V4_INDICATE 0xFF02
  19. #define BLUEFI_BLE_SERVICE_CHAR_V2_WRITE_INDEX 0x02
  20. #define BLUEFI_BLE_SERVICE_CHAR_V3_INDICATE_INDEX 0x04
  21. #define BLUEFI_BLE_SERVICE_CHAR_INDICATE_CCCD_INDEX (BLUEFI_BLE_SERVICE_CHAR_V3_INDICATE_INDEX + 1)
  22. #define BLUFI_RECV_BUFF_SIZE 200
  23. struct basl_blufi_recv_data
  24. {
  25. uint8_t buf[BLUFI_RECV_BUFF_SIZE];
  26. uint16_t alloc_len;
  27. uint8_t recv_offset;
  28. };
  29. static struct basl_blufi_recv_data blufi_data;
  30. static P_SRV_GENERAL_CB pfn_bas_cb = NULL;
  31. uint8_t bsal_blufi_push_data(struct basl_blufi_recv_data *blufi_data, uint8_t length, uint8_t *data)
  32. {
  33. if (blufi_data->recv_offset + length > blufi_data->alloc_len)
  34. {
  35. //error
  36. return 1;
  37. }
  38. if (data[0] == '{')
  39. {
  40. //first entry
  41. blufi_data->recv_offset = 0;
  42. memset(blufi_data->buf, 0, blufi_data->alloc_len);
  43. }
  44. memcpy(&blufi_data->buf[blufi_data->recv_offset], data, length);
  45. blufi_data->recv_offset += length;
  46. //check the data
  47. if (data[length - 1] == '}')
  48. {
  49. return 0xff;
  50. }
  51. return 0;
  52. }
  53. static void profile_callback(void *p)
  54. {
  55. bsal_callbak_data_t *p_param = (bsal_callbak_data_t *)p;
  56. bool is_app_cb = false;
  57. //BSAL_STATUS bsal_result = BSAL_RESULT_SUCCESS;
  58. if (p_param->msg_type == BSAL_CALLBACK_TYPE_READ_CHAR_VALUE)
  59. {
  60. //NO DEAL
  61. }
  62. else if (p_param->msg_type == BSAL_CALLBACK_TYPE_WRITE_CHAR_VALUE)
  63. {
  64. //do nothing
  65. if (BLUEFI_BLE_SERVICE_CHAR_V2_WRITE_INDEX == p_param->off_handle)
  66. {
  67. uint8_t ret = bsal_blufi_push_data(&blufi_data, p_param->length, p_param->data);
  68. if (ret == 0xff)
  69. {
  70. //the data is ready
  71. is_app_cb = true;
  72. p_param->data = blufi_data.buf;
  73. p_param->length = blufi_data.recv_offset;
  74. //bsal_osif_printf("\r\n BLUFI: THE RECEIVE DATA IS :%s \r\n", p_param->data);
  75. }
  76. }
  77. }
  78. else if (p_param->msg_type == BSAL_CALLBACK_TYPE_INDIFICATION_NOTIFICATION)
  79. {
  80. if (BLUEFI_BLE_SERVICE_CHAR_INDICATE_CCCD_INDEX == p_param->off_handle)
  81. {
  82. if (p_param->length == 2)
  83. {
  84. // uint16_t ccdbit = (uint32_t)p_param->data;
  85. is_app_cb = true;
  86. }
  87. }
  88. }
  89. if (is_app_cb && (pfn_bas_cb != NULL))
  90. {
  91. pfn_bas_cb(p_param);
  92. }
  93. }
  94. void bsal_le_blufi_svr_init(void *stack_ptr, void *app_callback)
  95. {
  96. struct bsal_gatt_app_srv_def ble_svc_blufi_defs[] =
  97. {
  98. {
  99. /*** Battery Service. */
  100. .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  101. .uuid = BSAL_UUID16_DECLARE(GATT_UUID_BLUFI_PROFILE),
  102. .characteristics = (bsal_gatt_chr_def_t[])
  103. {
  104. {
  105. /*** Battery level characteristic */
  106. .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_BLUFI_V2_WRITE),
  107. .properties = BSAL_ATT_P_WRITE
  108. ,
  109. .permission = GATT_PERM_WRITE,
  110. .value_length = 1,
  111. },
  112. {
  113. /*** Battery level characteristic */
  114. .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_BLUFI_V4_INDICATE),
  115. .properties = BSAL_ATT_P_INDICATE
  116. ,
  117. .permission = GATT_PERM_READ | GATT_PERM_WRITE,
  118. .value_length = 1,
  119. },
  120. {
  121. 0, /* No more characteristics in this service. */
  122. }
  123. },
  124. },
  125. {
  126. 0, /* No more services. */
  127. },
  128. };
  129. bsal_stack_le_srv_reg_func(stack_ptr, &ble_svc_blufi_defs, (P_SRV_GENERAL_CB *)profile_callback);
  130. pfn_bas_cb = app_callback;
  131. blufi_data.alloc_len = BLUFI_RECV_BUFF_SIZE;
  132. blufi_data.recv_offset = 0;
  133. }
  134. void bsal_blufi_ble_send_v4_indicate(void *stack_ptr, uint16_t conn_id, void *p_value, uint16_t length)
  135. {
  136. bsal_uuid_any_t uuid_srv;
  137. uuid_srv.u_type = BSAL_UUID_TYPE_16BIT;
  138. uuid_srv.u16.value = GATT_UUID_BLUFI_PROFILE;
  139. uint16_t start_handle = bsal_srv_get_start_handle(stack_ptr, uuid_srv);
  140. bsal_srv_send_notify_data(stack_ptr, conn_id, start_handle, BLUEFI_BLE_SERVICE_CHAR_INDICATE_CCCD_INDEX, length, p_value);
  141. }
  142. void bsal_le_blufi_svr_deinit(void *stack_ptr)
  143. {
  144. //deinit
  145. }