avr_isp_view_programmer.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "avr_isp_view_programmer.h"
  2. #include <avr_isp_icons.h>
  3. #include "../helpers/avr_isp_worker.h"
  4. #include <gui/elements.h>
  5. struct AvrIspProgrammerView {
  6. View* view;
  7. AvrIspWorker* worker;
  8. AvrIspProgrammerViewCallback callback;
  9. void* context;
  10. };
  11. typedef struct {
  12. AvrIspProgrammerViewStatus status;
  13. } AvrIspProgrammerViewModel;
  14. void avr_isp_programmer_view_set_callback(
  15. AvrIspProgrammerView* instance,
  16. AvrIspProgrammerViewCallback callback,
  17. void* context) {
  18. furi_assert(instance);
  19. furi_assert(callback);
  20. instance->callback = callback;
  21. instance->context = context;
  22. }
  23. void avr_isp_programmer_view_draw(Canvas* canvas, AvrIspProgrammerViewModel* model) {
  24. canvas_clear(canvas);
  25. if(model->status == AvrIspProgrammerViewStatusUSBConnect) {
  26. canvas_set_font(canvas, FontPrimary);
  27. canvas_draw_icon(canvas, 0, 0, &I_isp_active_128x53);
  28. elements_multiline_text(canvas, 45, 10, "ISP mode active");
  29. } else {
  30. canvas_set_font(canvas, FontSecondary);
  31. canvas_draw_icon(canvas, 51, 6, &I_link_waiting_77x56);
  32. elements_multiline_text(canvas, 0, 25, "Waiting for\nsoftware\nconnection");
  33. }
  34. }
  35. bool avr_isp_programmer_view_input(InputEvent* event, void* context) {
  36. furi_assert(context);
  37. UNUSED(context);
  38. if(event->key == InputKeyBack || event->type != InputTypeShort) {
  39. return false;
  40. }
  41. return true;
  42. }
  43. static void avr_isp_programmer_usb_connect_callback(void* context, bool status_connect) {
  44. furi_assert(context);
  45. AvrIspProgrammerView* instance = context;
  46. with_view_model(
  47. instance->view,
  48. AvrIspProgrammerViewModel * model,
  49. {
  50. if(status_connect) {
  51. model->status = AvrIspProgrammerViewStatusUSBConnect;
  52. } else {
  53. model->status = AvrIspProgrammerViewStatusNoUSBConnect;
  54. }
  55. },
  56. true);
  57. }
  58. void avr_isp_programmer_view_enter(void* context) {
  59. furi_assert(context);
  60. AvrIspProgrammerView* instance = context;
  61. with_view_model(
  62. instance->view,
  63. AvrIspProgrammerViewModel * model,
  64. { model->status = AvrIspProgrammerViewStatusNoUSBConnect; },
  65. true);
  66. //Start worker
  67. instance->worker = avr_isp_worker_alloc(instance->context);
  68. avr_isp_worker_set_callback(
  69. instance->worker, avr_isp_programmer_usb_connect_callback, instance);
  70. avr_isp_worker_start(instance->worker);
  71. }
  72. void avr_isp_programmer_view_exit(void* context) {
  73. furi_assert(context);
  74. AvrIspProgrammerView* instance = context;
  75. //Stop worker
  76. if(avr_isp_worker_is_running(instance->worker)) {
  77. avr_isp_worker_stop(instance->worker);
  78. }
  79. avr_isp_worker_set_callback(instance->worker, NULL, NULL);
  80. avr_isp_worker_free(instance->worker);
  81. }
  82. AvrIspProgrammerView* avr_isp_programmer_view_alloc() {
  83. AvrIspProgrammerView* instance = malloc(sizeof(AvrIspProgrammerView));
  84. // View allocation and configuration
  85. instance->view = view_alloc();
  86. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(AvrIspProgrammerViewModel));
  87. view_set_context(instance->view, instance);
  88. view_set_draw_callback(instance->view, (ViewDrawCallback)avr_isp_programmer_view_draw);
  89. view_set_input_callback(instance->view, avr_isp_programmer_view_input);
  90. view_set_enter_callback(instance->view, avr_isp_programmer_view_enter);
  91. view_set_exit_callback(instance->view, avr_isp_programmer_view_exit);
  92. with_view_model(
  93. instance->view,
  94. AvrIspProgrammerViewModel * model,
  95. { model->status = AvrIspProgrammerViewStatusNoUSBConnect; },
  96. false);
  97. return instance;
  98. }
  99. void avr_isp_programmer_view_free(AvrIspProgrammerView* instance) {
  100. furi_assert(instance);
  101. view_free(instance->view);
  102. free(instance);
  103. }
  104. View* avr_isp_programmer_view_get_view(AvrIspProgrammerView* instance) {
  105. furi_assert(instance);
  106. return instance->view;
  107. }