Address review feedback

This commit is contained in:
ivmarkov 2022-10-24 11:10:59 +03:00
parent 4d5550070f
commit f78c706b89
3 changed files with 34 additions and 22 deletions

View File

@ -245,19 +245,23 @@ impl Driver for RtcDriver {
fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool { fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
critical_section::with(|cs| { critical_section::with(|cs| {
let t = self.now();
// If alarm timestamp has passed don't set the alarm and return `false` to indicate that.
if timestamp <= t {
return false;
}
let n = alarm.id() as _; let n = alarm.id() as _;
let alarm = self.get_alarm(cs, alarm); let alarm = self.get_alarm(cs, alarm);
alarm.timestamp.set(timestamp); alarm.timestamp.set(timestamp);
let r = rtc(); let r = rtc();
let t = self.now();
if timestamp <= t {
// If alarm timestamp has passed the alarm will not fire.
// Disarm the alarm and return `false` to indicate that.
r.intenclr.write(|w| unsafe { w.bits(compare_n(n)) });
alarm.timestamp.set(u64::MAX);
return false;
}
// If it hasn't triggered yet, setup it in the compare channel. // If it hasn't triggered yet, setup it in the compare channel.
// Write the CC value regardless of whether we're going to enable it now or not. // Write the CC value regardless of whether we're going to enable it now or not.

View File

@ -71,13 +71,6 @@ impl Driver for TimerDriver {
fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool { fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
let n = alarm.id() as usize; let n = alarm.id() as usize;
critical_section::with(|cs| { critical_section::with(|cs| {
let now = self.now();
// If alarm timestamp has passed don't set the alarm and return `false` to indicate that.
if timestamp <= now {
return false;
}
let alarm = &self.alarms.borrow(cs)[n]; let alarm = &self.alarms.borrow(cs)[n];
alarm.timestamp.set(timestamp); alarm.timestamp.set(timestamp);
@ -87,7 +80,18 @@ impl Driver for TimerDriver {
// it is checked if the alarm time has passed. // it is checked if the alarm time has passed.
unsafe { pac::TIMER.alarm(n).write_value(timestamp as u32) }; unsafe { pac::TIMER.alarm(n).write_value(timestamp as u32) };
true let now = self.now();
if timestamp <= now {
// If alarm timestamp has passed the alarm will not fire.
// Disarm the alarm and return `false` to indicate that.
unsafe { pac::TIMER.armed().write(|w| w.set_armed(1 << n)) }
alarm.timestamp.set(u64::MAX);
false
} else {
true
}
}) })
} }
} }

View File

@ -294,19 +294,23 @@ impl Driver for RtcDriver {
fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool { fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
critical_section::with(|cs| { critical_section::with(|cs| {
let t = self.now();
// If alarm timestamp has passed don't set the alarm and return `false` to indicate that.
if timestamp <= t {
return false;
}
let r = T::regs_gp16(); let r = T::regs_gp16();
let n = alarm.id() as _; let n = alarm.id() as _;
let alarm = self.get_alarm(cs, alarm); let alarm = self.get_alarm(cs, alarm);
alarm.timestamp.set(timestamp); alarm.timestamp.set(timestamp);
let t = self.now();
if timestamp <= t {
// If alarm timestamp has passed the alarm will not fire.
// Disarm the alarm and return `false` to indicate that.
unsafe { r.dier().modify(|w| w.set_ccie(n + 1, false)) };
alarm.timestamp.set(u64::MAX);
return false;
}
let safe_timestamp = timestamp.max(t + 3); let safe_timestamp = timestamp.max(t + 3);
// Write the CCR value regardless of whether we're going to enable it now or not. // Write the CCR value regardless of whether we're going to enable it now or not.