diff --git a/Pedestal/PedestalConnectBox/firmware/src/main.rs b/Pedestal/PedestalConnectBox/firmware/src/main.rs index a057bcc..6c7cd58 100644 --- a/Pedestal/PedestalConnectBox/firmware/src/main.rs +++ b/Pedestal/PedestalConnectBox/firmware/src/main.rs @@ -18,11 +18,13 @@ use stm32f1xx_hal::{ gpio::{Pin, Input, Analog, PullDown, Output, PushPull}, pac, prelude::*, - timer::{Channel, Tim2NoRemap}, + timer::{Channel, Tim2NoRemap, Tim2FullRemap}, flash::{FlashWriter, FlashSize, SectorSize}, usb::{Peripheral, UsbBus}, }; +// TODO SPI + use usb_device::prelude::*; use usbd_human_interface_device::prelude::*; @@ -66,13 +68,59 @@ macro_rules! define_ecam_output_states_col { } struct MyPins { - pa1: Pin<'A', 1, Analog>, - pa2: Pin<'A', 2, Analog>, - pb0: Pin<'B', 0, Output>, - pb12: Pin<'B', 12, Output>, - pc1: Pin<'C', 1, Input>, - pc3: Pin<'C', 3, Analog>, - pc15: Pin<'C', 15, Input>, + // Analog Inputs + pa2: Pin<'A', 2, Analog>, // Speed Brake + pa3: Pin<'A', 3, Analog>, // Parking Brake + pa5: Pin<'A', 5, Analog>, // Flaps + pa6: Pin<'A', 6, Analog>, // Gravity Gear Extension + pa7: Pin<'A', 7, Analog>, // Flood Light Pedestal + pb0: Pin<'B', 0, Analog>, // Upper ECAM Brightness + pb1: Pin<'B', 1, Analog>, // Lower ECAM Brightness + pc0: Pin<'C', 0, Analog>, // Flood Light MIP + pc1: Pin<'C', 1, Analog>, // Integ Light + pc2: Pin<'C', 2, Analog>, // Weather Radar Tilt + pc3: Pin<'C', 3, Analog>, // Weather Radar Gain + + // Inputs + pa0: Pin<'A', 0, Input>, // Rudder Trim Reset + pa1: Pin<'A', 1, Input>, // Rudder Trim Left + pa4: Pin<'A', 4, Input>, // Spoiler Arm + pa8: Pin<'A', 8, Input>, // Switching ATT Captain + pa9: Pin<'A', 9, Input>, // Switching AIR Captain + pa10: Pin<'A', 10, Input>, // Switching ATT FO +// pb4: Pin<'B', 4, Input>, // Weather Radar MAP + pb5: Pin<'B', 5, Input>, // Weather Radar PWS + pb8: Pin<'B', 8, Input>, // Door Unlock + pb9: Pin<'B', 9, Input>, // Door Lock + pc4: Pin<'C', 4, Input>, // DFDR + pc5: Pin<'C', 5, Input>, // AIDS + pc6: Pin<'C', 6, Input>, // Switching EIS Captain + pc9: Pin<'C', 9, Input>, // Switching AIR FO + pc13: Pin<'C', 13, Input>, // Engine Mode Crank + pc14: Pin<'C', 14, Input>, // Engine Mode Start + pc15: Pin<'C', 15, Input>, // Rudder Trim Right + pd1: Pin<'D', 1, Input>, // Weather Radar System 1 + pd3: Pin<'D', 3, Input>, // Weather Radar System 2 + pd4: Pin<'D', 4, Input>, // Weather Radar Multiscan + pd5: Pin<'D', 5, Input>, // Weather Radar WX+T + pd6: Pin<'D', 6, Input>, // Weather Radar CCS + pd7: Pin<'D', 7, Input>, // Weather Radar TURB + pd13: Pin<'D', 13, Input>, // Switching ECAM FO + pd14: Pin<'D', 14, Input>, // Switching ECAM Captain + pd15: Pin<'D', 15, Input>, // Switching EIS FO + pe0: Pin<'E', 0, Input>, // Door Video + pe5: Pin<'E', 5, Input>, // Engine 1 Master + pe6: Pin<'E', 6, Input>, // Engine 2 Master + + // Outputs + pb6: Pin<'B', 6, Output>, // Door Fault Light + pb7: Pin<'B', 7, Output>, // Door Open Light + pe1: Pin<'E', 1, Output>, // Engine 1 Fire + pe2: Pin<'E', 2, Output>, // Engine 1 Fault + pe3: Pin<'E', 3, Output>, // Engine 2 Fault + pe4: Pin<'E', 4, Output>, // Engine 2 Fire + + // TODO ECAM matrix pins } #[derive(Pod)] @@ -138,6 +186,9 @@ fn main() -> ! { .pclk1(24.MHz()) .freeze(&mut flash.acr); + let mut afio = p.AFIO.constrain(); + let (pa15, pb3, pb4) = afio.mapr.disable_jtag(gpioa.pa15, gpiob.pb3, gpiob.pb4); // To allow us to use pa15 and pb4 + // ====================== USB setup ================= assert!(clocks.usbclk_valid()); let mut usb_dp = gpioa.pa12.into_push_pull_output(&mut gpioa.crh); @@ -158,7 +209,7 @@ fn main() -> ! { let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) .manufacturer("FLC Meow") .product("Pedestal box") - .serial_number("01189998819991197253") + .serial_number("01189998819991197250") .build(); // ====================== ADC setup ================= @@ -172,30 +223,72 @@ fn main() -> ! { // ====================== Pin setup ================= let mut io_pins = MyPins { - pa1: gpioa.pa1.into_analog(&mut gpioa.crl), + // Analog Inputs pa2: gpioa.pa2.into_analog(&mut gpioa.crl), - pb0: gpiob.pb0.into_push_pull_output(&mut gpiob.crl), - pb12: gpiob.pb12.into_push_pull_output(&mut gpiob.crh), - pc1: gpioc.pc1.into_pull_down_input(&mut gpioc.crl), + pa3: gpioa.pa3.into_analog(&mut gpioa.crl), + pa5: gpioa.pa5.into_analog(&mut gpioa.crl), + pa6: gpioa.pa6.into_analog(&mut gpioa.crl), + pa7: gpioa.pa7.into_analog(&mut gpioa.crl), + pb0: gpiob.pb0.into_analog(&mut gpiob.crl), + pb1: gpiob.pb1.into_analog(&mut gpiob.crl), + pc0: gpioc.pc0.into_analog(&mut gpioc.crl), + pc1: gpioc.pc1.into_analog(&mut gpioc.crl), + pc2: gpioc.pc2.into_analog(&mut gpioc.crl), pc3: gpioc.pc3.into_analog(&mut gpioc.crl), + + // Inputs + pa0: gpioa.pa0.into_pull_down_input(&mut gpioa.crl), + pa1: gpioa.pa1.into_pull_down_input(&mut gpioa.crl), + pa4: gpioa.pa4.into_pull_down_input(&mut gpioa.crl), + pa8: gpioa.pa8.into_pull_down_input(&mut gpioa.crh), + pa9: gpioa.pa9.into_pull_down_input(&mut gpioa.crh), + pa10: gpioa.pa10.into_pull_down_input(&mut gpioa.crh), +// pb4: gpiob.pb4.into_pull_down_input(&mut gpiob.crl), + pb5: gpiob.pb5.into_pull_down_input(&mut gpiob.crl), + pb8: gpiob.pb8.into_pull_down_input(&mut gpiob.crh), + pb9: gpiob.pb9.into_pull_down_input(&mut gpiob.crh), + pc4: gpioc.pc4.into_pull_down_input(&mut gpioc.crl), + pc5: gpioc.pc5.into_pull_down_input(&mut gpioc.crl), + pc6: gpioc.pc6.into_pull_down_input(&mut gpioc.crl), + pc9: gpioc.pc9.into_pull_down_input(&mut gpioc.crh), + pc13: gpioc.pc13.into_pull_down_input(&mut gpioc.crh), + pc14: gpioc.pc14.into_pull_down_input(&mut gpioc.crh), pc15: gpioc.pc15.into_pull_down_input(&mut gpioc.crh), + pd1: gpiod.pd1.into_pull_down_input(&mut gpiod.crl), + pd3: gpiod.pd3.into_pull_down_input(&mut gpiod.crl), + pd4: gpiod.pd4.into_pull_down_input(&mut gpiod.crl), + pd5: gpiod.pd5.into_pull_down_input(&mut gpiod.crl), + pd6: gpiod.pd6.into_pull_down_input(&mut gpiod.crl), + pd7: gpiod.pd7.into_pull_down_input(&mut gpiod.crl), + pd13: gpiod.pd13.into_pull_down_input(&mut gpiod.crh), + pd14: gpiod.pd14.into_pull_down_input(&mut gpiod.crh), + pd15: gpiod.pd15.into_pull_down_input(&mut gpiod.crh), + pe0: gpioe.pe0.into_pull_down_input(&mut gpioe.crl), + pe5: gpioe.pe5.into_pull_down_input(&mut gpioe.crl), + pe6: gpioe.pe6.into_pull_down_input(&mut gpioe.crl), + + // Outputs + pb6: gpiob.pb6.into_push_pull_output(&mut gpiob.crl), + pb7: gpiob.pb7.into_push_pull_output(&mut gpiob.crl), + pe1: gpioe.pe1.into_push_pull_output(&mut gpioe.crl), + pe2: gpioe.pe2.into_push_pull_output(&mut gpioe.crl), + pe3: gpioe.pe3.into_push_pull_output(&mut gpioe.crl), + pe4: gpioe.pe4.into_push_pull_output(&mut gpioe.crl), }; // let mut last = get_report(&mut io_pins, &mut adc1, &cal); // ====================== PWM setup ================= - let mut afio = p.AFIO.constrain(); - let c1 = gpioa.pa0.into_alternate_push_pull(&mut gpioa.crl); - let mut integ_lt_pwm = p + let c1 = pa15.into_alternate_push_pull(&mut gpioa.crh); + let c3 = gpiob.pb10.into_alternate_push_pull(&mut gpiob.crh); + let (mut integ_lt_pwm, mut rudder_trim_display_pwm) = p .TIM2 - .pwm_hz::(c1, &mut afio.mapr, 1.kHz(), &clocks); - integ_lt_pwm.enable(Channel::C1); - //TODO -// let c3 = gpiob.pb10.into_alternate_push_pull(&mut gpiob.crh); + .pwm_hz::((c1, c3), &mut afio.mapr, 1.kHz(), &clocks).split(); + integ_lt_pwm.enable(); // let mut rudder_trim_display_pwm = p // .TIM2 -// .pwm_hz::(c3, &mut afio.mapr, 1.kHz(), &clocks); -// rudder_trim_display_pwm.enable(Channel::C3); +// .pwm_hz::(c3, &mut afio.mapr, 1.kHz(), &clocks); + rudder_trim_display_pwm.enable(); let pwm_max = integ_lt_pwm.get_max_duty(); //48000 in our case // ====================== Timer setup =============== @@ -236,7 +329,7 @@ fn main() -> ! { else { pwm_val = output.integ_lt; } - integ_lt_pwm.set_duty(Channel::C1, pwm_val); + integ_lt_pwm.set_duty(pwm_val); // LED outputs // ECAM @@ -253,7 +346,7 @@ fn main() -> ! { if output.leds & 0xC00 != 0 { ecam_col[4] = 1; } if output.leds & 0x1001 != 0 { ecam_col[5] = 1; } // Set ECAM Out - define_ecam_output_states_row!(0, pb12, ecam_row, io_pins); // Row 1 +// define_ecam_output_states_row!(0, pb12, ecam_row, io_pins); // Row 1 // define_ecam_output_states_row!(1, pe13, ecam_row, io_pins); // Row 2 // define_ecam_output_states_row!(2, pe9, ecam_row, io_pins); // Row 3 // define_ecam_output_states_col!(0, pd9, ecam_row, io_pins); // Col 1 @@ -268,22 +361,24 @@ fn main() -> ! { // define_output_states!(0x8000, pe2, output, io_pins); // ENG 1 FAULT // define_output_states!(0x10000, pe1, output, io_pins); // ENG 1 FIRE // define_output_states!(0x20000, pe3, output, io_pins); // ENG 2 FAULT +// define_output_states!(0x40000, pe4, output, io_pins); // ENG 2 FIRE // Check generic input field // Calibration bit if output.generic & 0x1 == 0x1 { calibration_active = true; if !calibration_min_done && output.generic & 0x2 == 0x2 { - cal.data[0].min = adc1.read(&mut io_pins.pa1).unwrap(); - cal.data[1].min = adc1.read(&mut io_pins.pa2).unwrap(); + // TODO all pins + cal.data[0].min = adc1.read(&mut io_pins.pa2).unwrap(); + cal.data[1].min = adc1.read(&mut io_pins.pa3).unwrap(); calibration_min_done = true; } } else { if calibration_active { - let mut values: [u16; 2] = [0; 2]; - values[0] = adc1.read(&mut io_pins.pa1).unwrap(); - values[1] = adc1.read(&mut io_pins.pa2).unwrap(); + let mut values: [u16; 11] = [0; 11]; + values[0] = adc1.read(&mut io_pins.pa2).unwrap(); + values[1] = adc1.read(&mut io_pins.pa3).unwrap(); let mut i = 0; loop { if values[i] > cal.data[i].min { @@ -300,7 +395,7 @@ fn main() -> ! { } let save_success = save_calibration(&mut flash_writer, &cal); if save_success { - integ_lt_pwm.set_duty(Channel::C1, pwm_max); + integ_lt_pwm.set_duty(pwm_max); } } calibration_active = false; @@ -325,8 +420,9 @@ fn calculate_factor(min: u16, max: u16) -> f32 { fn get_report(pins: &mut MyPins, adc1: &mut adc::Adc, cal: &Calibration) -> CustomInputReport { // Read axis let mut values: [u16; 11] = [0; 11]; - values[0] = adc1.read(&mut pins.pa1).unwrap(); - values[1] = adc1.read(&mut pins.pc3).unwrap(); + // TODO all pins + values[0] = adc1.read(&mut pins.pa2).unwrap(); + values[1] = adc1.read(&mut pins.pa3).unwrap(); // Apply calibration to axis data let mut values_norm: [u16; 11] = [0; 11]; @@ -351,6 +447,8 @@ fn get_report(pins: &mut MyPins, adc1: &mut adc::Adc, cal: &Calibrati let mut buttons: u16 = 0; // if pins.pb0.is_high() { buttons += 0x1; } + // ECAM Keyboard matrix + CustomInputReport { report_id: 1, axis: values_norm,