Skip to content

Commit 16be170

Browse files
authored
Expanded linux example (#6)
Also added `impl core::fmt::Display for bmp390::Measurement`
1 parent 439cc16 commit 16be170

File tree

5 files changed

+285
-29
lines changed

5 files changed

+285
-29
lines changed

Cargo.lock

+193
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+9-4
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@ embassy-time = ["dep:embassy-time"]
1919
sync = ["dep:embedded-hal"]
2020

2121
[dependencies]
22+
defmt = "0.3.8"
2223
embedded-hal-async = "1.0.0"
23-
embedded-hal = { version= "1.0.0", optional = true}
24+
embedded-hal = { version = "1.0.0", optional = true }
2425
embassy-time = { version = "0.4.0", optional = true }
25-
defmt = "0.3.8"
2626
libm = "0.2.8"
27-
uom = { version = "0.36.0", default-features = false, features = ["f32", "si", "autoconvert"] }
27+
uom = { version = "0.36.0", default-features = false, features = [
28+
"f32",
29+
"si",
30+
"autoconvert",
31+
] }
2832

2933
[dev-dependencies]
30-
defmt = { version = "0.3.8", features = [ "unstable-test" ] }
34+
clap = { version = "4.5.26", features = ["derive"] }
35+
defmt = { version = "0.3.8", features = ["unstable-test"] }
3136
embedded-hal-mock = { version = "0.11.0", default-features = false, features = [
3237
"eh1",
3338
"embedded-hal-async",

examples/linux-sync.rs

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use bmp390::{sync::Bmp390, Address, Configuration};
2+
use clap::Parser;
3+
use embedded_hal::delay::DelayNs;
4+
use linux_embedded_hal::{Delay, I2cdev};
5+
6+
/// This example demonstrates how to use the synchronous BMP390 driver on Linux.
7+
///
8+
/// By default, this will print one measurement from the `/dev/i2c-1` device. The device can be
9+
/// changed with the first positional argument. The program can also print multiple times with the
10+
/// `--count` argument, or made to repeat `--forever`. To speed up the program, use
11+
/// `--frequency <FREQ>`. The BMP390 is configured to 50 Hz by default; any value above this will
12+
/// yield repeated measurements.
13+
#[derive(Parser)]
14+
#[command(version)]
15+
#[command(group = clap::ArgGroup::new("repetition").multiple(false))]
16+
struct Args {
17+
/// Which I2C device to use.
18+
#[clap(default_value = "/dev/i2c-1")]
19+
device: String,
20+
21+
/// How many measurements to take before exiting. Exclusive with `forever`.
22+
#[clap(short, long, default_value_t = 1, group = "repetition")]
23+
count: usize,
24+
25+
/// Whether to perform measurements continuously. Exclusive with `count`.
26+
#[clap(long, default_value_t = false, group = "repetition")]
27+
forever: bool,
28+
29+
/// How many measurements to take per second.
30+
#[clap(short, long, default_value_t = 1.0)]
31+
frequency: f32,
32+
}
33+
34+
impl Args {
35+
fn delay_ms(&self) -> u32 {
36+
(1000.0 / self.frequency).floor() as u32
37+
}
38+
}
39+
40+
fn main() {
41+
let args = Args::parse();
42+
eprintln!("Using I2C device: {}", args.device);
43+
let i2c = I2cdev::new(&args.device)
44+
.map_err(bmp390::Error::I2c)
45+
.expect("Failed to create I2C device");
46+
47+
let config = Configuration::default();
48+
let mut sensor = Bmp390::try_new(i2c, Address::Up, Delay, &config)
49+
.expect("Failed to initialize BMP390 sensor");
50+
51+
let mut delay = Delay;
52+
let delay_ms = args.delay_ms();
53+
54+
if args.forever {
55+
eprintln!("Measuring forever...");
56+
for i in 1usize.. {
57+
let measurement = sensor.measure().expect("Failed to measure BMP390 data");
58+
eprintln!("{i}: {measurement}");
59+
delay.delay_ms(delay_ms);
60+
}
61+
} else {
62+
let count = args.count;
63+
for i in 1..=count {
64+
let measurement = sensor.measure().expect("Failed to measure BMP390 data");
65+
eprintln!("{i}/{count}: {measurement}");
66+
if i != count {
67+
delay.delay_ms(delay_ms);
68+
}
69+
}
70+
}
71+
}

examples/sync_linux.rs

-25
This file was deleted.

src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,18 @@ impl Format for Measurement {
197197
}
198198
}
199199

200+
impl core::fmt::Display for Measurement {
201+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
202+
write!(
203+
f,
204+
"Pressure: {} Pa, Temperature: {} °C, Altitude: {} m",
205+
self.pressure.get::<pascal>(),
206+
self.temperature.get::<degree_celsius>(),
207+
self.altitude.get::<meter>(),
208+
)
209+
}
210+
}
211+
200212
/// The BMP390 barometer's I2C addresses, either `0x76` or `0x77`.
201213
///
202214
/// The BMP390 can be configured to use two different addresses by either pulling the `SDO` pin down to `GND`

0 commit comments

Comments
 (0)