picopass_scene_write_card.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "../picopass_i.h"
  2. #include <dolphin/dolphin.h>
  3. #include "../picopass_keys.h"
  4. #define PICOPASS_SCENE_WRITE_BLOCK_START 6
  5. #define PICOPASS_SCENE_WRITE_BLOCK_STOP 10
  6. NfcCommand picopass_scene_write_poller_callback(PicopassPollerEvent event, void* context) {
  7. Picopass* picopass = context;
  8. NfcCommand command = NfcCommandContinue;
  9. if(event.type == PicopassPollerEventTypeRequestMode) {
  10. event.data->req_mode.mode = PicopassPollerModeWrite;
  11. } else if(event.type == PicopassPollerEventTypeRequestKey) {
  12. memcpy(event.data->req_key.key, picopass_iclass_key, sizeof(picopass_iclass_key));
  13. event.data->req_key.is_elite_key = false;
  14. event.data->req_key.is_key_provided = true;
  15. } else if(event.type == PicopassPollerEventTypeRequestWriteBlock) {
  16. uint8_t block_num =
  17. scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneWriteCard);
  18. if(block_num == PICOPASS_SCENE_WRITE_BLOCK_STOP) {
  19. event.data->req_write.perform_write = false;
  20. } else {
  21. event.data->req_write.block_num = block_num;
  22. event.data->req_write.block = &picopass->dev->dev_data.card_data[block_num];
  23. event.data->req_write.perform_write = true;
  24. block_num++;
  25. scene_manager_set_scene_state(
  26. picopass->scene_manager, PicopassSceneWriteCard, block_num);
  27. }
  28. } else if(event.type == PicopassPollerEventTypeSuccess) {
  29. view_dispatcher_send_custom_event(
  30. picopass->view_dispatcher, PicopassCustomEventPollerSuccess);
  31. } else if(
  32. event.type == PicopassPollerEventTypeFail ||
  33. event.type == PicopassPollerEventTypeAuthFail) {
  34. view_dispatcher_send_custom_event(
  35. picopass->view_dispatcher, PicopassCustomEventPollerFail);
  36. }
  37. return command;
  38. }
  39. void picopass_scene_write_card_on_enter(void* context) {
  40. Picopass* picopass = context;
  41. dolphin_deed(DolphinDeedNfcSave);
  42. // Setup view
  43. Popup* popup = picopass->popup;
  44. popup_set_header(popup, "Writing\npicopass\ncard", 68, 30, AlignLeft, AlignTop);
  45. popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
  46. scene_manager_set_scene_state(
  47. picopass->scene_manager, PicopassSceneWriteCard, PICOPASS_SCENE_WRITE_BLOCK_START);
  48. // Start worker
  49. view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup);
  50. picopass->poller = picopass_poller_alloc(picopass->nfc);
  51. picopass_poller_start(picopass->poller, picopass_scene_write_poller_callback, picopass);
  52. picopass_blink_start(picopass);
  53. }
  54. bool picopass_scene_write_card_on_event(void* context, SceneManagerEvent event) {
  55. Picopass* picopass = context;
  56. bool consumed = false;
  57. if(event.type == SceneManagerEventTypeCustom) {
  58. if(event.event == PicopassCustomEventPollerFail) {
  59. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardFailure);
  60. consumed = true;
  61. } else if(event.event == PicopassCustomEventPollerSuccess) {
  62. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardSuccess);
  63. consumed = true;
  64. }
  65. }
  66. return consumed;
  67. }
  68. void picopass_scene_write_card_on_exit(void* context) {
  69. Picopass* picopass = context;
  70. // Stop worker
  71. picopass_poller_stop(picopass->poller);
  72. picopass_poller_free(picopass->poller);
  73. // Clear view
  74. popup_reset(picopass->popup);
  75. picopass_blink_stop(picopass);
  76. }