subbrute_scene_setup_extra.c 11 KB

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