subghz_transmitter.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. if(model->protocol && model->protocol->get_upload_protocol) {
  43. elements_button_center(canvas, "Send");
  44. }
  45. }
  46. bool subghz_transmitter_input(InputEvent* event, void* context) {
  47. furi_assert(context);
  48. SubghzTransmitter* subghz_transmitter = context;
  49. bool can_be_send = false;
  50. with_view_model(
  51. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  52. can_be_send = (model->protocol && model->protocol->get_upload_protocol);
  53. string_clean(model->text);
  54. model->protocol->to_string(model->protocol, model->text);
  55. return true;
  56. });
  57. //if(event->type != InputTypeShort) return false;
  58. if(event->key == InputKeyBack) {
  59. return false;
  60. } else if(can_be_send && event->key == InputKeyOk && event->type == InputTypePress) {
  61. subghz_transmitter->callback(SubghzTransmitterEventSendStart, subghz_transmitter->context);
  62. return true;
  63. } else if(can_be_send && event->key == InputKeyOk && event->type == InputTypeRelease) {
  64. subghz_transmitter->callback(SubghzTransmitterEventSendStop, subghz_transmitter->context);
  65. return true;
  66. }
  67. return true;
  68. }
  69. void subghz_transmitter_text_callback(string_t text, void* context) {
  70. furi_assert(context);
  71. SubghzTransmitter* subghz_transmitter = context;
  72. with_view_model(
  73. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  74. string_set(model->text, text);
  75. model->scene = 0;
  76. return true;
  77. });
  78. }
  79. void subghz_transmitter_enter(void* context) {
  80. furi_assert(context);
  81. SubghzTransmitter* subghz_transmitter = context;
  82. with_view_model(
  83. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  84. model->protocol->to_string(model->protocol, model->text);
  85. return true;
  86. });
  87. }
  88. void subghz_transmitter_exit(void* context) {
  89. furi_assert(context);
  90. SubghzTransmitter* subghz_transmitter = context;
  91. with_view_model(
  92. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  93. string_clean(model->text);
  94. return true;
  95. });
  96. }
  97. SubghzTransmitter* subghz_transmitter_alloc() {
  98. SubghzTransmitter* subghz_transmitter = furi_alloc(sizeof(SubghzTransmitter));
  99. // View allocation and configuration
  100. subghz_transmitter->view = view_alloc();
  101. view_allocate_model(
  102. subghz_transmitter->view, ViewModelTypeLocking, sizeof(SubghzTransmitterModel));
  103. view_set_context(subghz_transmitter->view, subghz_transmitter);
  104. view_set_draw_callback(subghz_transmitter->view, (ViewDrawCallback)subghz_transmitter_draw);
  105. view_set_input_callback(subghz_transmitter->view, subghz_transmitter_input);
  106. view_set_enter_callback(subghz_transmitter->view, subghz_transmitter_enter);
  107. view_set_exit_callback(subghz_transmitter->view, subghz_transmitter_exit);
  108. with_view_model(
  109. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  110. string_init(model->text);
  111. return true;
  112. });
  113. return subghz_transmitter;
  114. }
  115. void subghz_transmitter_free(SubghzTransmitter* subghz_transmitter) {
  116. furi_assert(subghz_transmitter);
  117. with_view_model(
  118. subghz_transmitter->view, (SubghzTransmitterModel * model) {
  119. string_clear(model->text);
  120. return true;
  121. });
  122. view_free(subghz_transmitter->view);
  123. free(subghz_transmitter);
  124. }
  125. View* subghz_transmitter_get_view(SubghzTransmitter* subghz_transmitter) {
  126. furi_assert(subghz_transmitter);
  127. return subghz_transmitter->view;
  128. }