api-hal-nfc.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "api-hal-nfc.h"
  2. #include <st25r3916.h>
  3. static bool dev_is_found = false;
  4. ReturnCode api_hal_nfc_init() {
  5. // Check if Nfc worker was started
  6. if(rfalNfcGetState() > RFAL_NFC_STATE_NOTINIT) {
  7. return ERR_NONE;
  8. }
  9. return rfalNfcInitialize();
  10. }
  11. bool api_hal_nfc_is_busy() {
  12. return rfalNfcGetState() > RFAL_NFC_STATE_IDLE;
  13. }
  14. void api_hal_nfc_field_on() {
  15. st25r3916TxRxOn();
  16. }
  17. void api_hal_nfc_field_off() {
  18. rfalFieldOff();
  19. }
  20. void api_hal_nfc_start_sleep() {
  21. rfalLowPowerModeStart();
  22. }
  23. void api_hal_nfc_exit_sleep() {
  24. rfalLowPowerModeStop();
  25. }
  26. static void api_hal_nfc_change_state_cb(rfalNfcState st) {
  27. FURI_LOG_D("HAL NFC", "NFC worker state: %d", st);
  28. if(st >= RFAL_NFC_STATE_POLL_SELECT) {
  29. dev_is_found = true;
  30. }
  31. }
  32. bool api_hal_nfc_detect(rfalNfcDevice **dev_list, uint8_t* dev_cnt, uint32_t cycles) {
  33. furi_assert(dev_list);
  34. furi_assert(dev_cnt);
  35. rfalLowPowerModeStop();
  36. if(rfalNfcGetState() == RFAL_NFC_STATE_NOTINIT) {
  37. rfalNfcInitialize();
  38. }
  39. rfalNfcDiscoverParam params;
  40. params.compMode = RFAL_COMPLIANCE_MODE_EMV;
  41. params.techs2Find = RFAL_NFC_POLL_TECH_A | RFAL_NFC_POLL_TECH_B | RFAL_NFC_POLL_TECH_F |
  42. RFAL_NFC_POLL_TECH_V | RFAL_NFC_POLL_TECH_AP2P | RFAL_NFC_POLL_TECH_ST25TB;
  43. params.totalDuration = 1000;
  44. params.devLimit = 3;
  45. params.wakeupEnabled = false;
  46. params.wakeupConfigDefault = true;
  47. params.nfcfBR = RFAL_BR_212;
  48. params.ap2pBR = RFAL_BR_424;
  49. params.maxBR = RFAL_BR_KEEP;
  50. params.GBLen = RFAL_NFCDEP_GB_MAX_LEN;
  51. params.notifyCb = api_hal_nfc_change_state_cb;
  52. dev_is_found = false;
  53. rfalNfcDiscover(&params);
  54. while(--cycles) {
  55. rfalNfcWorker();
  56. FURI_LOG_D("HAL NFC", "Current state %d", rfalNfcGetState());
  57. if(dev_is_found) {
  58. rfalNfcGetDevicesFound(dev_list, dev_cnt);
  59. FURI_LOG_D("HAL NFC", "Found %d devices", dev_cnt);
  60. break;
  61. }
  62. osDelay(5);
  63. }
  64. rfalNfcDeactivate(false);
  65. rfalLowPowerModeStart();
  66. if(!cycles) {
  67. FURI_LOG_D("HAL NFC", "Timeout");
  68. return false;
  69. }
  70. return true;
  71. }