rsiot/drivers_i2c/ads1115/
config.rs1use std::time::Duration;
4
5use bitvec::prelude::*;
6
7use crate::message::Message;
8
9#[derive(Clone)]
11pub struct InputConfig<TMsg> {
12 pub mux_config: MuxConfig,
14 pub amplifier: Amplifier,
16 pub period: Duration,
18 pub fn_output: fn(f64) -> Option<Message<TMsg>>,
20}
21
22#[derive(Clone)]
24#[allow(non_camel_case_types)]
25pub enum MuxConfig {
26 Single_0,
28 Single_1,
30 Single_2,
32 Single_3,
34 Diff_0_1,
36 Diff_0_3,
38 Diff_1_3,
40 Diff_2_3,
42}
43
44#[derive(Clone)]
47#[allow(non_camel_case_types)]
48pub enum Amplifier {
49 V_6_144,
51 V_4_096,
53 V_2_048,
55 V_1_024,
57 V_0_512,
59 V_0_256,
61}
62
63impl Amplifier {
64 pub fn max_value(&self) -> f64 {
66 match self {
67 Amplifier::V_6_144 => 6.144,
68 Amplifier::V_4_096 => 4.096,
69 Amplifier::V_2_048 => 2.048,
70 Amplifier::V_1_024 => 1.024,
71 Amplifier::V_0_512 => 0.512,
72 Amplifier::V_0_256 => 0.256,
73 }
74 }
75}
76
77pub fn config_to_bytes(mux_config: &MuxConfig, aplifier: &Amplifier) -> [u8; 2] {
79 let mut config: [u8; 2] = [0, 0];
80 let config_bits = config.view_bits_mut::<Lsb0>();
81
82 config_bits.set(15, true);
84
85 match mux_config {
87 MuxConfig::Diff_0_1 => {
88 config_bits.set(14, false);
89 config_bits.set(13, false);
90 config_bits.set(12, false);
91 }
92 MuxConfig::Diff_0_3 => {
93 config_bits.set(14, false);
94 config_bits.set(13, false);
95 config_bits.set(12, true);
96 }
97 MuxConfig::Diff_1_3 => {
98 config_bits.set(14, false);
99 config_bits.set(13, true);
100 config_bits.set(12, false);
101 }
102 MuxConfig::Diff_2_3 => {
103 config_bits.set(14, false);
104 config_bits.set(13, true);
105 config_bits.set(12, true);
106 }
107 MuxConfig::Single_0 => {
108 config_bits.set(14, true);
109 config_bits.set(13, false);
110 config_bits.set(12, false);
111 }
112 MuxConfig::Single_1 => {
113 config_bits.set(14, true);
114 config_bits.set(13, false);
115 config_bits.set(12, true);
116 }
117 MuxConfig::Single_2 => {
118 config_bits.set(14, true);
119 config_bits.set(13, true);
120 config_bits.set(12, false);
121 }
122 MuxConfig::Single_3 => {
123 config_bits.set(14, true);
124 config_bits.set(13, true);
125 config_bits.set(12, true);
126 }
127 }
128
129 match aplifier {
131 Amplifier::V_6_144 => {
132 config_bits.set(11, false);
133 config_bits.set(10, false);
134 config_bits.set(9, false);
135 }
136 Amplifier::V_4_096 => {
137 config_bits.set(11, false);
138 config_bits.set(10, false);
139 config_bits.set(9, true);
140 }
141 Amplifier::V_2_048 => {
142 config_bits.set(11, false);
143 config_bits.set(10, true);
144 config_bits.set(9, false);
145 }
146 Amplifier::V_1_024 => {
147 config_bits.set(11, false);
148 config_bits.set(10, true);
149 config_bits.set(9, true);
150 }
151 Amplifier::V_0_512 => {
152 config_bits.set(11, true);
153 config_bits.set(10, false);
154 config_bits.set(9, false);
155 }
156 Amplifier::V_0_256 => {
157 config_bits.set(11, true);
158 config_bits.set(10, false);
159 config_bits.set(9, true);
160 }
161 }
162
163 config_bits.set(8, true);
165
166 config_bits.set(7, true);
168 config_bits.set(6, false);
169 config_bits.set(5, false);
170
171 config_bits.set(4, false);
173
174 config_bits.set(3, false);
176
177 config_bits.set(2, false);
179
180 config_bits.set(1, true);
182 config_bits.set(0, true);
183
184 config.swap(0, 1);
185 config
186}
187
188#[cfg(test)]
189mod tests {
190 use super::*;
191
192 #[test]
198 fn test1() {
199 let config = config_to_bytes(&MuxConfig::Diff_0_1, &Amplifier::V_2_048);
200 assert_eq!(config, [0x85, 0x83]);
201 }
202}