irda_app_brute_force.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "helpers/irda_parser.h"
  2. #include "irda_app_brute_force.h"
  3. #include "irda_app_signal.h"
  4. #include <memory>
  5. #include <m-string.h>
  6. #include <furi.h>
  7. #include <file_worker_cpp.h>
  8. void IrdaAppBruteForce::add_record(int index, const char* name) {
  9. records[name].index = index;
  10. records[name].amount = 0;
  11. }
  12. bool IrdaAppBruteForce::calculate_messages() {
  13. bool result = false;
  14. Storage* storage = static_cast<Storage*>(furi_record_open("storage"));
  15. FlipperFile* ff = flipper_file_alloc(storage);
  16. result = flipper_file_open_existing(ff, universal_db_filename);
  17. if(result) {
  18. IrdaAppSignal signal;
  19. string_t signal_name;
  20. string_init(signal_name);
  21. while(flipper_file_read_string(ff, "name", signal_name)) {
  22. auto element = records.find(string_get_cstr(signal_name));
  23. if(element != records.cend()) {
  24. ++element->second.amount;
  25. }
  26. }
  27. string_clear(signal_name);
  28. }
  29. flipper_file_close(ff);
  30. flipper_file_free(ff);
  31. furi_record_close("storage");
  32. return result;
  33. }
  34. void IrdaAppBruteForce::stop_bruteforce() {
  35. furi_assert((current_record.size()));
  36. if(current_record.size()) {
  37. furi_assert(ff);
  38. current_record.clear();
  39. flipper_file_close(ff);
  40. flipper_file_free(ff);
  41. furi_record_close("storage");
  42. }
  43. }
  44. bool IrdaAppBruteForce::send_next_bruteforce(void) {
  45. furi_assert(current_record.size());
  46. furi_assert(ff);
  47. IrdaAppSignal signal;
  48. std::string signal_name;
  49. bool result = false;
  50. do {
  51. result = irda_parser_read_signal(ff, signal, signal_name);
  52. } while(result && current_record.compare(signal_name));
  53. if(result) {
  54. signal.transmit();
  55. }
  56. return result;
  57. }
  58. bool IrdaAppBruteForce::start_bruteforce(int index, int& record_amount) {
  59. bool result = false;
  60. record_amount = 0;
  61. for(const auto& it : records) {
  62. if(it.second.index == index) {
  63. record_amount = it.second.amount;
  64. if(record_amount) {
  65. current_record = it.first;
  66. }
  67. break;
  68. }
  69. }
  70. if(record_amount) {
  71. Storage* storage = static_cast<Storage*>(furi_record_open("storage"));
  72. ff = flipper_file_alloc(storage);
  73. result = flipper_file_open_existing(ff, universal_db_filename);
  74. if(!result) {
  75. flipper_file_close(ff);
  76. flipper_file_free(ff);
  77. furi_record_close("storage");
  78. }
  79. }
  80. return result;
  81. }