diff options
| author | Dániel Buga <[email protected]> | 2024-11-26 23:54:21 +0100 |
|---|---|---|
| committer | Dániel Buga <[email protected]> | 2024-12-10 21:31:42 +0100 |
| commit | 5a5495aac43d75610735f2ca80fb6c8e8f31ed71 (patch) | |
| tree | 7a4336917894730692589359e9d1a285ec5a0a05 /embassy-time/src/driver_mock.rs | |
| parent | 406d377b7564d16e12b7fae4f42c0c709bf4f243 (diff) | |
Refactor integrated-timers
Diffstat (limited to 'embassy-time/src/driver_mock.rs')
| -rw-r--r-- | embassy-time/src/driver_mock.rs | 85 |
1 files changed, 25 insertions, 60 deletions
diff --git a/embassy-time/src/driver_mock.rs b/embassy-time/src/driver_mock.rs index 8587f9172..829eb0437 100644 --- a/embassy-time/src/driver_mock.rs +++ b/embassy-time/src/driver_mock.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | use core::cell::RefCell; | 1 | use core::cell::RefCell; |
| 2 | 2 | ||
| 3 | use critical_section::Mutex as CsMutex; | 3 | use critical_section::Mutex as CsMutex; |
| 4 | use embassy_time_driver::{AlarmHandle, Driver}; | 4 | use embassy_time_driver::Driver; |
| 5 | 5 | ||
| 6 | use crate::{Duration, Instant}; | 6 | use crate::{Duration, Instant}; |
| 7 | 7 | ||
| @@ -60,15 +60,13 @@ impl MockDriver { | |||
| 60 | 60 | ||
| 61 | let now = inner.now.as_ticks(); | 61 | let now = inner.now.as_ticks(); |
| 62 | 62 | ||
| 63 | inner | 63 | if inner.alarm.timestamp <= now { |
| 64 | .alarm | 64 | inner.alarm.timestamp = u64::MAX; |
| 65 | .as_mut() | ||
| 66 | .filter(|alarm| alarm.timestamp <= now) | ||
| 67 | .map(|alarm| { | ||
| 68 | alarm.timestamp = u64::MAX; | ||
| 69 | 65 | ||
| 70 | (alarm.callback, alarm.ctx) | 66 | Some((inner.alarm.callback, inner.alarm.ctx)) |
| 71 | }) | 67 | } else { |
| 68 | None | ||
| 69 | } | ||
| 72 | }) | 70 | }) |
| 73 | }; | 71 | }; |
| 74 | 72 | ||
| @@ -76,68 +74,48 @@ impl MockDriver { | |||
| 76 | (callback)(ctx); | 74 | (callback)(ctx); |
| 77 | } | 75 | } |
| 78 | } | 76 | } |
| 79 | } | ||
| 80 | |||
| 81 | impl Driver for MockDriver { | ||
| 82 | fn now(&self) -> u64 { | ||
| 83 | critical_section::with(|cs| self.0.borrow_ref(cs).now).as_ticks() | ||
| 84 | } | ||
| 85 | |||
| 86 | unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> { | ||
| 87 | critical_section::with(|cs| { | ||
| 88 | let mut inner = self.0.borrow_ref_mut(cs); | ||
| 89 | |||
| 90 | if inner.alarm.is_some() { | ||
| 91 | None | ||
| 92 | } else { | ||
| 93 | inner.alarm.replace(AlarmState::new()); | ||
| 94 | |||
| 95 | Some(AlarmHandle::new(0)) | ||
| 96 | } | ||
| 97 | }) | ||
| 98 | } | ||
| 99 | 77 | ||
| 100 | fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) { | 78 | /// Configures a callback to be called when the alarm fires. |
| 79 | pub fn set_alarm_callback(&self, callback: fn(*mut ()), ctx: *mut ()) { | ||
| 101 | critical_section::with(|cs| { | 80 | critical_section::with(|cs| { |
| 102 | let mut inner = self.0.borrow_ref_mut(cs); | 81 | let mut inner = self.0.borrow_ref_mut(cs); |
| 103 | 82 | ||
| 104 | let Some(alarm) = inner.alarm.as_mut() else { | 83 | inner.alarm.callback = callback; |
| 105 | panic!("Alarm not allocated"); | 84 | inner.alarm.ctx = ctx; |
| 106 | }; | ||
| 107 | |||
| 108 | alarm.callback = callback; | ||
| 109 | alarm.ctx = ctx; | ||
| 110 | }); | 85 | }); |
| 111 | } | 86 | } |
| 112 | 87 | ||
| 113 | fn set_alarm(&self, _alarm: AlarmHandle, timestamp: u64) -> bool { | 88 | /// Sets the alarm to fire at the specified timestamp. |
| 89 | pub fn set_alarm(&self, timestamp: u64) -> bool { | ||
| 114 | critical_section::with(|cs| { | 90 | critical_section::with(|cs| { |
| 115 | let mut inner = self.0.borrow_ref_mut(cs); | 91 | let mut inner = self.0.borrow_ref_mut(cs); |
| 116 | 92 | ||
| 117 | if timestamp <= inner.now.as_ticks() { | 93 | if timestamp <= inner.now.as_ticks() { |
| 118 | false | 94 | false |
| 119 | } else { | 95 | } else { |
| 120 | let Some(alarm) = inner.alarm.as_mut() else { | 96 | inner.alarm.timestamp = timestamp; |
| 121 | panic!("Alarm not allocated"); | ||
| 122 | }; | ||
| 123 | |||
| 124 | alarm.timestamp = timestamp; | ||
| 125 | true | 97 | true |
| 126 | } | 98 | } |
| 127 | }) | 99 | }) |
| 128 | } | 100 | } |
| 129 | } | 101 | } |
| 130 | 102 | ||
| 103 | impl Driver for MockDriver { | ||
| 104 | fn now(&self) -> u64 { | ||
| 105 | critical_section::with(|cs| self.0.borrow_ref(cs).now).as_ticks() | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 131 | struct InnerMockDriver { | 109 | struct InnerMockDriver { |
| 132 | now: Instant, | 110 | now: Instant, |
| 133 | alarm: Option<AlarmState>, | 111 | alarm: AlarmState, |
| 134 | } | 112 | } |
| 135 | 113 | ||
| 136 | impl InnerMockDriver { | 114 | impl InnerMockDriver { |
| 137 | const fn new() -> Self { | 115 | const fn new() -> Self { |
| 138 | Self { | 116 | Self { |
| 139 | now: Instant::from_ticks(0), | 117 | now: Instant::from_ticks(0), |
| 140 | alarm: None, | 118 | alarm: AlarmState::new(), |
| 141 | } | 119 | } |
| 142 | } | 120 | } |
| 143 | } | 121 | } |
| @@ -189,8 +167,7 @@ mod tests { | |||
| 189 | setup(); | 167 | setup(); |
| 190 | 168 | ||
| 191 | let driver = MockDriver::get(); | 169 | let driver = MockDriver::get(); |
| 192 | let alarm = unsafe { AlarmHandle::new(0) }; | 170 | assert_eq!(false, driver.set_alarm(driver.now())); |
| 193 | assert_eq!(false, driver.set_alarm(alarm, driver.now())); | ||
| 194 | } | 171 | } |
| 195 | 172 | ||
| 196 | #[test] | 173 | #[test] |
| @@ -199,23 +176,11 @@ mod tests { | |||
| 199 | setup(); | 176 | setup(); |
| 200 | 177 | ||
| 201 | let driver = MockDriver::get(); | 178 | let driver = MockDriver::get(); |
| 202 | let alarm = unsafe { driver.allocate_alarm() }.expect("No alarms available"); | ||
| 203 | static mut CALLBACK_CALLED: bool = false; | 179 | static mut CALLBACK_CALLED: bool = false; |
| 204 | let ctx = &mut () as *mut (); | 180 | driver.set_alarm_callback(|_| unsafe { CALLBACK_CALLED = true }, core::ptr::null_mut()); |
| 205 | driver.set_alarm_callback(alarm, |_| unsafe { CALLBACK_CALLED = true }, ctx); | 181 | driver.set_alarm(driver.now() + 1); |
| 206 | driver.set_alarm(alarm, driver.now() + 1); | ||
| 207 | assert_eq!(false, unsafe { CALLBACK_CALLED }); | 182 | assert_eq!(false, unsafe { CALLBACK_CALLED }); |
| 208 | driver.advance(Duration::from_secs(1)); | 183 | driver.advance(Duration::from_secs(1)); |
| 209 | assert_eq!(true, unsafe { CALLBACK_CALLED }); | 184 | assert_eq!(true, unsafe { CALLBACK_CALLED }); |
| 210 | } | 185 | } |
| 211 | |||
| 212 | #[test] | ||
| 213 | #[serial] | ||
| 214 | fn test_allocate_alarm() { | ||
| 215 | setup(); | ||
| 216 | |||
| 217 | let driver = MockDriver::get(); | ||
| 218 | assert!(unsafe { driver.allocate_alarm() }.is_some()); | ||
| 219 | assert!(unsafe { driver.allocate_alarm() }.is_none()); | ||
| 220 | } | ||
| 221 | } | 186 | } |
