use rppal::i2c::I2c;

const ADDR: u16 = 0x48;
const REG: u8 = 0;

/// ADT7410 温度センサ。
pub struct ADT7410 {
    bus: I2c,
}

impl ADT7410 {
    /// 新たなADT7410型の値を生成。
    pub fn new(bus: I2c) -> Self {
        Self { bus }
    }

    /// 温度をセルシウス度で返す。
    pub fn celcius(&mut self) -> Option<f64> {
        // アドレスを0x48に設定
        self.bus
            .set_slave_address(ADDR)
            .expect("failed to set slave address");

        match self.bus.smbus_read_word(REG) {
            // 上位13ビットがの値が温度
            // 2の補数表現のため、i16に型変換してから右算術シフト
            Ok(n) => Some((n.to_be() as i16 >> 3) as f64 / 16.0),
            Err(e) => {
                eprintln!("{e}");
                None
            }
        }
    }
}
