diff --git a/src/display/mod.rs b/src/display/mod.rs index 36be10b..2a5de70 100644 --- a/src/display/mod.rs +++ b/src/display/mod.rs @@ -1,3 +1,11 @@ +use embedded_graphics::{ + prelude::*, + mono_font::{ascii::FONT_7X13, ascii::FONT_10X20, MonoTextStyle}, + pixelcolor::BinaryColor, + text::{Text, Alignment}, +}; + + /// Enum to make clear the stage of failure of the display #[derive(Debug)] pub enum DisplayError { diff --git a/src/gps/mod.rs b/src/gps/mod.rs index 201e85a..8541ce9 100644 --- a/src/gps/mod.rs +++ b/src/gps/mod.rs @@ -1,3 +1,14 @@ +use esp_idf_hal::{ + self, + peripheral::Peripheral, + gpio::{AnyInputPin, AnyOutputPin, InputPin}, + units::Hertz, + delay::BLOCK, + uart::{self, Uart}, +}; + +use crate::error::Error; + pub mod gpsdata; #[derive(Debug)] @@ -7,4 +18,45 @@ pub enum GpsError { UpdateError(), ReadError(), NoData(), +} + +pub struct GPS<'a> { + uart: uart::UartRxDriver<'a>, + latest: gpsdata::GpsData +} + +impl<'a> GPS<'a> { + /// Returns a new GPS struct with interfaces to allow for fetching + /// uart: Uart connection to GPS module. + pub fn new( + uart: impl Peripheral

+ 'a, + gps_rx: impl Peripheral

+ 'a, + ) -> Result, Error> { + // Setup UART to read serial data from GPS + let config = uart::config::Config::default().baudrate(Hertz(9_600)); + let uart: uart::UartRxDriver = uart::UartRxDriver::new( + uart, + gps_rx, + None::, + None::, + &config + ).map_err(|err| Error::EspError(err))?; + + Ok(GPS { uart, latest: gpsdata::GpsData::default() }) + } + + pub fn poll(self: &mut GPS<'a>) -> Result<&gpsdata::GpsData, Error> { + //Read buffer from UART + let mut buf: Vec = ( + 0..self.uart.count().map_err(|err| Error::EspError(err))? as u8 + ).collect(); + self.uart.read(&mut buf[..], BLOCK).map_err(|err| Error::EspError(err))?; + + //Update GPS Data Struct with the latest data fetched from UART buffer + self.latest.update(&buf) + .map_err(|err| Error::GpsError(err))?; + + // Return the latest stored data + Ok(&self.latest) + } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index dccae62..8b3d179 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,13 @@ +#![allow(unused)] + use esp_idf_sys as _; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported use esp_idf_hal::{ self, - interrupt, prelude::Peripherals, - gpio::{AnyInputPin, AnyOutputPin}, - delay::BLOCK, units::Hertz, - uart, i2c::{I2cConfig, I2cDriver} }; -use embedded_graphics::{ - prelude::*, - mono_font::{ascii::FONT_7X13, ascii::FONT_10X20, MonoTextStyle}, - pixelcolor::BinaryColor, - text::{Text, Alignment}, -}; - use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306}; mod appstate; @@ -48,17 +39,6 @@ fn main() -> Result<(), Error> { let sda = pins.gpio21; let gps_rx = pins.gpio16; let _lcd_address: u8 = 0x3C; - - - // Setup UART to read serial data from GPS - let config = uart::config::Config::default().baudrate(Hertz(9_600)); - let uart: uart::UartRxDriver = uart::UartRxDriver::new( - peripherals.uart1, - gps_rx, - None::, - None::, - &config - ).map_err(|err| Error::EspError(err))?; // Setup I2C driver let config = I2cConfig::new().baudrate(Hertz(921600)); @@ -77,36 +57,27 @@ fn main() -> Result<(), Error> { let mut app_state = appstate::AppState::default(); let mut latest_data = gpsdata::GpsData::default(); - loop { - // Read buffer from UART - let mut buf: Vec = ( - 0..uart.count().map_err(|err| Error::EspError(err))? as u8 - ).collect(); - uart.read(&mut buf[..], BLOCK).map_err(|err| Error::EspError(err))?; + Err(error::Error::DisplayError(DisplayError::DrawingError)) - //Update GPS Data Struct with the latest data fetched from UART buffer - latest_data.update(&buf) - .map_err(|err| Error::GpsError(err))?; + // loop { - // Clear display ready for next write - let style = MonoTextStyle::new(&FONT_10X20, BinaryColor::On); - display.clear(BinaryColor::Off) - .map_err(|_| Error::DisplayError(DisplayError::DrawingError))?; + // // Clear display ready for next write + // let style = MonoTextStyle::new(&FONT_10X20, BinaryColor::On); + // display.clear(BinaryColor::Off) + // .map_err(|_| Error::DisplayError(DisplayError::DrawingError))?; - // Draw text to Display - Text::with_alignment( - &latest_data.get_speed().as_str(), - //&latest_data.to_string().as_str(), - Point::new(64, 20), - style, - Alignment::Center, - ) - .draw(&mut display) - .map_err(|_| Error::DisplayError(DisplayError::DrawingError))?; - - //Flush data to the display - display.flush() - .map_err(|_| Error::DisplayError(DisplayError::FlushError))?; - } -} + // // Draw text to Display + // Text::with_alignment( + // &latest_data.get_speed().as_str(), + // Point::new(64, 20), + // style, + // Alignment::Center, + // ) + // .draw(&mut display) + // .map_err(|_| Error::DisplayError(DisplayError::DrawingError))?; + // //Flush data to the display + // display.flush() + // .map_err(|_| Error::DisplayError(DisplayError::FlushError))?; + // } +} \ No newline at end of file