diff options
author | Diego Barrios Romero <eldruin@gmail.com> | 2018-11-11 08:04:42 +0100 |
---|---|---|
committer | Diego Barrios Romero <eldruin@gmail.com> | 2018-11-11 08:04:42 +0100 |
commit | 3e3a790d9f70bfd6cb4210dfe09560d0385fdf5a (patch) | |
tree | 8cf40e43cb93b15a774696c3af639d504addce8c /src/channels.rs | |
parent | 8b9e9ecdb85a30ac1c57fe6b96498cae6ad9f7cc (diff) | |
download | ads1x1x-async-3e3a790d9f70bfd6cb4210dfe09560d0385fdf5a.tar.gz ads1x1x-async-3e3a790d9f70bfd6cb4210dfe09560d0385fdf5a.tar.xz ads1x1x-async-3e3a790d9f70bfd6cb4210dfe09560d0385fdf5a.zip |
Reorganize modules
Diffstat (limited to 'src/channels.rs')
-rw-r--r-- | src/channels.rs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/channels.rs b/src/channels.rs new file mode 100644 index 0000000..c202ad3 --- /dev/null +++ b/src/channels.rs @@ -0,0 +1,86 @@ +//! ADC input channels +use { Ads1x1x, ic, hal, Config, BitFlags as BF }; + +/// ADC input channel selection +#[allow(dead_code)] +pub mod channel { + /// Measure single-ended signal on input channel 0 + pub struct SingleA0; + /// Measure single-ended signal on input channel 1 + pub struct SingleA1; + /// Measure single-ended signal on input channel 2 + pub struct SingleA2; + /// Measure single-ended signal on input channel 3 + pub struct SingleA3; + /// Measure signal on input channel 0 differentially to signal on input channel 1 + pub struct DifferentialA0A1; + /// Measure signal on input channel 0 differentially to signal on input channel 3 + pub struct DifferentialA0A3; + /// Measure signal on input channel 1 differentially to signal on input channel 3 + pub struct DifferentialA1A3; + /// Measure signal on input channel 3 differentially to signal on input channel 3 + pub struct DifferentialA2A3; +} + +pub enum ChannelSelection { + SingleA0, + SingleA1, + SingleA2, + SingleA3, + DifferentialA0A1, + DifferentialA0A3, + DifferentialA1A3, + DifferentialA2A3, +} + +macro_rules! impl_channel { + ( $IC:ident, $CH:ident ) => { + impl<DI, MODE> hal::adc::Channel<Ads1x1x<DI, ic::$IC, MODE>> for channel::$CH { + type ID = ChannelSelection; + + fn channel() -> Self::ID { + ChannelSelection::$CH + } + } + } +} + +impl_channel!(Ads1013, DifferentialA0A1); +impl_channel!(Ads1113, DifferentialA0A1); + +impl_channel!(Ads1014, DifferentialA0A1); +impl_channel!(Ads1114, DifferentialA0A1); + +impl_channel!(Ads1015, DifferentialA0A1); +impl_channel!(Ads1015, DifferentialA0A3); +impl_channel!(Ads1015, DifferentialA1A3); +impl_channel!(Ads1015, DifferentialA2A3); +impl_channel!(Ads1015, SingleA0); +impl_channel!(Ads1015, SingleA1); +impl_channel!(Ads1015, SingleA2); +impl_channel!(Ads1015, SingleA3); + +impl_channel!(Ads1115, DifferentialA0A1); +impl_channel!(Ads1115, DifferentialA0A3); +impl_channel!(Ads1115, DifferentialA1A3); +impl_channel!(Ads1115, DifferentialA2A3); +impl_channel!(Ads1115, SingleA0); +impl_channel!(Ads1115, SingleA1); +impl_channel!(Ads1115, SingleA2); +impl_channel!(Ads1115, SingleA3); + +impl Config { + pub(crate) fn with_mux_bits(&self, ch: ChannelSelection) -> Self { + use self::ChannelSelection as CS; + match ch { + CS::DifferentialA0A1 => self.with_low( BF::MUX2).with_low( BF::MUX1).with_low( BF::MUX0), + CS::DifferentialA0A3 => self.with_low( BF::MUX2).with_low( BF::MUX1).with_high(BF::MUX0), + CS::DifferentialA1A3 => self.with_low( BF::MUX2).with_high(BF::MUX1).with_low( BF::MUX0), + CS::DifferentialA2A3 => self.with_low( BF::MUX2).with_high(BF::MUX1).with_high(BF::MUX0), + CS::SingleA0 => self.with_high(BF::MUX2).with_low( BF::MUX1).with_low( BF::MUX0), + CS::SingleA1 => self.with_high(BF::MUX2).with_low( BF::MUX1).with_high(BF::MUX0), + CS::SingleA2 => self.with_high(BF::MUX2).with_high(BF::MUX1).with_low( BF::MUX0), + CS::SingleA3 => self.with_high(BF::MUX2).with_high(BF::MUX1).with_high(BF::MUX0), + } + } +} |