Review comments
diff --git a/examples/ble_scanning.rs b/examples/ble_scanning.rs
index 8396399..bbbe76a 100644
--- a/examples/ble_scanning.rs
+++ b/examples/ble_scanning.rs
@@ -29,7 +29,12 @@
ble_parser::find(&my_buffer, simple_ble::gap_data::SERVICE_DATA as u8)
.and_then(|service_data| ble_parser::extract_for_service([91, 79], service_data))
.and_then(|payload| corepack::from_bytes::<LedCommand>(&payload).ok())
- .and_then(|msg| leds_driver.get(msg.nr as usize).map(|led| led.set(msg.st)));
+ .and_then(|msg| {
+ leds_driver
+ .get(msg.nr as usize)
+ .map(|led| led.set(msg.st))
+ .into()
+ });
});
let _subscription = drivers.ble_scanning.start(&mut callback)?;
diff --git a/examples/blink_random.rs b/examples/blink_random.rs
index 60bac18..93a263d 100644
--- a/examples/blink_random.rs
+++ b/examples/blink_random.rs
@@ -31,7 +31,7 @@
// Takes the 4 least-significant bits of x, and turn the 4 leds on/off accordingly.
fn blink_nibble(leds_driver: &LedsDriver, x: u8) -> TockResult<()> {
for i in 0..4 {
- let led = leds_driver.get(i).unwrap();
+ let led = leds_driver.get(i)?;
if (x >> i) & 1 != 0 {
led.on()?;
} else {
diff --git a/examples/button_leds.rs b/examples/button_leds.rs
index 794251d..4a48f2f 100644
--- a/examples/button_leds.rs
+++ b/examples/button_leds.rs
@@ -12,7 +12,7 @@
let leds_driver = drivers.leds.init_driver()?;
let mut callback = |button_num, state| {
- if let (ButtonState::Pressed, Some(led)) = (state, leds_driver.get(button_num)) {
+ if let (ButtonState::Pressed, Ok(led)) = (state, leds_driver.get(button_num)) {
led.toggle().ok().unwrap();
}
};
diff --git a/src/buttons.rs b/src/buttons.rs
index 5787f83..aac5cb2 100644
--- a/src/buttons.rs
+++ b/src/buttons.rs
@@ -1,6 +1,7 @@
use crate::callback::CallbackSubscription;
use crate::callback::Consumer;
use crate::result::OtherError;
+use crate::result::OutOfRangeError;
use crate::result::TockResult;
use crate::syscalls;
use core::marker::PhantomData;
@@ -41,14 +42,15 @@
self.num_buttons
}
- pub fn get(&self, button_num: usize) -> Option<Button> {
+ /// Returns the button at 0-based index `button_num`
+ pub fn get(&self, button_num: usize) -> Result<Button, OutOfRangeError> {
if button_num < self.num_buttons {
- Some(Button {
+ Ok(Button {
button_num,
lifetime: PhantomData,
})
} else {
- None
+ Err(OutOfRangeError)
}
}
diff --git a/src/callback.rs b/src/callback.rs
index 95d4e04..053806f 100644
--- a/src/callback.rs
+++ b/src/callback.rs
@@ -46,7 +46,7 @@
}
impl<'a> CallbackSubscription<'a> {
- pub fn new(driver_number: usize, subscribe_number: usize) -> CallbackSubscription<'a> {
+ pub(crate) fn new(driver_number: usize, subscribe_number: usize) -> CallbackSubscription<'a> {
CallbackSubscription {
driver_number,
subscribe_number,
diff --git a/src/leds.rs b/src/leds.rs
index 8fd9ce6..e0f420c 100644
--- a/src/leds.rs
+++ b/src/leds.rs
@@ -1,3 +1,4 @@
+use crate::result::OutOfRangeError;
use crate::result::TockResult;
use crate::syscalls::command;
use core::marker::PhantomData;
@@ -42,14 +43,15 @@
}
}
- pub fn get(&self, led_num: usize) -> Option<Led> {
+ /// Returns the led at 0-based index `led_num`
+ pub fn get(&self, led_num: usize) -> Result<Led, OutOfRangeError> {
if led_num < self.num_leds {
- Some(Led {
+ Ok(Led {
led_num,
lifetime: PhantomData,
})
} else {
- None
+ Err(OutOfRangeError)
}
}
}
diff --git a/src/result.rs b/src/result.rs
index 925dcdc..9dc4f16 100644
--- a/src/result.rs
+++ b/src/result.rs
@@ -72,6 +72,7 @@
TimerDriverDurationOutOfRange,
TimerDriverErroneousClockFrequency,
DriverAlreadyTaken,
+ OutOfRangeError,
}
impl From<OtherError> for TockError {
@@ -80,6 +81,14 @@
}
}
+pub struct OutOfRangeError;
+
+impl From<OutOfRangeError> for TockError {
+ fn from(_other: OutOfRangeError) -> Self {
+ TockError::Other(OtherError::OutOfRangeError)
+ }
+}
+
pub const SUCCESS: isize = 0;
pub const FAIL: isize = -1;
pub const EBUSY: isize = -2;