xremote_transmit.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "xremote_transmit.h"
  2. struct XRemoteTransmit {
  3. View* view;
  4. XRemoteTransmitCallback callback;
  5. void* context;
  6. };
  7. typedef struct {
  8. int type;
  9. const char* name;
  10. int time;
  11. } XRemoteTransmitModel;
  12. static void xremote_transmit_model_init(XRemoteTransmitModel* const model) {
  13. model->type = XRemoteRemoteItemTypeInfrared;
  14. model->time = 1;
  15. }
  16. void xremote_transmit_model_set_name(XRemoteTransmit* instance, const char* name) {
  17. furi_assert(instance);
  18. XRemoteTransmitModel* model = view_get_model(instance->view);
  19. model->name = name;
  20. view_commit_model(instance->view, false);
  21. }
  22. void xremote_transmit_model_set_type(XRemoteTransmit* instance, int type) {
  23. furi_assert(instance);
  24. XRemoteTransmitModel* model = view_get_model(instance->view);
  25. model->time = 1;
  26. model->type = type;
  27. view_commit_model(instance->view, false);
  28. }
  29. void xremote_transmit_set_callback(
  30. XRemoteTransmit* instance,
  31. XRemoteTransmitCallback callback,
  32. void* context) {
  33. furi_assert(instance);
  34. furi_assert(callback);
  35. instance->callback = callback;
  36. instance->context = context;
  37. }
  38. void xremote_transmit_draw_ir(Canvas* canvas, XRemoteTransmitModel* model) {
  39. model->time++;
  40. canvas_clear(canvas);
  41. canvas_set_color(canvas, ColorBlack);
  42. canvas_draw_icon(canvas, 0, 0, &I_ir_transmit_128x64);
  43. canvas_set_font(canvas, FontPrimary);
  44. canvas_draw_str_aligned(canvas, 74, 5, AlignLeft, AlignTop, "Sending");
  45. canvas_set_font(canvas, FontSecondary);
  46. canvas_draw_str_aligned(canvas, 74, 20, AlignLeft, AlignTop, "Infrared");
  47. canvas_draw_str_aligned(canvas, 74, 30, AlignLeft, AlignTop, model->name);
  48. char temp_str[18];
  49. snprintf(temp_str, 18, "%u", model->time);
  50. canvas_draw_str_aligned(canvas, 74, 40, AlignLeft, AlignTop, temp_str);
  51. }
  52. void xremote_transmit_draw_pause(Canvas* canvas, XRemoteTransmitModel* model) {
  53. model->time++;
  54. canvas_clear(canvas);
  55. canvas_set_color(canvas, ColorBlack);
  56. canvas_draw_icon(canvas, 0, 0, &I_pause_128x64);
  57. canvas_set_font(canvas, FontPrimary);
  58. canvas_draw_str_aligned(canvas, 74, 5, AlignLeft, AlignTop, "Waiting");
  59. canvas_set_font(canvas, FontSecondary);
  60. canvas_draw_str_aligned(canvas, 74, 20, AlignLeft, AlignTop, "Sequence");
  61. canvas_draw_str_aligned(canvas, 74, 30, AlignLeft, AlignTop, model->name);
  62. char temp_str[18];
  63. snprintf(temp_str, 18, "%u", model->time);
  64. canvas_draw_str_aligned(canvas, 74, 40, AlignLeft, AlignTop, temp_str);
  65. }
  66. void xremote_transmit_draw_subghz(Canvas* canvas, XRemoteTransmitModel* model) {
  67. model->time++;
  68. canvas_clear(canvas);
  69. canvas_set_color(canvas, ColorBlack);
  70. canvas_draw_icon(canvas, 0, 0, &I_sg_transmit_128x64);
  71. canvas_set_font(canvas, FontPrimary);
  72. canvas_draw_str_aligned(canvas, 74, 5, AlignLeft, AlignTop, "Sending");
  73. canvas_set_font(canvas, FontSecondary);
  74. canvas_draw_str_aligned(canvas, 74, 20, AlignLeft, AlignTop, "SubGhz");
  75. canvas_draw_str_aligned(canvas, 74, 30, AlignLeft, AlignTop, model->name);
  76. char temp_str[18];
  77. snprintf(temp_str, 18, "%u", model->time);
  78. canvas_draw_str_aligned(canvas, 74, 40, AlignLeft, AlignTop, temp_str);
  79. }
  80. void xremote_transmit_draw(Canvas* canvas, XRemoteTransmitModel* model) {
  81. if(model->type == XRemoteRemoteItemTypeInfrared) {
  82. xremote_transmit_draw_ir(canvas, model);
  83. } else if(model->type == XRemoteRemoteItemTypeSubGhz) {
  84. xremote_transmit_draw_subghz(canvas, model);
  85. } else if(model->type == XRemoteRemoteItemTypePause) {
  86. xremote_transmit_draw_pause(canvas, model);
  87. }
  88. }
  89. bool xremote_transmit_input(InputEvent* event, void* context) {
  90. furi_assert(context);
  91. XRemoteTransmit* instance = context;
  92. if(event->type == InputTypeRelease) {
  93. switch(event->key) {
  94. case InputKeyBack:
  95. with_view_model(
  96. instance->view,
  97. XRemoteTransmitModel * model,
  98. {
  99. UNUSED(model);
  100. instance->callback(
  101. XRemoteCustomEventViewTransmitterSendStop, instance->context);
  102. },
  103. true);
  104. break;
  105. default:
  106. break;
  107. }
  108. }
  109. return true;
  110. }
  111. XRemoteTransmit* xremote_transmit_alloc() {
  112. XRemoteTransmit* instance = malloc(sizeof(XRemoteTransmit));
  113. instance->view = view_alloc();
  114. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(XRemoteTransmitModel));
  115. view_set_context(instance->view, instance);
  116. view_set_draw_callback(instance->view, (ViewDrawCallback)xremote_transmit_draw);
  117. view_set_input_callback(instance->view, xremote_transmit_input);
  118. view_set_enter_callback(instance->view, xremote_transmit_enter);
  119. with_view_model(
  120. instance->view,
  121. XRemoteTransmitModel * model,
  122. { xremote_transmit_model_init(model); },
  123. true);
  124. return instance;
  125. }
  126. void xremote_transmit_enter(void* context) {
  127. furi_assert(context);
  128. XRemoteTransmit* instance = (XRemoteTransmit*)context;
  129. with_view_model(
  130. instance->view,
  131. XRemoteTransmitModel * model,
  132. { xremote_transmit_model_init(model); },
  133. true);
  134. }
  135. void xremote_transmit_free(XRemoteTransmit* instance) {
  136. furi_assert(instance);
  137. with_view_model(instance->view, XRemoteTransmitModel * model, { UNUSED(model); }, true);
  138. view_free(instance->view);
  139. free(instance);
  140. }
  141. View* xremote_transmit_get_view(XRemoteTransmit* instance) {
  142. furi_assert(instance);
  143. return instance->view;
  144. }