Address issues in PR

Also add some documentation.
This commit is contained in:
Richard Dodd 2021-05-05 18:33:45 +01:00
parent 0b3ccca69b
commit 9d427a1ba4

View File

@ -113,7 +113,12 @@ impl<'d, T: Pin> Output<'d, T> {
) -> Self { ) -> Self {
unborrow!(pin); unborrow!(pin);
init_output(&pin, initial_output, drive); match initial_output {
Level::High => pin.set_high(),
Level::Low => pin.set_low(),
}
init_output(&pin, drive);
Self { Self {
pin, pin,
@ -168,7 +173,9 @@ impl<'d, T: Pin> StatefulOutputPin for Output<'d, T> {
/// GPIO flexible pin. /// GPIO flexible pin.
/// ///
/// This pin can either be a disconnected, input, or output pin. /// This pin can either be a disconnected, input, or output pin. The level register bit will remain
/// set while not in output mode, so the pin's level will be 'remembered' when it is not in output
/// mode.
pub struct FlexPin<'d, T: Pin> { pub struct FlexPin<'d, T: Pin> {
pub(crate) pin: T, pub(crate) pin: T,
phantom: PhantomData<&'d mut T>, phantom: PhantomData<&'d mut T>,
@ -177,7 +184,8 @@ pub struct FlexPin<'d, T: Pin> {
impl<'d, T: Pin> FlexPin<'d, T> { impl<'d, T: Pin> FlexPin<'d, T> {
/// Wrap the pin in a `FlexPin`. /// Wrap the pin in a `FlexPin`.
/// ///
/// The pin remains disconnected. /// The pin remains disconnected. The initial output level is unspecified, but can be changed
/// before the pin is put into output mode.
pub fn new(pin: impl Unborrow<Target = T> + 'd) -> Self { pub fn new(pin: impl Unborrow<Target = T> + 'd) -> Self {
unborrow!(pin); unborrow!(pin);
// Pin will be in disconnected state. // Pin will be in disconnected state.
@ -187,17 +195,21 @@ impl<'d, T: Pin> FlexPin<'d, T> {
} }
} }
pub fn to_input(&self, pull: Pull) { /// Put the pin into input mode.
self.pin.conf().reset(); // TODO is this necessary? pub fn set_as_input(&mut self, pull: Pull) {
init_input(&self.pin, pull); init_input(&self.pin, pull);
} }
pub fn to_output(&self, initial_output: Level, drive: OutputDrive) { /// Put the pin into output mode.
self.pin.conf().reset(); // TODO is this necessary? ///
init_output(&self.pin, initial_output, drive); /// The pin level will be whatever was set before (or low by default). If you want it to begin
/// at a specific level, call `set_high`/`set_low` on the pin first.
pub fn set_as_output(&mut self, drive: OutputDrive) {
init_output(&self.pin, drive);
} }
pub fn disconnect(&self) { /// Put the pin into disconnected mode.
pub fn set_as_disconnected(&mut self) {
self.pin.conf().reset(); self.pin.conf().reset();
} }
} }
@ -397,12 +409,7 @@ fn init_input<T: Pin>(pin: &T, pull: Pull) {
/// Set up a pin for output /// Set up a pin for output
#[inline] #[inline]
fn init_output<T: Pin>(pin: &T, initial_output: Level, drive: OutputDrive) { fn init_output<T: Pin>(pin: &T, drive: OutputDrive) {
match initial_output {
Level::High => pin.set_high(),
Level::Low => pin.set_low(),
}
let drive = match drive { let drive = match drive {
OutputDrive::Standard => DRIVE_A::S0S1, OutputDrive::Standard => DRIVE_A::S0S1,
OutputDrive::HighDrive0Standard1 => DRIVE_A::H0S1, OutputDrive::HighDrive0Standard1 => DRIVE_A::H0S1,