nfc_rfid_detector_view_field_presence.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "nfc_rfid_detector_view_field_presence.h"
  2. #include "../nfc_rfid_detector_app_i.h"
  3. #include <nfc_rfid_detector_icons.h>
  4. #include <input/input.h>
  5. #include <gui/elements.h>
  6. #define FIELD_FOUND_WEIGHT 5
  7. typedef enum {
  8. NfcRfidDetectorTypeFieldPresenceNfc,
  9. NfcRfidDetectorTypeFieldPresenceRfid,
  10. } NfcRfidDetectorTypeFieldPresence;
  11. static const Icon* NfcRfidDetectorFieldPresenceIcons[] = {
  12. [NfcRfidDetectorTypeFieldPresenceNfc] = &I_NFC_detect_45x30,
  13. [NfcRfidDetectorTypeFieldPresenceRfid] = &I_Rfid_detect_45x30,
  14. };
  15. struct NfcRfidDetectorFieldPresence {
  16. View* view;
  17. };
  18. typedef struct {
  19. uint8_t nfc_field;
  20. uint8_t rfid_field;
  21. uint32_t rfid_frequency;
  22. } NfcRfidDetectorFieldPresenceModel;
  23. void nfc_rfid_detector_view_field_presence_update(
  24. NfcRfidDetectorFieldPresence* instance,
  25. bool nfc_field,
  26. bool rfid_field,
  27. uint32_t rfid_frequency) {
  28. furi_assert(instance);
  29. with_view_model(
  30. instance->view,
  31. NfcRfidDetectorFieldPresenceModel * model,
  32. {
  33. if(nfc_field) {
  34. model->nfc_field = FIELD_FOUND_WEIGHT;
  35. } else if(model->nfc_field) {
  36. model->nfc_field--;
  37. }
  38. if(rfid_field) {
  39. model->rfid_field = FIELD_FOUND_WEIGHT;
  40. model->rfid_frequency = rfid_frequency;
  41. } else if(model->rfid_field) {
  42. model->rfid_field--;
  43. }
  44. },
  45. true);
  46. }
  47. void nfc_rfid_detector_view_field_presence_draw(
  48. Canvas* canvas,
  49. NfcRfidDetectorFieldPresenceModel* model) {
  50. canvas_clear(canvas);
  51. canvas_set_color(canvas, ColorBlack);
  52. if(!model->nfc_field && !model->rfid_field) {
  53. canvas_draw_icon(canvas, 0, 16, &I_Modern_reader_18x34);
  54. canvas_draw_icon(canvas, 22, 12, &I_Move_flipper_26x39);
  55. canvas_set_font(canvas, FontSecondary);
  56. canvas_draw_str(canvas, 56, 36, "Touch the reader");
  57. } else {
  58. if(model->nfc_field) {
  59. canvas_set_font(canvas, FontPrimary);
  60. canvas_draw_str(canvas, 21, 10, "NFC");
  61. canvas_draw_icon(
  62. canvas,
  63. 9,
  64. 17,
  65. NfcRfidDetectorFieldPresenceIcons[NfcRfidDetectorTypeFieldPresenceNfc]);
  66. canvas_set_font(canvas, FontSecondary);
  67. canvas_draw_str(canvas, 9, 62, "13.56 MHz");
  68. }
  69. if(model->rfid_field) {
  70. char str[16];
  71. snprintf(str, sizeof(str), "%.02f kHz", (double)model->rfid_frequency / 1000);
  72. canvas_set_font(canvas, FontPrimary);
  73. canvas_draw_str(canvas, 76, 10, "LF RFID");
  74. canvas_draw_icon(
  75. canvas,
  76. 71,
  77. 17,
  78. NfcRfidDetectorFieldPresenceIcons[NfcRfidDetectorTypeFieldPresenceRfid]);
  79. canvas_set_font(canvas, FontSecondary);
  80. canvas_draw_str(canvas, 69, 62, str);
  81. }
  82. }
  83. }
  84. bool nfc_rfid_detector_view_field_presence_input(InputEvent* event, void* context) {
  85. furi_assert(context);
  86. NfcRfidDetectorFieldPresence* instance = context;
  87. UNUSED(instance);
  88. if(event->key == InputKeyBack) {
  89. return false;
  90. }
  91. return true;
  92. }
  93. void nfc_rfid_detector_view_field_presence_enter(void* context) {
  94. furi_assert(context);
  95. NfcRfidDetectorFieldPresence* instance = context;
  96. with_view_model(
  97. instance->view,
  98. NfcRfidDetectorFieldPresenceModel * model,
  99. {
  100. model->nfc_field = 0;
  101. model->rfid_field = 0;
  102. model->rfid_frequency = 0;
  103. },
  104. true);
  105. }
  106. void nfc_rfid_detector_view_field_presence_exit(void* context) {
  107. furi_assert(context);
  108. NfcRfidDetectorFieldPresence* instance = context;
  109. UNUSED(instance);
  110. }
  111. NfcRfidDetectorFieldPresence* nfc_rfid_detector_view_field_presence_alloc() {
  112. NfcRfidDetectorFieldPresence* instance = malloc(sizeof(NfcRfidDetectorFieldPresence));
  113. // View allocation and configuration
  114. instance->view = view_alloc();
  115. view_allocate_model(
  116. instance->view, ViewModelTypeLocking, sizeof(NfcRfidDetectorFieldPresenceModel));
  117. view_set_context(instance->view, instance);
  118. view_set_draw_callback(
  119. instance->view, (ViewDrawCallback)nfc_rfid_detector_view_field_presence_draw);
  120. view_set_input_callback(instance->view, nfc_rfid_detector_view_field_presence_input);
  121. view_set_enter_callback(instance->view, nfc_rfid_detector_view_field_presence_enter);
  122. view_set_exit_callback(instance->view, nfc_rfid_detector_view_field_presence_exit);
  123. with_view_model(
  124. instance->view,
  125. NfcRfidDetectorFieldPresenceModel * model,
  126. {
  127. model->nfc_field = 0;
  128. model->rfid_field = 0;
  129. model->rfid_frequency = 0;
  130. },
  131. true);
  132. return instance;
  133. }
  134. void nfc_rfid_detector_view_field_presence_free(NfcRfidDetectorFieldPresence* instance) {
  135. furi_assert(instance);
  136. view_free(instance->view);
  137. free(instance);
  138. }
  139. View* nfc_rfid_detector_view_field_presence_get_view(NfcRfidDetectorFieldPresence* instance) {
  140. furi_assert(instance);
  141. return instance->view;
  142. }