espforge_codegen/component_builders/
uart_device.rs1use anyhow::{Result, anyhow};
2use espforge_configuration::EspforgeConfiguration;
3use proc_macro2::TokenStream;
4use quote::{format_ident, quote};
5
6pub fn generate(
7 name: &str,
8 uart: &str,
9 baud: Option<u32>,
10 model: &EspforgeConfiguration,
11 fields: &mut Vec<TokenStream>,
12 init_logic: &mut Vec<TokenStream>,
13 struct_init: &mut Vec<TokenStream>,
14) -> Result<()> {
15 let field = format_ident!("{}", name);
16 let uart_ref = uart.strip_prefix('$').unwrap_or(uart);
17
18 let esp32 = model
19 .esp32
20 .as_ref()
21 .ok_or_else(|| anyhow!("No ESP32 configuration found"))?;
22
23 let cfg = esp32
24 .uart
25 .get(uart_ref)
26 .ok_or_else(|| anyhow!("UART resource {} not found", uart))?;
27
28 let uart_num = cfg.uart;
29 let tx_pin = cfg.tx;
30 let rx_pin = cfg.rx;
31 let baud_rate = baud.unwrap_or(cfg.baud);
32
33 fields.push(quote! { pub #field: espforge_platform::components::uart::Uart });
34
35 init_logic.push(quote! {
36 let #field = espforge_platform::components::uart::Uart::new(
37 #uart_num,
38 #tx_pin,
39 #rx_pin,
40 #baud_rate
41 );
42 });
43
44 struct_init.push(quote! { #field });
45 Ok(())
46}