Skip to content

Commit 96981c8

Browse files
Make gpio::Error uninhabited and use it
1 parent 7b0c2ff commit 96981c8

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

src/gpio.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ pub enum Port {
7979
PH,
8080
}
8181

82+
/// Error type used by the GPIO trait impls.
83+
///
84+
/// GPIO operations cannot fail, so this is uninhabited.
8285
#[derive(Debug)]
83-
pub enum Error {
84-
Foo,
85-
}
86+
pub enum Error {}
8687

8788
macro_rules! gpio {
8889
($GPIOX:ident, $gpiox:ident, $iopxenr:ident, $PXx:ident, [
@@ -134,28 +135,28 @@ macro_rules! gpio {
134135
}
135136

136137
impl<MODE> OutputPin for $PXx<Output<MODE>> {
137-
type Error = ();
138+
type Error = super::Error;
138139

139-
fn set_high(&mut self) -> Result<(), ()> {
140+
fn set_high(&mut self) -> Result<(), Self::Error> {
140141
// NOTE(unsafe) atomic write to a stateless register
141142
unsafe { (*$GPIOX::ptr()).bsrr.write(|w| w.bits(1 << self.i)) };
142143
Ok(())
143144
}
144145

145-
fn set_low(&mut self) -> Result<(), ()> {
146+
fn set_low(&mut self) -> Result<(), Self::Error> {
146147
// NOTE(unsafe) atomic write to a stateless register
147148
unsafe { (*$GPIOX::ptr()).bsrr.write(|w| w.bits(1 << (self.i + 16))) };
148149
Ok(())
149150
}
150151
}
151152

152153
impl<MODE> StatefulOutputPin for $PXx<Output<MODE>> {
153-
fn is_set_high(&self) -> Result<bool, ()> {
154+
fn is_set_high(&self) -> Result<bool, Self::Error> {
154155
let is_high = self.is_set_low()?;
155156
Ok(is_high)
156157
}
157158

158-
fn is_set_low(&self) -> Result<bool, ()> {
159+
fn is_set_low(&self) -> Result<bool, Self::Error> {
159160
// NOTE(unsafe) atomic read with no side effects
160161
let is_low = unsafe { (*$GPIOX::ptr()).odr.read().bits() & (1 << self.i) == 0 };
161162
Ok(is_low)
@@ -165,29 +166,29 @@ macro_rules! gpio {
165166
impl<MODE> toggleable::Default for $PXx<Output<MODE>> {}
166167

167168
impl<MODE> InputPin for $PXx<Output<MODE>> {
168-
type Error = ();
169+
type Error = super::Error;
169170

170-
fn is_high(&self) -> Result<bool, ()> {
171+
fn is_high(&self) -> Result<bool, Self::Error> {
171172
let is_high = !self.is_low()?;
172173
Ok(is_high)
173174
}
174175

175-
fn is_low(&self) -> Result<bool, ()> {
176+
fn is_low(&self) -> Result<bool, Self::Error> {
176177
// NOTE(unsafe) atomic read with no side effects
177178
let is_low = unsafe { (*$GPIOX::ptr()).idr.read().bits() & (1 << self.i) == 0 };
178179
Ok(is_low)
179180
}
180181
}
181182

182183
impl<MODE> InputPin for $PXx<Input<MODE>> {
183-
type Error = ();
184+
type Error = super::Error;
184185

185-
fn is_high(&self) -> Result<bool, ()> {
186+
fn is_high(&self) -> Result<bool, Self::Error> {
186187
let is_high = !self.is_low()?;
187188
Ok(is_high)
188189
}
189190

190-
fn is_low(&self) -> Result<bool, ()> {
191+
fn is_low(&self) -> Result<bool, Self::Error> {
191192
// NOTE(unsafe) atomic read with no side effects
192193
let is_low = unsafe { (*$GPIOX::ptr()).idr.read().bits() & (1 << self.i) == 0 };
193194
Ok(is_low)
@@ -378,15 +379,15 @@ macro_rules! gpio {
378379
}
379380

380381
impl<MODE> OutputPin for $PXi<Output<MODE>> {
381-
type Error = ();
382+
type Error = super::Error;
382383

383-
fn set_high(&mut self) -> Result<(), ()> {
384+
fn set_high(&mut self) -> Result<(), Self::Error> {
384385
// NOTE(unsafe) atomic write to a stateless register
385386
unsafe { (*$GPIOX::ptr()).bsrr.write(|w| w.bits(1 << $i)) };
386387
Ok(())
387388
}
388389

389-
fn set_low(&mut self) -> Result<(), ()> {
390+
fn set_low(&mut self) -> Result<(), Self::Error> {
390391
// NOTE(unsafe) atomic write to a stateless register
391392
unsafe { (*$GPIOX::ptr()).bsrr.write(|w| w.bits(1 << ($i + 16))) };
392393
Ok(())
@@ -395,12 +396,12 @@ macro_rules! gpio {
395396

396397
impl<MODE> StatefulOutputPin for $PXi<Output<MODE>> {
397398

398-
fn is_set_high(&self) -> Result<bool, ()> {
399+
fn is_set_high(&self) -> Result<bool, Self::Error> {
399400
let is_set_high = !self.is_set_low()?;
400401
Ok(is_set_high)
401402
}
402403

403-
fn is_set_low(&self) -> Result<bool, ()> {
404+
fn is_set_low(&self) -> Result<bool, Self::Error> {
404405
// NOTE(unsafe) atomic read with no side effects
405406
let is_set_low = unsafe { (*$GPIOX::ptr()).odr.read().bits() & (1 << $i) == 0 };
406407
Ok(is_set_low)
@@ -410,14 +411,14 @@ macro_rules! gpio {
410411
impl<MODE> toggleable::Default for $PXi<Output<MODE>> {}
411412

412413
impl<MODE> InputPin for $PXi<Output<MODE>> {
413-
type Error = ();
414+
type Error = super::Error;
414415

415-
fn is_high(&self) -> Result<bool, ()> {
416+
fn is_high(&self) -> Result<bool, Self::Error> {
416417
let is_high = !self.is_low()?;
417418
Ok(is_high)
418419
}
419420

420-
fn is_low(&self) -> Result<bool, ()> {
421+
fn is_low(&self) -> Result<bool, Self::Error> {
421422
// NOTE(unsafe) atomic read with no side effects
422423
let is_low = unsafe { (*$GPIOX::ptr()).idr.read().bits() & (1 << $i) == 0 };
423424
Ok(is_low)
@@ -440,14 +441,14 @@ macro_rules! gpio {
440441

441442
impl<MODE> InputPin for $PXi<Input<MODE>> {
442443

443-
type Error = ();
444+
type Error = super::Error;
444445

445-
fn is_high(&self) -> Result<bool, ()> {
446+
fn is_high(&self) -> Result<bool, Self::Error> {
446447
let is_high = !self.is_low()?;
447448
Ok(is_high)
448449
}
449450

450-
fn is_low(&self) -> Result<bool, ()> {
451+
fn is_low(&self) -> Result<bool, Self::Error> {
451452
// NOTE(unsafe) atomic read with no side effects
452453
let is_low = unsafe { (*$GPIOX::ptr()).idr.read().bits() & (1 << $i) == 0 };
453454
Ok(is_low)

0 commit comments

Comments
 (0)