mifare_nested_scene_check_keys.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "../mifare_nested_i.h"
  2. void mifare_nested_scene_check_keys_widget_callback(
  3. GuiButtonType result,
  4. InputType type,
  5. void* context) {
  6. MifareNested* mifare_nested = context;
  7. if(type == InputTypeShort) {
  8. view_dispatcher_send_custom_event(mifare_nested->view_dispatcher, result);
  9. }
  10. }
  11. bool mifare_nested_check_keys_worker_callback(MifareNestedWorkerEvent event, void* context) {
  12. MifareNested* mifare_nested = context;
  13. CheckKeysState* plugin_state = mifare_nested->keys_state;
  14. if(event == MifareNestedWorkerEventKeyChecked) {
  15. mifare_nested_blink_nonce_collection_start(mifare_nested);
  16. KeyInfo_t* key_info = mifare_nested->keys;
  17. with_view_model(
  18. plugin_state->view,
  19. CheckKeysViewModel * model,
  20. {
  21. model->lost_tag = false;
  22. model->keys_checked = key_info->checked_keys;
  23. model->keys_found = key_info->found_keys;
  24. model->keys_total = key_info->sector_keys;
  25. model->keys_count = key_info->total_keys;
  26. },
  27. true);
  28. } else if(event == MifareNestedWorkerEventNoTagDetected) {
  29. mifare_nested_blink_start(mifare_nested);
  30. with_view_model(
  31. plugin_state->view, CheckKeysViewModel * model, { model->lost_tag = true; }, true);
  32. } else if(event == MifareNestedWorkerEventProcessingKeys) {
  33. with_view_model(
  34. plugin_state->view,
  35. CheckKeysViewModel * model,
  36. { model->processing_keys = true; },
  37. true);
  38. }
  39. view_dispatcher_send_custom_event(mifare_nested->view_dispatcher, event);
  40. return true;
  41. }
  42. void mifare_nested_scene_check_keys_on_enter(void* context) {
  43. MifareNested* mifare_nested = context;
  44. CheckKeysState* plugin_state = mifare_nested->keys_state;
  45. mifare_nested_worker_start(
  46. mifare_nested->worker,
  47. MifareNestedWorkerStateValidating,
  48. &mifare_nested->nfc_dev->dev_data,
  49. mifare_nested_check_keys_worker_callback,
  50. mifare_nested);
  51. mifare_nested_blink_start(mifare_nested);
  52. with_view_model(
  53. plugin_state->view,
  54. CheckKeysViewModel * model,
  55. {
  56. model->lost_tag = false;
  57. model->processing_keys = false;
  58. model->keys_count = 0;
  59. model->keys_checked = 0;
  60. model->keys_found = 0;
  61. },
  62. false);
  63. view_dispatcher_switch_to_view(mifare_nested->view_dispatcher, MifareNestedViewCheckKeys);
  64. }
  65. bool mifare_nested_scene_check_keys_on_event(void* context, SceneManagerEvent event) {
  66. MifareNested* mifare_nested = context;
  67. bool consumed = false;
  68. if(event.type == SceneManagerEventTypeCustom) {
  69. if(event.event == GuiButtonTypeCenter) {
  70. scene_manager_search_and_switch_to_previous_scene(mifare_nested->scene_manager, 0);
  71. consumed = true;
  72. } else if(event.event == MifareNestedWorkerEventNoncesCollected) {
  73. scene_manager_next_scene(
  74. mifare_nested->scene_manager, MifareNestedSceneNoncesCollected);
  75. consumed = true;
  76. } else if(event.event == MifareNestedWorkerEventNeedKey) {
  77. scene_manager_next_scene(mifare_nested->scene_manager, MifareNestedSceneNoKeys);
  78. consumed = true;
  79. } else if(event.event == MifareNestedWorkerEventKeysFound) {
  80. scene_manager_next_scene(mifare_nested->scene_manager, MifareNestedSceneAddedKeys);
  81. consumed = true;
  82. } else if(event.event == MifareNestedWorkerEventNeedKeyRecovery) {
  83. scene_manager_next_scene(
  84. mifare_nested->scene_manager, MifareNestedSceneNeedKeyRecovery);
  85. consumed = true;
  86. } else if(event.event == MifareNestedWorkerEventNeedCollection) {
  87. scene_manager_next_scene(
  88. mifare_nested->scene_manager, MifareNestedSceneNeedCollection);
  89. consumed = true;
  90. } else if(
  91. event.event == MifareNestedWorkerEventKeyChecked ||
  92. event.event == MifareNestedWorkerEventNoTagDetected ||
  93. event.event == MifareNestedWorkerEventProcessingKeys) {
  94. consumed = true;
  95. }
  96. }
  97. return consumed;
  98. }
  99. void mifare_nested_scene_check_keys_on_exit(void* context) {
  100. MifareNested* mifare_nested = context;
  101. mifare_nested_worker_stop(mifare_nested->worker);
  102. // Clear view
  103. mifare_nested_blink_stop(mifare_nested);
  104. popup_reset(mifare_nested->popup);
  105. widget_reset(mifare_nested->widget);
  106. }