132 lines
3.2 KiB
Rust
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()
|
|
}
|
|
}
|