diff --git a/src/devices/common.rs b/src/devices/common.rs index f1509d3..3ff59d9 100644 --- a/src/devices/common.rs +++ b/src/devices/common.rs @@ -4,7 +4,7 @@ use crate::{devices::OperatingMode, interface, Ads1x1x, BitFlags, Config, Error, impl Ads1x1x where - DI: interface::WriteData + interface::ReadData, + DI: interface::ReadWriteRegister, { pub(super) fn set_operating_mode(&mut self, mode: OperatingMode) -> Result<(), Error> { let config = match mode { diff --git a/src/devices/features/tier1.rs b/src/devices/features/tier1.rs index 0c940ee..f67162f 100644 --- a/src/devices/features/tier1.rs +++ b/src/devices/features/tier1.rs @@ -6,7 +6,7 @@ use crate::{ impl Ads1x1x where - DI: interface::WriteData, + DI: interface::ReadWriteRegister, { /// Set data rate pub fn set_data_rate(&mut self, rate: DataRate12Bit) -> Result<(), Error> { @@ -29,7 +29,7 @@ where impl Ads1x1x where - DI: interface::WriteData, + DI: interface::ReadWriteRegister, { /// Set data rate pub fn set_data_rate(&mut self, rate: DataRate16Bit) -> Result<(), Error> { diff --git a/src/devices/features/tier2.rs b/src/devices/features/tier2.rs index 96330a0..dbd2883 100644 --- a/src/devices/features/tier2.rs +++ b/src/devices/features/tier2.rs @@ -9,7 +9,7 @@ use crate::{ impl Ads1x1x where - DI: interface::WriteData, + DI: interface::ReadWriteRegister, IC: ic::Tier2Features, CONV: conversion::ConvertThreshold, { diff --git a/src/devices/mode/continuous.rs b/src/devices/mode/continuous.rs index df58775..1dca71e 100644 --- a/src/devices/mode/continuous.rs +++ b/src/devices/mode/continuous.rs @@ -8,7 +8,7 @@ use core::marker::PhantomData; impl Ads1x1x where - DI: interface::ReadData + interface::WriteData, + DI: interface::ReadWriteRegister, CONV: conversion::ConvertMeasurement, { /// Change operating mode to OneShot diff --git a/src/devices/mode/oneshot.rs b/src/devices/mode/oneshot.rs index 15c24fa..8679fe1 100644 --- a/src/devices/mode/oneshot.rs +++ b/src/devices/mode/oneshot.rs @@ -7,7 +7,7 @@ use core::marker::PhantomData; impl Ads1x1x where - DI: interface::WriteData + interface::ReadData, + DI: interface::ReadWriteRegister, CONV: conversion::ConvertMeasurement, { /// Change operating mode to Continuous @@ -36,7 +36,7 @@ where impl Ads1x1x where - DI: interface::ReadData + interface::WriteData, + DI: interface::ReadWriteRegister, CONV: conversion::ConvertMeasurement, { /// Request that the ADC begin a conversion on the specified channel. diff --git a/src/interface.rs b/src/interface.rs index 0e665a3..dbb621d 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -9,45 +9,35 @@ pub struct I2cInterface { pub(crate) address: u8, } -/// Write data -pub trait WriteData: private::Sealed { - /// Error type +/// Read/write data from/to register. +pub trait ReadWriteRegister: private::Sealed { + /// Error type. type Error; - /// Write to an u16 register + /// Reads a `u16` register. + fn read_register(&mut self, register: u8) -> Result>; + + /// Writes to a `u16` register. fn write_register(&mut self, register: u8, data: u16) -> Result<(), Error>; } -impl WriteData for I2cInterface +impl ReadWriteRegister for I2cInterface where I2C: embedded_hal::i2c::I2c, { type Error = E; + fn write_register(&mut self, register: u8, data: u16) -> Result<(), Error> { - let payload: [u8; 3] = [register, (data >> 8) as u8, data as u8]; + let data = data.to_be_bytes(); + let payload: [u8; 3] = [register, data[0], data[1]]; self.i2c.write(self.address, &payload).map_err(Error::I2C) } -} -/// Read data -pub trait ReadData: private::Sealed { - /// Error type - type Error; - - /// Read an u16 register - fn read_register(&mut self, register: u8) -> Result>; -} - -impl ReadData for I2cInterface -where - I2C: embedded_hal::i2c::I2c, -{ - type Error = E; fn read_register(&mut self, register: u8) -> Result> { let mut data = [0, 0]; self.i2c .write_read(self.address, &[register], &mut data) .map_err(Error::I2C) - .and(Ok((u16::from(data[0]) << 8) | u16::from(data[1]))) + .and(Ok(u16::from_be_bytes(data))) } }