1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/// Type alias for clarity. For more information see [`SamplingFreqencyExt`](./trait.SamplingFrequencyExt.html)
/// and [`Helpers`](./trait.Helpers.html).
pub type SamplingFrequency = f32;

/// Extension functions for numeric types used to create [`SamplingFreqency`](./struct.SamplingFrequency.html) values.
///
/// # Usage
/// ```rust
/// use qrs_detector::sampling::*;
///
/// // Both values represent 500 samples per second
/// let fs = 500.sps();
/// let fs2 = 0.5.ksps();
///
/// assert_eq!(fs, fs2);
/// ```
pub trait SamplingFrequencyExt {
    fn sps(self) -> SamplingFrequency;
    fn ksps(self) -> SamplingFrequency;
}

impl SamplingFrequencyExt for f32 {
    fn sps(self) -> SamplingFrequency {
        self
    }

    fn ksps(self) -> SamplingFrequency {
        (self * 1000.0).sps()
    }
}

impl SamplingFrequencyExt for usize {
    fn sps(self) -> SamplingFrequency {
        self as SamplingFrequency
    }

    fn ksps(self) -> SamplingFrequency {
        (self * 1000).sps()
    }
}

/// Helper functions to make some sampling time related conversions simpler.
pub trait Helpers {
    /// Convert `ms` milliseconds to number of samples
    /// ```rust
    /// # use qrs_detector::sampling::*;
    /// #
    /// let samples = 500.sps().s_to_samples(2.5);
    /// assert_eq!(samples, 1250);
    /// ```
    fn ms_to_samples(self, ms: f32) -> u32;

    /// Convert `s` seconds to number of samples
    /// ```rust
    /// # use qrs_detector::sampling::*;
    /// #
    /// let samples = 500.sps().ms_to_samples(500.0);
    /// assert_eq!(samples, 250);
    /// ```
    fn s_to_samples(self, s: f32) -> u32;
}

impl Helpers for SamplingFrequency {
    fn ms_to_samples(self, ms: f32) -> u32 {
        ((ms * self) as u32) / 1000
    }
    fn s_to_samples(self, s: f32) -> u32 {
        self.ms_to_samples(s * 1000.0)
    }
}