reflow-firmware3.0/src/application/mod.rs

132 lines
3.2 KiB
Rust

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<Alternate<PushPull>>,
gpioa::PA6<Input<Floating>>,
gpioa::PA7<Alternate<PushPull>>,
),
>;
type AppQEI = qei::Qei<
pac::TIM3,
Tim3PartialRemap,
(gpiob::PB4<Input<Floating>>, gpiob::PB5<Input<Floating>>),
>;
type AppDisp =
st7735_lcd::ST7735<AppSPI, gpioa::PA4<Output<PushPull>>, gpioa::PA1<Output<PushPull>>>;
pub struct App {
delay: Delay,
board_led: gpioc::PC13<Output<PushPull>>,
spi: Option<AppSPI>,
disp_cs: gpioa::PA0<Output<PushPull>>,
disp_dc: Option<gpioa::PA4<Output<PushPull>>>,
disp_rst: Option<gpioa::PA1<Output<PushPull>>>,
max_cs: gpioa::PA9<Output<PushPull>>,
qei: AppQEI,
button: gpiob::PB3<Input<Floating>>,
selected_profile: usize,
styles: Styles,
temp_avg: f32,
heater: gpiob::PB6<Output<PushPull>>,
}
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()
}
}