wifi_marauder_script_worker.c 2.4 KB

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