xremote_transmit.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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, 15, AlignLeft, AlignTop, "Infrared");
  47. canvas_draw_str_aligned(canvas, 74, 25, AlignLeft, AlignTop, model->name);
  48. if(model->time == 0) {
  49. canvas_draw_icon(canvas, 36, 2, &I_ir_ani_1_32x22);
  50. } else if(model->time == 1) {
  51. canvas_draw_icon(canvas, 36, 2, &I_ir_ani_2_32x22);
  52. } else if(model->time == 2) {
  53. canvas_draw_icon(canvas, 36, 2, &I_ir_ani_3_32x22);
  54. }
  55. }
  56. void xremote_transmit_draw_pause(Canvas* canvas, XRemoteTransmitModel* model) {
  57. model->time++;
  58. canvas_clear(canvas);
  59. canvas_set_color(canvas, ColorBlack);
  60. canvas_draw_icon(canvas, 0, 0, &I_pause_128x64);
  61. canvas_set_font(canvas, FontPrimary);
  62. canvas_draw_str_aligned(canvas, 74, 5, AlignLeft, AlignTop, "Waiting");
  63. canvas_set_font(canvas, FontSecondary);
  64. canvas_draw_str_aligned(canvas, 74, 15, AlignLeft, AlignTop, "Sequence");
  65. canvas_draw_str_aligned(canvas, 74, 25, AlignLeft, AlignTop, model->name);
  66. if(model->time == 0) {
  67. canvas_draw_icon(canvas, 9, 28, &I_pause_ani_1_22x23);
  68. } else if(model->time == 1) {
  69. canvas_draw_icon(canvas, 9, 28, &I_pause_ani_2_22x23);
  70. } else if(model->time == 2) {
  71. canvas_draw_icon(canvas, 9, 28, &I_pause_ani_3_22x23);
  72. }
  73. }
  74. void xremote_transmit_draw_subghz(Canvas* canvas, XRemoteTransmitModel* model) {
  75. model->time++;
  76. canvas_clear(canvas);
  77. canvas_set_color(canvas, ColorBlack);
  78. canvas_draw_icon(canvas, 0, 0, &I_sg_transmit_128x64);
  79. canvas_set_font(canvas, FontPrimary);
  80. canvas_draw_str_aligned(canvas, 74, 5, AlignLeft, AlignTop, "Sending");
  81. canvas_set_font(canvas, FontSecondary);
  82. canvas_draw_str_aligned(canvas, 74, 15, AlignLeft, AlignTop, "SubGhz");
  83. canvas_draw_str_aligned(canvas, 74, 25, AlignLeft, AlignTop, model->name);
  84. if(model->time == 0) {
  85. canvas_draw_icon(canvas, 15, 1, &I_sg_ani_1_19x13);
  86. } else if(model->time == 1) {
  87. canvas_draw_icon(canvas, 15, 1, &I_sg_ani_2_19x13);
  88. } else if(model->time == 2) {
  89. canvas_draw_icon(canvas, 15, 1, &I_sg_ani_3_19x13);
  90. }
  91. }
  92. void xremote_transmit_draw(Canvas* canvas, XRemoteTransmitModel* model) {
  93. if(model->type == XRemoteRemoteItemTypeInfrared) {
  94. xremote_transmit_draw_ir(canvas, model);
  95. } else if(model->type == XRemoteRemoteItemTypeSubGhz) {
  96. xremote_transmit_draw_subghz(canvas, model);
  97. } else if(model->type == XRemoteRemoteItemTypePause) {
  98. xremote_transmit_draw_pause(canvas, model);
  99. }
  100. if(model->time > 2) {
  101. model->time = 0;
  102. }
  103. elements_button_right(canvas, "exit");
  104. }
  105. bool xremote_transmit_input(InputEvent* event, void* context) {
  106. furi_assert(context);
  107. XRemoteTransmit* instance = context;
  108. if(event->type == InputTypeRelease) {
  109. switch(event->key) {
  110. case InputKeyBack:
  111. case InputKeyRight:
  112. with_view_model(
  113. instance->view,
  114. XRemoteTransmitModel * model,
  115. {
  116. UNUSED(model);
  117. instance->callback(
  118. XRemoteCustomEventViewTransmitterSendStop, instance->context);
  119. },
  120. true);
  121. break;
  122. default:
  123. break;
  124. }
  125. }
  126. return true;
  127. }
  128. void xremote_transmit_enter(void* context) {
  129. furi_assert(context);
  130. XRemoteTransmit* instance = (XRemoteTransmit*)context;
  131. with_view_model(
  132. instance->view,
  133. XRemoteTransmitModel * model,
  134. { xremote_transmit_model_init(model); },
  135. true);
  136. }
  137. XRemoteTransmit* xremote_transmit_alloc() {
  138. XRemoteTransmit* instance = malloc(sizeof(XRemoteTransmit));
  139. instance->view = view_alloc();
  140. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(XRemoteTransmitModel));
  141. view_set_context(instance->view, instance);
  142. view_set_draw_callback(instance->view, (ViewDrawCallback)xremote_transmit_draw);
  143. view_set_input_callback(instance->view, xremote_transmit_input);
  144. //view_set_enter_callback(instance->view, xremote_transmit_enter);
  145. with_view_model(
  146. instance->view,
  147. XRemoteTransmitModel * model,
  148. { xremote_transmit_model_init(model); },
  149. true);
  150. return instance;
  151. }
  152. void xremote_transmit_free(XRemoteTransmit* instance) {
  153. furi_assert(instance);
  154. with_view_model(instance->view, XRemoteTransmitModel * model, { UNUSED(model); }, true);
  155. view_free(instance->view);
  156. free(instance);
  157. }
  158. View* xremote_transmit_get_view(XRemoteTransmit* instance) {
  159. furi_assert(instance);
  160. return instance->view;
  161. }