Select Git revision
formatfloat.h
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;
}
}