hardware_worker.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include "hardware_worker.h"
  2. #include "furi.h"
  3. #if defined(RFID_125_PROTOCOL)
  4. #include <lib/lfrfid/lfrfid_dict_file.h>
  5. #include <lib/lfrfid/lfrfid_worker.h>
  6. #else
  7. #include <lib/ibutton/ibutton_worker.h>
  8. #include <lib/ibutton/ibutton_key.h>
  9. #endif
  10. #define TAG "Fuzzer HW worker"
  11. struct HardwareWorker {
  12. #if defined(RFID_125_PROTOCOL)
  13. LFRFIDWorker* proto_worker;
  14. ProtocolId protocol_id;
  15. ProtocolDict* protocols_items;
  16. #else
  17. iButtonWorker* proto_worker;
  18. iButtonProtocolId protocol_id;
  19. iButtonProtocols* protocols_items;
  20. iButtonKey* key;
  21. #endif
  22. };
  23. HardwareWorker* hardware_worker_alloc() {
  24. HardwareWorker* instance = malloc(sizeof(HardwareWorker));
  25. #if defined(RFID_125_PROTOCOL)
  26. instance->protocols_items = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax);
  27. instance->proto_worker = lfrfid_worker_alloc(instance->protocols_items);
  28. #else
  29. instance->protocols_items = ibutton_protocols_alloc();
  30. instance->key =
  31. ibutton_key_alloc(ibutton_protocols_get_max_data_size(instance->protocols_items));
  32. instance->proto_worker = ibutton_worker_alloc(instance->protocols_items);
  33. #endif
  34. return instance;
  35. }
  36. void hardware_worker_free(HardwareWorker* instance) {
  37. #if defined(RFID_125_PROTOCOL)
  38. lfrfid_worker_free(instance->proto_worker);
  39. protocol_dict_free(instance->protocols_items);
  40. #else
  41. ibutton_worker_free(instance->proto_worker);
  42. ibutton_key_free(instance->key);
  43. ibutton_protocols_free(instance->protocols_items);
  44. #endif
  45. free(instance);
  46. }
  47. void hardware_worker_start_thread(HardwareWorker* instance) {
  48. #if defined(RFID_125_PROTOCOL)
  49. lfrfid_worker_start_thread(instance->proto_worker);
  50. #else
  51. ibutton_worker_start_thread(instance->proto_worker);
  52. #endif
  53. }
  54. void hardware_worker_stop_thread(HardwareWorker* instance) {
  55. #if defined(RFID_125_PROTOCOL)
  56. lfrfid_worker_stop(instance->proto_worker);
  57. lfrfid_worker_stop_thread(instance->proto_worker);
  58. #else
  59. ibutton_worker_stop(instance->proto_worker);
  60. ibutton_worker_stop_thread(instance->proto_worker);
  61. #endif
  62. }
  63. void hardware_worker_emulate_start(HardwareWorker* instance) {
  64. #if defined(RFID_125_PROTOCOL)
  65. lfrfid_worker_emulate_start(instance->proto_worker, instance->protocol_id);
  66. #else
  67. ibutton_worker_emulate_start(instance->proto_worker, instance->key);
  68. #endif
  69. }
  70. void hardware_worker_stop(HardwareWorker* instance) {
  71. #if defined(RFID_125_PROTOCOL)
  72. lfrfid_worker_stop(instance->proto_worker);
  73. #else
  74. ibutton_worker_stop(instance->proto_worker);
  75. #endif
  76. }
  77. void hardware_worker_set_protocol_data(
  78. HardwareWorker* instance,
  79. uint8_t* payload,
  80. uint8_t payload_size) {
  81. #if defined(RFID_125_PROTOCOL)
  82. protocol_dict_set_data(
  83. instance->protocols_items, instance->protocol_id, payload, payload_size);
  84. #else
  85. ibutton_key_set_protocol_id(instance->key, instance->protocol_id);
  86. iButtonEditableData data;
  87. ibutton_protocols_get_editable_data(instance->protocols_items, instance->key, &data);
  88. furi_check(payload_size >= data.size);
  89. memcpy(data.ptr, payload, data.size);
  90. #endif
  91. }
  92. void hardware_worker_get_protocol_data(
  93. HardwareWorker* instance,
  94. uint8_t* payload,
  95. uint8_t payload_size) {
  96. #if defined(RFID_125_PROTOCOL)
  97. protocol_dict_get_data(
  98. instance->protocols_items, instance->protocol_id, payload, payload_size);
  99. #else
  100. iButtonEditableData data;
  101. ibutton_protocols_get_editable_data(instance->protocols_items, instance->key, &data);
  102. furi_check(payload_size >= data.size);
  103. memcpy(payload, data.ptr, data.size);
  104. #endif
  105. }
  106. static bool hardware_worker_protocol_is_valid(HardwareWorker* instance) {
  107. #if defined(RFID_125_PROTOCOL)
  108. if(instance->protocol_id != PROTOCOL_NO) {
  109. return true;
  110. }
  111. #else
  112. if(instance->protocol_id != iButtonProtocolIdInvalid) {
  113. return true;
  114. }
  115. #endif
  116. return false;
  117. }
  118. bool hardware_worker_set_protocol_id_by_name(HardwareWorker* instance, const char* protocol_name) {
  119. #if defined(RFID_125_PROTOCOL)
  120. instance->protocol_id =
  121. protocol_dict_get_protocol_by_name(instance->protocols_items, protocol_name);
  122. return (instance->protocol_id != PROTOCOL_NO);
  123. #else
  124. instance->protocol_id =
  125. ibutton_protocols_get_id_by_name(instance->protocols_items, protocol_name);
  126. return (instance->protocol_id != iButtonProtocolIdInvalid);
  127. #endif
  128. }
  129. HwProtocolID hardware_worker_get_protocol_id(HardwareWorker* instance) {
  130. if(hardware_worker_protocol_is_valid(instance)) {
  131. return instance->protocol_id;
  132. }
  133. return -1;
  134. }
  135. bool hardware_worker_load_key_from_file(HardwareWorker* instance, const char* filename) {
  136. bool res = false;
  137. #if defined(RFID_125_PROTOCOL)
  138. ProtocolId loaded_proto_id = lfrfid_dict_file_load(instance->protocols_items, filename);
  139. if(loaded_proto_id == PROTOCOL_NO) {
  140. // Err Cant load file
  141. FURI_LOG_W(TAG, "Cant load file");
  142. } else {
  143. instance->protocol_id = loaded_proto_id;
  144. res = true;
  145. }
  146. #else
  147. if(!ibutton_protocols_load(instance->protocols_items, instance->key, filename)) {
  148. // Err Cant load file
  149. FURI_LOG_W(TAG, "Cant load file");
  150. } else {
  151. instance->protocol_id = ibutton_key_get_protocol_id(instance->key);
  152. res = true;
  153. }
  154. #endif
  155. return res;
  156. }
  157. bool hardware_worker_save_key(HardwareWorker* instance, const char* path) {
  158. furi_assert(instance);
  159. bool res;
  160. #if defined(RFID_125_PROTOCOL)
  161. res = lfrfid_dict_file_save(instance->protocols_items, instance->protocol_id, path);
  162. #else
  163. res = ibutton_protocols_save(instance->protocols_items, instance->key, path);
  164. #endif
  165. return res;
  166. }