Crate embedded_hal_compat

source ·
Expand description

A compatibility layer to alleviate (some) of the issues resolving from changes to embedded-hal. This crate lets you easily mix and match drivers and hal implementations using v1.x.x and v0.2.x versions of embedded-hal, just add a .forward() or a .reverse() wherever you see trait bounds errors.

Note that no effort is made to support interoperability between alpha versions, we’ll do our best to keep up with the latest alpha and swap to 1.0.0 on release. In the future these traits may be renamed to support more hal versions.

§Forward compatibility:

Calling ForwardCompat::forward() (or .forward()) on v0.2.x types creates a wrapper for use with v1.0.x consumers, so you can drop these wrapped types into drivers expecting v1.0.x types.

Note that GPIO pins will require annotation with marker types (see markers) to select input / output / combined modes.

 use embedded_hal_compat::{Forward, ForwardCompat, markers::*};

 // Create e-h v0.2.x based type (mock)
 let mut old = OutputPin0_2;
 // Access via e-h v0.2.x methods
 let _ = eh0_2::digital::v2::OutputPin::set_high(&mut old);

 // Apply forward compatibility wrapper
 let mut new: Forward<_, ForwardIoPin> = old.forward();
 // Access via e-h v1.x.x methods
 let _ = eh1_0::digital::OutputPin::set_high(&mut new);

§Backwards compatibility:

Calling ReverseCompat::reverse() (or .reverse()) on v1.0.x types creates a wrapper for use with v0.2.x consumers, so you can drop these wrapped types into drivers expecting v0.2.x types.

Note that input and output pins require .reverse_cell() as a workaround for mutability changes.

 use embedded_hal_compat::ReverseCompat;

 // Create e-h v1.x.x based type (mock)
 let mut new = OutputPin1_0;
 // Access via e-h v1.x.x methods
 let _ = eh1_0::digital::OutputPin::set_high(&mut new);

 // Apply backwards compatibility wrapper
 let mut old = new.reverse_cell();
 // Access via e-h v0.2.x methods
 let _ = eh0_2::digital::v2::OutputPin::set_high(&mut old);
use embedded_hal_compat::ReverseCompat;

// Create e-h v1.x.x based type (mock)
let mut new = InputPin1_0;
// Access via e-h v1.x.x methods
let _ = eh1_0::digital::InputPin::is_high(&mut new);

// Apply backwards compatibility wrapper
let mut old = new.reverse_cell();
// Access via e-h v0.2.x methods
let _ = eh0_2::digital::v2::InputPin::is_high(&mut old);

§Optional features

§alloc

The alloc feature enables an implementation of the I2C and SPI Transactional traits from embedded-hal v0.2.x for the “reverse” direction.

For example, when your MCU implements theembedded-hal 1.0.0 traits and you want to connect with an I2C or SPI driver that uses the Transactional traits of embedded-hal 0.2.x.

For all other cases, this feature is unnecessary.

Do not enable it if you do not need it.

Note that this introduces a dependency on the core allocation library.

Re-exports§

Modules§

Structs§

  • Forward compatibility container object. This is generic over different E-H types and will provide adaption depending on the bound type.
  • Reverse compatibility container object. This is generic over different E-H types and will provide adaption depending on the bound type.

Traits§

  • Helper trait to convert a type for forward compatibility call .forward() on e-h@0.2.x types to create an e-h@1.x.x compatible wrapper object
  • Convert a type into a reverse compatibility wrapper object call .reverse() on e-h@1.0.x types to create an e-h@0.2.x compatible wrapper object