btstack_run_loop: extend run loop api

This commit is contained in:
Matthias Ringwald 2021-03-16 10:13:47 +01:00
parent 3c7763bd89
commit 9fb44c6d99
2 changed files with 57 additions and 6 deletions

View File

@ -211,7 +211,13 @@ int btstack_run_loop_remove_data_source(btstack_data_source_t * data_source){
return the_run_loop->remove_data_source(data_source);
}
void btstack_run_loop_set_timer(btstack_timer_source_t * timer, uint32_t timeout_in_ms){
void btstack_run_loop_poll_data_sources_from_irq(void){
btstack_assert(the_run_loop != NULL);
btstack_assert(the_run_loop->poll_data_sources_from_irq != NULL);
the_run_loop->poll_data_sources_from_irq();
}
void btstack_run_loop_set_timer(btstack_timer_source_t *timer, uint32_t timeout_in_ms){
btstack_assert(the_run_loop != NULL);
the_run_loop->set_timer(timer, timeout_in_ms);
}
@ -269,6 +275,18 @@ void btstack_run_loop_execute(void){
the_run_loop->execute();
}
void btstack_run_loop_trigger_exit(void){
btstack_assert(the_run_loop != NULL);
btstack_assert(the_run_loop->trigger_exit != NULL);
the_run_loop->trigger_exit();
}
void btstack_run_loop_execute_on_main_thread(btstack_context_callback_registration_t * callback_registration){
btstack_assert(the_run_loop != NULL);
btstack_assert(the_run_loop->execute_on_main_thread != NULL);
the_run_loop->execute_on_main_thread(callback_registration);
}
// init must be called before any other run_loop call
void btstack_run_loop_init(const btstack_run_loop_t * run_loop){
btstack_assert(the_run_loop == NULL);

View File

@ -36,17 +36,23 @@
*/
/**
* @title Run Loop
* BTstack Run Loop Abstraction
*
* Provides generic functionality required by the Bluetooth stack and example applications:
* - asynchronous IO for various devices Serial, USB, network sockets, console
* - system time in milliseconds
* - single shot timers
* - integration for threaded environments
*/
#ifndef btstack_run_loop_H
#define btstack_run_loop_H
#ifndef BTSTACK_RUN_LOOP_H
#define BTSTACK_RUN_LOOP_H
#include "btstack_config.h"
#include "btstack_bool.h"
#include "btstack_linked_list.h"
#include "btstack_defines.h"
#include <stdint.h>
@ -104,6 +110,9 @@ typedef struct btstack_run_loop {
void (*execute)(void);
void (*dump_timer)(void);
uint32_t (*get_time_ms)(void);
void (*poll_data_sources_from_irq)(void);
void (*execute_on_main_thread)(btstack_context_callback_registration_t * callback_registration);
void (*trigger_exit)(void);
} btstack_run_loop_t;
@ -294,11 +303,36 @@ void btstack_run_loop_add_data_source(btstack_data_source_t * data_source);
*/
int btstack_run_loop_remove_data_source(btstack_data_source_t * data_source);
/**
* @brief Poll data sources - called only from IRQ context
* @note Can be used to trigger processing of received peripheral data on the main thread
* by registering a data source with DATA_SOURCE_CALLBACK_POLL and calling this
* function from the IRQ handler.
*/
void btstack_run_loop_poll_data_sources_from_irq(void);
/**
* @brief Execute configured run loop. This function does not return.
*/
void btstack_run_loop_execute(void);
/**
* @brief Registers callback with run loop and mark main thread as ready
* @note Callback can only be registered once
* @param callback_registration
*/
void btstack_run_loop_execute_on_main_thread(btstack_context_callback_registration_t * callback_registration);
/**
* @brief Trigger exit of active run loop (started via btstack_run_loop_execute) if possible
* @note This is only supported if there's a loop in the btstack_run_loop_execute function.
* It is not supported if timers and data sources are only mapped to RTOS equivalents, e.g.
* in the Qt or Core Foundation implementations.
*/
void btstack_run_loop_trigger_exit(void);
/**
* @brief De-Init Run Loop
*/
@ -307,9 +341,8 @@ void btstack_run_loop_deinit(void);
/* API_END */
#if defined __cplusplus
}
#endif
#endif // btstack_run_loop_H
#endif // BTSTACK_RUN_LOOP_H