wifi_marauder_script_worker.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "../wifi_marauder_app_i.h"
  2. #include "wifi_marauder_script_worker.h"
  3. WifiMarauderScriptWorker* wifi_marauder_script_worker_alloc() {
  4. WifiMarauderScriptWorker* worker = malloc(sizeof(WifiMarauderScriptWorker));
  5. if (worker == NULL) {
  6. return NULL;
  7. }
  8. worker->callback_start = NULL;
  9. worker->callback_stage = NULL;
  10. worker->worker_thread = NULL;
  11. worker->is_running = false;
  12. return worker;
  13. }
  14. int32_t _wifi_marauder_script_worker_task(void* worker) {
  15. WifiMarauderScriptWorker* script_worker = worker;
  16. WifiMarauderScript *script = script_worker->script;
  17. if (script == NULL) {
  18. return WifiMarauderScriptWorkerStatusInvalidScript;
  19. }
  20. // Setup
  21. script_worker->callback_start(script_worker->context);
  22. if (!script_worker->is_running) {
  23. return WifiMarauderScriptWorkerStatusForceExit;
  24. }
  25. // Stages
  26. for (int i = 0; i < script->repeat; i++) {
  27. WifiMarauderScriptStage *current_stage = script->first_stage;
  28. while (current_stage != NULL && script_worker->is_running) {
  29. script_worker->callback_stage(current_stage, script_worker->context);
  30. current_stage = current_stage->next_stage;
  31. }
  32. if (!script_worker->is_running) {
  33. return WifiMarauderScriptWorkerStatusForceExit;
  34. }
  35. }
  36. script_worker->is_running = false;
  37. return WifiMarauderScriptWorkerStatusSuccess;
  38. }
  39. bool wifi_marauder_script_worker_start(WifiMarauderScriptWorker* instance, WifiMarauderScript* script) {
  40. if (!instance || !script) {
  41. return false;
  42. }
  43. instance->callback_start = wifi_marauder_script_execute_start;
  44. instance->callback_stage = wifi_marauder_script_execute_stage;
  45. instance->script = script;
  46. instance->context = instance;
  47. instance->is_running = true;
  48. instance->worker_thread = furi_thread_alloc_ex("WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
  49. if (!instance->worker_thread) {
  50. return false;
  51. }
  52. furi_thread_start(instance->worker_thread);
  53. return true;
  54. }
  55. void wifi_marauder_script_worker_free(WifiMarauderScriptWorker *worker) {
  56. if (worker != NULL) {
  57. if (worker->worker_thread != NULL) {
  58. worker->is_running = false;
  59. furi_thread_join(worker->worker_thread);
  60. furi_thread_free(worker->worker_thread);
  61. }
  62. free(worker);
  63. }
  64. }