aboutsummaryrefslogtreecommitdiff
path: root/embassy-time/src/driver_mock.rs
diff options
context:
space:
mode:
authorDániel Buga <[email protected]>2024-11-26 23:54:21 +0100
committerDániel Buga <[email protected]>2024-12-10 21:31:42 +0100
commit5a5495aac43d75610735f2ca80fb6c8e8f31ed71 (patch)
tree7a4336917894730692589359e9d1a285ec5a0a05 /embassy-time/src/driver_mock.rs
parent406d377b7564d16e12b7fae4f42c0c709bf4f243 (diff)
Refactor integrated-timers
Diffstat (limited to 'embassy-time/src/driver_mock.rs')
-rw-r--r--embassy-time/src/driver_mock.rs85
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 @@
1use core::cell::RefCell; 1use core::cell::RefCell;
2 2
3use critical_section::Mutex as CsMutex; 3use critical_section::Mutex as CsMutex;
4use embassy_time_driver::{AlarmHandle, Driver}; 4use embassy_time_driver::Driver;
5 5
6use crate::{Duration, Instant}; 6use 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
81impl 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
103impl Driver for MockDriver {
104 fn now(&self) -> u64 {
105 critical_section::with(|cs| self.0.borrow_ref(cs).now).as_ticks()
106 }
107}
108
131struct InnerMockDriver { 109struct InnerMockDriver {
132 now: Instant, 110 now: Instant,
133 alarm: Option<AlarmState>, 111 alarm: AlarmState,
134} 112}
135 113
136impl InnerMockDriver { 114impl 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}