MCPcopy Create free account
hub / github.com/FastLED/FastLED / attach_timer_handler

Function attach_timer_handler

src/platforms/arm/rp/isr_rp2040.hpp:226–305  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

224// =============================================================================
225
226int attach_timer_handler(const isr_config_t& config, isr_handle_t* out_handle) FL_NOEXCEPT {
227 if (!config.handler) {
228 FL_WARN("attachTimerHandler: handler is null");
229 return -1; // Invalid parameter
230 }
231
232 if (config.frequency_hz == 0) {
233 FL_WARN("attachTimerHandler: frequency_hz is 0");
234 return -2; // Invalid frequency
235 }
236
237 // Check frequency bounds (practical limits for RP2040)
238 if (config.frequency_hz > 1000000) {
239 FL_WARN("attachTimerHandler: frequency " << config.frequency_hz << " Hz exceeds 1 MHz limit");
240 return -2; // Invalid frequency
241 }
242
243 // Allocate a hardware alarm
244 i8 alarm_num = allocate_alarm();
245 if (alarm_num < 0) {
246 FL_WARN("attachTimerHandler: no free hardware alarms (max 4)");
247 return -3; // Out of resources
248 }
249
250 // Allocate handle data
251 auto handle_owner = fl::make_unique<rp2040_isr_handle_data>();
252 auto* handle_data = handle_owner.get();
253 if (!handle_data) {
254 free_alarm(alarm_num);
255 FL_WARN("attachTimerHandler: failed to allocate handle data");
256 return -5; // Out of memory
257 }
258
259 handle_data->is_timer = true;
260 handle_data->alarm_num = alarm_num;
261 handle_data->frequency_hz = config.frequency_hz;
262 handle_data->user_handler = config.handler;
263 handle_data->user_data = config.user_data;
264 handle_data->core_num = get_core_num();
265
266 // Store handle for ISR access
267 alarm_handles[alarm_num] = handle_data;
268
269 // Calculate interval in microseconds
270 i64 interval_us = 1000000 / config.frequency_hz;
271
272 // Add repeating timer using Pico SDK
273 handle_data->alarm_id = add_alarm_in_us(interval_us, alarm_callback_wrapper,
274 handle_data, true);
275
276 if (handle_data->alarm_id == 0 || handle_data->alarm_id == -1) {
277 // Alarm creation failed
278 free_alarm(alarm_num);
279 alarm_handles[alarm_num] = nullptr;
280 FL_WARN("attachTimerHandler: add_alarm_in_us failed");
281 return -4; // Internal error
282 }
283

Callers

nothing calls this directly

Calls 5

allocate_alarmFunction · 0.70
free_alarmFunction · 0.70
map_priority_to_nvicFunction · 0.70
getMethod · 0.45
releaseMethod · 0.45

Tested by

no test coverage detected