picopass_scene_write_card.c 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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.AA1[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(event.type == PicopassPollerEventTypeFail) {
  32. view_dispatcher_send_custom_event(
  33. picopass->view_dispatcher, PicopassCustomEventPollerFail);
  34. }
  35. return command;
  36. }
  37. void picopass_scene_write_card_on_enter(void* context) {
  38. Picopass* picopass = context;
  39. dolphin_deed(DolphinDeedNfcSave);
  40. // Setup view
  41. Popup* popup = picopass->popup;
  42. popup_set_header(popup, "Writing\npicopass\ncard", 68, 30, AlignLeft, AlignTop);
  43. popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
  44. scene_manager_set_scene_state(
  45. picopass->scene_manager, PicopassSceneWriteCard, PICOPASS_SCENE_WRITE_BLOCK_START);
  46. // Start worker
  47. view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup);
  48. picopass->poller = picopass_poller_alloc(picopass->nfc);
  49. picopass_poller_start(picopass->poller, picopass_scene_write_poller_callback, picopass);
  50. picopass_blink_start(picopass);
  51. }
  52. bool picopass_scene_write_card_on_event(void* context, SceneManagerEvent event) {
  53. Picopass* picopass = context;
  54. bool consumed = false;
  55. if(event.type == SceneManagerEventTypeCustom) {
  56. if(event.event == PicopassCustomEventPollerFail) {
  57. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardFailure);
  58. consumed = true;
  59. } else if(event.event == PicopassCustomEventPollerSuccess) {
  60. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardSuccess);
  61. consumed = true;
  62. }
  63. }
  64. return consumed;
  65. }
  66. void picopass_scene_write_card_on_exit(void* context) {
  67. Picopass* picopass = context;
  68. // Stop worker
  69. picopass_poller_stop(picopass->poller);
  70. picopass_poller_free(picopass->poller);
  71. // Clear view
  72. popup_reset(picopass->popup);
  73. picopass_blink_stop(picopass);
  74. }