-
Notifications
You must be signed in to change notification settings - Fork 223
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Digital v1 <-> v2 compatibility wrappers and shims #127
Merged
bors
merged 11 commits into
rust-embedded:master
from
ryankurte:feature/digital-compat-shims-a
Mar 21, 2019
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
da8b3d4
Working on compatibility shims for digital traits
ryankurte 11f83aa
Fixed v1/v2 compatibility.
ryankurte 24854c8
Added constructors
ryankurte ae11cf3
updated changelog
ryankurte e3c4d12
remove old incompatibilty warning
ryankurte f8e85ca
made suggested changes / improved and fixed tests
ryankurte a157a54
Apply suggestions from code review
eldruin 7cbdc3f
Clean up comments
ryankurte c74f8d1
made panic notes more consistent
ryankurte bf5ecee
removed .inner from external interface, fixed test without unproven
ryankurte dbf815c
Apply suggestions from code review
therealprof File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,155 +1,25 @@ | ||
//! Digital I/O | ||
//! | ||
//! The traits in this module are now deprecated. Please use the new versions included | ||
//! in `digital::v2`. | ||
|
||
/// Single digital push-pull output pin | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `OutputPin` trait in | ||
/// `digital::v2::OutputPin`*. | ||
#[deprecated(since = "0.2.2", note = "Deprecated because the methods cannot return errors. \ | ||
Users should use the traits in digital::v2.")] | ||
pub trait OutputPin { | ||
/// Drives the pin low | ||
/// | ||
/// *NOTE* the actual electrical state of the pin may not actually be low, e.g. due to external | ||
/// electrical sources | ||
fn set_low(&mut self); | ||
|
||
/// Drives the pin high | ||
/// | ||
/// *NOTE* the actual electrical state of the pin may not actually be high, e.g. due to external | ||
/// electrical sources | ||
fn set_high(&mut self); | ||
} | ||
|
||
/// Push-pull output pin that can read its output state | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `StatefulOutputPin` trait in | ||
/// `digital::v2::StatefulOutputPin`*. | ||
#[deprecated(since = "0.2.2", note = "Deprecated because the methods cannot return errors. \ | ||
Users should use the traits in digital::v2.")] | ||
#[cfg(feature = "unproven")] | ||
pub trait StatefulOutputPin { | ||
/// Is the pin in drive high mode? | ||
/// | ||
/// *NOTE* this does *not* read the electrical state of the pin | ||
fn is_set_high(&self) -> bool; | ||
|
||
/// Is the pin in drive low mode? | ||
/// | ||
/// *NOTE* this does *not* read the electrical state of the pin | ||
fn is_set_low(&self) -> bool; | ||
} | ||
|
||
/// Output pin that can be toggled | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `ToggleableOutputPin` | ||
/// trait in `digital::v2::ToggleableOutputPin`*. | ||
/// | ||
/// See [toggleable](toggleable) to use a software implementation if | ||
/// both [OutputPin](trait.OutputPin.html) and | ||
/// [StatefulOutputPin](trait.StatefulOutputPin.html) are | ||
/// implemented. Otherwise, implement this using hardware mechanisms. | ||
#[deprecated(since = "0.2.2", note = "Deprecated because the methods cannot return errors. \ | ||
Users should use the traits in digital::v2.")] | ||
#[cfg(feature = "unproven")] | ||
pub trait ToggleableOutputPin { | ||
/// Toggle pin output. | ||
fn toggle(&mut self); | ||
} | ||
//! | ||
//! | ||
|
||
/// If you can read **and** write the output state, a pin is | ||
/// toggleable by software. | ||
/// | ||
/// *This version of the module is now deprecated. Please use the new `toggleable` module in | ||
/// `digital::v2::toggleable`*. | ||
/// | ||
/// ``` | ||
/// use embedded_hal::digital::{OutputPin, StatefulOutputPin, ToggleableOutputPin}; | ||
/// use embedded_hal::digital::toggleable; | ||
/// | ||
/// /// A virtual output pin that exists purely in software | ||
/// struct MyPin { | ||
/// state: bool | ||
/// } | ||
/// | ||
/// impl OutputPin for MyPin { | ||
/// fn set_low(&mut self) { | ||
/// self.state = false; | ||
/// } | ||
/// fn set_high(&mut self) { | ||
/// self.state = true; | ||
/// } | ||
/// } | ||
/// | ||
/// impl StatefulOutputPin for MyPin { | ||
/// fn is_set_low(&self) -> bool { | ||
/// !self.state | ||
/// } | ||
/// fn is_set_high(&self) -> bool { | ||
/// self.state | ||
/// } | ||
/// } | ||
/// | ||
/// /// Opt-in to the software implementation. | ||
/// impl toggleable::Default for MyPin {} | ||
/// | ||
/// let mut pin = MyPin { state: false }; | ||
/// pin.toggle(); | ||
/// assert!(pin.is_set_high()); | ||
/// pin.toggle(); | ||
/// assert!(pin.is_set_low()); | ||
/// ``` | ||
// Deprecated / infallible traits | ||
#[deprecated(since = "0.2.2", note = "Deprecated because the methods cannot return errors. \ | ||
Users should use the traits in digital::v2.")] | ||
#[cfg(feature = "unproven")] | ||
pub mod toggleable { | ||
#[allow(deprecated)] | ||
use super::{OutputPin, StatefulOutputPin, ToggleableOutputPin}; | ||
pub mod v1; | ||
|
||
/// Software-driven `toggle()` implementation. | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
#[allow(deprecated)] | ||
pub trait Default: OutputPin + StatefulOutputPin {} | ||
// New / fallible traits | ||
pub mod v2; | ||
|
||
#[allow(deprecated)] | ||
impl<P> ToggleableOutputPin for P | ||
where | ||
P: Default, | ||
{ | ||
/// Toggle pin output | ||
fn toggle(&mut self) { | ||
if self.is_set_low() { | ||
self.set_high(); | ||
} else { | ||
self.set_low(); | ||
} | ||
} | ||
} | ||
} | ||
// v2 -> v1 compatibility wrappers | ||
// These require explicit casts from v2 -> v1 | ||
pub mod v1_compat; | ||
|
||
/// Single digital input pin | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `InputPin` trait in | ||
/// `digital::v2::InputPin`*. | ||
#[deprecated(since = "0.2.2", note = "Deprecated because the methods cannot return errors. \ | ||
Users should use the traits in digital::v2.")] | ||
#[cfg(feature = "unproven")] | ||
pub trait InputPin { | ||
/// Is the input pin high? | ||
fn is_high(&self) -> bool; | ||
// v1 -> v2 compatibility shims | ||
// These are implicit over v1 implementations | ||
pub mod v2_compat; | ||
|
||
/// Is the input pin low? | ||
fn is_low(&self) -> bool; | ||
} | ||
// Re-export old traits so this isn't a breaking change | ||
#[allow(deprecated)] | ||
pub use self::v1::*; | ||
|
||
/// Improved version of the digital traits where the methods can also return an error. | ||
pub mod v2; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
//! Digital I/O | ||
//! | ||
//! The traits in this module are now deprecated. Please use the new versions included | ||
//! in `digital::v2`. | ||
|
||
#![allow(deprecated)] | ||
|
||
/// Single digital push-pull output pin | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `OutputPin` trait in | ||
/// `digital::v2::OutputPin`*. | ||
|
||
pub trait OutputPin { | ||
/// Drives the pin low | ||
/// | ||
/// *NOTE* the actual electrical state of the pin may not actually be low, e.g. due to external | ||
/// electrical sources | ||
fn set_low(&mut self); | ||
|
||
/// Drives the pin high | ||
/// | ||
/// *NOTE* the actual electrical state of the pin may not actually be high, e.g. due to external | ||
/// electrical sources | ||
fn set_high(&mut self); | ||
} | ||
|
||
/// Push-pull output pin that can read its output state | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `StatefulOutputPin` trait in | ||
/// `digital::v2::StatefulOutputPin`*. | ||
#[cfg(feature = "unproven")] | ||
pub trait StatefulOutputPin { | ||
/// Is the pin in drive high mode? | ||
/// | ||
/// *NOTE* this does *not* read the electrical state of the pin | ||
fn is_set_high(&self) -> bool; | ||
|
||
/// Is the pin in drive low mode? | ||
/// | ||
/// *NOTE* this does *not* read the electrical state of the pin | ||
fn is_set_low(&self) -> bool; | ||
} | ||
|
||
/// Output pin that can be toggled | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `ToggleableOutputPin` | ||
/// trait in `digital::v2::ToggleableOutputPin`*. | ||
/// | ||
/// See [toggleable](toggleable) to use a software implementation if | ||
/// both [OutputPin](trait.OutputPin.html) and | ||
/// [StatefulOutputPin](trait.StatefulOutputPin.html) are | ||
/// implemented. Otherwise, implement this using hardware mechanisms. | ||
#[cfg(feature = "unproven")] | ||
pub trait ToggleableOutputPin { | ||
/// Toggle pin output. | ||
fn toggle(&mut self); | ||
} | ||
|
||
/// If you can read **and** write the output state, a pin is | ||
/// toggleable by software. | ||
/// | ||
/// *This version of the module is now deprecated. Please use the new `toggleable` module in | ||
/// `digital::v2::toggleable`*. | ||
/// | ||
/// ``` | ||
/// use embedded_hal::digital::{OutputPin, StatefulOutputPin, ToggleableOutputPin}; | ||
/// use embedded_hal::digital::toggleable; | ||
/// | ||
/// /// A virtual output pin that exists purely in software | ||
/// struct MyPin { | ||
/// state: bool | ||
/// } | ||
/// | ||
/// impl OutputPin for MyPin { | ||
/// fn set_low(&mut self) { | ||
/// self.state = false; | ||
/// } | ||
/// fn set_high(&mut self) { | ||
/// self.state = true; | ||
/// } | ||
/// } | ||
/// | ||
/// impl StatefulOutputPin for MyPin { | ||
/// fn is_set_low(&self) -> bool { | ||
/// !self.state | ||
/// } | ||
/// fn is_set_high(&self) -> bool { | ||
/// self.state | ||
/// } | ||
/// } | ||
/// | ||
/// /// Opt-in to the software implementation. | ||
/// impl toggleable::Default for MyPin {} | ||
/// | ||
/// let mut pin = MyPin { state: false }; | ||
/// pin.toggle(); | ||
/// assert!(pin.is_set_high()); | ||
/// pin.toggle(); | ||
/// assert!(pin.is_set_low()); | ||
/// ``` | ||
#[cfg(feature = "unproven")] | ||
pub mod toggleable { | ||
#[allow(deprecated)] | ||
use super::{OutputPin, StatefulOutputPin, ToggleableOutputPin}; | ||
|
||
/// Software-driven `toggle()` implementation. | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
#[allow(deprecated)] | ||
pub trait Default: OutputPin + StatefulOutputPin {} | ||
|
||
#[allow(deprecated)] | ||
impl<P> ToggleableOutputPin for P | ||
where | ||
P: Default, | ||
{ | ||
/// Toggle pin output | ||
fn toggle(&mut self) { | ||
if self.is_set_low() { | ||
self.set_high(); | ||
} else { | ||
self.set_low(); | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Single digital input pin | ||
/// | ||
/// *This trait is available if embedded-hal is built with the `"unproven"` feature.* | ||
/// | ||
/// *This version of the trait is now deprecated. Please use the new `InputPin` trait in | ||
/// `digital::v2::InputPin`*. | ||
#[cfg(feature = "unproven")] | ||
pub trait InputPin { | ||
/// Is the input pin high? | ||
fn is_high(&self) -> bool; | ||
|
||
/// Is the input pin low? | ||
fn is_low(&self) -> bool; | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we get rid of all the
#[cfg(feature = "unproven")]
in v1_compat.rs with this?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah but it'll fail if we prove one of the traits without the others?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, sure. But we could introduce all the
#[cfg(feature = "unproven")]
in the necessary places then. We could enjoy cleaner code as long as that does not happen.