ibutton_worker_modes.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "ibutton_worker_i.h"
  2. #include <core/check.h>
  3. #include <furi_hal_rfid.h>
  4. #include <furi_hal_power.h>
  5. #include "ibutton_protocols.h"
  6. static void ibutton_worker_mode_idle_start(iButtonWorker* worker);
  7. static void ibutton_worker_mode_idle_tick(iButtonWorker* worker);
  8. static void ibutton_worker_mode_idle_stop(iButtonWorker* worker);
  9. static void ibutton_worker_mode_emulate_start(iButtonWorker* worker);
  10. static void ibutton_worker_mode_emulate_tick(iButtonWorker* worker);
  11. static void ibutton_worker_mode_emulate_stop(iButtonWorker* worker);
  12. static void ibutton_worker_mode_read_start(iButtonWorker* worker);
  13. static void ibutton_worker_mode_read_tick(iButtonWorker* worker);
  14. static void ibutton_worker_mode_read_stop(iButtonWorker* worker);
  15. static void ibutton_worker_mode_write_common_start(iButtonWorker* worker);
  16. static void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker);
  17. static void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker);
  18. static void ibutton_worker_mode_write_common_stop(iButtonWorker* worker);
  19. const iButtonWorkerModeType ibutton_worker_modes[] = {
  20. {
  21. .quant = FuriWaitForever,
  22. .start = ibutton_worker_mode_idle_start,
  23. .tick = ibutton_worker_mode_idle_tick,
  24. .stop = ibutton_worker_mode_idle_stop,
  25. },
  26. {
  27. .quant = 100,
  28. .start = ibutton_worker_mode_read_start,
  29. .tick = ibutton_worker_mode_read_tick,
  30. .stop = ibutton_worker_mode_read_stop,
  31. },
  32. {
  33. .quant = 1000,
  34. .start = ibutton_worker_mode_write_common_start,
  35. .tick = ibutton_worker_mode_write_blank_tick,
  36. .stop = ibutton_worker_mode_write_common_stop,
  37. },
  38. {
  39. .quant = 1000,
  40. .start = ibutton_worker_mode_write_common_start,
  41. .tick = ibutton_worker_mode_write_copy_tick,
  42. .stop = ibutton_worker_mode_write_common_stop,
  43. },
  44. {
  45. .quant = 1000,
  46. .start = ibutton_worker_mode_emulate_start,
  47. .tick = ibutton_worker_mode_emulate_tick,
  48. .stop = ibutton_worker_mode_emulate_stop,
  49. },
  50. };
  51. /*********************** IDLE ***********************/
  52. void ibutton_worker_mode_idle_start(iButtonWorker* worker) {
  53. UNUSED(worker);
  54. }
  55. void ibutton_worker_mode_idle_tick(iButtonWorker* worker) {
  56. UNUSED(worker);
  57. }
  58. void ibutton_worker_mode_idle_stop(iButtonWorker* worker) {
  59. UNUSED(worker);
  60. }
  61. /*********************** READ ***********************/
  62. void ibutton_worker_mode_read_start(iButtonWorker* worker) {
  63. UNUSED(worker);
  64. furi_hal_power_enable_otg();
  65. }
  66. void ibutton_worker_mode_read_tick(iButtonWorker* worker) {
  67. if(ibutton_protocols_read(worker->protocols, worker->key)) {
  68. if(worker->read_cb != NULL) {
  69. worker->read_cb(worker->cb_ctx);
  70. }
  71. ibutton_worker_switch_mode(worker, iButtonWorkerModeIdle);
  72. }
  73. }
  74. void ibutton_worker_mode_read_stop(iButtonWorker* worker) {
  75. UNUSED(worker);
  76. furi_hal_power_disable_otg();
  77. }
  78. /*********************** EMULATE ***********************/
  79. void ibutton_worker_mode_emulate_start(iButtonWorker* worker) {
  80. furi_assert(worker->key);
  81. furi_hal_rfid_pins_reset();
  82. furi_hal_rfid_pin_pull_pulldown();
  83. ibutton_protocols_emulate_start(worker->protocols, worker->key);
  84. }
  85. void ibutton_worker_mode_emulate_tick(iButtonWorker* worker) {
  86. UNUSED(worker);
  87. }
  88. void ibutton_worker_mode_emulate_stop(iButtonWorker* worker) {
  89. furi_assert(worker->key);
  90. ibutton_protocols_emulate_stop(worker->protocols, worker->key);
  91. furi_hal_rfid_pins_reset();
  92. }
  93. /*********************** WRITE ***********************/
  94. void ibutton_worker_mode_write_common_start(iButtonWorker* worker) { //-V524
  95. UNUSED(worker);
  96. furi_hal_power_enable_otg();
  97. }
  98. void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker) {
  99. furi_assert(worker->key);
  100. const bool success = ibutton_protocols_write_blank(worker->protocols, worker->key);
  101. // TODO: pass a proper result to the callback
  102. const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
  103. iButtonWorkerWriteNoDetect;
  104. if(worker->write_cb != NULL) {
  105. worker->write_cb(worker->cb_ctx, result);
  106. }
  107. }
  108. void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker) {
  109. furi_assert(worker->key);
  110. const bool success = ibutton_protocols_write_copy(worker->protocols, worker->key);
  111. // TODO: pass a proper result to the callback
  112. const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
  113. iButtonWorkerWriteNoDetect;
  114. if(worker->write_cb != NULL) {
  115. worker->write_cb(worker->cb_ctx, result);
  116. }
  117. }
  118. void ibutton_worker_mode_write_common_stop(iButtonWorker* worker) { //-V524
  119. UNUSED(worker);
  120. furi_hal_power_disable_otg();
  121. }