Skip to content

Commit 4f38d8c

Browse files
committed
Use unwrap-infallible
After removing `void`, we're still missing a way to explicitly unwrap infallible results such that it is clear that no panic can occur in this location. Because the standard library does not yet provide a solution to this, let's use the `unwrap-infallible` crate [1] in the meantime. This topic was also discussed in more detail in the embedded-hal project [2]. [1]: https://crates.io/crates/unwrap-infallible [2]: rust-embedded/embedded-hal#329
1 parent bde492c commit 4f38d8c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+188
-147
lines changed

avr-hal-generic/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ paste = "1.0.0"
1212
avr-device = "0.5.3"
1313
embedded-storage = "0.2"
1414
embedded-hal = "1.0"
15+
unwrap-infallible = "0.1.5"
1516

1617
[dependencies.embedded-hal-v0]
1718
version = "0.2.3"

avr-hal-generic/src/adc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<H, ADC: AdcOps<H>> AdcChannel<H, ADC> for Channel<H, ADC> {
132132
/// let voltage = adc.read_blocking(&a0);
133133
///
134134
/// // alternatively, a non-blocking interface exists
135-
/// let voltage = nb::block!(adc.read_nonblocking(&a0)).unwrap();
135+
/// let voltage = nb::block!(adc.read_nonblocking(&a0)).unwrap_infallible();
136136
/// ```
137137
pub struct Adc<H, ADC: AdcOps<H>, CLOCK> {
138138
p: ADC,

avr-hal-generic/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub mod wdt;
2828
pub mod prelude {
2929
pub use hal::prelude::*;
3030
pub use ufmt::uWrite as _ufmt_uWrite;
31+
pub use unwrap_infallible::UnwrapInfallible as _unwrap_infallible_UnwrapInfallible;
3132
}
3233

3334
// For making certain traits unimplementable from outside this crate.

avr-hal-generic/src/usart.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
use core::cmp::Ordering;
66
use core::marker;
7+
use crate::prelude::*;
78

89
use crate::port;
910

@@ -219,11 +220,11 @@ pub trait UsartOps<H, RX, TX> {
219220
/// 57600.into_baudrate(),
220221
/// );
221222
///
222-
/// ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap();
223+
/// ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap_infallible();
223224
///
224225
/// loop {
225-
/// let b = nb::block!(serial.read()).unwrap();
226-
/// ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap();
226+
/// let b = nb::block!(serial.read()).unwrap_infallible();
227+
/// ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap_infallible();
227228
/// }
228229
/// ```
229230
pub struct Usart<H, USART: UsartOps<H, RX, TX>, RX, TX, CLOCK> {
@@ -278,22 +279,22 @@ impl<H, USART: UsartOps<H, RX, TX>, RX, TX, CLOCK> Usart<H, USART, RX, TX, CLOCK
278279

279280
/// Block until all remaining data has been transmitted.
280281
pub fn flush(&mut self) {
281-
nb::block!(self.p.raw_flush()).unwrap()
282+
nb::block!(self.p.raw_flush()).unwrap_infallible()
282283
}
283284

284285
/// Transmit a byte.
285286
///
286287
/// This method will block until the byte has been enqueued for transmission but **not** until
287288
/// it was entirely sent.
288289
pub fn write_byte(&mut self, byte: u8) {
289-
nb::block!(self.p.raw_write(byte)).unwrap()
290+
nb::block!(self.p.raw_write(byte)).unwrap_infallible()
290291
}
291292

292293
/// Receive a byte.
293294
///
294295
/// This method will block until a byte could be received.
295296
pub fn read_byte(&mut self) -> u8 {
296-
nb::block!(self.p.raw_read()).unwrap()
297+
nb::block!(self.p.raw_read()).unwrap_infallible()
297298
}
298299

299300
/// Enable the interrupt for [`Event`].
@@ -437,7 +438,7 @@ impl<H, USART: UsartOps<H, RX, TX>, RX, TX, CLOCK> ufmt::uWrite
437438

438439
fn write_str(&mut self, s: &str) -> Result<(), Self::Error> {
439440
for b in s.as_bytes().iter() {
440-
nb::block!(self.p.raw_write(*b)).unwrap()
441+
nb::block!(self.p.raw_write(*b)).unwrap_infallible()
441442
}
442443
Ok(())
443444
}

examples/arduino-diecimila/src/bin/diecimila-adc.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use arduino_hal::adc;
@@ -17,8 +18,8 @@ fn main() -> ! {
1718
adc.read_blocking(&adc::channel::Vbg),
1819
adc.read_blocking(&adc::channel::Gnd),
1920
);
20-
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap();
21-
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap();
21+
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap_infallible();
22+
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap_infallible();
2223

2324
// To store multiple channels in an array, we use the `into_channel()` method.
2425
let channels: [adc::Channel; 6] = [
@@ -33,10 +34,10 @@ fn main() -> ! {
3334
loop {
3435
for (i, ch) in channels.iter().enumerate() {
3536
let v = adc.read_blocking(ch);
36-
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap();
37+
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap_infallible();
3738
}
3839

39-
ufmt::uwriteln!(&mut serial, "").unwrap();
40+
ufmt::uwriteln!(&mut serial, "").unwrap_infallible();
4041
arduino_hal::delay_ms(1000);
4142
}
4243
}

examples/arduino-diecimila/src/bin/diecimila-i2cdetect.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
#[arduino_hal::entry]
@@ -16,12 +17,12 @@ fn main() -> ! {
1617
50000,
1718
);
1819

19-
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap();
20+
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap_infallible();
2021
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write)
21-
.unwrap();
22-
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap();
22+
.unwrap_infallible();
23+
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap_infallible();
2324
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read)
24-
.unwrap();
25+
.unwrap_infallible();
2526

2627
loop {}
2728
}

examples/arduino-diecimila/src/bin/diecimila-spi-feedback.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#![no_std]
1616
#![no_main]
1717

18+
use arduino_hal::prelude::*;
1819
use arduino_hal::spi;
1920
use embedded_hal_v0::spi::FullDuplex;
2021
use panic_halt as _;
@@ -39,11 +40,11 @@ fn main() -> ! {
3940

4041
loop {
4142
// Send a byte
42-
nb::block!(spi.send(0b00001111)).unwrap();
43+
nb::block!(spi.send(0b00001111)).unwrap_infallible();
4344
// Because MISO is connected to MOSI, the read data should be the same
44-
let data = nb::block!(spi.read()).unwrap();
45+
let data = nb::block!(spi.read()).unwrap_infallible();
4546

46-
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap();
47+
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap_infallible();
4748
arduino_hal::delay_ms(1000);
4849
}
4950
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use embedded_hal_v0::serial::Read;
@@ -11,13 +12,13 @@ fn main() -> ! {
1112
let pins = arduino_hal::pins!(dp);
1213
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);
1314

14-
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap();
15+
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap_infallible();
1516

1617
loop {
1718
// Read a byte from the serial connection default
18-
let b = nb::block!(serial.read()).unwrap();
19+
let b = nb::block!(serial.read()).unwrap_infallible();
1920

2021
// Answer
21-
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap();
22+
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap_infallible();
2223
}
2324
}

examples/arduino-leonardo/src/bin/leonardo-adc.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use arduino_hal::adc;
@@ -18,9 +19,9 @@ fn main() -> ! {
1819
adc.read_blocking(&adc::channel::Gnd),
1920
adc.read_blocking(&adc::channel::Temperature),
2021
);
21-
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap();
22-
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap();
23-
ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).unwrap();
22+
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap_infallible();
23+
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap_infallible();
24+
ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).unwrap_infallible();
2425

