subghz_transmitter.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "subghz_transmitter.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 SubghzTransmitter {
  11. View* view;
  12. SubghzTransmitterCallback callback;
  13. void* context;
  14. };
  15. typedef struct {
  16. string_t text;
  17. uint16_t scene;
  18. SubGhzProtocolCommon* protocol;
  19. } SubghzTransmitterModel;
  20. void subghz_transmitter_set_callback(
  21. SubghzTransmitter* subghz_transmitter,
  22. SubghzTransmitterCallback callback,
  23. void* context) {
  24. furi_assert(subghz_transmitter);
  25. subghz_transmitter->callback = callback;
  26. subghz_transmitter->context = context;
  27. }
  28. void subghz_transmitter_set_protocol(
  29. SubghzTransmitter* subghz_transmitter,
  30. SubGhzProtocolCommon* protocol) {
  31. with_view_model(
  32. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  33. model->protocol = protocol;
  34. return true;
  35. });
  36. }
  37. void subghz_transmitter_draw(Canvas* canvas, SubghzTransmitterModel* model) {
  38. canvas_clear(canvas);
  39. canvas_set_color(canvas, ColorBlack);
  40. canvas_set_font(canvas, FontSecondary);
  41. elements_multiline_text(canvas, 0, 10, string_get_cstr(model->text));
  42. elements_button_center(canvas, "Send");
  43. }
  44. bool subghz_transmitter_input(InputEvent* event, void* context) {
  45. furi_assert(context);
  46. SubghzTransmitter* subghz_transmitter = context;
  47. if(event->type != InputTypeShort) return false;
  48. if(event->key == InputKeyBack) {
  49. return false;
  50. } else if(event->key == InputKeyOk) {
  51. subghz_transmitter->callback(SubghzTransmitterEventSend, subghz_transmitter->context);
  52. return true;
  53. }
  54. return true;
  55. }
  56. void subghz_transmitter_text_callback(string_t text, void* context) {
  57. furi_assert(context);
  58. SubghzTransmitter* subghz_transmitter = context;
  59. with_view_model(
  60. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  61. string_set(model->text, text);
  62. model->scene = 0;
  63. return true;
  64. });
  65. }
  66. void subghz_transmitter_enter(void* context) {
  67. furi_assert(context);
  68. SubghzTransmitter* subghz_transmitter = context;
  69. with_view_model(
  70. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  71. model->protocol->to_string(model->protocol, model->text);
  72. return true;
  73. });
  74. }
  75. void subghz_transmitter_exit(void* context) {
  76. furi_assert(context);
  77. SubghzTransmitter* subghz_transmitter = context;
  78. with_view_model(
  79. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  80. string_clean(model->text);
  81. return true;
  82. });
  83. }
  84. SubghzTransmitter* subghz_transmitter_alloc() {
  85. SubghzTransmitter* subghz_transmitter = furi_alloc(sizeof(SubghzTransmitter));
  86. // View allocation and configuration
  87. subghz_transmitter->view = view_alloc();
  88. view_allocate_model(
  89. subghz_transmitter->view, ViewModelTypeLocking, sizeof(SubghzTransmitterModel));
  90. view_set_context(subghz_transmitter->view, subghz_transmitter);
  91. view_set_draw_callback(subghz_transmitter->view, (ViewDrawCallback)subghz_transmitter_draw);
  92. view_set_input_callback(subghz_transmitter->view, subghz_transmitter_input);
  93. view_set_enter_callback(subghz_transmitter->view, subghz_transmitter_enter);
  94. view_set_exit_callback(subghz_transmitter->view, subghz_transmitter_exit);
  95. with_view_model(
  96. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  97. string_init(model->text);
  98. return true;
  99. });
  100. return subghz_transmitter;
  101. }
  102. void subghz_transmitter_free(SubghzTransmitter* subghz_transmitter) {
  103. furi_assert(subghz_transmitter);
  104. with_view_model(
  105. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  106. string_clear(model->text);
  107. return true;
  108. });
  109. view_free(subghz_transmitter->view);
  110. free(subghz_transmitter);
  111. }
  112. View* subghz_transmitter_get_view(SubghzTransmitter* subghz_transmitter) {
  113. furi_assert(subghz_transmitter);
  114. return subghz_transmitter->view;
  115. }