lfrfid_scene_read.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "../lfrfid_i.h"
  2. #include <dolphin/dolphin.h>
  3. static const NotificationSequence sequence_blink_set_yellow = {
  4. &message_blink_set_color_yellow,
  5. NULL,
  6. };
  7. static const NotificationSequence sequence_blink_set_green = {
  8. &message_blink_set_color_green,
  9. NULL,
  10. };
  11. static const NotificationSequence sequence_blink_set_cyan = {
  12. &message_blink_set_color_cyan,
  13. NULL,
  14. };
  15. static void
  16. lfrfid_read_callback(LFRFIDWorkerReadResult result, ProtocolId protocol, void* context) {
  17. LfRfid* app = context;
  18. uint32_t event = 0;
  19. if(result == LFRFIDWorkerReadSenseStart) {
  20. event = LfRfidEventReadSenseStart;
  21. } else if(result == LFRFIDWorkerReadSenseEnd) {
  22. event = LfRfidEventReadSenseEnd;
  23. } else if(result == LFRFIDWorkerReadSenseCardStart) {
  24. event = LfRfidEventReadSenseCardStart;
  25. } else if(result == LFRFIDWorkerReadSenseCardEnd) {
  26. event = LfRfidEventReadSenseCardEnd;
  27. } else if(result == LFRFIDWorkerReadDone) {
  28. event = LfRfidEventReadDone;
  29. app->protocol_id_next = protocol;
  30. } else if(result == LFRFIDWorkerReadStartASK) {
  31. event = LfRfidEventReadStartASK;
  32. } else if(result == LFRFIDWorkerReadStartPSK) {
  33. event = LfRfidEventReadStartPSK;
  34. } else {
  35. return;
  36. }
  37. view_dispatcher_send_custom_event(app->view_dispatcher, event);
  38. }
  39. void lfrfid_scene_read_on_enter(void* context) {
  40. LfRfid* app = context;
  41. if(app->read_type == LFRFIDWorkerReadTypePSKOnly) {
  42. lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadPskOnly);
  43. } else if(app->read_type == LFRFIDWorkerReadTypeASKOnly) {
  44. lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadAskOnly);
  45. }
  46. lfrfid_worker_start_thread(app->lfworker);
  47. lfrfid_worker_read_start(app->lfworker, app->read_type, lfrfid_read_callback, app);
  48. notification_message(app->notifications, &sequence_blink_start_cyan);
  49. view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewRead);
  50. }
  51. bool lfrfid_scene_read_on_event(void* context, SceneManagerEvent event) {
  52. LfRfid* app = context;
  53. bool consumed = false;
  54. if(event.type == SceneManagerEventTypeCustom) {
  55. if(event.event == LfRfidEventReadSenseStart) {
  56. notification_message(app->notifications, &sequence_blink_set_yellow);
  57. consumed = true;
  58. } else if(event.event == LfRfidEventReadSenseCardStart) {
  59. notification_message(app->notifications, &sequence_blink_set_green);
  60. consumed = true;
  61. } else if(
  62. (event.event == LfRfidEventReadSenseEnd) ||
  63. (event.event == LfRfidEventReadSenseCardEnd)) {
  64. notification_message(app->notifications, &sequence_blink_set_cyan);
  65. consumed = true;
  66. } else if(event.event == LfRfidEventReadDone) {
  67. app->protocol_id = app->protocol_id_next;
  68. notification_message(app->notifications, &sequence_success);
  69. furi_string_reset(app->file_name);
  70. scene_manager_next_scene(app->scene_manager, LfRfidSceneReadSuccess);
  71. DOLPHIN_DEED(DolphinDeedRfidReadSuccess);
  72. consumed = true;
  73. } else if(event.event == LfRfidEventReadStartPSK) {
  74. if(app->read_type == LFRFIDWorkerReadTypeAuto) {
  75. lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadPsk);
  76. }
  77. consumed = true;
  78. } else if(event.event == LfRfidEventReadStartASK) {
  79. if(app->read_type == LFRFIDWorkerReadTypeAuto) {
  80. lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadAsk);
  81. }
  82. consumed = true;
  83. }
  84. }
  85. return consumed;
  86. }
  87. void lfrfid_scene_read_on_exit(void* context) {
  88. LfRfid* app = context;
  89. notification_message(app->notifications, &sequence_blink_stop);
  90. popup_reset(app->popup);
  91. lfrfid_worker_stop(app->lfworker);
  92. lfrfid_worker_stop_thread(app->lfworker);
  93. }