bt_cli.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "bt_cli.h"
  2. #include <furi.h>
  3. #include <furi-hal.h>
  4. #include "bt_settings.h"
  5. void bt_cli_init() {
  6. Cli* cli = furi_record_open("cli");
  7. cli_add_command(cli, "bt_info", CliCommandFlagDefault, bt_cli_command_info, NULL);
  8. cli_add_command(cli, "bt_tx_carrier", CliCommandFlagDefault, bt_cli_command_carrier_tx, NULL);
  9. cli_add_command(cli, "bt_rx_carrier", CliCommandFlagDefault, bt_cli_command_carrier_rx, NULL);
  10. cli_add_command(cli, "bt_tx_pt", CliCommandFlagDefault, bt_cli_command_packet_tx, NULL);
  11. cli_add_command(cli, "bt_rx_pt", CliCommandFlagDefault, bt_cli_command_packet_rx, NULL);
  12. furi_record_close("cli");
  13. }
  14. void bt_cli_command_info(Cli* cli, string_t args, void* context) {
  15. string_t buffer;
  16. string_init(buffer);
  17. furi_hal_bt_dump_state(buffer);
  18. printf("%s", string_get_cstr(buffer));
  19. string_clear(buffer);
  20. }
  21. void bt_cli_command_carrier_tx(Cli* cli, string_t args, void* context) {
  22. uint16_t channel;
  23. uint16_t power;
  24. BtSettings bt_settings;
  25. bt_settings_load(&bt_settings);
  26. int ret = sscanf(string_get_cstr(args), "%hu %hu", &channel, &power);
  27. if(ret != 2) {
  28. printf("sscanf returned %d, channel: %hu, power: %hu\r\n", ret, channel, power);
  29. cli_print_usage("bt_tx_carrier", "<Channel number> <Power>", string_get_cstr(args));
  30. return;
  31. }
  32. if(channel > 39) {
  33. printf("Channel number must be in 0...39 range, not %hu\r\n", channel);
  34. return;
  35. }
  36. if(power > 6) {
  37. printf("Power must be in 0...6 dB range, not %hu\r\n", power);
  38. return;
  39. }
  40. furi_hal_bt_stop_advertising();
  41. printf("Transmitting carrier at %hu channel at %hu dB power\r\n", channel, power);
  42. printf("Press CTRL+C to stop\r\n");
  43. furi_hal_bt_start_tone_tx(channel, 0x19 + power);
  44. while(!cli_cmd_interrupt_received(cli)) {
  45. osDelay(250);
  46. }
  47. furi_hal_bt_stop_tone_tx();
  48. if(bt_settings.enabled) {
  49. furi_hal_bt_start_advertising();
  50. }
  51. }
  52. void bt_cli_command_carrier_rx(Cli* cli, string_t args, void* context) {
  53. uint16_t channel;
  54. BtSettings bt_settings;
  55. bt_settings_load(&bt_settings);
  56. int ret = sscanf(string_get_cstr(args), "%hu", &channel);
  57. if(ret != 1) {
  58. printf("sscanf returned %d, channel: %hu\r\n", ret, channel);
  59. cli_print_usage("bt_rx_carrier", "<Channel number>", string_get_cstr(args));
  60. return;
  61. }
  62. if(channel > 39) {
  63. printf("Channel number must be in 0...39 range, not %hu\r\n", channel);
  64. return;
  65. }
  66. furi_hal_bt_stop_advertising();
  67. printf("Receiving carrier at %hu channel\r\n", channel);
  68. printf("Press CTRL+C to stop\r\n");
  69. furi_hal_bt_start_packet_rx(channel, 1);
  70. while(!cli_cmd_interrupt_received(cli)) {
  71. osDelay(1024 / 4);
  72. printf("RSSI: %6.1f dB\r", furi_hal_bt_get_rssi());
  73. fflush(stdout);
  74. }
  75. furi_hal_bt_stop_packet_test();
  76. if(bt_settings.enabled) {
  77. furi_hal_bt_start_advertising();
  78. }
  79. }
  80. void bt_cli_command_packet_tx(Cli* cli, string_t args, void* context) {
  81. uint16_t channel;
  82. uint16_t pattern;
  83. uint16_t datarate;
  84. BtSettings bt_settings;
  85. bt_settings_load(&bt_settings);
  86. int ret = sscanf(string_get_cstr(args), "%hu %hu %hu", &channel, &pattern, &datarate);
  87. if(ret != 3) {
  88. printf("sscanf returned %d, channel: %hu %hu %hu\r\n", ret, channel, pattern, datarate);
  89. cli_print_usage(
  90. "bt_tx_pt", "<Channel number> <Pattern> <Datarate>", string_get_cstr(args));
  91. return;
  92. }
  93. if(channel > 39) {
  94. printf("Channel number must be in 0...39 range, not %hu\r\n", channel);
  95. return;
  96. }
  97. if(pattern > 5) {
  98. printf("Pattern must be in 0...5 range, not %hu\r\n", pattern);
  99. printf("0 - Pseudo-Random bit sequence 9\r\n");
  100. printf("1 - Pattern of alternating bits '11110000'\r\n");
  101. printf("2 - Pattern of alternating bits '10101010'\r\n");
  102. printf("3 - Pseudo-Random bit sequence 15\r\n");
  103. printf("4 - Pattern of All '1' bits\r\n");
  104. printf("5 - Pattern of All '0' bits\r\n");
  105. return;
  106. }
  107. if(datarate < 1 || datarate > 2) {
  108. printf("Datarate must be in 1 or 2 Mb, not %hu\r\n", datarate);
  109. return;
  110. }
  111. furi_hal_bt_stop_advertising();
  112. printf(
  113. "Transmitting %hu pattern packet at %hu channel at %hu M datarate\r\n",
  114. pattern,
  115. channel,
  116. datarate);
  117. printf("Press CTRL+C to stop\r\n");
  118. furi_hal_bt_start_packet_tx(channel, pattern, datarate);
  119. while(!cli_cmd_interrupt_received(cli)) {
  120. osDelay(250);
  121. }
  122. furi_hal_bt_stop_packet_test();
  123. printf("Transmitted %lu packets", furi_hal_bt_get_transmitted_packets());
  124. if(bt_settings.enabled) {
  125. furi_hal_bt_start_advertising();
  126. }
  127. }
  128. void bt_cli_command_packet_rx(Cli* cli, string_t args, void* context) {
  129. uint16_t channel;
  130. uint16_t datarate;
  131. BtSettings bt_settings;
  132. bt_settings_load(&bt_settings);
  133. int ret = sscanf(string_get_cstr(args), "%hu %hu", &channel, &datarate);
  134. if(ret != 2) {
  135. printf("sscanf returned %d, channel: %hu datarate: %hu\r\n", ret, channel, datarate);
  136. cli_print_usage("bt_rx_pt", "<Channel number> <Datarate>", string_get_cstr(args));
  137. return;
  138. }
  139. if(channel > 39) {
  140. printf("Channel number must be in 0...39 range, not %hu\r\n", channel);
  141. return;
  142. }
  143. if(datarate < 1 || datarate > 2) {
  144. printf("Datarate must be in 1 or 2 Mb, not %hu\r\n", datarate);
  145. return;
  146. }
  147. furi_hal_bt_stop_advertising();
  148. printf("Receiving packets at %hu channel at %hu M datarate\r\n", channel, datarate);
  149. printf("Press CTRL+C to stop\r\n");
  150. furi_hal_bt_start_packet_rx(channel, datarate);
  151. float rssi_raw = 0;
  152. while(!cli_cmd_interrupt_received(cli)) {
  153. osDelay(250);
  154. rssi_raw = furi_hal_bt_get_rssi();
  155. printf("RSSI: %03.1f dB\r", rssi_raw);
  156. fflush(stdout);
  157. }
  158. uint16_t packets_received = furi_hal_bt_stop_packet_test();
  159. printf("Received %hu packets", packets_received);
  160. if(bt_settings.enabled) {
  161. furi_hal_bt_start_advertising();
  162. }
  163. }