xref: /btstack/src/btstack_run_loop_base.h (revision 98a6a0788e826bf360e283f43f5ffc40815eda25)
1*98a6a078SMatthias Ringwald /*
2*98a6a078SMatthias Ringwald  * Copyright (C) 2019 BlueKitchen GmbH
3*98a6a078SMatthias Ringwald  *
4*98a6a078SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5*98a6a078SMatthias Ringwald  * modification, are permitted provided that the following conditions
6*98a6a078SMatthias Ringwald  * are met:
7*98a6a078SMatthias Ringwald  *
8*98a6a078SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9*98a6a078SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10*98a6a078SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*98a6a078SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*98a6a078SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13*98a6a078SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*98a6a078SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15*98a6a078SMatthias Ringwald  *    from this software without specific prior written permission.
16*98a6a078SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*98a6a078SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18*98a6a078SMatthias Ringwald  *    monetary gain.
19*98a6a078SMatthias Ringwald  *
20*98a6a078SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*98a6a078SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*98a6a078SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*98a6a078SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24*98a6a078SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*98a6a078SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*98a6a078SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*98a6a078SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*98a6a078SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*98a6a078SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*98a6a078SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*98a6a078SMatthias Ringwald  * SUCH DAMAGE.
32*98a6a078SMatthias Ringwald  *
33*98a6a078SMatthias Ringwald  * Please inquire about commercial licensing options at
34*98a6a078SMatthias Ringwald  * [email protected]
35*98a6a078SMatthias Ringwald  *
36*98a6a078SMatthias Ringwald  */
37*98a6a078SMatthias Ringwald 
38*98a6a078SMatthias Ringwald /*
39*98a6a078SMatthias Ringwald  *  btstack_run_loop_base.h
40*98a6a078SMatthias Ringwald  *
41*98a6a078SMatthias Ringwald  *  Portable implementation of timer and data source managment as base for platform specific implementations
42*98a6a078SMatthias Ringwald  */
43*98a6a078SMatthias Ringwald 
44*98a6a078SMatthias Ringwald #ifndef BTSTACK_RUN_LOOP_BASE_H
45*98a6a078SMatthias Ringwald #define BTSTACK_RUN_LOOP_BASE_H
46*98a6a078SMatthias Ringwald 
47*98a6a078SMatthias Ringwald #include "btstack_run_loop.h"
48*98a6a078SMatthias Ringwald 
49*98a6a078SMatthias Ringwald #include "btstack_linked_list.h"
50*98a6a078SMatthias Ringwald 
51*98a6a078SMatthias Ringwald #include <stdint.h>
52*98a6a078SMatthias Ringwald 
53*98a6a078SMatthias Ringwald #if defined __cplusplus
54*98a6a078SMatthias Ringwald extern "C" {
55*98a6a078SMatthias Ringwald #endif
56*98a6a078SMatthias Ringwald 
57*98a6a078SMatthias Ringwald // private data (access only by run loop implementations)
58*98a6a078SMatthias Ringwald extern btstack_linked_list_t btstack_run_loop_base_timers;
59*98a6a078SMatthias Ringwald extern btstack_linked_list_t btstack_run_loop_base_data_sources;
60*98a6a078SMatthias Ringwald 
61*98a6a078SMatthias Ringwald /**
62*98a6a078SMatthias Ringwald  * @brief Init
63*98a6a078SMatthias Ringwald  */
64*98a6a078SMatthias Ringwald void btstack_run_loop_base_init(void);
65*98a6a078SMatthias Ringwald 
66*98a6a078SMatthias Ringwald /**
67*98a6a078SMatthias Ringwald  * @brief Add timer source.
68*98a6a078SMatthias Ringwald  */
69*98a6a078SMatthias Ringwald void btstack_run_loop_base_add_timer(btstack_timer_source_t * timer);
70*98a6a078SMatthias Ringwald 
71*98a6a078SMatthias Ringwald /**
72*98a6a078SMatthias Ringwald  * @brief Remove timer source.
73*98a6a078SMatthias Ringwald  */
74*98a6a078SMatthias Ringwald int  btstack_run_loop_base_remove_timer(btstack_timer_source_t * timer);
75*98a6a078SMatthias Ringwald 
76*98a6a078SMatthias Ringwald /**
77*98a6a078SMatthias Ringwald  * @brief Process timers: remove expired timers from list and call their process function
78*98a6a078SMatthias Ringwald  * @param now
79*98a6a078SMatthias Ringwald  */
80*98a6a078SMatthias Ringwald void  btstack_run_loop_base_process_timers(uint32_t now);
81*98a6a078SMatthias Ringwald 
82*98a6a078SMatthias Ringwald /**
83*98a6a078SMatthias Ringwald  * @brief Get time until first timer fires
84*98a6a078SMatthias Ringwald  * @returns -1 if no timers, time until next timeout otherwise
85*98a6a078SMatthias Ringwald  */
86*98a6a078SMatthias Ringwald int32_t btstack_run_loop_base_get_time_until_timeout(uint32_t now);
87*98a6a078SMatthias Ringwald 
88*98a6a078SMatthias Ringwald /**
89*98a6a078SMatthias Ringwald  * @brief Add data source to run loop
90*98a6a078SMatthias Ringwald  * @param data_source to add
91*98a6a078SMatthias Ringwald  */
92*98a6a078SMatthias Ringwald void btstack_run_loop_base_add_data_source(btstack_data_source_t * data_source);
93*98a6a078SMatthias Ringwald 
94*98a6a078SMatthias Ringwald /**
95*98a6a078SMatthias Ringwald  * @brief Remove data source from run loop
96*98a6a078SMatthias Ringwald  * @param data_source to remove
97*98a6a078SMatthias Ringwald  */
98*98a6a078SMatthias Ringwald int btstack_run_loop_base_remove_data_source(btstack_data_source_t * data_source);
99*98a6a078SMatthias Ringwald 
100*98a6a078SMatthias Ringwald /**
101*98a6a078SMatthias Ringwald  * @brief Enable callbacks for a data source
102*98a6a078SMatthias Ringwald  * @param data_source to remove
103*98a6a078SMatthias Ringwald  * @param callback types to enable
104*98a6a078SMatthias Ringwald  */
105*98a6a078SMatthias Ringwald void btstack_run_loop_base_enable_data_source_callbacks(btstack_data_source_t * data_source, uint16_t callbacks);
106*98a6a078SMatthias Ringwald 
107*98a6a078SMatthias Ringwald /**
108*98a6a078SMatthias Ringwald  * @brief Enable callbacks for a data source
109*98a6a078SMatthias Ringwald  * @param data_source to remove
110*98a6a078SMatthias Ringwald  * @param callback types to disable
111*98a6a078SMatthias Ringwald  */
112*98a6a078SMatthias Ringwald void btstack_run_loop_base_disable_data_source_callbacks(btstack_data_source_t * data_source, uint16_t callbacks);
113*98a6a078SMatthias Ringwald 
114*98a6a078SMatthias Ringwald #if defined __cplusplus
115*98a6a078SMatthias Ringwald }
116*98a6a078SMatthias Ringwald #endif
117*98a6a078SMatthias Ringwald 
118*98a6a078SMatthias Ringwald #endif // BTSTACK_RUN_LOOP_BASE_H
119