subghz_receiver.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "subghz_receiver.h"
  2. #include "../subghz_i.h"
  3. #include <math.h>
  4. #include <furi.h>
  5. #include <furi-hal.h>
  6. #include <input/input.h>
  7. #include <gui/elements.h>
  8. #include <notification/notification-messages.h>
  9. #include <assets_icons.h>
  10. struct SubghzReceiver {
  11. View* view;
  12. SubghzReceiverCallback callback;
  13. void* context;
  14. };
  15. typedef struct {
  16. string_t text;
  17. uint16_t scene;
  18. SubGhzProtocolCommon* protocol;
  19. } SubghzReceiverModel;
  20. void subghz_receiver_set_callback(
  21. SubghzReceiver* subghz_receiver,
  22. SubghzReceiverCallback callback,
  23. void* context) {
  24. furi_assert(subghz_receiver);
  25. furi_assert(callback);
  26. subghz_receiver->callback = callback;
  27. subghz_receiver->context = context;
  28. }
  29. void subghz_receiver_set_protocol(SubghzReceiver* subghz_receiver, SubGhzProtocolCommon* protocol) {
  30. with_view_model(
  31. subghz_receiver->view, (SubghzReceiverModel * model) {
  32. model->protocol = protocol;
  33. return true;
  34. });
  35. }
  36. void subghz_receiver_draw(Canvas* canvas, SubghzReceiverModel* model) {
  37. canvas_clear(canvas);
  38. canvas_set_color(canvas, ColorBlack);
  39. canvas_set_font(canvas, FontSecondary);
  40. elements_multiline_text(canvas, 0, 10, string_get_cstr(model->text));
  41. elements_button_left(canvas, "Back");
  42. if(model->protocol && model->protocol->to_save_string &&
  43. strcmp(model->protocol->name, "KeeLoq")) {
  44. elements_button_right(canvas, "Save");
  45. }
  46. }
  47. bool subghz_receiver_input(InputEvent* event, void* context) {
  48. furi_assert(context);
  49. SubghzReceiver* subghz_receiver = context;
  50. if(event->type != InputTypeShort) return false;
  51. bool can_be_saved = false;
  52. with_view_model(
  53. subghz_receiver->view, (SubghzReceiverModel * model) {
  54. can_be_saved =
  55. (model->protocol && model->protocol->to_save_string &&
  56. strcmp(model->protocol->name, "KeeLoq"));
  57. return false;
  58. });
  59. if(event->key == InputKeyBack) {
  60. return false;
  61. } else if(event->key == InputKeyLeft) {
  62. subghz_receiver->callback(SubghzReceverEventBack, subghz_receiver->context);
  63. } else if(can_be_saved && event->key == InputKeyRight) {
  64. subghz_receiver->callback(SubghzReceverEventSave, subghz_receiver->context);
  65. }
  66. return true;
  67. }
  68. void subghz_receiver_text_callback(string_t text, void* context) {
  69. furi_assert(context);
  70. SubghzReceiver* subghz_receiver = context;
  71. with_view_model(
  72. subghz_receiver->view, (SubghzReceiverModel * model) {
  73. string_set(model->text, text);
  74. model->scene = 0;
  75. return true;
  76. });
  77. }
  78. void subghz_receiver_enter(void* context) {
  79. furi_assert(context);
  80. SubghzReceiver* subghz_receiver = context;
  81. with_view_model(
  82. subghz_receiver->view, (SubghzReceiverModel * model) {
  83. model->protocol->to_string(model->protocol, model->text);
  84. return true;
  85. });
  86. }
  87. void subghz_receiver_exit(void* context) {
  88. furi_assert(context);
  89. SubghzReceiver* subghz_receiver = context;
  90. with_view_model(
  91. subghz_receiver->view, (SubghzReceiverModel * model) {
  92. string_clean(model->text);
  93. return true;
  94. });
  95. }
  96. SubghzReceiver* subghz_receiver_alloc() {
  97. SubghzReceiver* subghz_receiver = furi_alloc(sizeof(SubghzReceiver));
  98. // View allocation and configuration
  99. subghz_receiver->view = view_alloc();
  100. view_allocate_model(subghz_receiver->view, ViewModelTypeLocking, sizeof(SubghzReceiverModel));
  101. view_set_context(subghz_receiver->view, subghz_receiver);
  102. view_set_draw_callback(subghz_receiver->view, (ViewDrawCallback)subghz_receiver_draw);
  103. view_set_input_callback(subghz_receiver->view, subghz_receiver_input);
  104. view_set_enter_callback(subghz_receiver->view, subghz_receiver_enter);
  105. view_set_exit_callback(subghz_receiver->view, subghz_receiver_exit);
  106. with_view_model(
  107. subghz_receiver->view, (SubghzReceiverModel * model) {
  108. string_init(model->text);
  109. return true;
  110. });
  111. return subghz_receiver;
  112. }
  113. void subghz_receiver_free(SubghzReceiver* subghz_receiver) {
  114. furi_assert(subghz_receiver);
  115. with_view_model(
  116. subghz_receiver->view, (SubghzReceiverModel * model) {
  117. string_clear(model->text);
  118. return true;
  119. });
  120. view_free(subghz_receiver->view);
  121. free(subghz_receiver);
  122. }
  123. View* subghz_receiver_get_view(SubghzReceiver* subghz_receiver) {
  124. furi_assert(subghz_receiver);
  125. return subghz_receiver->view;
  126. }