Skip to content
Snippets Groups Projects
Select Git revision
  • 1129de5ac09ac5b41a952021cbc7a9752c8c253f
  • wip-bootstrap default
  • dualcore
  • ch3/leds
  • ch3/time
  • master
6 results

main.c

Blame
  • captouch.rs 12.01 KiB
    use ad7147::{
        device::DecimationFactor,
        stage::{CapInput, CdcInput, InputConnection},
        Ad7147, DeviceConfiguration, Initialized, StageConfiguration,
    };
    use embassy_futures::select::select;
    use embassy_time::{Delay, Duration, Timer};
    use embedded_hal_async::digital::Wait;
    use esp_println::println;
    use hal::{
        gpio::{Gpio15, Gpio16, Unknown},
        i2c::I2C,
        peripherals::I2C0,
    };
    use shared_bus::{I2cProxy, XtensaMutex};
    
    pub struct CapTouchHandler;
    
    fn init_captouch(
        i2c_bot: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>,
        i2c_top: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>,
    ) -> Result<
        (
            Ad7147<I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>, Initialized, 12>,
            Ad7147<I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>, Initialized, 12>,
        ),
        hal::i2c::Error,
    > {
        let ad7147_bot = Ad7147::new(i2c_bot, 0b00101101);
        let config_bot = DeviceConfiguration::builder()
            .decimation(DecimationFactor::Factor64)
            .stages([
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN0,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN1,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN2,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN3,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN4,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN5,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN6,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN7,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN8,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(2)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN9,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(30)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN10,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(26)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN11,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
            ])
            .build();
        let ad7147_top = Ad7147::new(i2c_top, 0b00101100);
        let config_top = DeviceConfiguration::builder()
            .decimation(DecimationFactor::Factor64)
            .stages([
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(30)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN0,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(30)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN1,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(28)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN2,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(28)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN3,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(28)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN4,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(28)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN5,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(28)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN6,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(10)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN7,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(20)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN8,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(20)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN9,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(8)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN10,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
                StageConfiguration::builder()
                    .calibration_enabled(true)
                    .conversion_complete_interrupt_enabled(true)
                    .pos_afe_offset(20)
                    .add_input_connection(InputConnection {
                        cin: CapInput::CIN11,
                        cdc: CdcInput::Positive,
                    })
                    .build(),
            ])
            .build();
        Ok((
            ad7147_bot.init(config_bot, &mut Delay)?,
            ad7147_top.init(config_top, &mut Delay)?,
        ))
    }
    
    #[embassy_executor::task]
    pub async fn captouch_controller(
        i2c_bot: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>,
        i2c_top: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>,
        cap_bot_int: Gpio16<Unknown>,
        cap_top_int: Gpio15<Unknown>,
    ) -> ! {
        let mut cap_bot_int = cap_bot_int.into_pull_up_input();
        let mut cap_top_int = cap_top_int.into_pull_up_input();
        let (mut ad7147_bot, mut ad7147_top) = init_captouch(i2c_bot, i2c_top).unwrap();
    
        let device_id = ad7147_bot.read_device_id().unwrap();
        println!("captouch bot device id: {:016b}", device_id);
        let device_id = ad7147_top.read_device_id().unwrap();
        println!("captouch top device id: {:016b}", device_id);
        println!("initialized captouch");
        loop {
            //println!("int pin: {}", cap_b_int.is_input_high());
            select(cap_bot_int.wait_for_low(), cap_top_int.wait_for_low());
            let _ = ad7147_bot.read_interrupt_registers().unwrap();
            let _ = ad7147_top.read_interrupt_registers().unwrap();
            //println!("ints: {:?}", ints);
            let measurement = ad7147_bot.read_all_stages().unwrap();
            println!(
                "{} {} {} {} {} {} {} {} {} {} {} {}",
                measurement[0],
                measurement[1],
                measurement[2],
                measurement[3],
                measurement[4],
                measurement[5],
                measurement[6],
                measurement[7],
                measurement[8],
                measurement[9],
                measurement[10],
                measurement[11]
            );
            let measurement = ad7147_top.read_all_stages().unwrap();
            println!(
                "{} {} {} {} {} {} {} {} {} {} {} {}",
                measurement[0],
                measurement[1],
                measurement[2],
                measurement[3],
                measurement[4],
                measurement[5],
                measurement[6],
                measurement[7],
                measurement[8],
                measurement[9],
                measurement[10],
                measurement[11]
            );
            Timer::after(Duration::from_millis(1000)).await;
        }
    }