avr_isp_view_reader.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "avr_isp_view_reader.h"
  2. #include <gui/elements.h>
  3. #include "../helpers/avr_isp_worker_rw.h"
  4. struct AvrIspReaderView {
  5. View* view;
  6. AvrIspWorkerRW* avr_isp_worker_rw;
  7. const char* file_path;
  8. const char* file_name;
  9. AvrIspReaderViewCallback callback;
  10. void* context;
  11. };
  12. typedef struct {
  13. AvrIspReaderViewStatus status;
  14. float progress_flash;
  15. float progress_eeprom;
  16. } AvrIspReaderViewModel;
  17. void avr_isp_reader_update_progress(AvrIspReaderView* instance) {
  18. with_view_model(
  19. instance->view,
  20. AvrIspReaderViewModel * model,
  21. {
  22. model->progress_flash =
  23. avr_isp_worker_rw_get_progress_flash(instance->avr_isp_worker_rw);
  24. model->progress_eeprom =
  25. avr_isp_worker_rw_get_progress_eeprom(instance->avr_isp_worker_rw);
  26. },
  27. true);
  28. }
  29. void avr_isp_reader_view_set_callback(
  30. AvrIspReaderView* instance,
  31. AvrIspReaderViewCallback callback,
  32. void* context) {
  33. furi_assert(instance);
  34. furi_assert(callback);
  35. instance->callback = callback;
  36. instance->context = context;
  37. }
  38. void avr_isp_reader_set_file_path(
  39. AvrIspReaderView* instance,
  40. const char* file_path,
  41. const char* file_name) {
  42. furi_assert(instance);
  43. instance->file_path = file_path;
  44. instance->file_name = file_name;
  45. }
  46. void avr_isp_reader_view_draw(Canvas* canvas, AvrIspReaderViewModel* model) {
  47. canvas_clear(canvas);
  48. char str_buf[64] = {0};
  49. canvas_set_font(canvas, FontPrimary);
  50. switch(model->status) {
  51. case AvrIspReaderViewStatusIDLE:
  52. canvas_draw_str_aligned(canvas, 64, 5, AlignCenter, AlignCenter, "Press start to dump");
  53. canvas_set_font(canvas, FontSecondary);
  54. elements_button_center(canvas, "Start");
  55. break;
  56. case AvrIspReaderViewStatusReading:
  57. canvas_draw_str_aligned(canvas, 64, 5, AlignCenter, AlignCenter, "Reading dump");
  58. break;
  59. case AvrIspReaderViewStatusVerification:
  60. canvas_draw_str_aligned(canvas, 64, 5, AlignCenter, AlignCenter, "Verifyng dump");
  61. break;
  62. default:
  63. break;
  64. }
  65. canvas_set_font(canvas, FontSecondary);
  66. canvas_draw_str(canvas, 0, 27, "Flash");
  67. snprintf(str_buf, sizeof(str_buf), "%d%%", (uint8_t)(model->progress_flash * 100));
  68. elements_progress_bar_with_text(canvas, 44, 17, 84, model->progress_flash, str_buf);
  69. canvas_draw_str(canvas, 0, 43, "EEPROM");
  70. snprintf(str_buf, sizeof(str_buf), "%d%%", (uint8_t)(model->progress_eeprom * 100));
  71. elements_progress_bar_with_text(canvas, 44, 34, 84, model->progress_eeprom, str_buf);
  72. }
  73. bool avr_isp_reader_view_input(InputEvent* event, void* context) {
  74. furi_assert(context);
  75. AvrIspReaderView* instance = context;
  76. bool ret = true;
  77. if(event->key == InputKeyBack && event->type == InputTypeShort) {
  78. with_view_model(
  79. instance->view,
  80. AvrIspReaderViewModel * model,
  81. {
  82. if(model->status == AvrIspReaderViewStatusIDLE) {
  83. if(instance->callback)
  84. instance->callback(AvrIspCustomEventSceneExit, instance->context);
  85. ret = false;
  86. }
  87. },
  88. false);
  89. } else if(event->key == InputKeyOk && event->type == InputTypeShort) {
  90. with_view_model(
  91. instance->view,
  92. AvrIspReaderViewModel * model,
  93. {
  94. if(model->status == AvrIspReaderViewStatusIDLE) {
  95. model->status = AvrIspReaderViewStatusReading;
  96. avr_isp_worker_rw_read_dump_start(
  97. instance->avr_isp_worker_rw, instance->file_path, instance->file_name);
  98. }
  99. },
  100. false);
  101. }
  102. return ret;
  103. }
  104. static void avr_isp_reader_callback_status(void* context, AvrIspWorkerRWStatus status) {
  105. furi_assert(context);
  106. AvrIspReaderView* instance = context;
  107. with_view_model(
  108. instance->view,
  109. AvrIspReaderViewModel * model,
  110. {
  111. switch(status) {
  112. case AvrIspWorkerRWStatusEndReading:
  113. model->status = AvrIspReaderViewStatusVerification;
  114. avr_isp_worker_rw_verification_start(
  115. instance->avr_isp_worker_rw, instance->file_path, instance->file_name);
  116. model->status = AvrIspReaderViewStatusVerification;
  117. break;
  118. case AvrIspWorkerRWStatusEndVerification:
  119. if(instance->callback)
  120. instance->callback(AvrIspCustomEventSceneReadingOk, instance->context);
  121. break;
  122. case AvrIspWorkerRWStatusErrorVerification:
  123. if(instance->callback)
  124. instance->callback(AvrIspCustomEventSceneErrorVerification, instance->context);
  125. break;
  126. default:
  127. //AvrIspWorkerRWStatusErrorReading;
  128. if(instance->callback)
  129. instance->callback(AvrIspCustomEventSceneErrorReading, instance->context);
  130. break;
  131. }
  132. },
  133. true);
  134. }
  135. void avr_isp_reader_view_enter(void* context) {
  136. furi_assert(context);
  137. AvrIspReaderView* instance = context;
  138. with_view_model(
  139. instance->view,
  140. AvrIspReaderViewModel * model,
  141. {
  142. model->status = AvrIspReaderViewStatusIDLE;
  143. model->progress_flash = 0.0f;
  144. model->progress_eeprom = 0.0f;
  145. },
  146. true);
  147. //Start avr_isp_worker_rw
  148. instance->avr_isp_worker_rw = avr_isp_worker_rw_alloc(instance->context);
  149. avr_isp_worker_rw_set_callback_status(
  150. instance->avr_isp_worker_rw, avr_isp_reader_callback_status, instance);
  151. avr_isp_worker_rw_start(instance->avr_isp_worker_rw);
  152. }
  153. void avr_isp_reader_view_exit(void* context) {
  154. furi_assert(context);
  155. AvrIspReaderView* instance = context;
  156. //Stop avr_isp_worker_rw
  157. if(avr_isp_worker_rw_is_running(instance->avr_isp_worker_rw)) {
  158. avr_isp_worker_rw_stop(instance->avr_isp_worker_rw);
  159. }
  160. avr_isp_worker_rw_free(instance->avr_isp_worker_rw);
  161. }
  162. AvrIspReaderView* avr_isp_reader_view_alloc() {
  163. AvrIspReaderView* instance = malloc(sizeof(AvrIspReaderView));
  164. // View allocation and configuration
  165. instance->view = view_alloc();
  166. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(AvrIspReaderViewModel));
  167. view_set_context(instance->view, instance);
  168. view_set_draw_callback(instance->view, (ViewDrawCallback)avr_isp_reader_view_draw);
  169. view_set_input_callback(instance->view, avr_isp_reader_view_input);
  170. view_set_enter_callback(instance->view, avr_isp_reader_view_enter);
  171. view_set_exit_callback(instance->view, avr_isp_reader_view_exit);
  172. return instance;
  173. }
  174. void avr_isp_reader_view_free(AvrIspReaderView* instance) {
  175. furi_assert(instance);
  176. view_free(instance->view);
  177. free(instance);
  178. }
  179. View* avr_isp_reader_view_get_view(AvrIspReaderView* instance) {
  180. furi_assert(instance);
  181. return instance->view;
  182. }