#![no_std]
#![no_main]

use embedded_hal::i2c::{self, I2c};
use cortex_m_rt::entry;
use rtt_target::{rprintln, rtt_init_print};
use nrf52840_hal::{
    gpio::*,
    pac,
    twim::{self, Twim},
};

const BME280_I2C_ADDR_PRIMARY: u8 = 0x76;
const BME280_CHIP_ID_ADDR: u8 = 0xD0;
const BME280_CHIP_ID: u8 = 0x60;

fn bme280_get_chip_id<E: i2c::Error>(i2c: &mut
        impl I2c<Error = E>) -> Result<u8, E> {
    let mut chip_id = [0; 1];
    i2c.write_read(BME280_I2C_ADDR_PRIMARY,
        &[BME280_CHIP_ID_ADDR], &mut chip_id)?;
    Ok(chip_id[0])
}

/// TWI example code using an BME280 sensor:
/// Connect SDA to P0.27 and SCL to pin P0.26
#[entry]
fn main() -> ! {
    rtt_init_print!();
    let p = pac::Peripherals::take().unwrap();
    let port0 = p0::Parts::new(p.P0);

    let scl = port0.p0_26.into_floating_input()
                 .degrade();
    let sda = port0.p0_27.into_floating_input()
                 .degrade();
    let pins = twim::Pins { scl, sda };
    let mut i2c = Twim::new(p.TWIM0, pins,
                      twim::Frequency::K100);
    let chip_id = bme280_get_chip_id(&mut i2c)
        .expect("Failed to read BME280 chip ID");
    if chip_id == BME280_CHIP_ID {
        rprintln!("BME280 chip ID: 0x{:02X}",
                      chip_id);
    } else {
        rprintln!("Unexpected BME280 chip ID:
                              0x{:02X}", chip_id);
    }

    loop {}
}
