use core::mem; use embedded_hal::digital::v2::OutputPin; use rtt_target::rprintln; use st7735_lcd::Orientation; use stm32f1xx_hal::{ delay::Delay, gpio::{gpioa, gpiob, gpioc, Alternate, Floating, Input, Output, PushPull}, pac, qei, spi::{Spi, Spi1NoRemap}, timer::Tim3PartialRemap, }; use crate::max6675; mod confirm_profile; mod profile_selection; mod run_profile; mod setup; mod splash; mod styles; pub use setup::setup; use styles::Styles; type AppSPI = Spi< pac::SPI1, Spi1NoRemap, ( gpioa::PA5>, gpioa::PA6>, gpioa::PA7>, ), >; type AppQEI = qei::Qei< pac::TIM3, Tim3PartialRemap, (gpiob::PB4>, gpiob::PB5>), >; type AppDisp = st7735_lcd::ST7735>, gpioa::PA1>>; pub struct App { delay: Delay, board_led: gpioc::PC13>, spi: Option, disp_cs: gpioa::PA0>, disp_dc: Option>>, disp_rst: Option>>, max_cs: gpioa::PA9>, qei: AppQEI, button: gpiob::PB3>, selected_profile: usize, styles: Styles, temp_avg: f32, heater: gpiob::PB6>, } impl App { pub fn run(mut self) -> ! { //self.read_temperature(); rprintln!("Application Startup!"); let mut disp = self.get_display(); disp.init(&mut self.delay).unwrap(); self.release_display(disp); self.splash_screen(); loop { self.profile_selection(); let confirmed = self.confirm_profile(); if !confirmed { continue; } self.run_profile(); } } fn get_display(&mut self) -> AppDisp { let spi = mem::replace(&mut self.spi, None).expect("Spi already in use"); let disp_dc = mem::replace(&mut self.disp_dc, None).expect("Dispaly DC already in use"); let disp_rst = mem::replace(&mut self.disp_rst, None).expect("Display RST already in use"); let mut disp = st7735_lcd::ST7735::new(spi, disp_dc, disp_rst, true, false, 160, 128); self.disp_cs.set_low().unwrap(); disp.set_orientation(&Orientation::LandscapeSwapped) .unwrap(); disp } fn release_display(&mut self, disp: AppDisp) { self.disp_cs.set_high().unwrap(); let (spi, disp_dc, disp_rst) = disp.release(); self.spi = Some(spi); self.disp_dc = Some(disp_dc); self.disp_rst = Some(disp_rst); } fn read_temperature(&mut self) -> f32 { let mut spi = mem::replace(&mut self.spi, None).expect("Spi already in use"); let mut res = max6675::read(&mut spi, &mut self.max_cs); for _ in 0..4 { if res.is_ok() { break; } res = max6675::read(&mut spi, &mut self.max_cs); } self.spi = Some(spi); /*self.temp_avg = if self.temp_avg > 0.0 { self.temp_avg * 0.5 + res.unwrap() * 0.5 } else { res.unwrap() };*/ //self.temp_avg res.unwrap() } }