unleashed-firmware/applications/services/expansion/expansion_worker.h
Georgii Surkov 6836a7b7c5
[FL-3764] Expansion module service improvements (#3429)
* Separate expansion control and worker threads
* Add edge case checks
* Reduce expansion control thread stack size, add comments
* Fix crash when disabling expansion modules
* Show a different RPC icon for expansion modules
* Restore expansion interrupt on changing logging settings
* Improve responsiveness in heavy games at the expense of dropped frames
* Improve furi_hal_serial API
* Fix a typo
* Remove too optimistic furi_check, replace with condition
* Fix premature RX interrupt during serial configuration
* Disable expansion interrupt if the handle was acquired
* Do not use a timer callback

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
2024-02-12 09:16:34 +07:00

78 lines
2.4 KiB
C

/**
* @file expansion_worker.h
* @brief Expansion module handling thread wrapper.
*
* The worker is started each time an expansion module is detected
* and handles all of the communication protocols. Likewise, it is stopped
* upon module disconnection or communication error.
*
* @warning This file is a private implementation detail. Please do not attempt to use it in applications.
*/
#pragma once
#include <furi_hal_serial_types.h>
/**
* @brief Expansion worker opaque type declaration.
*/
typedef struct ExpansionWorker ExpansionWorker;
/**
* @brief Worker callback type.
*
* @see expansion_worker_set_callback()
*
* @param[in,out] context pointer to a user-defined object.
*/
typedef void (*ExpansionWorkerCallback)(void* context);
/**
* @brief Create an expansion worker instance.
*
* @param[in] serial_id numerical identifier of the serial to be used by the worker.
* @returns pointer to the created instance.
*/
ExpansionWorker* expansion_worker_alloc(FuriHalSerialId serial_id);
/**
* @brief Delete an expansion worker instance.
*
* @param[in,out] instance pointer to the instance to be deleted.
*/
void expansion_worker_free(ExpansionWorker* instance);
/**
* @brief Set the module disconnect callback.
*
* The callback will be triggered upon worker stop EXCEPT
* when it was stopped via an expansion_worker_stop() call.
*
* In other words, the callback will ONLY be triggered if the worker was
* stopped due to the user disconnecting/resetting/powering down the module,
* or due to some communication error.
*
* @param[in,out] instance pointer to the worker instance to be modified.
* @param[in] callback pointer to the callback function to be called under the above conditions.
* @param[in] context pointer to a user-defined object, will be passed as a parameter to the callback.
*/
void expansion_worker_set_callback(
ExpansionWorker* instance,
ExpansionWorkerCallback callback,
void* context);
/**
* @brief Start the expansion module worker.
*
* @param[in,out] instance pointer to the worker instance to be started.
*/
void expansion_worker_start(ExpansionWorker* instance);
/**
* @brief Stop the expansion module worker.
*
* If the worker was stopped via this call (and not because of module disconnect/
* protocol error), the callback will not be triggered.
*
* @param[in,out] instance pointer to the worker instance to be stopped.
*/
void expansion_worker_stop(ExpansionWorker* instance);