summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDiego Barrios Romero <eldruin@gmail.com>2018-11-04 21:32:46 +0100
committerDiego Barrios Romero <eldruin@gmail.com>2018-11-04 21:32:46 +0100
commit5a5d08f92768c48949cb175605055b853e559c5c (patch)
treedb71b7805fbb47acc57c09f7a659f9dc205ed47d
downloadads1x1x-async-5a5d08f92768c48949cb175605055b853e559c5c.tar.gz
ads1x1x-async-5a5d08f92768c48949cb175605055b853e559c5c.tar.xz
ads1x1x-async-5a5d08f92768c48949cb175605055b853e559c5c.zip
Initial version
-rw-r--r--.gitignore6
-rw-r--r--CHANGELOG.md10
-rw-r--r--Cargo.toml34
-rw-r--r--LICENSE-APACHE176
-rw-r--r--LICENSE-MIT19
-rw-r--r--README.md66
-rw-r--r--src/devices/ads1013.rs28
-rw-r--r--src/devices/mod.rs19
-rw-r--r--src/interface.rs142
-rw-r--r--src/lib.rs123
10 files changed, 623 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d7fe530
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+**/*.rs.bk
+.#*
+/target/
+Cargo.lock
+.gdb_history
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e152443
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+...
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..3e48b88
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,34 @@
+[package]
+name = "ads1x1x"
+version = "0.1.0"
+authors = ["Diego Barrios Romero <eldruin@gmail.com>"]
+repository = "https://github.com/eldruin/ads1x1x-rs"
+license = "MIT OR Apache-2.0"
+description = "Platform-agnostic Rust driver for the ADS1013, ADS1014, ADS1015, ADS1113, ADS1114, ADS1115, ADS1018 and ADS1118 ultra-small, low-power analog-to-digital converters (ADC)."
+readme = "README.md"
+keywords = ["adc", "analog", "driver", "embedded-hal-driver"]
+categories = ["embedded", "hardware-support", "no-std"]
+homepage = "https://github.com/eldruin/ads1x1x-rs"
+documentation = "https://docs.rs/ads1x1x"
+include = [
+ "**/*.rs",
+ "Cargo.toml",
+ "README.md",
+ "CHANGELOG.md",
+ "LICENSE-MIT",
+ "LICENSE-APACHE",
+]
+
+[badges.travis-ci]
+branch = "master"
+repository = "eldruin/ads1x1x-rs"
+
+[dependencies]
+embedded-hal = "0.2.2"
+
+[dev-dependencies]
+linux-embedded-hal = "0.2"
+embedded-hal-mock = "0.4"
+
+[profile.release]
+lto = true
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 0000000..1b5ec8b
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..c75da13
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,19 @@
+Copyright (C) 2018 Diego Barrios Romero
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d763e58
--- /dev/null
+++ b/README.md
@@ -0,0 +1,66 @@
+# Rust ADS1013, ADS1014, ADS1015, ADS1113, ADS1114, ADS1115, ADS1018 and ADS1118 ultra-small, low-power analog-to-digital converters (ADC) Driver [![crates.io](https://img.shields.io/crates/v/ads1x1x.svg)](https://crates.io/crates/ads1x1x) [![Docs](https://docs.rs/ads1x1x/badge.svg)](https://docs.rs/ads1x1x) [![Build Status](https://travis-ci.org/eldruin/ads1x1x-rs.svg?branch=master)](https://travis-ci.org/eldruin/ads1x1x-rs)
+
+This is a platform agnostic Rust driver for the ADS1013, ADS1014, ADS1015,
+ADS1113, ADS1114, ADS1115, ADS1018 and ADS1118 ultra-small, low-power
+analog-to-digital converters (ADC), based on the [`embedded-hal`] traits.
+
+[`embedded-hal`]: https://github.com/rust-embedded/embedded-hal
+
+This driver allows you to:
+- TODO
+
+## The devices
+
+The devices are precision, low power, 12/16-bit analog-to-digital
+converters (ADC) that provide all features necessary to measure the most
+common sensor signals in an ultra-small package. Depending on the device,
+these integrate a programmable gain amplifier (PGA), voltage reference,
+oscillator and high-accuracy temperature sensor.
+
+The devices can perform conversions at data rates up to 3300 samples per
+second (SPS). The PGA offers input ranges from ±256 mV to ±6.144 V,
+allowing both large and small signals to be measured with high resolution.
+An input multiplexer (MUX) allows to measure two differential or four
+single-ended inputs. The high-accuracy temperature sensor can be used for
+system-level temperature monitoring or cold-junction compensation for
+thermocouples.
+
+The devices operate either in continuous-conversion mode, or in a
+single-shot mode that automatically powers down after a conversion.
+Single-shot mode significantly reduces current consumption during idle
+periods. Data are transferred through a I2C or SPI.
+
+Here is a comparison of the caracteristics of the devices:
+
+| Device | Resolution | Sample Rate | Channels | Interface | Multi-channel | Features |
+|---------|------------|--------------|----------|-----------|---------------|------------------------------|
+| ADS1013 | 12-bit | Max 3300 SPS | 1 | I2C | N/A | |
+| ADS1014 | 12-bit | Max 3300 SPS | 1 | I2C | N/A | Comparator, PGA |
+| ADS1015 | 12-bit | Max 3300 SPS | 4 | I2C | Multiplexed | Comparator, PGA |
+| ADS1018 | 12-bit | Max 3300 SPS | 4 | SPI | Multiplexed | Comparator, PGA, Temp sensor |
+| ADS1113 | 16-bit | Max 860 SPS | 1 | I2C | N/A | |
+| ADS1114 | 16-bit | Max 860 SPS | 1 | I2C | N/A | Comparator, PGA |
+| ADS1115 | 16-bit | Max 860 SPS | 4 | I2C | Multiplexed | Comparator, PGA |
+| ADS1118 | 16-bit | Max 860 SPS | 4 | SPI | Multiplexed | Comparator, PGA, Temp sensor |
+
+Datasheets:
+- [ADS101x](http://www.ti.com/lit/ds/symlink/ads1015.pdf)
+- [ADS1018](http://www.ti.com/lit/ds/symlink/ads1018.pdf)
+- [ADS111x](http://www.ti.com/lit/ds/symlink/ads1115.pdf)
+- [ADS1118](http://www.ti.com/lit/ds/symlink/ads1118.pdf)
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
+ http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or
+ http://opensource.org/licenses/MIT) at your option.
+
+### Contributing
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall
+be dual licensed as above, without any additional terms or conditions.
+
diff --git a/src/devices/ads1013.rs b/src/devices/ads1013.rs
new file mode 100644
index 0000000..b4628b5
--- /dev/null
+++ b/src/devices/ads1013.rs
@@ -0,0 +1,28 @@
+//! Functions exclusive of ADS1013
+
+extern crate embedded_hal as hal;
+use hal::blocking;
+use core::marker::PhantomData;
+use { Ads1x1x, DEVICE_BASE_ADDRESS, SlaveAddr, ic };
+use interface::I2cInterface;
+
+impl<I2C, E> Ads1x1x<I2cInterface<I2C>, ic::ADS1013>
+where
+ I2C: blocking::i2c::Write<Error = E> + blocking::i2c::WriteRead<Error = E>
+{
+ /// Create a new instance of the ADS1013 device.
+ pub fn new_ads1013(i2c: I2C, address: SlaveAddr) -> Self {
+ Ads1x1x {
+ iface: I2cInterface {
+ i2c,
+ address: address.addr(DEVICE_BASE_ADDRESS)
+ },
+ _ic: PhantomData
+ }
+ }
+
+ /// Destroy driver instance, return I²C bus instance.
+ pub fn destroy_ads1013(self) -> I2C {
+ self.iface.i2c
+ }
+}
diff --git a/src/devices/mod.rs b/src/devices/mod.rs
new file mode 100644
index 0000000..529db04
--- /dev/null
+++ b/src/devices/mod.rs
@@ -0,0 +1,19 @@
+/// IC markers
+pub mod ic {
+ /// ADS1013 IC marker
+ pub struct ADS1013;
+ /// ADS1014 IC marker
+ pub struct ADS1014;
+ /// ADS1015 IC marker
+ pub struct ADS1015;
+ /// ADS1113 IC marker
+ pub struct ADS1113;
+ /// ADS1114 IC marker
+ pub struct ADS1114;
+ /// ADS1115 IC marker
+ pub struct ADS1115;
+ /// ADS1118 IC marker
+ pub struct ADS1118;
+}
+
+mod ads1013;
diff --git a/src/interface.rs b/src/interface.rs
new file mode 100644
index 0000000..2bf14f2
--- /dev/null
+++ b/src/interface.rs
@@ -0,0 +1,142 @@
+//! I2C/SPI interfaces
+
+#![deny(missing_docs)]
+
+extern crate embedded_hal as hal;
+use hal::blocking;
+use Error;
+
+/// I2C interface
+#[derive(Debug, Default)]
+pub struct I2cInterface<I2C> {
+ pub(crate) i2c: I2C,
+ pub(crate) address : u8,
+}
+
+/// SPI interface
+#[derive(Debug, Default)]
+pub struct SpiInterface<SPI, CS> {
+ pub(crate) spi: SPI,
+ pub(crate) cs: CS
+}
+
+/// Write data
+pub trait WriteData {
+ /// Error type
+ type Error;
+ /// Write to an u8 register
+ fn write_register(&mut self, register: u8, data: u8) -> Result<(), Error<Self::Error>>;
+ /// Write data. The first element corresponds to the starting address.
+ fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error<Self::Error>>;
+}
+
+impl<I2C, E> WriteData for I2cInterface<I2C>
+where
+ I2C: blocking::i2c::Write<Error = E>
+{
+ type Error = E;
+ fn write_register(&mut self, register: u8, data: u8) -> Result<(), Error<E>> {
+ let payload: [u8; 2] = [register, data];
+ self.i2c
+ .write(self.address, &payload)
+ .map_err(Error::Comm)
+ }
+
+ fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error<Self::Error>> {
+ self.i2c
+ .write(self.address, &payload)
+ .map_err(Error::Comm)
+ }
+}
+
+impl<SPI, CS, E> WriteData for SpiInterface<SPI, CS>
+where
+ SPI: blocking::spi::Write<u8, Error = E>,
+ CS: hal::digital::OutputPin
+{
+ type Error = E;
+ fn write_register(&mut self, register: u8, data: u8) -> Result<(), Error<E>> {
+ self.cs.set_low();
+
+ let payload: [u8; 2] = [register + 0x80, data];
+ let result = self.spi
+ .write(&payload)
+ .map_err(Error::Comm);
+
+ self.cs.set_high();
+ result
+ }
+
+ fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error<Self::Error>> {
+ self.cs.set_low();
+ payload[0] += 0x80;
+ let result = self.spi
+ .write(&payload)
+ .map_err(Error::Comm);
+
+ self.cs.set_high();
+ result
+ }
+}
+
+
+/// Read data
+pub trait ReadData {
+ /// Error type
+ type Error;
+ /// Read an u8 register
+ fn read_register(&mut self, register: u8) -> Result<u8, Error<Self::Error>>;
+ /// Read some data. The first element corresponds to the starting address.
+ fn read_data(&mut self, payload: &mut [u8]) -> Result<(), Error<Self::Error>>;
+}
+
+impl<I2C, E> ReadData for I2cInterface<I2C>
+where
+ I2C: blocking::i2c::WriteRead<Error = E>
+{
+ type Error = E;
+ fn read_register(&mut self, register: u8) -> Result<u8, Error<E>> {
+ let mut data = [0];
+ self.i2c
+ .write_read(self.address, &[register], &mut data)
+ .map_err(Error::Comm)
+ .and(Ok(data[0]))
+ }
+
+ fn read_data(&mut self, payload: &mut [u8]) -> Result<(), Error<Self::Error>> {
+ let len = payload.len();
+ self.i2c
+ .write_read(self.address, &[payload[0]], &mut payload[1..=(len-1)])
+ .map_err(Error::Comm)
+ }
+}
+
+impl<SPI, CS, E> ReadData for SpiInterface<SPI, CS>
+where
+ SPI: blocking::spi::Transfer<u8, Error = E>,
+ CS: hal::digital::OutputPin
+{
+ type Error = E;
+ fn read_register(&mut self, register: u8) -> Result<u8, Error<E>> {
+ self.cs.set_low();
+ let mut data = [register, 0];
+ let result = self.spi
+ .transfer(&mut data)
+ .map_err(Error::Comm);
+ self.cs.set_high();
+ match result {
+ Ok(result) => Ok(result[1]),
+ Err(e) => Err(e)
+ }
+ }
+
+ fn read_data(&mut self, mut payload: &mut [u8]) -> Result<(), Error<Self::Error>> {
+ self.cs.set_low();
+ let result = self.spi
+ .transfer(&mut payload)
+ .map_err(Error::Comm);
+ self.cs.set_high();
+ result?;
+ Ok(())
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..23c36bb
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,123 @@
+//! This is a platform-agnostic Rust driver for the ADS1013, ADS1014, ADS1015,
+//! ADS1113, ADS1114, ADS1115, ADS1018 and ADS1118 ultra-small, low-power
+//! analog-to-digital converters (ADC), based on the [`embedded-hal`] traits.
+//!
+//! [`embedded-hal`]: https://github.com/rust-embedded/embedded-hal
+//!
+//! This driver allows you to:
+//! - TODO
+//!
+//! ## The devices
+//!
+//! The devices are precision, low power, 12/16-bit analog-to-digital
+//! converters (ADC) that provide all features necessary to measure the most
+//! common sensor signals in an ultra-small package. Depending on the device,
+//! these integrate a programmable gain amplifier (PGA), voltage reference,
+//! oscillator and high-accuracy temperature sensor.
+//!
+//! The devices can perform conversions at data rates up to 3300 samples per
+//! second (SPS). The PGA offers input ranges from ±256 mV to ±6.144 V,
+//! allowing both large and small signals to be measured with high resolution.
+//! An input multiplexer (MUX) allows to measure two differential or four
+//! single-ended inputs. The high-accuracy temperature sensor can be used for
+//! system-level temperature monitoring or cold-junction compensation for
+//! thermocouples.
+//!
+//! The devices operate either in continuous-conversion mode, or in a
+//! single-shot mode that automatically powers down after a conversion.
+//! Single-shot mode significantly reduces current consumption during idle
+//! periods. Data are transferred through a I2C or SPI.
+//!
+//! Here is a comparison of the caracteristics of the devices:
+//!
+//! | Device | Resolution | Sample Rate | Channels | Interface | Multi-channel | Features |
+//! |---------|------------|--------------|----------|-----------|---------------|------------------------------|
+//! | ADS1013 | 12-bit | Max 3300 SPS | 1 | I2C | N/A | |
+//! | ADS1014 | 12-bit | Max 3300 SPS | 1 | I2C | N/A | Comparator, PGA |
+//! | ADS1015 | 12-bit | Max 3300 SPS | 4 | I2C | Multiplexed | Comparator, PGA |
+//! | ADS1018 | 12-bit | Max 3300 SPS | 4 | SPI | Multiplexed | Comparator, PGA, Temp sensor |
+//! | ADS1113 | 16-bit | Max 860 SPS | 1 | I2C | N/A | |
+//! | ADS1114 | 16-bit | Max 860 SPS | 1 | I2C | N/A | Comparator, PGA |
+//! | ADS1115 | 16-bit | Max 860 SPS | 4 | I2C | Multiplexed | Comparator, PGA |
+//! | ADS1118 | 16-bit | Max 860 SPS | 4 | SPI | Multiplexed | Comparator, PGA, Temp sensor |
+//!
+//! Datasheets:
+//! - [ADS101x](http://www.ti.com/lit/ds/symlink/ads1015.pdf)
+//! - [ADS1018](http://www.ti.com/lit/ds/symlink/ads1018.pdf)
+//! - [ADS111x](http://www.ti.com/lit/ds/symlink/ads1115.pdf)
+//! - [ADS1118](http://www.ti.com/lit/ds/symlink/ads1118.pdf)
+//!
+
+#![deny(unsafe_code)]
+#![deny(missing_docs)]
+//TODO #![deny(warnings)]
+#![no_std]
+
+extern crate embedded_hal as hal;
+use core::marker::PhantomData;
+
+/// All possible errors in this crate
+#[derive(Debug)]
+pub enum Error<E> {
+ /// I²C/SPI bus error
+ Comm(E)
+}
+
+const DEVICE_BASE_ADDRESS : u8 = 0b100_1000;
+
+/// Possible slave addresses
+#[derive(Debug, Clone)]
+pub enum SlaveAddr {
+ /// Default slave address
+ Default,
+ /// Alternative slave address providing bit values for A1 and A0
+ Alternative(bool, bool)
+}
+
+impl Default for SlaveAddr {
+ /// Default slave address
+ fn default() -> Self {
+ SlaveAddr::Default
+ }
+}
+
+impl SlaveAddr {
+ fn addr(self, default: u8) -> u8 {
+ match self {
+ SlaveAddr::Default => default,
+ SlaveAddr::Alternative(a1, a0) => default |
+ ((a1 as u8) << 1) |
+ a0 as u8
+ }
+ }
+}
+
+/// ADS1x1x ADC driver
+#[derive(Debug, Default)]
+pub struct Ads1x1x<DI, IC> {
+ iface: DI,
+ _ic: PhantomData<IC>
+}
+
+pub mod interface;
+mod devices;
+pub use devices::ic;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn can_get_default_address() {
+ let addr = SlaveAddr::default();
+ assert_eq!(DEVICE_BASE_ADDRESS, addr.addr(DEVICE_BASE_ADDRESS));
+ }
+
+ #[test]
+ fn can_generate_alternative_addresses() {
+ assert_eq!(0b100_1000, SlaveAddr::Alternative(false, false).addr(DEVICE_BASE_ADDRESS));
+ assert_eq!(0b100_1001, SlaveAddr::Alternative(false, true).addr(DEVICE_BASE_ADDRESS));
+ assert_eq!(0b100_1010, SlaveAddr::Alternative(true, false).addr(DEVICE_BASE_ADDRESS));
+ assert_eq!(0b100_1011, SlaveAddr::Alternative(true, true).addr(DEVICE_BASE_ADDRESS));
+ }
+}