ionpak-thermostat/firmware/src/main.rs

139 lines
3.8 KiB
Rust
Raw Normal View History

2017-05-09 15:57:54 +08:00
#![feature(used, const_fn, core_float)]
2017-05-04 17:35:26 +08:00
#![no_std]
#[macro_use]
extern crate cortex_m;
extern crate cortex_m_rt;
extern crate tm4c129x;
2017-05-06 17:17:41 +08:00
use core::cell::{Cell, RefCell};
2017-05-09 13:16:00 +08:00
use core::fmt;
2017-05-04 17:35:26 +08:00
use cortex_m::ctxt::Local;
use cortex_m::exception::Handlers as ExceptionHandlers;
2017-05-06 17:17:41 +08:00
use cortex_m::interrupt::Mutex;
2017-05-05 19:31:12 +08:00
use tm4c129x::interrupt::Interrupt;
2017-05-04 17:35:26 +08:00
use tm4c129x::interrupt::Handlers as InterruptHandlers;
2017-05-09 15:57:54 +08:00
mod board;
2017-05-06 17:17:41 +08:00
mod pid;
2017-05-09 15:57:54 +08:00
mod loop_anode;
mod loop_cathode;
2017-05-06 17:17:41 +08:00
2017-05-09 15:57:54 +08:00
static LOOP_ANODE: Mutex<RefCell<loop_anode::Controller>> = Mutex::new(RefCell::new(
loop_anode::Controller::new()));
2017-05-06 12:32:13 +08:00
2017-05-09 15:57:54 +08:00
static LOOP_CATHODE: Mutex<RefCell<loop_cathode::Controller>> = Mutex::new(RefCell::new(
loop_cathode::Controller::new()));
2017-05-09 13:16:00 +08:00
pub struct UART0;
impl fmt::Write for UART0 {
fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> {
for c in s.bytes() {
unsafe {
let uart_0 = tm4c129x::UART0.get();
while (*uart_0).fr.read().txff().bit() {}
(*uart_0).dr.write(|w| w.data().bits(c))
}
}
Ok(())
}
}
#[macro_export]
macro_rules! print {
($($arg:tt)*) => ({
use core::fmt::Write;
write!($crate::UART0, $($arg)*).unwrap()
})
}
#[macro_export]
macro_rules! println {
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
}
2017-05-06 17:17:41 +08:00
2017-05-04 17:35:26 +08:00
fn main() {
2017-05-09 15:57:54 +08:00
board::init();
2017-05-04 19:42:22 +08:00
2017-05-09 15:57:54 +08:00
cortex_m::interrupt::free(|cs| {
2017-05-08 01:32:53 +08:00
// Enable FPU
let scb = tm4c129x::SCB.borrow(cs);
scb.enable_fpu();
2017-05-09 15:57:54 +08:00
let nvic = tm4c129x::NVIC.borrow(cs);
2017-05-05 19:31:12 +08:00
nvic.enable(Interrupt::ADC0SS0);
let mut loop_anode = LOOP_ANODE.borrow(cs).borrow_mut();
let mut loop_cathode = LOOP_CATHODE.borrow(cs).borrow_mut();
let anode_cathode = 60.0;
let cathode_bias = 12.0;
loop_anode.set_target(anode_cathode+cathode_bias);
loop_cathode.set_emission_target(anode_cathode/10000.0);
loop_cathode.set_bias_target(cathode_bias);
board::set_fv_pwm(10);
2017-05-04 17:35:26 +08:00
});
2017-05-06 12:33:38 +08:00
2017-05-09 13:16:00 +08:00
println!("ready");
2017-05-06 12:33:38 +08:00
loop {
2017-05-09 15:57:54 +08:00
board::process_errors();
2017-05-06 12:33:38 +08:00
}
2017-05-04 17:35:26 +08:00
}
2017-05-09 15:57:54 +08:00
use tm4c129x::interrupt::ADC0SS0;
extern fn adc0_ss0(ctxt: ADC0SS0) {
static ELAPSED: Local<Cell<u32>, ADC0SS0> = Local::new(Cell::new(0));
2017-05-04 17:35:26 +08:00
let elapsed = ELAPSED.borrow(&ctxt);
2017-05-05 19:31:12 +08:00
cortex_m::interrupt::free(|cs| {
let adc0 = tm4c129x::ADC0.borrow(cs);
if adc0.ostat.read().ov0().bit() {
panic!("ADC FIFO overflowed")
}
2017-05-07 00:00:01 +08:00
adc0.isc.write(|w| w.in0().bit(true));
2017-05-05 19:31:12 +08:00
2017-05-09 15:57:54 +08:00
let _ic_sample = adc0.ssfifo0.read().data().bits();
let fbi_sample = adc0.ssfifo0.read().data().bits();
let fv_sample = adc0.ssfifo0.read().data().bits();
let fd_sample = adc0.ssfifo0.read().data().bits();
let av_sample = adc0.ssfifo0.read().data().bits();
let fbv_sample = adc0.ssfifo0.read().data().bits();
let mut loop_anode = LOOP_ANODE.borrow(cs).borrow_mut();
let mut loop_cathode = LOOP_CATHODE.borrow(cs).borrow_mut();
loop_anode.adc_input(av_sample);
loop_cathode.adc_input(fbi_sample, fd_sample, fv_sample, fbv_sample);
2017-05-09 19:08:16 +08:00
elapsed.set(elapsed.get() + 1);
2017-05-09 15:57:54 +08:00
if elapsed.get() % 100 == 0 {
board::set_led(1, true);
board::set_led(2, false);
}
if elapsed.get() % 100 == 50 {
board::set_led(1, false);
board::set_led(2, true);
}
if elapsed.get() == 1000 {
loop_cathode.ready();
}
});
2017-05-05 19:31:12 +08:00
}
2017-05-04 17:35:26 +08:00
#[used]
#[link_section = ".rodata.exceptions"]
pub static EXCEPTIONS: ExceptionHandlers = ExceptionHandlers {
..cortex_m::exception::DEFAULT_HANDLERS
};
#[used]
#[link_section = ".rodata.interrupts"]
pub static INTERRUPTS: InterruptHandlers = InterruptHandlers {
2017-05-05 19:31:12 +08:00
ADC0SS0: adc0_ss0,
2017-05-04 17:35:26 +08:00
..tm4c129x::interrupt::DEFAULT_HANDLERS
};