summaryrefslogtreecommitdiffstats
path: root/examples/spi.rs
blob: ffdbc7814aa18955a81fed7a68748dc2a7b85556 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// MIT License
//
// Copyright © 2022, Michael Büsch <m@bues.ch>
// Copyright © 2020-present, Michael Cummings <mgcummings@yahoo.com>.
//
// 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.
//! This is a simple example of how to use library.
//!
//! The example was written assuming Raspberry Pi OS but should work with other
//! Linux distros with little or no change.
//!
//! ## Examples
//! To build the example use:
//! ```sh, no_run
//! cargo build --example spi
//! ```
//! Then to run use:
//! ```sh, no_run
//! sudo ./target/debug/examples/spi
//! ```
//!
//! Output example:
//! ```sh, no_run
//! axis: {'x': 1.6083, 'y': 0.0392, 'z': 8.7868} m/s²
//! axis: {'x': 1.6867, 'y': 0.1177, 'z': 8.7868} m/s²
//! axis: {'x': 1.6475, 'y': 0.1177, 'z': 8.8260} m/s²
//! ...
//! ```

use adxl345_driver::{spi::Device, Adxl345Reader, Adxl345Writer};
use anyhow::{Context, Result};
use rppal::system::DeviceInfo;
use std::{
    sync::atomic::{AtomicBool, Ordering},
    sync::Arc,
    thread::sleep,
    time::Duration,
};

/// Output scale is 4mg/LSB.
const SCALE_MULTIPLIER: f64 = 0.004;
/// Average Earth gravity in m/s²
const EARTH_GRAVITY_MS2: f64 = 9.80665;

/// Entry point of example.
fn main() -> Result<()> {
    println!(
        "SPI example started on a {}",
        DeviceInfo::new()
            .context("Failed to get new DeviceInfo")?
            .model()
    );
    let mut adxl345 = Device::new().context("Failed to get instance")?;
    let id = adxl345.device_id().context("Failed to get device id")?;
    println!("Device id = {}", id);
    // Set full scale output and range to 2G.
    adxl345
        .set_data_format(8)
        .context("Failed to set data format")?;
    // Set measurement mode on.
    adxl345
        .set_power_control(8)
        .context("Failed to turn on measurement mode")?;
    // Stuff needed to nicely handle Ctrl-C from user.
    let running = Arc::new(AtomicBool::new(true));
    let r = running.clone();
    ctrlc::set_handler(move || {
        r.store(false, Ordering::SeqCst);
    })
    .context("Error setting Ctrl-C handler")?;
    // Loop until Ctrl-C is received.
    while running.load(Ordering::SeqCst) {
        let (x, y, z) = adxl345
            .acceleration()
            .context("Failed to get acceleration data")?;
        let x = x as f64 * SCALE_MULTIPLIER * EARTH_GRAVITY_MS2;
        let y = y as f64 * SCALE_MULTIPLIER * EARTH_GRAVITY_MS2;
        let z = z as f64 * SCALE_MULTIPLIER * EARTH_GRAVITY_MS2;
        println!(
            "axis: {{'x': {:1.4}, 'y': {:1.4}, 'z': {:1.4}}} m/s²",
            x, y, z
        );
        sleep(Duration::from_millis(100));
    }
    // Set measurement mode off.
    adxl345
        .set_power_control(0)
        .context("Failed to turn on measurement mode")?;
    println!("\nSPI example stopped");
    Ok(())
}
bues.ch cgit interface