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

Function attach_timer_handler

src/platforms/arm/rp/isr_rp2350.hpp:232–313  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

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