xremote_transmit.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. XRemoteTransmit* xremote_transmit_alloc() {
  90. XRemoteTransmit* instance = malloc(sizeof(XRemoteTransmit));
  91. instance->view = view_alloc();
  92. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(XRemoteTransmitModel));
  93. view_set_context(instance->view, instance);
  94. view_set_draw_callback(instance->view, (ViewDrawCallback)xremote_transmit_draw);
  95. view_set_enter_callback(instance->view, xremote_transmit_enter);
  96. with_view_model(
  97. instance->view,
  98. XRemoteTransmitModel * model,
  99. { xremote_transmit_model_init(model); },
  100. true);
  101. return instance;
  102. }
  103. void xremote_transmit_enter(void* context) {
  104. furi_assert(context);
  105. XRemoteTransmit* instance = (XRemoteTransmit*)context;
  106. with_view_model(
  107. instance->view,
  108. XRemoteTransmitModel * model,
  109. { xremote_transmit_model_init(model); },
  110. true);
  111. }
  112. void xremote_transmit_free(XRemoteTransmit* instance) {
  113. furi_assert(instance);
  114. with_view_model(
  115. instance->view, XRemoteTransmitModel * model, { UNUSED(model); }, true);
  116. view_free(instance->view);
  117. free(instance);
  118. }
  119. View* xremote_transmit_get_view(XRemoteTransmit* instance) {
  120. furi_assert(instance);
  121. return instance->view;
  122. }