dap_main_view.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "dap_main_view.h"
  2. #include "dap_link_icons.h"
  3. #include <gui/elements.h>
  4. // extern const Icon I_ArrowDownEmpty_12x18;
  5. // extern const Icon I_ArrowDownFilled_12x18;
  6. // extern const Icon I_ArrowUpEmpty_12x18;
  7. // extern const Icon I_ArrowUpFilled_12x18;
  8. struct DapMainView {
  9. View* view;
  10. DapMainViewButtonCallback cb_left;
  11. void* cb_context;
  12. };
  13. typedef struct {
  14. DapMainViewMode mode;
  15. DapMainViewVersion version;
  16. bool usb_connected;
  17. uint32_t baudrate;
  18. bool dap_active;
  19. bool tx_active;
  20. bool rx_active;
  21. } DapMainViewModel;
  22. static void dap_main_view_draw_callback(Canvas* canvas, void* _model) {
  23. DapMainViewModel* model = _model;
  24. UNUSED(model);
  25. canvas_clear(canvas);
  26. elements_button_left(canvas, "Config");
  27. canvas_set_color(canvas, ColorBlack);
  28. canvas_draw_box(canvas, 0, 0, 127, 11);
  29. canvas_set_color(canvas, ColorWhite);
  30. const char* header_string;
  31. if(model->usb_connected) {
  32. if(model->version == DapMainViewVersionV1) {
  33. header_string = "DAP Link V1 Connected";
  34. } else if(model->version == DapMainViewVersionV2) {
  35. header_string = "DAP Link V2 Connected";
  36. } else {
  37. header_string = "DAP Link Connected";
  38. }
  39. } else {
  40. header_string = "DAP Link";
  41. }
  42. canvas_draw_str_aligned(canvas, 64, 9, AlignCenter, AlignBottom, header_string);
  43. canvas_set_color(canvas, ColorBlack);
  44. if(model->dap_active) {
  45. canvas_draw_icon(canvas, 14, 16, &I_ArrowUpFilled_12x18);
  46. canvas_draw_icon_ex(canvas, 28, 16, &I_ArrowUpFilled_12x18, IconRotation180);
  47. } else {
  48. canvas_draw_icon(canvas, 14, 16, &I_ArrowUpEmpty_12x18);
  49. canvas_draw_icon_ex(canvas, 28, 16, &I_ArrowUpEmpty_12x18, IconRotation180);
  50. }
  51. switch(model->mode) {
  52. case DapMainViewModeDisconnected:
  53. canvas_draw_str_aligned(canvas, 26, 38, AlignCenter, AlignTop, "----");
  54. break;
  55. case DapMainViewModeSWD:
  56. canvas_draw_str_aligned(canvas, 26, 38, AlignCenter, AlignTop, "SWD");
  57. break;
  58. case DapMainViewModeJTAG:
  59. canvas_draw_str_aligned(canvas, 26, 38, AlignCenter, AlignTop, "JTAG");
  60. break;
  61. }
  62. if(model->tx_active) {
  63. canvas_draw_icon(canvas, 87, 16, &I_ArrowUpFilled_12x18);
  64. } else {
  65. canvas_draw_icon(canvas, 87, 16, &I_ArrowUpEmpty_12x18);
  66. }
  67. if(model->rx_active) {
  68. canvas_draw_icon_ex(canvas, 101, 16, &I_ArrowUpFilled_12x18, IconRotation180);
  69. } else {
  70. canvas_draw_icon_ex(canvas, 101, 16, &I_ArrowUpEmpty_12x18, IconRotation180);
  71. }
  72. canvas_draw_str_aligned(canvas, 100, 38, AlignCenter, AlignTop, "UART");
  73. canvas_draw_line(canvas, 44, 52, 123, 52);
  74. if(model->baudrate == 0) {
  75. canvas_draw_str(canvas, 45, 62, "Baud: ????");
  76. } else {
  77. char baudrate_str[18];
  78. snprintf(baudrate_str, 18, "Baud: %lu", model->baudrate);
  79. canvas_draw_str(canvas, 45, 62, baudrate_str);
  80. }
  81. }
  82. static bool dap_main_view_input_callback(InputEvent* event, void* context) {
  83. furi_assert(context);
  84. DapMainView* dap_main_view = context;
  85. bool consumed = false;
  86. if(event->type == InputTypeShort) {
  87. if(event->key == InputKeyLeft) {
  88. if(dap_main_view->cb_left) {
  89. dap_main_view->cb_left(dap_main_view->cb_context);
  90. }
  91. consumed = true;
  92. }
  93. }
  94. return consumed;
  95. }
  96. DapMainView* dap_main_view_alloc() {
  97. DapMainView* dap_main_view = malloc(sizeof(DapMainView));
  98. dap_main_view->view = view_alloc();
  99. view_allocate_model(dap_main_view->view, ViewModelTypeLocking, sizeof(DapMainViewModel));
  100. view_set_context(dap_main_view->view, dap_main_view);
  101. view_set_draw_callback(dap_main_view->view, dap_main_view_draw_callback);
  102. view_set_input_callback(dap_main_view->view, dap_main_view_input_callback);
  103. return dap_main_view;
  104. }
  105. void dap_main_view_free(DapMainView* dap_main_view) {
  106. view_free(dap_main_view->view);
  107. free(dap_main_view);
  108. }
  109. View* dap_main_view_get_view(DapMainView* dap_main_view) {
  110. return dap_main_view->view;
  111. }
  112. void dap_main_view_set_left_callback(
  113. DapMainView* dap_main_view,
  114. DapMainViewButtonCallback callback,
  115. void* context) {
  116. with_view_model(
  117. dap_main_view->view,
  118. DapMainViewModel * model,
  119. {
  120. UNUSED(model);
  121. dap_main_view->cb_left = callback;
  122. dap_main_view->cb_context = context;
  123. },
  124. true);
  125. }
  126. void dap_main_view_set_mode(DapMainView* dap_main_view, DapMainViewMode mode) {
  127. with_view_model(
  128. dap_main_view->view, DapMainViewModel * model, { model->mode = mode; }, false);
  129. }
  130. void dap_main_view_set_dap(DapMainView* dap_main_view, bool active) {
  131. with_view_model(
  132. dap_main_view->view, DapMainViewModel * model, { model->dap_active = active; }, false);
  133. }
  134. void dap_main_view_set_tx(DapMainView* dap_main_view, bool active) {
  135. with_view_model(
  136. dap_main_view->view, DapMainViewModel * model, { model->tx_active = active; }, false);
  137. }
  138. void dap_main_view_set_rx(DapMainView* dap_main_view, bool active) {
  139. with_view_model(
  140. dap_main_view->view, DapMainViewModel * model, { model->rx_active = active; }, false);
  141. }
  142. void dap_main_view_set_baudrate(DapMainView* dap_main_view, uint32_t baudrate) {
  143. with_view_model(
  144. dap_main_view->view, DapMainViewModel * model, { model->baudrate = baudrate; }, false);
  145. }
  146. void dap_main_view_update(DapMainView* dap_main_view) {
  147. with_view_model(
  148. dap_main_view->view, DapMainViewModel * model, { UNUSED(model); }, true);
  149. }
  150. void dap_main_view_set_version(DapMainView* dap_main_view, DapMainViewVersion version) {
  151. with_view_model(
  152. dap_main_view->view, DapMainViewModel * model, { model->version = version; }, false);
  153. }
  154. void dap_main_view_set_usb_connected(DapMainView* dap_main_view, bool connected) {
  155. with_view_model(
  156. dap_main_view->view,
  157. DapMainViewModel * model,
  158. { model->usb_connected = connected; },
  159. false);
  160. }