diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 89e2823..b12f4dd 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -11,11 +11,11 @@ use panic_halt as _; use cortex_m::asm::delay; use cortex_m_rt::entry; use stm32f1xx_hal::{ - adc, - gpio::{Analog, Pin}, - pac, - prelude::*, - timer::{Channel, Tim2NoRemap}, + adc, + gpio::{Analog, Pin}, + pac, + prelude::*, + timer::{Channel, Tim2NoRemap}, }; use stm32f1xx_hal::usb::{Peripheral, UsbBus}; @@ -25,120 +25,119 @@ use usbd_human_interface_device::prelude::*; use crate::device::{CustomConfig, CustomInputReport, CustomOutputReport}; struct MyPins { - pa1: Pin<'A', 1, Analog>, - pa2: Pin<'A', 2, Analog>, + pa1: Pin<'A', 1, Analog>, + pa2: Pin<'A', 2, Analog>, } #[entry] fn main() -> ! { - // ====================== general setup ================= - // Acquire peripherals - // let cp = cortex_m::Peripherals::take().unwrap(); - let p = pac::Peripherals::take().unwrap(); - let mut flash = p.FLASH.constrain(); - let rcc = p.RCC.constrain(); + // ====================== general setup ================= + // Acquire peripherals + // let cp = cortex_m::Peripherals::take().unwrap(); + let p = pac::Peripherals::take().unwrap(); + let mut flash = p.FLASH.constrain(); + let rcc = p.RCC.constrain(); - // Setup GPIOA - let mut gpioa = p.GPIOA.split(); + // Setup GPIOA + let mut gpioa = p.GPIOA.split(); - // configure clock - let clocks = rcc - .cfgr - .use_hse(16.MHz()) - .sysclk(48.MHz()) - .pclk1(24.MHz()) - .freeze(&mut flash.acr); + // configure clock + let clocks = rcc + .cfgr + .use_hse(16.MHz()) + .sysclk(48.MHz()) + .pclk1(24.MHz()) + .freeze(&mut flash.acr); - // ====================== USB setup ================= - assert!(clocks.usbclk_valid()); - let mut usb_dp = gpioa.pa12.into_push_pull_output(&mut gpioa.crh); - usb_dp.set_low(); - delay(clocks.sysclk().raw() / 100); + // ====================== USB setup ================= + assert!(clocks.usbclk_valid()); + let mut usb_dp = gpioa.pa12.into_push_pull_output(&mut gpioa.crh); + usb_dp.set_low(); + delay(clocks.sysclk().raw() / 100); - let usb = Peripheral { - usb: p.USB, - pin_dm: gpioa.pa11, - pin_dp: usb_dp.into_floating_input(&mut gpioa.crh), - }; - let usb_bus = UsbBus::new(usb); + let usb = Peripheral { + usb: p.USB, + pin_dm: gpioa.pa11, + pin_dp: usb_dp.into_floating_input(&mut gpioa.crh), + }; + let usb_bus = UsbBus::new(usb); - let mut consumer = UsbHidClassBuilder::new() - .add_device(CustomConfig::default()) - .build(&usb_bus); + let mut consumer = UsbHidClassBuilder::new() + .add_device(CustomConfig::default()) + .build(&usb_bus); - let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) - .manufacturer("FLC Meow") - .product("Pedestal box") - .serial_number("01189998819991197253") - .build(); + let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) + .manufacturer("FLC Meow") + .product("Pedestal box") + .serial_number("01189998819991197253") + .build(); - // ====================== ADC setup ================= - // Setup ADC - let mut adc1 = adc::Adc::adc1(p.ADC1, clocks); + // ====================== ADC setup ================= + // Setup ADC + let mut adc1 = adc::Adc::adc1(p.ADC1, clocks); - // ====================== Pin setup ================= - let mut input_pins = MyPins { - pa1: gpioa.pa1.into_analog(&mut gpioa.crl), - pa2: gpioa.pa2.into_analog(&mut gpioa.crl), - }; + // ====================== Pin setup ================= + let mut input_pins = MyPins { + pa1: gpioa.pa1.into_analog(&mut gpioa.crl), + pa2: gpioa.pa2.into_analog(&mut gpioa.crl), + }; - let mut last = get_report(&mut input_pins, &mut adc1); - let mut last_output = CustomOutputReport { int: 0 }; + let mut last = get_report(&mut input_pins, &mut adc1); + let mut last_output = CustomOutputReport { int: 0 }; - // ====================== PWM setup ================= - let mut afio = p.AFIO.constrain(); - let c1 = gpioa.pa0.into_alternate_push_pull(&mut gpioa.crl); - let mut pwm = p - .TIM2 - .pwm_hz::(c1, &mut afio.mapr, 1.kHz(), &clocks); - pwm.enable(Channel::C1); - let pwm_max = pwm.get_max_duty() as u16; //48000 in our case + // ====================== PWM setup ================= + let mut afio = p.AFIO.constrain(); + let c1 = gpioa.pa0.into_alternate_push_pull(&mut gpioa.crl); + let mut pwm = p + .TIM2 + .pwm_hz::(c1, &mut afio.mapr, 1.kHz(), &clocks); + pwm.enable(Channel::C1); + let pwm_max = pwm.get_max_duty() as u16; //48000 in our case - loop { - let report = get_report(&mut input_pins, &mut adc1); - if report != last { - match consumer.device().write_report(&report) { - Err(UsbHidError::WouldBlock) => {} - Ok(_) => { - last = report; - } - Err(e) => { - core::panic!("Failed to write consumer report: {:?}", e) - } - } - } + loop { + let report = get_report(&mut input_pins, &mut adc1); + if report != last { + match consumer.device().write_report(&report) { + Err(UsbHidError::WouldBlock) => {} + Ok(_) => { + last = report; + } + Err(e) => { + core::panic!("Failed to write consumer report: {:?}", e) + } + } + } - if usb_dev.poll(&mut [&mut consumer]) { - match consumer.device().read_report() { - Err(UsbHidError::WouldBlock) => {} - Ok(output) => { - last_output = output; - } - Err(e) => { - core::panic!("Failed to write consumer report: {:?}", e) - } - } - } + if usb_dev.poll(&mut [&mut consumer]) { + match consumer.device().read_report() { + Err(UsbHidError::WouldBlock) => {} + Ok(output) => { + let pwm_val = output.int as u16 * 188; + pwm.set_duty(Channel::C1, pwm_val); + } + Err(e) => { + core::panic!("Failed to write consumer report: {:?}", e) + } + } + } // Get data from pots - let data: u16 = adc1.read(&mut input_pins.pa2).unwrap(); - let mut pwm_val = data as f32 / 0xfff as f32; - let pwm_duty = (pwm_max as f32 * pwm_val as f32) as u16; - pwm.set_duty(Channel::C1, pwm_duty); +// let data: u16 = adc1.read(&mut input_pins.pa2).unwrap(); +// let mut pwm_val = data as f32 / 0xfff as f32; +// let pwm_duty = (pwm_max as f32 * pwm_val as f32) as u16; +// pwm.set_duty(Channel::C1, pwm_duty); - } + } } fn get_report(pins: &mut MyPins, adc1: &mut adc::Adc) -> CustomInputReport { - let integLT: u16 = adc1.read(&mut pins.pa1).unwrap(); - let floodLT: u16 = adc1.read(&mut pins.pa2).unwrap(); - let retX = integLT * 16; - let retY = floodLT * 16; - let buttons: u16 = 0; + let integLT: u16 = adc1.read(&mut pins.pa1).unwrap(); + let floodLT: u16 = adc1.read(&mut pins.pa2).unwrap(); + let buttons: u16 = 0; - - CustomInputReport { - x: integLT.into(), - y: floodLT.into(), - buttons, - } + + CustomInputReport { + x: integLT.into(), + y: floodLT.into(), + buttons, + } }