mod uart0;
use common::buffer::Buffer;
+use common::ringbuf::Ringbuf;
use common::clock;
use common::systick;
use common::port;
port::set_pull(port::PORTE, 31, port::Pull::Up);
}
+fn uart0_try_read() -> Option<u8> {
+ 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();
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;
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-use ringbuf::Ringbuf;
use systick;
enum ParseState {
c | 0x20
}
-fn try_read() -> Option<u8> {
- 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)| {
}
}
- pub fn update(&mut self, tap: &mut TimeAndPos) -> bool {
+ pub fn update<F>(&mut self, tap: &mut TimeAndPos, mut read_func: F) -> bool
+ where F: FnMut() -> Option<u8>
+ {
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;