wiegand_save.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "../wiegand.h"
  2. void wiegand_data_scene_save_name_text_input_callback(void* context) {
  3. App* app = context;
  4. view_dispatcher_send_custom_event(app->view_dispatcher, WiegandDataSceneSaveFileEvent);
  5. }
  6. void ensure_dir_exists(Storage* storage) {
  7. // If apps_data directory doesn't exist, create it.
  8. if(!storage_dir_exists(storage, WIEGAND_APPS_DATA_FOLDER)) {
  9. FURI_LOG_I(TAG, "Creating directory: %s", WIEGAND_APPS_DATA_FOLDER);
  10. storage_simply_mkdir(storage, WIEGAND_APPS_DATA_FOLDER);
  11. } else {
  12. FURI_LOG_I(TAG, "Directory exists: %s", WIEGAND_APPS_DATA_FOLDER);
  13. }
  14. // If wiegand directory doesn't exist, create it.
  15. if(!storage_dir_exists(storage, WIEGAND_SAVE_FOLDER)) {
  16. FURI_LOG_I(TAG, "Creating directory: %s", WIEGAND_SAVE_FOLDER);
  17. storage_simply_mkdir(storage, WIEGAND_SAVE_FOLDER);
  18. } else {
  19. FURI_LOG_I(TAG, "Directory exists: %s", WIEGAND_SAVE_FOLDER);
  20. }
  21. }
  22. void wiegand_save(void* context) {
  23. App* app = context;
  24. FuriString* buffer = furi_string_alloc(1024);
  25. FuriString* file_path = furi_string_alloc();
  26. furi_string_printf(
  27. file_path, "%s/%s%s", WIEGAND_SAVE_FOLDER, app->file_name, WIEGAND_SAVE_EXTENSION);
  28. Storage* storage = furi_record_open(RECORD_STORAGE);
  29. ensure_dir_exists(storage);
  30. File* data_file = storage_file_alloc(storage);
  31. if(storage_file_open(
  32. data_file, furi_string_get_cstr(file_path), FSAM_WRITE, FSOM_OPEN_ALWAYS)) {
  33. furi_string_printf(buffer, "Filetype: Flipper Wiegand Key File\n");
  34. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  35. furi_string_printf(buffer, "Version: 1\n");
  36. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  37. furi_string_printf(buffer, "Protocol: RAW\n");
  38. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  39. furi_string_printf(buffer, "Bits: %d\n", bit_count);
  40. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  41. furi_string_printf(buffer, "RAW_Data: ");
  42. for(int i = 0; i < bit_count; i++) {
  43. furi_string_cat_printf(
  44. buffer,
  45. "D%d %ld %ld ",
  46. data[i] ? 1 : 0,
  47. data_fall[i] - data_fall[0],
  48. data_rise[i] - data_fall[0]);
  49. }
  50. furi_string_push_back(buffer, '\n');
  51. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  52. furi_string_printf(buffer, "PACS_Binary: ");
  53. for(int i = 0; i < bit_count; i++) {
  54. furi_string_cat_printf(buffer, "%d", data[i] ? 1 : 0);
  55. }
  56. furi_string_push_back(buffer, '\n');
  57. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  58. furi_string_printf(buffer, "PM3_Command: hf ic encode --bin ");
  59. for(int i = 0; i < bit_count; i++) {
  60. furi_string_cat_printf(buffer, "%d", data[i] ? 1 : 0);
  61. }
  62. furi_string_cat_printf(buffer, " --ki 0\n");
  63. storage_file_write(data_file, furi_string_get_cstr(buffer), furi_string_size(buffer));
  64. storage_file_close(data_file);
  65. }
  66. storage_file_free(data_file);
  67. furi_record_close(RECORD_STORAGE);
  68. furi_string_free(file_path);
  69. furi_string_free(buffer);
  70. }
  71. void wiegand_save_scene_on_enter(void* context) {
  72. App* app = context;
  73. text_input_reset(app->text_input);
  74. FuriHalRtcDateTime datetime;
  75. furi_hal_rtc_get_datetime(&datetime);
  76. snprintf(
  77. app->file_name,
  78. 50,
  79. "%02d_%02d_%02d_%02d_%02d_%02d",
  80. datetime.year,
  81. datetime.month,
  82. datetime.day,
  83. datetime.hour,
  84. datetime.minute,
  85. datetime.second);
  86. // set_random_name(app->file_name, WIEGAND_KEY_NAME_SIZE);
  87. text_input_set_header_text(app->text_input, "Name the key");
  88. text_input_set_result_callback(
  89. app->text_input,
  90. wiegand_data_scene_save_name_text_input_callback,
  91. app,
  92. app->file_name,
  93. WIEGAND_KEY_NAME_SIZE,
  94. true);
  95. view_dispatcher_switch_to_view(app->view_dispatcher, WiegandTextInputView);
  96. }
  97. bool wiegand_save_scene_on_event(void* context, SceneManagerEvent event) {
  98. App* app = context;
  99. bool consumed = false;
  100. switch(event.type) {
  101. case SceneManagerEventTypeCustom:
  102. switch(event.event) {
  103. case WiegandDataSceneSaveFileEvent:
  104. wiegand_save(app);
  105. data_saved = true;
  106. scene_manager_search_and_switch_to_previous_scene(
  107. app->scene_manager, WiegandDataScene);
  108. consumed = true;
  109. break;
  110. default:
  111. consumed = false;
  112. break;
  113. }
  114. break;
  115. default:
  116. break;
  117. }
  118. return consumed;
  119. }