seader_uart_view.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "../seader_bridge.h"
  2. #include "../seader_i.h"
  3. #include <furi_hal.h>
  4. #include <gui/elements.h>
  5. struct SeaderUartView {
  6. View* view;
  7. SeaderUartViewCallback callback;
  8. void* context;
  9. };
  10. typedef struct {
  11. uint32_t tx_cnt;
  12. uint32_t rx_cnt;
  13. bool tx_active;
  14. bool rx_active;
  15. uint8_t protocol;
  16. } SeaderUartViewModel;
  17. static void seader_uart_view_draw_callback(Canvas* canvas, void* _model) {
  18. SeaderUartViewModel* model = _model;
  19. char temp_str[18];
  20. canvas_set_font(canvas, FontPrimary);
  21. canvas_draw_str_aligned(canvas, 64, 0, AlignCenter, AlignTop, "PICC <=> SAM");
  22. canvas_draw_str(canvas, 3, 25, "TX:");
  23. canvas_draw_str(canvas, 3, 42, "RX:");
  24. if(model->protocol == FrameProtocol_iclass) {
  25. canvas_draw_str_aligned(canvas, 64, 62, AlignCenter, AlignBottom, "Detecting picopass");
  26. } else if(model->protocol == FrameProtocol_nfc) {
  27. canvas_draw_str_aligned(canvas, 64, 62, AlignCenter, AlignBottom, "Detecting 14a");
  28. }
  29. if(model->tx_cnt < 100000000) {
  30. canvas_set_font(canvas, FontSecondary);
  31. canvas_draw_str_aligned(canvas, 127, 24, AlignRight, AlignBottom, "B.");
  32. canvas_set_font(canvas, FontKeyboard);
  33. snprintf(temp_str, 18, "%lu", model->tx_cnt);
  34. canvas_draw_str_aligned(canvas, 116, 24, AlignRight, AlignBottom, temp_str);
  35. } else {
  36. canvas_set_font(canvas, FontSecondary);
  37. canvas_draw_str_aligned(canvas, 127, 24, AlignRight, AlignBottom, "KiB.");
  38. canvas_set_font(canvas, FontKeyboard);
  39. snprintf(temp_str, 18, "%lu", model->tx_cnt / 1024);
  40. canvas_draw_str_aligned(canvas, 111, 24, AlignRight, AlignBottom, temp_str);
  41. }
  42. if(model->rx_cnt < 100000000) {
  43. canvas_set_font(canvas, FontSecondary);
  44. canvas_draw_str_aligned(canvas, 127, 41, AlignRight, AlignBottom, "B.");
  45. canvas_set_font(canvas, FontKeyboard);
  46. snprintf(temp_str, 18, "%lu", model->rx_cnt);
  47. canvas_draw_str_aligned(canvas, 116, 41, AlignRight, AlignBottom, temp_str);
  48. } else {
  49. canvas_set_font(canvas, FontSecondary);
  50. canvas_draw_str_aligned(canvas, 127, 41, AlignRight, AlignBottom, "KiB.");
  51. canvas_set_font(canvas, FontKeyboard);
  52. snprintf(temp_str, 18, "%lu", model->rx_cnt / 1024);
  53. canvas_draw_str_aligned(canvas, 111, 41, AlignRight, AlignBottom, temp_str);
  54. }
  55. if(model->tx_active) {
  56. canvas_draw_icon(canvas, 48, 14, &I_ArrowUpFilled_14x15);
  57. } else {
  58. canvas_draw_icon(canvas, 48, 14, &I_ArrowUpEmpty_14x15);
  59. }
  60. if(model->rx_active) {
  61. canvas_draw_icon_ex(canvas, 48, 34, &I_ArrowUpFilled_14x15, IconRotation180);
  62. } else {
  63. canvas_draw_icon_ex(canvas, 48, 34, &I_ArrowUpEmpty_14x15, IconRotation180);
  64. }
  65. }
  66. static bool seader_uart_view_input_callback(InputEvent* event, void* context) {
  67. furi_assert(context);
  68. SeaderUartView* seader_uart_view = context;
  69. bool consumed = false;
  70. if(event->type == InputTypeShort) {
  71. if(event->key == InputKeyLeft) {
  72. consumed = true;
  73. furi_assert(seader_uart_view->callback);
  74. // seader_uart_view->callback(SeaderUartViewEventConfig, seader_uart_view->context);
  75. }
  76. }
  77. return consumed;
  78. }
  79. SeaderUartView* seader_uart_view_alloc() {
  80. SeaderUartView* seader_uart_view = malloc(sizeof(SeaderUartView));
  81. seader_uart_view->view = view_alloc();
  82. view_allocate_model(seader_uart_view->view, ViewModelTypeLocking, sizeof(SeaderUartViewModel));
  83. view_set_context(seader_uart_view->view, seader_uart_view);
  84. view_set_draw_callback(seader_uart_view->view, seader_uart_view_draw_callback);
  85. view_set_input_callback(seader_uart_view->view, seader_uart_view_input_callback);
  86. return seader_uart_view;
  87. }
  88. void seader_uart_view_free(SeaderUartView* seader_uart_view) {
  89. furi_assert(seader_uart_view);
  90. view_free(seader_uart_view->view);
  91. free(seader_uart_view);
  92. }
  93. View* seader_uart_view_get_view(SeaderUartView* seader_uart_view) {
  94. furi_assert(seader_uart_view);
  95. return seader_uart_view->view;
  96. }
  97. void seader_uart_view_set_callback(
  98. SeaderUartView* seader_uart_view,
  99. SeaderUartViewCallback callback,
  100. void* context) {
  101. furi_assert(seader_uart_view);
  102. furi_assert(callback);
  103. with_view_model(
  104. seader_uart_view->view,
  105. SeaderUartViewModel * model,
  106. {
  107. UNUSED(model);
  108. seader_uart_view->callback = callback;
  109. seader_uart_view->context = context;
  110. },
  111. false);
  112. }
  113. void seader_uart_view_update_state(
  114. SeaderUartView* instance,
  115. SeaderUartConfig* cfg,
  116. SeaderUartState* st) {
  117. furi_assert(instance);
  118. furi_assert(cfg);
  119. furi_assert(st);
  120. with_view_model(
  121. instance->view,
  122. SeaderUartViewModel * model,
  123. {
  124. model->tx_active = (model->tx_cnt != st->tx_cnt);
  125. model->rx_active = (model->rx_cnt != st->rx_cnt);
  126. model->tx_cnt = st->tx_cnt;
  127. model->rx_cnt = st->rx_cnt;
  128. model->protocol = st->protocol;
  129. },
  130. true);
  131. }