subghz_receiver.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. elements_button_right(canvas, "Save");
  44. }
  45. }
  46. bool subghz_receiver_input(InputEvent* event, void* context) {
  47. furi_assert(context);
  48. SubghzReceiver* subghz_receiver = context;
  49. if(event->type != InputTypeShort) return false;
  50. bool can_be_saved = false;
  51. with_view_model(
  52. subghz_receiver->view, (SubghzReceiverModel * model) {
  53. can_be_saved = (model->protocol && model->protocol->to_save_string);
  54. return false;
  55. });
  56. if(event->key == InputKeyBack) {
  57. return false;
  58. } else if(event->key == InputKeyLeft) {
  59. subghz_receiver->callback(SubghzReceverEventBack, subghz_receiver->context);
  60. } else if(can_be_saved && event->key == InputKeyRight) {
  61. subghz_receiver->callback(SubghzReceverEventSave, subghz_receiver->context);
  62. }
  63. return true;
  64. }
  65. void subghz_receiver_text_callback(string_t text, void* context) {
  66. furi_assert(context);
  67. SubghzReceiver* subghz_receiver = context;
  68. with_view_model(
  69. subghz_receiver->view, (SubghzReceiverModel * model) {
  70. string_set(model->text, text);
  71. model->scene = 0;
  72. return true;
  73. });
  74. }
  75. void subghz_receiver_enter(void* context) {
  76. furi_assert(context);
  77. SubghzReceiver* subghz_receiver = context;
  78. with_view_model(
  79. subghz_receiver->view, (SubghzReceiverModel * model) {
  80. model->protocol->to_string(model->protocol, model->text);
  81. return true;
  82. });
  83. }
  84. void subghz_receiver_exit(void* context) {
  85. furi_assert(context);
  86. SubghzReceiver* subghz_receiver = context;
  87. with_view_model(
  88. subghz_receiver->view, (SubghzReceiverModel * model) {
  89. string_clean(model->text);
  90. return true;
  91. });
  92. }
  93. SubghzReceiver* subghz_receiver_alloc() {
  94. SubghzReceiver* subghz_receiver = furi_alloc(sizeof(SubghzReceiver));
  95. // View allocation and configuration
  96. subghz_receiver->view = view_alloc();
  97. view_allocate_model(subghz_receiver->view, ViewModelTypeLocking, sizeof(SubghzReceiverModel));
  98. view_set_context(subghz_receiver->view, subghz_receiver);
  99. view_set_draw_callback(subghz_receiver->view, (ViewDrawCallback)subghz_receiver_draw);
  100. view_set_input_callback(subghz_receiver->view, subghz_receiver_input);
  101. view_set_enter_callback(subghz_receiver->view, subghz_receiver_enter);
  102. view_set_exit_callback(subghz_receiver->view, subghz_receiver_exit);
  103. with_view_model(
  104. subghz_receiver->view, (SubghzReceiverModel * model) {
  105. string_init(model->text);
  106. return true;
  107. });
  108. return subghz_receiver;
  109. }
  110. void subghz_receiver_free(SubghzReceiver* subghz_receiver) {
  111. furi_assert(subghz_receiver);
  112. with_view_model(
  113. subghz_receiver->view, (SubghzReceiverModel * model) {
  114. string_clear(model->text);
  115. return true;
  116. });
  117. view_free(subghz_receiver->view);
  118. free(subghz_receiver);
  119. }
  120. View* subghz_receiver_get_view(SubghzReceiver* subghz_receiver) {
  121. furi_assert(subghz_receiver);
  122. return subghz_receiver->view;
  123. }