| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include "../wifi_marauder_app_i.h"
- #include "wifi_marauder_script_worker.h"
- WifiMarauderScriptWorker* wifi_marauder_script_worker_alloc(WifiMarauderUart* uart) {
- WifiMarauderScriptWorker* worker = malloc(sizeof(WifiMarauderScriptWorker));
- if(worker == NULL) {
- return NULL;
- }
- worker->callback_start = NULL;
- worker->callback_stage = NULL;
- worker->worker_thread = NULL;
- worker->uart = uart;
- worker->is_running = false;
- return worker;
- }
- int32_t _wifi_marauder_script_worker_task(void* worker) {
- WifiMarauderScriptWorker* script_worker = worker;
- WifiMarauderScript* script = script_worker->script;
- if(script == NULL) {
- return WifiMarauderScriptWorkerStatusInvalidScript;
- }
- // Setup
- script_worker->callback_start(script_worker->context);
- if(!script_worker->is_running) {
- return WifiMarauderScriptWorkerStatusForceExit;
- }
- // Stages
- for(int i = 0; i < script->repeat; i++) {
- WifiMarauderScriptStage* current_stage = script->first_stage;
- while(current_stage != NULL && script_worker->is_running) {
- script_worker->callback_stage(current_stage, script_worker->context);
- current_stage = current_stage->next_stage;
- }
- if(!script_worker->is_running) {
- return WifiMarauderScriptWorkerStatusForceExit;
- }
- }
- script_worker->is_running = false;
- return WifiMarauderScriptWorkerStatusSuccess;
- }
- bool wifi_marauder_script_worker_start(
- WifiMarauderScriptWorker* instance,
- WifiMarauderScript* script) {
- if(!instance || !script) {
- return false;
- }
- instance->callback_start = wifi_marauder_script_execute_start;
- instance->callback_stage = wifi_marauder_script_execute_stage;
- instance->script = script;
- instance->context = instance;
- instance->is_running = true;
- instance->worker_thread = furi_thread_alloc_ex(
- "WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
- if(!instance->worker_thread) {
- return false;
- }
- furi_thread_start(instance->worker_thread);
- return true;
- }
- void wifi_marauder_script_worker_free(WifiMarauderScriptWorker* worker) {
- if(worker != NULL) {
- if(worker->worker_thread != NULL) {
- worker->is_running = false;
- furi_thread_join(worker->worker_thread);
- furi_thread_free(worker->worker_thread);
- }
- free(worker);
- }
- }
|