irda-app-remote-manager.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "irda-app-remote-manager.h"
  2. #include "irda-app-file-parser.h"
  3. #include <utility>
  4. #include <irda.h>
  5. #include <cstdio>
  6. #include <furi.h>
  7. #include <gui/modules/button_menu.h>
  8. #include <storage/storage.h>
  9. static const std::string default_remote_name = "remote";
  10. std::string IrdaAppRemoteManager::find_vacant_remote_name(const std::string& name) {
  11. IrdaAppFileParser file_parser;
  12. bool exist = true;
  13. if(!file_parser.is_irda_file_exist(name.c_str(), &exist)) {
  14. return std::string();
  15. } else if(!exist) {
  16. return name;
  17. }
  18. uint32_t i = 1;
  19. /* if suggested name is occupied, try another one (name2, name3, etc) */
  20. while(file_parser.is_irda_file_exist((name + std::to_string(++i)).c_str(), &exist) && exist)
  21. ;
  22. return !exist ? name + std::to_string(i) : std::string();
  23. }
  24. bool IrdaAppRemoteManager::add_button(const char* button_name, const IrdaAppSignal& signal) {
  25. remote->buttons.emplace_back(button_name, signal);
  26. return store();
  27. }
  28. bool IrdaAppRemoteManager::add_remote_with_button(
  29. const char* button_name,
  30. const IrdaAppSignal& signal) {
  31. furi_check(button_name != nullptr);
  32. auto new_name = find_vacant_remote_name(default_remote_name);
  33. if(new_name.empty()) {
  34. return false;
  35. }
  36. remote = std::make_unique<IrdaAppRemote>(new_name);
  37. return add_button(button_name, signal);
  38. }
  39. std::vector<std::string> IrdaAppRemoteManager::get_button_list(void) const {
  40. std::vector<std::string> name_vector;
  41. name_vector.reserve(remote->buttons.size());
  42. for(const auto& it : remote->buttons) {
  43. name_vector.emplace_back(it.name);
  44. }
  45. // copy elision
  46. return name_vector;
  47. }
  48. const IrdaAppSignal& IrdaAppRemoteManager::get_button_data(size_t index) const {
  49. furi_check(remote.get() != nullptr);
  50. auto& buttons = remote->buttons;
  51. furi_check(index < buttons.size());
  52. return buttons.at(index).signal;
  53. }
  54. bool IrdaAppRemoteManager::delete_remote() {
  55. bool result;
  56. IrdaAppFileParser file_parser;
  57. result = file_parser.remove_irda_file(remote->name.c_str());
  58. reset_remote();
  59. return result;
  60. }
  61. void IrdaAppRemoteManager::reset_remote() {
  62. remote.reset();
  63. }
  64. bool IrdaAppRemoteManager::delete_button(uint32_t index) {
  65. furi_check(remote.get() != nullptr);
  66. auto& buttons = remote->buttons;
  67. furi_check(index < buttons.size());
  68. buttons.erase(buttons.begin() + index);
  69. return store();
  70. }
  71. std::string IrdaAppRemoteManager::get_button_name(uint32_t index) {
  72. furi_check(remote.get() != nullptr);
  73. auto& buttons = remote->buttons;
  74. furi_check(index < buttons.size());
  75. return buttons[index].name.c_str();
  76. }
  77. std::string IrdaAppRemoteManager::get_remote_name() {
  78. return remote ? remote->name : std::string();
  79. }
  80. int IrdaAppRemoteManager::find_remote_name(const std::vector<std::string>& strings) {
  81. int i = 0;
  82. for(const auto& str : strings) {
  83. if(!str.compare(remote->name)) {
  84. return i;
  85. }
  86. ++i;
  87. }
  88. return -1;
  89. }
  90. bool IrdaAppRemoteManager::rename_remote(const char* str) {
  91. furi_check(str != nullptr);
  92. furi_check(remote.get() != nullptr);
  93. if(!remote->name.compare(str)) {
  94. return true;
  95. }
  96. auto new_name = find_vacant_remote_name(str);
  97. if(new_name.empty()) {
  98. return false;
  99. }
  100. IrdaAppFileParser file_parser;
  101. bool result = file_parser.rename_irda_file(remote->name.c_str(), new_name.c_str());
  102. remote->name = new_name;
  103. return result;
  104. }
  105. bool IrdaAppRemoteManager::rename_button(uint32_t index, const char* str) {
  106. furi_check(remote.get() != nullptr);
  107. auto& buttons = remote->buttons;
  108. furi_check(index < buttons.size());
  109. buttons[index].name = str;
  110. return store();
  111. }
  112. size_t IrdaAppRemoteManager::get_number_of_buttons() {
  113. furi_check(remote.get() != nullptr);
  114. return remote->buttons.size();
  115. }
  116. bool IrdaAppRemoteManager::store(void) {
  117. IrdaAppFileParser file_parser;
  118. bool result = true;
  119. if(!file_parser.open_irda_file_write(remote->name.c_str())) {
  120. return false;
  121. }
  122. for(const auto& button : remote->buttons) {
  123. bool result = file_parser.save_signal(button.signal, button.name.c_str());
  124. if(!result) {
  125. result = false;
  126. break;
  127. }
  128. }
  129. file_parser.close();
  130. return result;
  131. }
  132. bool IrdaAppRemoteManager::load(const std::string& name) {
  133. bool fs_res = false;
  134. IrdaAppFileParser file_parser;
  135. fs_res = file_parser.open_irda_file_read(name.c_str());
  136. if(!fs_res) {
  137. return false;
  138. }
  139. remote = std::make_unique<IrdaAppRemote>(name);
  140. while(1) {
  141. auto file_signal = file_parser.read_signal();
  142. if(!file_signal) {
  143. break;
  144. }
  145. remote->buttons.emplace_back(file_signal->name, file_signal->signal);
  146. }
  147. file_parser.close();
  148. return true;
  149. }