dap_main_view.c 5.9 KB

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