| 230 | // ============================================================================= |
| 231 | |
| 232 | int 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 |
nothing calls this directly
no test coverage detected