bt_views.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "bt_views.h"
  2. void bt_view_test_tone_tx_draw(Canvas* canvas, void* model) {
  3. BtViewTestToneTxModel* m = model;
  4. canvas_clear(canvas);
  5. canvas_set_font(canvas, FontSecondary);
  6. canvas_draw_str(canvas, 0, 12, "Performing continous TX test");
  7. if(m->type == BtStatusToneTx) {
  8. canvas_draw_str(canvas, 0, 24, "Manual control mode");
  9. } else {
  10. canvas_draw_str(canvas, 0, 24, "Hopping mode");
  11. }
  12. char buffer[32];
  13. snprintf(buffer, sizeof(buffer), "Channel:%d MHz", m->channel * 2 + 2402);
  14. canvas_draw_str(canvas, 0, 36, buffer);
  15. snprintf(buffer, sizeof(buffer), "Power:%d dB", m->power - BtPower0dB);
  16. canvas_draw_str(canvas, 0, 48, buffer);
  17. }
  18. void bt_view_test_tone_rx_draw(Canvas* canvas, void* model) {
  19. BtViewTestRxModel* m = model;
  20. canvas_clear(canvas);
  21. canvas_set_font(canvas, FontSecondary);
  22. canvas_draw_str(canvas, 0, 12, "Performing continous RX test");
  23. char buffer[32];
  24. snprintf(buffer, sizeof(buffer), "Channel:%d MHz", m->channel * 2 + 2402);
  25. canvas_draw_str(canvas, 0, 24, buffer);
  26. }
  27. void bt_view_test_packet_tx_draw(Canvas* canvas, void* model) {
  28. BtViewTestPacketTxModel* m = model;
  29. canvas_clear(canvas);
  30. canvas_set_font(canvas, FontSecondary);
  31. canvas_draw_str(canvas, 0, 12, "Packets send TX test");
  32. if(m->type == BtStatusPacketSetup) {
  33. canvas_draw_str(canvas, 0, 24, "Setup parameters");
  34. canvas_draw_str(canvas, 0, 36, "Press OK to send packets");
  35. } else {
  36. canvas_draw_str(canvas, 0, 24, "Sending packets");
  37. canvas_draw_str(canvas, 0, 36, "Packets parameters:");
  38. }
  39. char buffer[32];
  40. snprintf(buffer, sizeof(buffer), "Channel:%d MHz", m->channel * 2 + 2402);
  41. canvas_draw_str(canvas, 0, 48, buffer);
  42. snprintf(buffer, sizeof(buffer), "Daterate:%d Mbps", m->datarate);
  43. canvas_draw_str(canvas, 0, 60, buffer);
  44. }
  45. void bt_view_app_draw(Canvas* canvas, void* model) {
  46. canvas_clear(canvas);
  47. canvas_set_font(canvas, FontSecondary);
  48. canvas_draw_str(canvas, 0, 12, "Start BLE app");
  49. }
  50. BtTestChannel bt_switch_channel(InputKey key, BtTestChannel inst_chan) {
  51. uint8_t pos = 0;
  52. BtTestChannel arr[] = {BtChannel2402, BtChannel2440, BtChannel2480};
  53. for(pos = 0; pos < sizeof(arr); pos++) {
  54. if(arr[pos] == inst_chan) {
  55. break;
  56. }
  57. }
  58. if(key == InputKeyRight) {
  59. pos = (pos + 1) % sizeof(arr);
  60. return arr[pos];
  61. } else if(key == InputKeyLeft) {
  62. if(pos) {
  63. return arr[pos - 1];
  64. } else {
  65. return arr[sizeof(arr) - 1];
  66. }
  67. }
  68. return arr[0];
  69. }
  70. bool bt_view_test_tone_tx_input(InputEvent* event, void* context) {
  71. furi_assert(event);
  72. furi_assert(context);
  73. Bt* bt = context;
  74. if(event->type == InputTypeShort) {
  75. if(event->key == InputKeyBack) {
  76. if(osTimerIsRunning(bt->hopping_mode_timer)) {
  77. osTimerStop(bt->hopping_mode_timer);
  78. }
  79. BtMessage m = {.type = BtMessageTypeStopTestToneTx};
  80. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  81. view_dispatcher_switch_to_view(bt->view_dispatcher, VIEW_NONE);
  82. return true;
  83. } else {
  84. if(event->key == InputKeyRight || event->key == InputKeyLeft) {
  85. bt->state.param.channel = bt_switch_channel(event->key, bt->state.param.channel);
  86. } else if(event->key == InputKeyUp) {
  87. if(bt->state.param.power < BtPower6dB) {
  88. bt->state.param.power += 2;
  89. }
  90. } else if(event->key == InputKeyDown) {
  91. if(bt->state.param.power > BtPower0dB) {
  92. bt->state.param.power -= 2;
  93. }
  94. } else if(event->key == InputKeyOk) {
  95. if(bt->state.type == BtStatusToneTx) {
  96. bt->state.type = BtStatusHoppingTx;
  97. osTimerStart(bt->hopping_mode_timer, 2000);
  98. } else {
  99. bt->state.type = BtStatusToneTx;
  100. osTimerStop(bt->hopping_mode_timer);
  101. }
  102. }
  103. BtMessage m = {
  104. .type = BtMessageTypeStartTestToneTx,
  105. .param.channel = bt->state.param.channel,
  106. .param.power = bt->state.param.power};
  107. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  108. return true;
  109. }
  110. }
  111. return false;
  112. }
  113. bool bt_view_test_tone_rx_input(InputEvent* event, void* context) {
  114. furi_assert(event);
  115. furi_assert(context);
  116. Bt* bt = context;
  117. if(event->type == InputTypeShort) {
  118. if(event->key == InputKeyRight || event->key == InputKeyLeft) {
  119. bt->state.param.channel = bt_switch_channel(event->key, bt->state.param.channel);
  120. BtMessage m = {
  121. .type = BtMessageTypeStartTestRx, .param.channel = bt->state.param.channel};
  122. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  123. return true;
  124. } else if(event->key == InputKeyBack) {
  125. BtMessage m = {.type = BtMessageTypeStopTestRx};
  126. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  127. view_dispatcher_switch_to_view(bt->view_dispatcher, VIEW_NONE);
  128. return true;
  129. } else {
  130. return false;
  131. }
  132. }
  133. return false;
  134. }
  135. bool bt_view_test_packet_tx_input(InputEvent* event, void* context) {
  136. furi_assert(event);
  137. furi_assert(context);
  138. Bt* bt = context;
  139. if(event->type == InputTypeShort) {
  140. if(event->key < InputKeyOk) {
  141. // Process InputKeyUp, InputKeyDown, InputKeyLeft, InputKeyRight
  142. if(event->key == InputKeyRight || event->key == InputKeyLeft) {
  143. bt->state.param.channel = bt_switch_channel(event->key, bt->state.param.channel);
  144. } else if(event->key == InputKeyUp) {
  145. if(bt->state.param.datarate < BtDateRate2M) {
  146. bt->state.param.datarate += 1;
  147. }
  148. } else if(event->key == InputKeyDown) {
  149. if(bt->state.param.datarate > BtDateRate1M) {
  150. bt->state.param.datarate -= 1;
  151. }
  152. }
  153. bt->state.type = BtStatusPacketSetup;
  154. BtMessage m = {
  155. .type = BtMessageTypeSetupTestPacketTx,
  156. .param.channel = bt->state.param.channel,
  157. .param.datarate = bt->state.param.datarate,
  158. };
  159. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  160. return true;
  161. } else if(event->key == InputKeyOk) {
  162. bt->state.type = BtStatusPacketTx;
  163. BtMessage m = {
  164. .type = BtMessageTypeStartTestPacketTx,
  165. .param.channel = bt->state.param.channel,
  166. .param.datarate = bt->state.param.datarate,
  167. };
  168. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  169. return true;
  170. } else if(event->key == InputKeyBack) {
  171. BtMessage m = {
  172. .type = BtMessageTypeStopTestPacketTx,
  173. };
  174. furi_check(osMessageQueuePut(bt->message_queue, &m, 0, osWaitForever) == osOK);
  175. view_dispatcher_switch_to_view(bt->view_dispatcher, VIEW_NONE);
  176. return true;
  177. }
  178. }
  179. return false;
  180. }