bsal_srv_blufi.c 4.4 KB

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