use core::ops; use std::collections::{BTreeMap, BTreeSet}; use rtic_syntax::{ analyze::{self, Priority}, ast::{App, ExternInterrupt}, P, }; use syn::Ident; /// Extend the upstream `Analysis` struct with our field pub struct Analysis { parent: P, pub interrupts: BTreeMap, } impl ops::Deref for Analysis { type Target = analyze::Analysis; fn deref(&self) -> &Self::Target { &self.parent } } // Assign an interrupt to each priority level pub fn app(analysis: P, app: &App) -> P { // the set of priorities (each priority only once) let priorities = app .software_tasks .values() .map(|task| task.args.priority) .collect::>(); // map from priorities to interrupts (holding name and attributes) let interrupts: BTreeMap = priorities .iter() .cloned() .rev() .zip(&app.args.extern_interrupts) .map(|(p, (id, ext))| (p, (id.clone(), ext.clone()))) .collect(); P::new(Analysis { parent: analysis, interrupts, }) }