Skip to main content

adxl355/
conf.rs

1#![allow(non_camel_case_types)]
2
3#[derive(Copy, Clone, Debug)]
4pub enum Range {
5    _2G = 0b01,
6    _4G = 0b10,
7    _8G = 0b11,
8}
9
10impl Range {
11    pub fn val(self) -> u8 {
12        self as u8
13    }
14}
15
16impl From<Range> for f32 {
17    fn from(range: Range) -> f32 {
18        match range {
19            Range::_2G => 2.0,
20            Range::_4G => 4.0,
21            Range::_8G => 8.0,
22        }
23    }
24}
25
26impl Default for Range {
27    fn default() -> Self {
28        Range::_2G
29    }
30}
31
32#[derive(Copy, Clone, Debug)]
33/// Output data rate (odr) and Low pass filter corner frequency (lpf)
34pub enum ODR_LPF {
35    /// odr = 4000 Hz and lpf = 1000 Hz
36    ODR_4000_Hz                = 0,
37    /// odr = 2000 Hz and lpf = 500 Hz
38    ODR_2000_Hz                = 1,
39    /// odr = 1000 Hz and lpf = 250 Hz
40    ODR_1000_Hz                = 2,
41    /// odr = 500 Hz and lpf = 125 Hz
42    ODR_500_Hz                 = 3,
43    /// odr = 250 Hz and lpf = 62.5 Hz
44    ODR_250_Hz                 = 4,
45    /// odr = 125 Hz and lpf = 31.25 Hz
46    ODR_125_Hz                 = 5,
47    /// odr = 62.5 Hz and lpf = 15.625 Hz
48    ODR_62_5_Hz                = 6,
49    /// odr = 31.25 Hz and lpf = 7.813 Hz
50    ODR_31_25_Hz               = 7,
51    /// odr = 15.625 Hz and lpf = 3.906
52    ODR_15_625_Hz              = 8,
53    /// odr = 7.813 Hz and lpf = 1.953 Hz
54    ODR_7_813_Hz               = 9,
55    /// odr = 3.906 Hz and lpf = 0.977 Hz
56    ODR_3_906_Hz               = 10,
57}
58
59impl ODR_LPF {
60    pub fn val(self) -> u8 {
61        self as u8
62    }
63}
64
65impl From<ODR_LPF> for f32 {
66    fn from(rate: ODR_LPF) -> f32 {
67        match rate {
68            ODR_LPF::ODR_4000_Hz => 4000.0,
69            ODR_LPF::ODR_2000_Hz => 2000.0,
70            ODR_LPF::ODR_1000_Hz => 1000.0,
71            ODR_LPF::ODR_500_Hz => 500.0,
72            ODR_LPF::ODR_250_Hz => 250.0,
73            ODR_LPF::ODR_125_Hz => 125.0,
74            ODR_LPF::ODR_62_5_Hz => 62.5,
75            ODR_LPF::ODR_31_25_Hz => 31.25,
76            ODR_LPF::ODR_15_625_Hz => 15.625,
77            ODR_LPF::ODR_7_813_Hz => 7.813,
78            ODR_LPF::ODR_3_906_Hz => 3.906,
79        }
80    }
81}
82
83impl Default for ODR_LPF {
84    fn default() -> Self {
85        ODR_LPF::ODR_3_906_Hz
86    }
87}
88
89#[derive(Copy, Clone, Debug)]
90/// High pass corner frequency is proportional to the output data rate (ODR)
91pub enum HPF_CORNER {
92    /// no high pass filter
93    NONE        = 0,
94    /// corner freq = 247 × 10^3 × ODR
95    _247_ODR    = 1,
96    /// corner freq = 62.048 × 10^3 × ODR
97    _62_084_ODR = 2,
98    /// corner freq = 15.454 × 10^3 × ODR
99    _15_545_ODR = 3,
100    /// corner freq = 3.862 × 10^3 × ODR
101    _3_862_ODR  = 4,
102    /// corner freq = 0.954 × 10^3 × ODR
103    _0_954_ODR  = 5,
104    /// corner freq = 0.238 × 10^3 × ODR
105    _0_238_ODR  = 6
106}
107
108impl HPF_CORNER {
109    pub fn val(self) -> u8 {
110        self as u8
111    }
112}
113
114impl Default for HPF_CORNER {
115    fn default() -> Self {
116        HPF_CORNER::NONE
117    }
118}
119
120pub struct Config {
121    pub(crate) range: Option<Range>,
122    pub(crate) odr: Option<ODR_LPF>,
123    pub(crate) hpf: Option<HPF_CORNER>
124}
125
126/// ADXL355 configuration struct
127impl Config {
128
129    // Creates a new configuration object with default values
130    pub fn new() -> Self {
131        Config {
132            range: None,
133            odr: None,
134            hpf: None
135        }
136    }
137
138    /// Sets the range configuration
139    /// Default is 2G
140    pub fn range(&mut self, range: Range) -> &mut Self {
141        self.range = Some(range);
142        self
143    }
144
145    /// Sets the output data rate and low pass filter settings.
146    /// Default data rate is `3.906 Hz`
147    /// The low pass filter is fixed as 1/4 of the output data rate (fs)
148    pub fn odr(&mut self, odr: ODR_LPF) -> &mut Self {
149        self.odr = Some(odr);
150        self
151    }
152
153    /// Sets the -3dB corner frequency for the high pass filter
154    ///
155    /// Default is no high pass filter
156    pub fn hpf(&mut self, hpf: HPF_CORNER) -> &mut Self {
157        self.hpf = Some(hpf);
158        self
159    }
160}