subbrute_scene_setup_extra.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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[] = {"0001", "0010", "0100", "1000"};
  171. const uint8_t opencode_values[COUNT_OF(opencode_names)] = {0, 1, 2, 3};
  172. static void setup_extra_opencode_callback(VariableItem* item) {
  173. furi_assert(item);
  174. SubBruteState* instance = variable_item_get_context(item);
  175. furi_assert(instance);
  176. const uint8_t value_index = variable_item_get_current_value_index(item);
  177. variable_item_set_current_value_text(item, opencode_names[value_index]);
  178. subbrute_worker_set_opencode(instance->worker, opencode_values[value_index]);
  179. }
  180. static void subbrute_scene_setup_extra_init_var_list(SubBruteState* instance, bool on_extra) {
  181. furi_assert(instance);
  182. char str[6] = {0};
  183. VariableItem* item;
  184. static bool extra = false;
  185. if(on_extra) {
  186. extra = true;
  187. }
  188. VariableItemList* var_list = instance->var_list;
  189. variable_item_list_reset(var_list);
  190. item = variable_item_list_add(var_list, "TimeDelay", 3, setup_extra_td_callback, instance);
  191. snprintf(&str[0], 5, "%d", subbrute_worker_get_timeout(instance->worker));
  192. variable_item_set_current_value_text(item, &str[0]);
  193. switch(subbrute_worker_get_timeout(instance->worker)) {
  194. case MIN_TD:
  195. variable_item_set_current_value_index(item, 0);
  196. break;
  197. case MAX_TD:
  198. variable_item_set_current_value_index(item, 2);
  199. break;
  200. default:
  201. variable_item_set_current_value_index(item, 1);
  202. break;
  203. }
  204. if(extra) {
  205. item = variable_item_list_add(var_list, "Repeats", 3, setup_extra_rep_callback, instance);
  206. snprintf(&str[0], 5, "%d", subbrute_worker_get_repeats(instance->worker));
  207. variable_item_set_current_value_text(item, &str[0]);
  208. switch(subbrute_worker_get_repeats(instance->worker)) {
  209. case MIN_REP:
  210. variable_item_set_current_value_index(item, 0);
  211. break;
  212. case MAX_REP:
  213. variable_item_set_current_value_index(item, 2);
  214. break;
  215. default:
  216. variable_item_set_current_value_index(item, 1);
  217. break;
  218. }
  219. const uint32_t te = subbrute_worker_get_te(instance->worker);
  220. if(te != 0) {
  221. item = variable_item_list_add(var_list, "Te", 3, setup_extra_te_callback, instance);
  222. snprintf(&str[0], 5, "%ld", te);
  223. variable_item_set_current_value_text(item, &str[0]);
  224. switch(te) {
  225. case MIN_TE:
  226. variable_item_set_current_value_index(item, 0);
  227. break;
  228. case MAX_TE:
  229. variable_item_set_current_value_index(item, 2);
  230. break;
  231. default:
  232. variable_item_set_current_value_index(item, 1);
  233. break;
  234. }
  235. }
  236. if(subbrute_worker_get_is_pt2262(instance->worker)) {
  237. item = variable_item_list_add(
  238. var_list, "PT2262Code", 4, setup_extra_opencode_callback, instance);
  239. variable_item_set_current_value_index(
  240. item, subbrute_worker_get_opencode(instance->worker));
  241. variable_item_set_current_value_text(
  242. item, opencode_names[subbrute_worker_get_opencode(instance->worker)]);
  243. }
  244. } else {
  245. item = variable_item_list_add(var_list, "Show Extra", 0, NULL, NULL);
  246. variable_item_set_current_value_index(item, 0);
  247. }
  248. variable_item_list_set_enter_callback(var_list, setup_extra_enter_callback, instance);
  249. view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewVarList);
  250. }
  251. static void setup_extra_enter_callback(void* context, uint32_t index) {
  252. furi_assert(context);
  253. SubBruteState* instance = (SubBruteState*)context;
  254. if(index == SubBruteVarListIndexRepeatOrOnExtra) {
  255. subbrute_scene_setup_extra_init_var_list(instance, true);
  256. }
  257. }
  258. void subbrute_scene_setup_extra_on_enter(void* context) {
  259. furi_assert(context);
  260. SubBruteState* instance = (SubBruteState*)context;
  261. subbrute_scene_setup_extra_init_var_list(instance, false);
  262. }
  263. void subbrute_scene_setup_extra_on_exit(void* context) {
  264. furi_assert(context);
  265. SubBruteState* instance = (SubBruteState*)context;
  266. variable_item_list_reset(instance->var_list);
  267. }
  268. bool subbrute_scene_setup_extra_on_event(void* context, SceneManagerEvent event) {
  269. UNUSED(context);
  270. UNUSED(event);
  271. return false;
  272. }