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