2526
let a0 = pins.a0.into_analog_input(&mut adc);
2627
let a1 = pins.a1.into_analog_input(&mut adc);
@@ -40,10 +41,10 @@ fn main() -> ! {
4041
];
4142

4243
for (i, v) in values.iter().enumerate() {
43-
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap();
44+
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap_infallible();
4445
}
4546

46-
ufmt::uwriteln!(&mut serial, "").unwrap();
47+
ufmt::uwriteln!(&mut serial, "").unwrap_infallible();
4748
arduino_hal::delay_ms(1000);
4849
}
4950
}

examples/arduino-leonardo/src/bin/leonardo-i2cdetect.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
#[arduino_hal::entry]
@@ -16,10 +17,10 @@ fn main() -> ! {
1617
50000,
1718
);
1819

19-
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap();
20-
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write).unwrap();
21-
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap();
22-
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read).unwrap();
20+
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap_infallible();
21+
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write).unwrap_infallible();
22+
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap_infallible();
23+
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read).unwrap_infallible();
2324

2425
loop {}
2526
}

examples/arduino-leonardo/src/bin/leonardo-spi-feedback.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#![no_std]
1616
#![no_main]
1717

18+
use arduino_hal::prelude::*;
1819
use arduino_hal::spi;
1920
use embedded_hal_v0::spi::FullDuplex;
2021
use panic_halt as _;
@@ -39,11 +40,11 @@ fn main() -> ! {
3940

4041
loop {
4142
// Send a byte
42-
nb::block!(spi.send(0b00001111)).unwrap();
43+
nb::block!(spi.send(0b00001111)).unwrap_infallible();
4344
// Because MISO is connected to MOSI, the read data should be the same
44-
let data = nb::block!(spi.read()).unwrap();
45+
let data = nb::block!(spi.read()).unwrap_infallible();
4546

46-
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap();
47+
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap_infallible();
4748
arduino_hal::delay_ms(1000);
4849
}
4950
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use embedded_hal_v0::serial::Read;
@@ -11,13 +12,13 @@ fn main() -> ! {
1112
let pins = arduino_hal::pins!(dp);
1213
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);
1314

14-
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap();
15+
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap_infallible();
1516

1617
loop {
1718
// Read a byte from the serial connection
18-
let b = nb::block!(serial.read()).unwrap();
19+
let b = nb::block!(serial.read()).unwrap_infallible();
1920

2021
// Answer
21-
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap();
22+
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap_infallible();
2223
}
2324
}

