picopass_scene_write_key.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "../picopass_i.h"
  2. #include <dolphin/dolphin.h>
  3. NfcCommand picopass_scene_write_key_poller_callback(PicopassPollerEvent event, void* context) {
  4. NfcCommand command = NfcCommandContinue;
  5. Picopass* picopass = context;
  6. if(event.type == PicopassPollerEventTypeRequestMode) {
  7. event.data->req_mode.mode = PicopassPollerModeWriteKey;
  8. } else if(event.type == PicopassPollerEventTypeRequestKey) {
  9. event.data->req_key.is_key_provided = true;
  10. memcpy(event.data->req_key.key, picopass->dev->dev_data.pacs.key, PICOPASS_KEY_LEN);
  11. event.data->req_key.is_elite_key = picopass->dev->dev_data.pacs.elite_kdf;
  12. } else if(event.type == PicopassPollerEventTypeRequestWriteKey) {
  13. event.data->req_write_key.data = &picopass->dev->dev_data;
  14. memcpy(
  15. event.data->req_write_key.key,
  16. picopass->write_key_context.key_to_write,
  17. PICOPASS_KEY_LEN);
  18. event.data->req_write_key.is_elite_key = picopass->write_key_context.is_elite;
  19. } else if(event.type == PicopassPollerEventTypeSuccess) {
  20. view_dispatcher_send_custom_event(
  21. picopass->view_dispatcher, PicopassCustomEventPollerSuccess);
  22. } else if(event.type == PicopassPollerEventTypeFail) {
  23. view_dispatcher_send_custom_event(
  24. picopass->view_dispatcher, PicopassCustomEventPollerFail);
  25. }
  26. return command;
  27. }
  28. void picopass_scene_write_key_on_enter(void* context) {
  29. Picopass* picopass = context;
  30. dolphin_deed(DolphinDeedNfcSave);
  31. // Setup view
  32. Popup* popup = picopass->popup;
  33. popup_set_header(popup, "Writing\niClass\nkey", 68, 30, AlignLeft, AlignTop);
  34. popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
  35. // Start worker
  36. view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup);
  37. picopass_blink_start(picopass);
  38. picopass->poller = picopass_poller_alloc(picopass->nfc);
  39. picopass_poller_start(picopass->poller, picopass_scene_write_key_poller_callback, picopass);
  40. }
  41. bool picopass_scene_write_key_on_event(void* context, SceneManagerEvent event) {
  42. Picopass* picopass = context;
  43. bool consumed = false;
  44. if(event.type == SceneManagerEventTypeCustom) {
  45. if(event.event == PicopassCustomEventPollerSuccess) {
  46. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardSuccess);
  47. consumed = true;
  48. } else if(event.event == PicopassCustomEventPollerFail) {
  49. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardFailure);
  50. consumed = true;
  51. }
  52. }
  53. return consumed;
  54. }
  55. void picopass_scene_write_key_on_exit(void* context) {
  56. Picopass* picopass = context;
  57. // Stop worker
  58. picopass_poller_stop(picopass->poller);
  59. picopass_poller_free(picopass->poller);
  60. // Clear view
  61. popup_reset(picopass->popup);
  62. picopass_blink_stop(picopass);
  63. }