wireless_service.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "include.h"
  2. #include "ble_init.h"
  3. #include "ble_service.h"
  4. #include "wireless_service.h"
  5. #include "wireless_cmd.h"
  6. #include "utils_ring_buffer.h"
  7. #if FUNC_WIRELESS_EN
  8. #define TRACE_EN 1
  9. #if TRACE_EN
  10. #define TRACE(...) my_printf("[WIRELESS] ");\
  11. my_printf(__VA_ARGS__)
  12. #define TRACE_R(...) my_print_r(__VA_ARGS__);
  13. #else
  14. #define TRACE(...)
  15. #define TRACE_R(...)
  16. #endif // TRACE_EN
  17. /* Format: Header(1B) + [HID(n)] + [AUDIO(n)] + [CMD(n)] */
  18. #define WIRELESS_SINGLE_PACKET_SIZE (1 + WIRELESS_DATA_LENGTH_HID + WIRELESS_DATA_LENGTH_AUDIO + CTRL_CMD_PACKET_SIZE)
  19. static struct {
  20. uint16_t con_handle;
  21. wireless_addr_info_typedef addr_info;
  22. uint8_t transmit_done;
  23. uint8_t single_packet[WIRELESS_SINGLE_PACKET_SIZE];
  24. uint32_t data_len;
  25. } wireless_cb AT(.ble_buf.wireless.sta);
  26. AT(.com_text.wireless.transmit)
  27. void wireless_packet_process(uint8_t *buf, uint32_t size)
  28. {
  29. u8 head = buf[WIRELESS_HEAD_POS];
  30. u8 pos = WIRELESS_PAYLOAD_POS;
  31. u8 *cmd_data = NULL, cmd_len = 0;
  32. /* Unpack data */
  33. if (head & WIRELESS_HEADER_CTRL_BIT) {
  34. cmd_data = &buf[pos];
  35. cmd_len = cmd_data[WIRELESS_CMD_DATA_LENGTH_POS];
  36. pos += 2 + cmd_len;
  37. }
  38. /* Check length valid */
  39. if (pos != size) {
  40. TRACE("data length err: %d %d\n", pos, size);
  41. return;
  42. }
  43. /* Process */
  44. if (cmd_data) {
  45. TRACE("receive cmd - type:0x%02x data[%d]:\n", cmd_data[WIRELESS_CMD_DATA_TYPE_POS], cmd_len);
  46. TRACE_R(&cmd_data[WIRELESS_CMD_DATA_VALUE_POS], cmd_len);
  47. wireless_user_event_handle(cmd_data, cmd_len);
  48. }
  49. }
  50. static void wireless_event_packet_handler(uint8_t event_type, uint8_t *packet, uint8_t size)
  51. {
  52. switch (event_type) {
  53. case WIRELESS_EVENT_CONNECTED:
  54. TRACE("[slave]connected - con_handle: 0x%04x\n", GET_LE16(&packet[0]));
  55. wireless_cb.con_handle = GET_LE16(&packet[0]);
  56. memcpy((u8 *)&wireless_cb.addr_info, &packet[2], 7);
  57. bsp_wireless_link_info_write(&wireless_cb.addr_info);
  58. wireless_cb.transmit_done = 1;
  59. wireless_latency_applied(wireless_cb.con_handle, false);
  60. break;
  61. case WIRELESS_EVENT_DISCONNECTED:
  62. TRACE("[slave]disconnected - con_handle: 0x%04x reason: 0x%02x\n", GET_LE16(&packet[0]), packet[2]);
  63. wireless_cb.con_handle = 0;
  64. /* Update adv info and start when disc */
  65. wireless_adv_init(true);
  66. /* Reset HW state */
  67. sys_cb.peer_usb_is_active = 0;
  68. break;
  69. default:
  70. break;
  71. }
  72. }
  73. AT(.com_text.wireless.transmit)
  74. static void wireless_receive_handler(uint16_t con_handle, uint8_t *packet, uint8_t size)
  75. {
  76. if (con_handle == wireless_cb.con_handle) {
  77. wireless_packet_process(packet, size);
  78. }
  79. wireless_rxbuf_release(packet);
  80. lowpwr_pwroff_delay_reset();
  81. lowpwr_sleep_delay_reset();
  82. }
  83. void wireless_enter_sleep_hook(void)
  84. {
  85. if (wireless_cb.con_handle) {
  86. wireless_latency_applied(wireless_cb.con_handle, true);
  87. }
  88. }
  89. void wireless_exit_sleep_hook(void)
  90. {
  91. if (wireless_cb.con_handle) {
  92. wireless_latency_applied(wireless_cb.con_handle, false);
  93. }
  94. }
  95. void wireless_service_init(void)
  96. {
  97. TRACE("slave init\n");
  98. memset(&wireless_cb, 0x00, sizeof(wireless_cb));
  99. wireless_event_handler_register(wireless_event_packet_handler);
  100. wireless_receive_handler_register(wireless_receive_handler);
  101. wireless_cmd_init();
  102. }
  103. AT(.text.app.proc.ble)
  104. void wireless_service_proc(void)
  105. {
  106. u8 *ptr = &wireless_cb.single_packet[WIRELESS_PAYLOAD_POS];
  107. u32 len = 0;
  108. u8 found = 0;
  109. u8 head = 0;
  110. if (wireless_cb.con_handle) {
  111. if (wireless_cb.transmit_done) {
  112. len = wireless_cmd_get_buf(ptr);
  113. if (len) {
  114. ptr += len;
  115. head |= WIRELESS_HEADER_CTRL_BIT;
  116. found = 1;
  117. }
  118. wireless_cb.single_packet[WIRELESS_HEAD_POS] = head;
  119. wireless_cb.data_len = ptr - wireless_cb.single_packet;
  120. }
  121. if (found || !wireless_cb.transmit_done) {
  122. found = wireless_send_for_con(wireless_cb.con_handle, wireless_cb.single_packet, wireless_cb.data_len);
  123. wireless_cb.transmit_done = (found == 0)? 1: 0;
  124. lowpwr_pwroff_delay_reset();
  125. lowpwr_sleep_delay_reset();
  126. }
  127. }
  128. }
  129. #endif