examples/arduino-mega1280/src/bin/mega1280-adc.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use arduino_hal::adc;
@@ -17,8 +18,8 @@ fn main() -> ! {
1718
adc.read_blocking(&adc::channel::Vbg),
1819
adc.read_blocking(&adc::channel::Gnd),
1920
);
20-
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap();
21-
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap();
21+
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).unwrap_infallible();
22+
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).unwrap_infallible();
2223

2324
// To store multiple channels in an array, we use the `into_channel()` method.
2425
let channels: [adc::Channel; 16] = [
@@ -43,10 +44,10 @@ fn main() -> ! {
4344
loop {
4445
for (i, ch) in channels.iter().enumerate() {
4546
let v = adc.read_blocking(ch);
46-
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap();
47+
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).unwrap_infallible();
4748
}
4849

49-
ufmt::uwriteln!(&mut serial, "").unwrap();
50+
ufmt::uwriteln!(&mut serial, "").unwrap_infallible();
5051
arduino_hal::delay_ms(1000);
5152
}
5253
}

examples/arduino-mega1280/src/bin/mega1280-i2cdetect.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
#[arduino_hal::entry]
@@ -16,10 +17,10 @@ fn main() -> ! {
1617
50000,
1718
);
1819

19-
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap();
20-
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write).unwrap();
21-
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap();
22-
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read).unwrap();
20+
ufmt::uwriteln!(&mut serial, "Write direction test:\r").unwrap_infallible();
21+
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Write).unwrap_infallible();
22+
ufmt::uwriteln!(&mut serial, "\r\nRead direction test:\r").unwrap_infallible();
23+
i2c.i2cdetect(&mut serial, arduino_hal::i2c::Direction::Read).unwrap_infallible();
2324

2425
loop {}
2526
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![no_std]
22
#![no_main]
33

4+
use arduino_hal::prelude::*;
45
use panic_halt as _;
56

67
use embedded_hal_v0::serial::Read;
@@ -11,13 +12,13 @@ fn main() -> ! {
1112
let pins = arduino_hal::pins!(dp);
1213
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);
1314

14-
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap();
15+
ufmt::uwriteln!(&mut serial, "Hello from Arduino!\r").unwrap_infallible();
1516

1617
loop {
1718
// Read a byte from the serial connection
18-
let b = nb::block!(serial.read()).unwrap();
19+
let b = nb::block!(serial.read()).unwrap_infallible();
1920

2021
// Answer
21-
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap();
22+
ufmt::uwriteln!(&mut serial, "Got {}!\r", b).unwrap_infallible();
2223
}
2324
}

examples/arduino-mega1280/src/bin/mega1280spi-feedback.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#![no_std]
1616
#![no_main]
1717

18+
use arduino_hal::prelude::*;
1819
use arduino_hal::spi;
1920
use embedded_hal_v0::spi::FullDuplex;
2021
use panic_halt as _;
@@ -39,11 +40,11 @@ fn main() -> ! {
3940

4041
loop {
4142
// Send a byte
42-
nb::block!(spi.send(0b00001111)).unwrap();
43+
nb::block!(spi.send(0b00001111)).unwrap_infallible();
4344
// Because MISO is connected to MOSI, the read data should be the same
44-
let data = nb::block!(spi.read()).unwrap();
45+
let data = nb::block!(spi.read()).unwrap_infallible();
4546

46-
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap();
47+
ufmt::uwriteln!(&mut serial, "data: {}\r", data).unwrap_infallible();
4748
arduino_hal::delay_ms(1000);
4849
}
4950
}

0 commit comments

Comments
 (0)