blob: 0ce590b03c5fb6c51f29ff827872324ce8a81314 [file] [log] [blame]
/**
*******************************************************************************
*
* @file bridge_timer.c
*
* @brief Bridge timer
*
* Copyright (C) Atmosic 2022
*
*******************************************************************************
*/
#include "arch.h"
#include "atvrc_porting.h"
#include "sw_timer.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-declaration"
#include "vendor/common/blt_soft_timer.h"
#pragma GCC diagnostic pop
#define NUM_BLT_TIMER 3
#undef TIMER_DEBUG
#ifdef TIMER_DEBUG
#define TIMER_TRACE DEBUG_TRACE
#else
#define TIMER_TRACE(fmt, ...) DEBUG_TRACE_COND(0, fmt, ##__VA_ARGS__)
#endif
typedef struct blt_sw_timer_t {
sw_timer_id_t tid;
blt_timer_callback_t func;
} blt_sw_timer_t;
static blt_sw_timer_t blt_sw_timer[NUM_BLT_TIMER];
static void blt_sw_timer_timeout(sw_timer_id_t idx, void const *ctx)
{
TIMER_TRACE("%s idx: %d", __func__, idx);
blt_timer_callback_t func = (blt_timer_callback_t)(uintptr_t)ctx;
if (func) {
func();
}
}
static uint8_t get_available_blt_sw_timer(void)
{
for (uint8_t i = 0; i < NUM_BLT_TIMER; i++) {
if (!blt_sw_timer[i].tid) {
return i;
}
}
DEBUG_TRACE("No available blt_sw_timer, increase NUM_BLT_TIMER");
ASSERT_ERR(0);
return 0;
}
int blt_soft_timer_add(blt_timer_callback_t func, u32 interval_us)
{
uint8_t idx = get_available_blt_sw_timer();
blt_sw_timer[idx].tid = sw_timer_alloc(blt_sw_timer_timeout, func);
TIMER_TRACE("%s id: %d tid: %d inv: %lu func: %p", __func__, idx,
blt_sw_timer[idx].tid, interval_us, func);
blt_sw_timer[idx].func = func;
#define USEC_TO_CSEC 10000
sw_timer_set(blt_sw_timer[idx].tid, interval_us / USEC_TO_CSEC);
return idx;
}
int blt_soft_timer_delete(blt_timer_callback_t func)
{
uint8_t cnt = 0;
for (uint8_t i = 0; i < NUM_BLT_TIMER; i++) {
if (blt_sw_timer[i].func == func) {
TIMER_TRACE("%s id: %d tid: %d cb: %p", __func__, i,
blt_sw_timer[i].tid, func);
sw_timer_clear(blt_sw_timer[i].tid);
sw_timer_free(blt_sw_timer[i].tid);
blt_sw_timer[i].tid = 0;
blt_sw_timer[i].func = NULL;
cnt++;
}
}
TIMER_TRACE("found and deleted %d timer", cnt);
return cnt;
}