xremote_transmit.c 4.8 KB

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