seader_scene_apdu_runner.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. Popup* popup = seader->popup;
  28. bool consumed = false;
  29. if(event.type == SceneManagerEventTypeCustom) {
  30. if(event.event == GuiButtonTypeLeft) {
  31. scene_manager_search_and_switch_to_previous_scene(
  32. seader->scene_manager, SeaderSceneSamPresent);
  33. consumed = true;
  34. } else if(event.event == SeaderWorkerEventAPDURunnerUpdate) {
  35. SeaderAPDURunnerContext apdu_runner_ctx = seader->apdu_runner_ctx;
  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_set_header(popup, "APDU Runner\nSuccess", 68, 30, AlignLeft, AlignTop);
  48. consumed = true;
  49. } else if(event.event == SeaderWorkerEventAPDURunnerError) {
  50. notification_message(seader->notifications, &sequence_error);
  51. popup_set_header(popup, "APDU Runner\nError", 68, 30, AlignLeft, AlignTop);
  52. consumed = true;
  53. }
  54. } else if(event.type == SceneManagerEventTypeBack) {
  55. scene_manager_search_and_switch_to_previous_scene(
  56. seader->scene_manager, SeaderSceneSamPresent);
  57. consumed = true;
  58. }
  59. return consumed;
  60. }
  61. void seader_scene_apdu_runner_on_exit(void* context) {
  62. Seader* seader = context;
  63. // Clear view
  64. popup_reset(seader->popup);
  65. }