dps310 0.1.5

A platform agnostic driver to interface with the DPS310 barometric pressure & temp sensor through I2C
Documentation
// Sample code for stm32f3discovery (STM32F303VC) board

// Add following to Cargo.toml
// m = "0.1.1"
// f3 = "0.6.1"
// cortex-m = "0.6.3"
// cortex-m-rt = "0.6.3"
// panic-itm = "0.4.0"
// panic-halt = "0.2.0"
// dps310 = "0.1.2"

#![no_main]
#![no_std]

use core::convert::TryInto;

pub use cortex_m::{asm::bkpt, iprint, iprintln, peripheral::ITM};
pub use cortex_m_rt::entry;
use panic_halt as _;
pub use stm32f3xx_hal::{delay::Delay, i2c::I2c, pac::Peripherals, prelude::*};

use dps310::{self, DPS310};

const ADDRESS: u8 = 0x77;

#[entry]
fn main() -> ! {
    let mut cp = cortex_m::Peripherals::take().unwrap();
    let dp = Peripherals::take().unwrap();

    // setup ITM output
    let stim = &mut cp.ITM.stim[0];

    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();

    let clocks = rcc.cfgr.freeze(&mut flash.acr);

    let mut delay = Delay::new(cp.SYST, clocks);

    let mut gpiob = dp.GPIOB.split(&mut rcc.ahb);

    // Configure I2C1
    let mut scl =
        gpiob
            .pb6
            .into_af_open_drain(&mut gpiob.moder, &mut gpiob.otyper, &mut gpiob.afrl);
    let mut sda =
        gpiob
            .pb7
            .into_af_open_drain(&mut gpiob.moder, &mut gpiob.otyper, &mut gpiob.afrl);
    scl.internal_pull_up(&mut gpiob.pupdr, true);
    sda.internal_pull_up(&mut gpiob.pupdr, true);
    let i2c = I2c::new(
        dp.I2C1,
        (scl, sda),
        100.kHz().try_into().unwrap(),
        clocks,
        &mut rcc.apb1,
    );

    let mut dps = DPS310::new(i2c, ADDRESS, &dps310::Config::new()).unwrap();

    iprintln!(stim, "Wait for init done..");
    while !dps.init_complete().unwrap() {
        delay.delay_ms(200_u8);
    }
    iprintln!(stim, "Sensor init done");

    iprintln!(stim, "Wait for coef ready..");
    while !dps.coef_ready().unwrap() {
        delay.delay_ms(200_u8);
    }
    iprintln!(stim, "Sensor coefficients ready");

    dps.read_calibration_coefficients().unwrap();
    iprintln!(stim, "Sensor calibrated");

    dps.trigger_measurement(true, true, true).unwrap();

    loop {
        delay.delay_ms(200_u8);
        if dps.temp_ready().unwrap() {
            let temp = dps.read_temp_calibrated().unwrap();
            iprintln!(stim, "Temperature: {:.1} [C]", temp);
        }

        if dps.pres_ready().unwrap() {
            let pressure = dps.read_pressure_calibrated().unwrap();
            iprintln!(stim, "pressure: {:.1} [Pa]", pressure);
        }
    }
}