generated from luke-else/esp32-std-template
Chore: Started moving individual components out into modules. Started with GPS. Display and i2c driver to follow.
This commit is contained in:
parent
a880586321
commit
6625351e38
@ -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 {
|
||||
|
@ -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<P = impl Uart> + 'a,
|
||||
gps_rx: impl Peripheral<P = impl InputPin> + 'a,
|
||||
) -> Result<GPS<'a>, 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::<AnyInputPin>,
|
||||
None::<AnyOutputPin>,
|
||||
&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<u8> = (
|
||||
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)
|
||||
}
|
||||
}
|
73
src/main.rs
73
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::<AnyInputPin>,
|
||||
None::<AnyOutputPin>,
|
||||
&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<u8> = (
|
||||
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))?;
|
||||
// }
|
||||
}
|
Loading…
Reference in New Issue
Block a user