From 86d1797bace32913f5d24a109c2339b31a91619d Mon Sep 17 00:00:00 2001 From: "Brian J. Tarricone" Date: Sun, 5 Nov 2023 11:22:06 -0800 Subject: [PATCH] Update for embedded-hal 1.0.0-rc.1 Also moves the linux-embedded-hal example out of the readme and into a standalone file in examples/. --- Cargo.toml | 7 ++--- README.md | 56 +++++----------------------------------- examples/linux-serial.rs | 38 +++++++++++++++++++++++++++ src/i2c.rs | 2 +- src/serial.rs | 4 +-- 5 files changed, 51 insertions(+), 56 deletions(-) create mode 100644 examples/linux-serial.rs diff --git a/Cargo.toml b/Cargo.toml index b1d7023..bb5b5c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sen0177" description = "Read air quality data from the SEN0177 and PMSA003I sensors" -version = "0.4.0-alpha.1" +version = "0.5.0" authors = ["Brian J. Tarricone "] homepage = "https://github.com/kelnos/sen0177-rs" repository = "https://github.com/kelnos/sen0177-rs" @@ -20,9 +20,10 @@ default = [] std = [] [dependencies] -embedded-hal = "=1.0.0-alpha.8" +embedded-hal = "=1.0.0-rc.1" +embedded-hal-nb = "=1.0.0-rc.1" [dev-dependencies] anyhow = "1" -linux-embedded-hal = "0.3" +linux-embedded-hal = { git = "https://github.com/rust-embedded/linux-embedded-hal", rev = "27daf71e8ee22ff2b33fca5972a47dd139de69e2" } serial = "0.4" diff --git a/README.md b/README.md index f1fa5e1..90d4ca8 100644 --- a/README.md +++ b/README.md @@ -22,67 +22,23 @@ Include the following in your `Cargo.toml` file: ```toml [dependencies] -sen0177 = "0.4" +sen0177 = "0.5" ``` If you are in a `no_std` environment, you may depend on this crate like so: ```toml [dependencies] -sen0177 = { version = "0.4", default-features = false } +sen0177 = { version = "0.5", default-features = false } ``` ## Usage -This example shows how to use the sensor when connected to a Linux- -based serial device. +See the `examples/` directory. -Note that this example currently does not work becuase this crate is -tracking the current embedded-hal 1.0.0 alpha, but linux-embedded-hal -is a little behind at the time of writing. If you want to use my patched -version, add the following to your `Cargo.toml`: - -```toml -[patch.crates-io] -linux-embedded-hal = { git = "https://github.com/kelnos/linux-embedded-hal.git", branch = "embedded-hal-1.0.0-alpha.8" } -``` - -```rust,no_run,ignore -use linux_embedded_hal::Serial; -use sen0177::{serial::Sen0177, Reading}; -use serial::{core::prelude::*, BaudRate, CharSize, FlowControl, Parity, StopBits}; -use std::{io, path::Path, time::Duration}; - -const SERIAL_PORT: &str = "/dev/ttyS0"; -const BAUD_RATE: BaudRate = BaudRate::Baud9600; -const CHAR_SIZE: CharSize = CharSize::Bits8; -const PARITY: Parity = Parity::ParityNone; -const STOP_BITS: StopBits = StopBits::Stop1; -const FLOW_CONTROL: FlowControl = FlowControl::FlowNone; - -pub fn main() -> anyhow::Result<()> { - let mut serial = Serial::open(&Path::new(SERIAL_PORT))?; - serial.0.set_timeout(Duration::from_millis(1500))?; - serial.0.reconfigure(&|settings| { - settings.set_char_size(CHAR_SIZE); - settings.set_parity(PARITY); - settings.set_stop_bits(STOP_BITS); - settings.set_flow_control(FLOW_CONTROL); - settings.set_baud_rate(BAUD_RATE) - })?; - let mut sensor = Sen0177::new(serial); - - loop { - match sensor.read() { - Ok(reading) => { - println!("PM1: {}µg/m³, PM2.5: {}µg/m³, PM10: {}µg/m³", - reading.pm1(), reading.pm2_5(), reading.pm10()); - }, - Err(err) => eprintln!("Error: {:?}", err), - } - } -} -``` +Note that `linux-embedded-hal` does not currently have a release +supporting the 1.0.0 release candidates of `embedded-hal`, so the +Linux example has to pull `linux-embedded-hal` from GitHub. Note that the serial device occasionally returns bad data. If you receive [`SensorError::BadMagic`] or [`SensorError::ChecksumMismatch`] diff --git a/examples/linux-serial.rs b/examples/linux-serial.rs new file mode 100644 index 0000000..0f59306 --- /dev/null +++ b/examples/linux-serial.rs @@ -0,0 +1,38 @@ +use linux_embedded_hal::{ + serialport::{self, DataBits, FlowControl, Parity, StopBits}, + Serial, +}; +use sen0177::{serial::Sen0177, AirQualitySensor}; +use std::time::Duration; + +const SERIAL_PORT: &str = "/dev/ttyS0"; +const BAUD_RATE: u32 = 9600; +const DATA_BITS: DataBits = DataBits::Eight; +const PARITY: Parity = Parity::None; +const STOP_BITS: StopBits = StopBits::One; +const FLOW_CONTROL: FlowControl = FlowControl::None; + +pub fn main() -> anyhow::Result<()> { + let builder = serialport::new(SERIAL_PORT, BAUD_RATE) + .data_bits(DATA_BITS) + .flow_control(FLOW_CONTROL) + .parity(PARITY) + .stop_bits(STOP_BITS) + .timeout(Duration::from_millis(1500)); + let serial = Serial::open_from_builder(builder)?; + let mut sensor = Sen0177::new(serial); + + loop { + match sensor.read() { + Ok(reading) => { + println!( + "PM1: {}µg/m³, PM2.5: {}µg/m³, PM10: {}µg/m³", + reading.pm1(), + reading.pm2_5(), + reading.pm10() + ); + } + Err(err) => eprintln!("Error: {:?}", err), + } + } +} diff --git a/src/i2c.rs b/src/i2c.rs index b1eb2ee..94791d7 100644 --- a/src/i2c.rs +++ b/src/i2c.rs @@ -1,5 +1,5 @@ use crate::{read::*, AirQualitySensor, Reading, SensorError}; -use embedded_hal::i2c::{blocking::I2c, AddressMode, Error as I2cError}; +use embedded_hal::i2c::{AddressMode, Error as I2cError, I2c}; /// A SEN0177 device connected via I2C pub struct Sen0177 diff --git a/src/serial.rs b/src/serial.rs index 0ec3af5..2348d30 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -1,7 +1,7 @@ use crate::{read::*, AirQualitySensor, Reading, SensorError}; -use embedded_hal::{ +use embedded_hal_nb::{ nb::block, - serial::{nb::Read, Error as SerialError}, + serial::{Error as SerialError, Read}, }; /// A SEN0177 device connected via serial UART