action_ibutton.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // Methods for iButton transmission
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <ibutton/ibutton_key.h>
  5. #include <ibutton/ibutton_worker.h>
  6. #include <ibutton/ibutton_protocols.h>
  7. #include "action_i.h"
  8. #include "quac.h"
  9. void action_ibutton_tx(void* context, const FuriString* action_path, FuriString* error) {
  10. App* app = context;
  11. const char* cpath = furi_string_get_cstr(action_path);
  12. FURI_LOG_I(TAG, "iButton: Tx %s", cpath);
  13. iButtonProtocols* protocols = ibutton_protocols_alloc();
  14. iButtonKey* key = ibutton_key_alloc(ibutton_protocols_get_max_data_size(protocols));
  15. const bool success = ibutton_protocols_load(protocols, key, cpath);
  16. if(!success) {
  17. FURI_LOG_E(TAG, "Error loading iButton file %s", cpath);
  18. ACTION_SET_ERROR("Error loading %s", cpath);
  19. } else {
  20. FURI_LOG_I(TAG, "iButton: Starting...");
  21. iButtonWorker* worker = ibutton_worker_alloc(protocols);
  22. ibutton_worker_start_thread(worker);
  23. ibutton_worker_emulate_start(worker, key);
  24. int16_t time_ms = app->settings.ibutton_duration;
  25. const int16_t interval_ms = 100;
  26. while(time_ms > 0) {
  27. furi_delay_ms(interval_ms);
  28. time_ms -= interval_ms;
  29. }
  30. FURI_LOG_I(TAG, "iButton: Done");
  31. ibutton_worker_stop(worker);
  32. ibutton_worker_stop_thread(worker);
  33. ibutton_worker_free(worker);
  34. }
  35. ibutton_key_free(key);
  36. ibutton_protocols_free(protocols);
  37. }