123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #include "app_timer.h"
- #include "es_adv_timing.h"
- #include "es_adv_timing_resolver.h"
- #include "es_slot.h"
- APP_TIMER_DEF(m_es_adv_interval_timer);
- APP_TIMER_DEF(m_es_slot_timer);
- static nrf_ble_escs_adv_interval_t m_current_adv_interval;
- static es_adv_timing_callback_t m_timing_mgr_callback;
- static es_adv_timing_resolver_result_t m_adv_timing_result;
- static bool m_non_conn_adv_active;
- static void invoke_callback(const es_adv_timing_evt_t * p_evt)
- {
- if (m_timing_mgr_callback != NULL && m_non_conn_adv_active)
- {
- m_timing_mgr_callback(p_evt);
- }
- }
- #if APP_CONFIG_TLM_ADV_INTERLEAVE_RATIO > 1
- static bool frame_to_adv_is_tlm(const es_adv_timing_evt_t * p_evt)
- {
- const es_slot_reg_t * p_reg = es_slot_get_registry();
- return (p_reg->tlm_configured &&
- (p_evt->slot_no == p_reg->tlm_slot || p_evt->evt_id == ES_ADV_TIMING_EVT_ADV_ETLM));
- }
- static bool tlm_should_be_advertised(uint32_t adv_event_cnt)
- {
- return (adv_event_cnt % APP_CONFIG_TLM_ADV_INTERLEAVE_RATIO) == 0;
- }
- #endif
- static void adv_slot_timeout(void * p_context)
- {
- ret_code_t err_code;
- uint32_t active_slot_index = (uint32_t)p_context;
- es_adv_timing_evt_t evt;
- evt.slot_no = m_adv_timing_result.timing_results[active_slot_index].slot_no;
- evt.evt_id = m_adv_timing_result.timing_results[active_slot_index].is_etlm
- ? ES_ADV_TIMING_EVT_ADV_ETLM
- : ES_ADV_TIMING_EVT_ADV_SLOT;
-
-
-
- if (m_non_conn_adv_active && \
- m_adv_timing_result.len_timing_results > 1 && \
- active_slot_index < (uint32_t)(m_adv_timing_result.len_timing_results - 1))
- {
- err_code = app_timer_start( m_es_slot_timer,
- APP_TIMER_TICKS(m_adv_timing_result.timing_results[active_slot_index].delay_ms),
- (void*)(active_slot_index + 1));
- APP_ERROR_CHECK(err_code);
- }
- #if APP_CONFIG_TLM_ADV_INTERLEAVE_RATIO > 1
- static uint32_t adv_event_cnt = 0;
- if (active_slot_index == 0)
- {
- adv_event_cnt++;
- }
- if (frame_to_adv_is_tlm(&evt) && !tlm_should_be_advertised(adv_event_cnt))
- {
- return;
- }
- #endif
- invoke_callback(&evt);
- }
- static void adv_interval_timeout(void * p_context)
- {
- if (es_slot_get_registry()->num_configured_slots > 0)
- {
-
-
- adv_slot_timeout(NULL);
- }
- if (m_non_conn_adv_active)
- {
- uint32_t err_code = app_timer_start(m_es_adv_interval_timer,
- APP_TIMER_TICKS(m_current_adv_interval),
- NULL);
- APP_ERROR_CHECK(err_code);
- }
- }
- void es_adv_timing_timers_init(void)
- {
- ret_code_t err_code;
- err_code = app_timer_create(&m_es_adv_interval_timer,
- APP_TIMER_MODE_SINGLE_SHOT,
- adv_interval_timeout);
- APP_ERROR_CHECK(err_code);
- err_code = app_timer_create(&m_es_slot_timer,
- APP_TIMER_MODE_SINGLE_SHOT,
- adv_slot_timeout);
- APP_ERROR_CHECK(err_code);
- }
- static void adv_timing_set(void)
- {
- ret_code_t err_code;
- const es_slot_reg_t * p_reg = es_slot_get_registry();
- es_adv_timing_resolver_input_t resolver_input = {
- .adv_interval = m_current_adv_interval,
- .p_result = &m_adv_timing_result,
- .num_slots_configured = p_reg->num_configured_slots,
- .p_slots_configured = p_reg->slots_configured,
- .num_eid_slots_configured = p_reg->num_configured_eid_slots,
- .p_eid_slots_configured = p_reg->eid_slots_configured,
- .tlm_configured = p_reg->tlm_configured,
- .tlm_slot = p_reg->tlm_slot};
- err_code = es_adv_timing_resolve(&resolver_input);
- APP_ERROR_CHECK(err_code);
- }
- void es_adv_timing_start(uint16_t adv_interval)
- {
- ret_code_t err_code;
- const es_slot_reg_t * p_reg = es_slot_get_registry();
- m_non_conn_adv_active = true;
- if (p_reg->num_configured_slots > 0)
- {
- m_current_adv_interval = adv_interval;
- err_code = app_timer_start(m_es_adv_interval_timer,
- APP_TIMER_TICKS(m_current_adv_interval),
- NULL);
- APP_ERROR_CHECK(err_code);
- adv_timing_set();
- }
- }
- void es_adv_timing_stop(void)
- {
- m_non_conn_adv_active = false;
- }
- void es_adv_timing_init(es_adv_timing_callback_t p_handler)
- {
- m_non_conn_adv_active = false;
- m_timing_mgr_callback = p_handler;
- memset(&m_adv_timing_result, 0, sizeof(m_adv_timing_result));
- }
|