From 2c21f04d5a34595ced62860d8273dec306f6a4d6 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 8 Jan 2020 18:30:19 +0100 Subject: [PATCH] common: Make Gps::update() access UART0's receive buffer via a closure. This will allow us to write tests for Gps without providing a fake implementation of the UART reader function in the test. --- src/application/main.rs | 17 ++++++++++++++++- src/common/gps.rs | 21 ++++----------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/application/main.rs b/src/application/main.rs index 3523b88..444ffd4 100644 --- a/src/application/main.rs +++ b/src/application/main.rs @@ -30,6 +30,7 @@ extern crate common; mod uart0; use common::buffer::Buffer; +use common::ringbuf::Ringbuf; use common::clock; use common::systick; use common::port; @@ -122,6 +123,20 @@ fn configure_push_buttons() { port::set_pull(port::PORTE, 31, port::Pull::Up); } +fn uart0_try_read() -> Option { + extern { + static mut uart0_rx_buf: Ringbuf; + } + + unsafe { + if uart0_rx_buf.is_empty() { + None + } else { + Some(uart0_rx_buf.read()) + } + } +} + #[no_mangle] pub unsafe extern "C" fn _start() -> ! { clock::configure(); @@ -207,7 +222,7 @@ pub unsafe extern "C" fn _start() -> ! { let mut show_time = false; let old_gps_has_fix = gps_has_fix; - while gps.update(&mut tap) { + while gps.update(&mut tap, uart0_try_read) { prev_tap = tap; show_time = true; diff --git a/src/common/gps.rs b/src/common/gps.rs index 64772c7..178e551 100644 --- a/src/common/gps.rs +++ b/src/common/gps.rs @@ -21,7 +21,6 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -use ringbuf::Ringbuf; use systick; enum ParseState { @@ -63,20 +62,6 @@ fn to_lower(c: u8) -> u8 { c | 0x20 } -fn try_read() -> Option { - extern { - static mut uart0_rx_buf: Ringbuf; - } - - unsafe { - if uart0_rx_buf.is_empty() { - None - } else { - Some(uart0_rx_buf.read()) - } - } -} - fn parse_coordinate(s: &[u8]) -> i32 { // Find the position of the decimal separator for the minutes. let dot_position = s.iter().enumerate().find(|(_, &c)| { @@ -205,10 +190,12 @@ impl Gps { } } - pub fn update(&mut self, tap: &mut TimeAndPos) -> bool { + pub fn update(&mut self, tap: &mut TimeAndPos, mut read_func: F) -> bool + where F: FnMut() -> Option + { let hexdigits = b"0123456789abcdef"; - while let Some(received) = try_read() { + while let Some(received) = read_func() { if received == b'$' { self.state = ParseState::InPacket; self.offset = 0; -- 2.30.2