21template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
23 uint32_t spin_threshold_us_,
24 unsigned long (*
const current_time_us)())
29 PERIOD_US(period_us_),
30 SPIN_US(spin_threshold_us_),
32 CURRENT_TIME_US(current_time_us)
43template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
46 uint32_t delta = CURRENT_TIME_US() - last_fire_us;
47 if (delta >= PERIOD_US)
50 if (delta >= 2 * PERIOD_US)
52 last_fire_us = CURRENT_TIME_US();
54 last_fire_us += PERIOD_US;
59 if (delta >= PERIOD_US - SPIN_US)
62 while ((uint32_t)(CURRENT_TIME_US() - last_fire_us) < PERIOD_US)
66 last_fire_us += PERIOD_US;
78template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
81 if (current_time_us ==
nullptr)
84 last_fire_us = current_time_us();
85 for (uint8_t mcp_index = 0; mcp_index < NUM_MCP2515; ++mcp_index)
87 for (uint8_t task_index = 0; task_index < NUM_TASKS; ++task_index)
89 task_counters[mcp_index][task_index] = task_ticks[mcp_index][task_index];
104template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
107 uint8_t mcp_idx =
static_cast<uint8_t
>(mcp_index);
108 if (mcp_idx >= NUM_MCP2515 || task ==
nullptr)
111 if (task_cnt[mcp_idx] >= NUM_TASKS)
114 tasks[mcp_idx][task_cnt[mcp_idx]] = task;
115 task_ticks[mcp_idx][task_cnt[mcp_idx]] = tick_interval;
116 task_counters[mcp_idx][task_cnt[mcp_idx]] = 1;
130template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
133 uint8_t mcp_idx =
static_cast<uint8_t
>(mcp_index);
134 if (mcp_idx >= NUM_MCP2515 || task ==
nullptr)
137 for (uint8_t i = 0; i < task_cnt[mcp_idx]; ++i)
139 if (tasks[mcp_idx][i] == task)
142 for (uint8_t j = i; j < task_cnt[mcp_idx] - 1; ++j)
144 tasks[mcp_idx][j] = tasks[mcp_idx][j + 1];
145 task_ticks[mcp_idx][j] = task_ticks[mcp_idx][j + 1];
146 task_counters[mcp_idx][j] = task_counters[mcp_idx][j + 1];
150 tasks[mcp_idx][task_cnt[mcp_idx] - 1] =
nullptr;
151 task_ticks[mcp_idx][task_cnt[mcp_idx] - 1] = 0;
152 task_counters[mcp_idx][task_cnt[mcp_idx] - 1] = 0;
167template <u
int8_t NUM_TASKS, u
int8_t NUM_MCP2515>
170 for (uint8_t task_index = 0; task_index < NUM_TASKS; ++task_index)
172 for (uint8_t mcp_index = 0; mcp_index < NUM_MCP2515; ++mcp_index)
174 if (task_counters[mcp_index][task_index] == 0)
177 if (task_counters[mcp_index][task_index] == 1)
179 if (tasks[mcp_index][task_index] ==
nullptr)
183 (tasks[mcp_index][task_index])();
186 task_counters[mcp_index][task_index] = task_ticks[mcp_index][task_index];
190 --task_counters[mcp_index][task_index];
Enumeration definitions for the VCU.
McpIndex
MCP2515 instance indices.
Declaration of the Scheduler class template, for scheduling tasks on multiple MCP2515 instances.
bool removeTask(const McpIndex mcp_index, const TaskFn task)
Remove a task from the scheduler for a specific MCP2515 instance.
void synchronize(unsigned long(*const current_time_us)())
Synchonize the scheduler to the current time, resetting all task counters, used when starting multipl...
bool addTask(const McpIndex mcp_index, const TaskFn task, const uint8_t tick_interval)
Add a task to the scheduler for a specific MCP2515 index.
void update()
Update the scheduler, checking if tasks need to be run based on the current time.
void runTasks()
Helper function to run scheduled tasks.