subbrute_scene_setup_extra.c 9.5 KB

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