Skip to main content

espforge_codegen/component_builders/
uart_device.rs

1use 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}