# bsec crate Rust API to the [Bosch BSEC library](https://www.bosch-sensortec.com/software-tools/software/bsec/). This readme will use *bsec* to refer to this crate, while *Bosch BSEC* is used to refer to the original BSEC library provided by Bosch. ## Important license information The *Bosch BSEC* library is proprietary. Thus, the *Bosch BSEC* library and its documentation cannot be included in the *bsec* Rust crate and need to be obtained separately. While the *bsec* documentation covers the Rust crate itself, you will likely have to refer to the *Bosch BSEC* documentation at some points to get a full understanding. You are responsible for adhering to the Bosch BSEC lincese terms in your products, despite the Rust API in this crate being published under a permissive license. * [Bosch BSEC website to obtain your copy](https://www.bosch-sensortec.com/software-tools/software/bsec/) * [Bosch BESC license terms at the time of writing](https://www.bosch-sensortec.com/media/boschsensortec/downloads/bsec/2017-07-17_clickthrough_license_terms_environmentalib_sw_clean.pdf) ## Features * Safe Rust API bindings to the *Bosch BSEC* library. * Implementation to use it with the [BME680](https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme680/) sensor. * Extensible to other sensors. * Rudimentary fake sensor implementation to use in unit tests. ## Documentation [The crate documentation can be found on docs.rs.](https://docs.rs/bsec/latest/bsec/index.html) ## Getting started [See the crate documentation.](https://docs.rs/bsec/latest/bsec/index.html#getting-started) ## Usage example ```rust use bsec::{Bsec, Input, InputKind, OutputKind, clock::Clock, SampleRate, SubscriptionRequest}; use nb::block; use std::time::Duration; // Acquire handle to the BSEC library. // Only one such handle can be acquired at any time. let mut bsec: Bsec<_, TimePassed, _> = Bsec::init(sensor, &clock)?; // Configure the outputs you want to subscribe to. bsec.update_subscription(&[ SubscriptionRequest { sample_rate: SampleRate::Lp, sensor: OutputKind::Iaq, }, ])?; // We need to feed BSEC regularly with new measurements. loop { // Wait for when the next measurement is due. sleep_for(Duration::from_nanos((bsec.next_measurement() - clock.timestamp_ns()) as u64)); // Start the measurement. let wait_duration = block!(bsec.start_next_measurement())?; sleep_for(wait_duration); # clock.advance_by(wait_duration); // Process the measurement when ready and print the BSEC outputs. let outputs = block!(bsec.process_last_measurement())?; for output in &outputs { println!("{:?}: {}", output.sensor, output.signal); } } ```