subbrute_scene_setup_extra.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #include "../subbrute_i.h"
  2. #include "subbrute_scene.h"
  3. #define TAG "SubBruteSceneLoadFile"
  4. #define MIN_TD 0
  5. #define MAX_TD 255
  6. #define MIN_REP 1
  7. #define MAX_REP 100
  8. #define MIN_TE 100
  9. #define MAX_TE 600
  10. enum SubBruteVarListIndex {
  11. SubBruteVarListIndexTimeDelay,
  12. SubBruteVarListIndexRepeatOrOnExtra,
  13. SubBruteVarListIndexTe,
  14. SubBruteVarListIndexOpenCode,
  15. };
  16. static void setup_extra_enter_callback(void* context, uint32_t index);
  17. static void setup_extra_td_callback(VariableItem* item) {
  18. furi_assert(item);
  19. SubBruteState* instance = variable_item_get_context(item);
  20. furi_assert(instance);
  21. char buf[6] = {0};
  22. const uint8_t index = variable_item_get_current_value_index(item);
  23. uint8_t val = subbrute_worker_get_timeout(instance->worker);
  24. if(index == 0) {
  25. if(val > MIN_TD) {
  26. val--;
  27. subbrute_worker_set_timeout(instance->worker, val);
  28. snprintf(&buf[0], 5, "%d", val);
  29. variable_item_set_current_value_text(item, &buf[0]);
  30. variable_item_set_current_value_index(item, 1);
  31. if(val == MIN_TD) {
  32. variable_item_set_current_value_index(item, 0);
  33. }
  34. }
  35. } else if(index == 2) {
  36. if(val < MAX_TD) {
  37. val++;
  38. subbrute_worker_set_timeout(instance->worker, val);
  39. snprintf(&buf[0], 5, "%d", val);
  40. variable_item_set_current_value_text(item, &buf[0]);
  41. variable_item_set_current_value_index(item, 1);
  42. if(val == MAX_TD) {
  43. variable_item_set_current_value_index(item, 2);
  44. }
  45. }
  46. } else if(index == 1) {
  47. if(val == MIN_TD) {
  48. val++;
  49. subbrute_worker_set_timeout(instance->worker, val);
  50. snprintf(&buf[0], 5, "%d", val);
  51. variable_item_set_current_value_text(item, &buf[0]);
  52. variable_item_set_current_value_index(item, 1);
  53. if(val == MAX_TD) {
  54. variable_item_set_current_value_index(item, 2);
  55. }
  56. } else if(val == MAX_TD) {
  57. val--;
  58. subbrute_worker_set_timeout(instance->worker, val);
  59. snprintf(&buf[0], 5, "%d", val);
  60. variable_item_set_current_value_text(item, &buf[0]);
  61. variable_item_set_current_value_index(item, 1);
  62. if(val == MIN_TD) {
  63. variable_item_set_current_value_index(item, 0);
  64. }
  65. }
  66. }
  67. }
  68. static void setup_extra_rep_callback(VariableItem* item) {
  69. furi_assert(item);
  70. SubBruteState* instance = variable_item_get_context(item);
  71. furi_assert(instance);
  72. char buf[6] = {0};
  73. const uint8_t index = variable_item_get_current_value_index(item);
  74. uint8_t val = subbrute_worker_get_repeats(instance->worker);
  75. if(index == 0) {
  76. if(val > MIN_REP) {
  77. val--;
  78. subbrute_worker_set_repeats(instance->worker, val);
  79. snprintf(&buf[0], 5, "%d", val);
  80. variable_item_set_current_value_text(item, &buf[0]);
  81. variable_item_set_current_value_index(item, 1);
  82. if(val == MIN_REP) {
  83. variable_item_set_current_value_index(item, 0);
  84. }
  85. }
  86. } else if(index == 2) {
  87. if(val < MAX_REP) {
  88. val++;
  89. subbrute_worker_set_repeats(instance->worker, val);
  90. snprintf(&buf[0], 5, "%d", val);
  91. variable_item_set_current_value_text(item, &buf[0]);
  92. variable_item_set_current_value_index(item, 1);
  93. if(val == MAX_REP) {
  94. variable_item_set_current_value_index(item, 2);
  95. }
  96. }
  97. } else if(index == 1) {
  98. if(val == MIN_REP) {
  99. val++;
  100. subbrute_worker_set_repeats(instance->worker, val);
  101. snprintf(&buf[0], 5, "%d", val);
  102. variable_item_set_current_value_text(item, &buf[0]);
  103. variable_item_set_current_value_index(item, 1);
  104. if(val == MAX_REP) {
  105. variable_item_set_current_value_index(item, 2);
  106. }
  107. } else if(val == MAX_REP) {
  108. val--;
  109. subbrute_worker_set_repeats(instance->worker, val);
  110. snprintf(&buf[0], 5, "%d", val);
  111. variable_item_set_current_value_text(item, &buf[0]);
  112. variable_item_set_current_value_index(item, 1);
  113. if(val == MIN_REP) {
  114. variable_item_set_current_value_index(item, 0);
  115. }
  116. }
  117. }
  118. }
  119. static void setup_extra_te_callback(VariableItem* item) {
  120. furi_assert(item);
  121. SubBruteState* instance = variable_item_get_context(item);
  122. furi_assert(instance);
  123. char buf[6] = {0};
  124. const uint8_t index = variable_item_get_current_value_index(item);
  125. uint32_t val = subbrute_worker_get_te(instance->worker);
  126. if(index == 0) {
  127. if(val > MIN_TE) {
  128. val--;
  129. subbrute_worker_set_te(instance->worker, val);
  130. snprintf(&buf[0], 5, "%ld", val);
  131. variable_item_set_current_value_text(item, &buf[0]);
  132. variable_item_set_current_value_index(item, 1);
  133. if(val == MIN_TE) {
  134. variable_item_set_current_value_index(item, 0);
  135. }
  136. }
  137. } else if(index == 2) {
  138. if(val < MAX_TE) {
  139. val++;
  140. subbrute_worker_set_te(instance->worker, val);
  141. snprintf(&buf[0], 5, "%ld", val);
  142. variable_item_set_current_value_text(item, &buf[0]);
  143. variable_item_set_current_value_index(item, 1);
  144. if(val == MAX_TE) {
  145. variable_item_set_current_value_index(item, 2);
  146. }
  147. }
  148. } else if(index == 1) {
  149. if(val == MIN_TE) {
  150. val++;
  151. subbrute_worker_set_te(instance->worker, val);
  152. snprintf(&buf[0], 5, "%ld", val);
  153. variable_item_set_current_value_text(item, &buf[0]);
  154. variable_item_set_current_value_index(item, 1);
  155. if(val == MAX_TE) {
  156. variable_item_set_current_value_index(item, 2);
  157. }
  158. } else if(val == MAX_TE) {
  159. val--;
  160. subbrute_worker_set_te(instance->worker, val);
  161. snprintf(&buf[0], 5, "%ld", val);
  162. variable_item_set_current_value_text(item, &buf[0]);
  163. variable_item_set_current_value_index(item, 1);
  164. if(val == MIN_TE) {
  165. variable_item_set_current_value_index(item, 0);
  166. }
  167. }
  168. }
  169. }
  170. const char* const opencode_names[] =
  171. {"0001", "0010", "0100", "1000", "1100", "0F00", "00F0", "F000", "1001"};
  172. const uint8_t opencode_values[COUNT_OF(opencode_names)] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
  173. static void setup_extra_opencode_callback(VariableItem* item) {
  174. furi_assert(item);
  175. SubBruteState* instance = variable_item_get_context(item);
  176. furi_assert(instance);
  177. const uint8_t value_index = variable_item_get_current_value_index(item);
  178. subbrute_worker_set_opencode(instance->worker, opencode_values[value_index]);
  179. instance->device->opencode = opencode_values[value_index];
  180. variable_item_set_current_value_text(item, opencode_names[value_index]);
  181. }
  182. static void subbrute_scene_setup_extra_init_var_list(SubBruteState* instance, bool on_extra) {
  183. furi_assert(instance);
  184. char str[6] = {0};
  185. VariableItem* item;
  186. static bool extra = false;
  187. if(on_extra) {
  188. extra = true;
  189. }
  190. VariableItemList* var_list = instance->var_list;
  191. variable_item_list_reset(var_list);
  192. item = variable_item_list_add(var_list, "TimeDelay", 3, setup_extra_td_callback, instance);
  193. snprintf(&str[0], 5, "%d", subbrute_worker_get_timeout(instance->worker));
  194. variable_item_set_current_value_text(item, &str[0]);
  195. switch(subbrute_worker_get_timeout(instance->worker)) {
  196. case MIN_TD:
  197. variable_item_set_current_value_index(item, 0);
  198. break;
  199. case MAX_TD:
  200. variable_item_set_current_value_index(item, 2);
  201. break;
  202. default:
  203. variable_item_set_current_value_index(item, 1);
  204. break;
  205. }
  206. if(extra) {
  207. item = variable_item_list_add(var_list, "Repeats", 3, setup_extra_rep_callback, instance);
  208. snprintf(&str[0], 5, "%d", subbrute_worker_get_repeats(instance->worker));
  209. variable_item_set_current_value_text(item, &str[0]);
  210. switch(subbrute_worker_get_repeats(instance->worker)) {
  211. case MIN_REP:
  212. variable_item_set_current_value_index(item, 0);
  213. break;
  214. case MAX_REP:
  215. variable_item_set_current_value_index(item, 2);
  216. break;
  217. default:
  218. variable_item_set_current_value_index(item, 1);
  219. break;
  220. }
  221. const uint32_t te = subbrute_worker_get_te(instance->worker);
  222. if(te != 0) {
  223. item = variable_item_list_add(var_list, "Te", 3, setup_extra_te_callback, instance);
  224. snprintf(&str[0], 5, "%ld", te);
  225. variable_item_set_current_value_text(item, &str[0]);
  226. switch(te) {
  227. case MIN_TE:
  228. variable_item_set_current_value_index(item, 0);
  229. break;
  230. case MAX_TE:
  231. variable_item_set_current_value_index(item, 2);
  232. break;
  233. default:
  234. variable_item_set_current_value_index(item, 1);
  235. break;
  236. }
  237. }
  238. if(subbrute_worker_get_is_pt2262(instance->worker)) {
  239. uint8_t value_index;
  240. item = variable_item_list_add(
  241. var_list, "PT2262Code", 9, setup_extra_opencode_callback, instance);
  242. value_index = subbrute_worker_get_opencode(instance->worker);
  243. variable_item_set_current_value_index(item, value_index);
  244. variable_item_set_current_value_text(item, opencode_names[value_index]);
  245. }
  246. } else {
  247. item = variable_item_list_add(var_list, "Show Extra", 0, NULL, NULL);
  248. variable_item_set_current_value_index(item, 0);
  249. }
  250. variable_item_list_set_selected_item(var_list, 0);
  251. variable_item_list_set_enter_callback(var_list, setup_extra_enter_callback, instance);
  252. view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewVarList);
  253. }
  254. static void setup_extra_enter_callback(void* context, uint32_t index) {
  255. furi_assert(context);
  256. SubBruteState* instance = (SubBruteState*)context;
  257. if(index == SubBruteVarListIndexRepeatOrOnExtra) {
  258. subbrute_scene_setup_extra_init_var_list(instance, true);
  259. }
  260. }
  261. void subbrute_scene_setup_extra_on_enter(void* context) {
  262. furi_assert(context);
  263. SubBruteState* instance = (SubBruteState*)context;
  264. subbrute_scene_setup_extra_init_var_list(instance, false);
  265. }
  266. void subbrute_scene_setup_extra_on_exit(void* context) {
  267. furi_assert(context);
  268. SubBruteState* instance = (SubBruteState*)context;
  269. variable_item_list_reset(instance->var_list);
  270. }
  271. bool subbrute_scene_setup_extra_on_event(void* context, SceneManagerEvent event) {
  272. UNUSED(context);
  273. UNUSED(event);
  274. return false;
  275. }