# `defmt-brtt`: defmt over `rtt` and `bbq`, simultaneously!
This crate combines the functionality of `defmt-rtt` and `defmt-bbq` into one single crate.
This allows you to retrieve data over RTT, but also to pump it out over some other transport by reading the data from a `bbqueue`.
Even if that is not a use-case you're interested in, you can also `defmt-brtt` as an easier way of switching between using RTT and/or BBQueue as your defmt transport.
# Features
* `rtt`: activate the RTT transport (works exactly like [`defmt-rtt`](https://docs.rs/defmt-rtt/0.4.0/defmt_rtt/), except for [Buffer Size](#buffer-size)).
* `bbq`: activate the BBQueue transport (works exactly like [`defmt-bbq`](https://docs.rs/defmt-bbq/0.1.0/defmt_bbq/), except for [Buffer Size](#buffer-size)).
* `async-await`: add a function to `defmt_brtt::DefmtConsumer` that enables async-waiting for log data.
You must activate at least one of `rtt` and `bbq`.
# Buffer Size
To configure the buffer size used by `defmt-brtt`, you can set the environment variable `DEFMT_BRTT_BUFFER_SIZE` to the desired size.
For example, if we'd want to use a 512 byte internal buffer, we would run `DEFMT_BRTT_BUFFER_SIZE=512 cargo build` in the build directory of a project.
Note that `defmt-brtt` assigned one buffer of size `DEFMT_BRTT_BUFFER_SIZE` once for both `rtt` and `bbq`, if those features are activated.
# User code required for use
To use the `defmt` logger implementation provided by `defmt-brtt`, you must always add insert the following use statement somewhere in your project:
```rust
use defmt_brtt as _;
```
## `rtt`
To use the `rtt` functionality of this crate, you only need to do is activate the `rtt` feature (activated by default).
## `bbq`
To use the `bbq` functionality of this crate, you must activate the `bbq` feature (activated by default). You must call `defmt_brtt::init` and use the returned `DefmtConsumer` to consume the `defmt` data.
The data that is produced by the `DefmtConsumer` can then be transported and fed to a decoder, such as [`defmt-print`](https://crates.io/crates/defmt-print), that will reconstruct the log messages from the `defmt` data.
```rust
fn main() {
let logger = defmt_brtt::init();
loop {
if let Some(grant) = logger.read() {
let written_bytes = write_my_log_data_over_usb(&grant).ok();
// The step below is optional. Dropping the `Grant` releases
// all read bytes.
grant.release(written_bytes);
}
}
}
// If you have the `async-await` feature enabled, you
// can also do the following:
async fn read_logs(consumer: DefmtConsumer) {
loop {
let grant = logger.wait_for_log().await;
let written_bytes = write_my_log_data_over_usb(&grant).ok();
// The step below is optional. Dropping the `Grant` releases
// all read bytes.
grant.release(written_bytes);
}
}
```