seader_scene_apdu_runner.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "../seader_i.h"
  2. #include <dolphin/dolphin.h>
  3. #define TAG "Seader:Scene:APDURunner"
  4. char seader_scene_apdu_runner_update_text[24];
  5. void seader_apdu_runner_worker_callback(SeaderWorkerEvent event, void* context) {
  6. Seader* seader = context;
  7. view_dispatcher_send_custom_event(seader->view_dispatcher, event);
  8. }
  9. void seader_scene_apdu_runner_on_enter(void* context) {
  10. Seader* seader = context;
  11. // Setup view
  12. Popup* popup = seader->popup;
  13. popup_set_header(popup, "APDU Runner", 68, 30, AlignLeft, AlignTop);
  14. // TODO: Make icon for interaction with SAM
  15. popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
  16. // Start worker
  17. seader_worker_start(
  18. seader->worker,
  19. SeaderWorkerStateAPDURunner,
  20. seader->uart,
  21. seader_apdu_runner_worker_callback,
  22. seader);
  23. view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup);
  24. }
  25. bool seader_scene_apdu_runner_on_event(void* context, SceneManagerEvent event) {
  26. Seader* seader = context;
  27. bool consumed = false;
  28. if(event.type == SceneManagerEventTypeCustom) {
  29. if(event.event == GuiButtonTypeLeft) {
  30. scene_manager_search_and_switch_to_previous_scene(
  31. seader->scene_manager, SeaderSceneSamPresent);
  32. consumed = true;
  33. } else if(event.event == SeaderWorkerEventAPDURunnerUpdate) {
  34. SeaderAPDURunnerContext apdu_runner_ctx = seader->apdu_runner_ctx;
  35. Popup* popup = seader->popup;
  36. snprintf(
  37. seader_scene_apdu_runner_update_text,
  38. sizeof(seader_scene_apdu_runner_update_text),
  39. "APDU Runner\n%d/%d",
  40. apdu_runner_ctx.current_line,
  41. apdu_runner_ctx.total_lines);
  42. popup_set_header(
  43. popup, seader_scene_apdu_runner_update_text, 68, 30, AlignLeft, AlignTop);
  44. consumed = true;
  45. } else if(event.event == SeaderWorkerEventAPDURunnerSuccess) {
  46. notification_message(seader->notifications, &sequence_success);
  47. Popup* popup = seader->popup;
  48. popup_set_header(popup, "APDU Runner\nSuccess", 68, 30, AlignLeft, AlignTop);
  49. consumed = true;
  50. } else if(event.event == SeaderWorkerEventAPDURunnerError) {
  51. notification_message(seader->notifications, &sequence_error);
  52. Popup* popup = seader->popup;
  53. popup_set_header(popup, "APDU Runner\nError", 68, 30, AlignLeft, AlignTop);
  54. consumed = true;
  55. }
  56. } else if(event.type == SceneManagerEventTypeBack) {
  57. scene_manager_search_and_switch_to_previous_scene(
  58. seader->scene_manager, SeaderSceneSamPresent);
  59. consumed = true;
  60. }
  61. return consumed;
  62. }
  63. void seader_scene_apdu_runner_on_exit(void* context) {
  64. Seader* seader = context;
  65. // Clear view
  66. popup_reset(seader->popup);
  67. }