Working with 3 input axis

Signed-off-by: fly <merspieler@alwaysdata.com>
This commit is contained in:
fly 2024-06-10 00:08:44 +02:00
parent 288456f127
commit 83f234b5f7
2 changed files with 18 additions and 20 deletions

View file

@ -7,7 +7,7 @@ use usbd_human_interface_device::{
descriptor::InterfaceProtocol,
device::DeviceClass,
interface::{
InBytes8, Interface, InterfaceBuilder, InterfaceConfig, OutBytes8, ReportSingle,
InBytes64, Interface, InterfaceBuilder, InterfaceConfig, OutBytes64, ReportSingle,
UsbAllocatable,
},
UsbHidError,
@ -23,10 +23,11 @@ pub const CUSTOM_DESCRIPTOR: &[u8] = &[
0x09, 0x01, // UsageId(Pointer[0x0001])
0xA1, 0x00, // Collection(Physical)
0x09, 0x30, // UsageId(X[0x0030])
0x09, 0x31, // UsageId(Y[0x0031])
0x09, 0x32, // UsageId(Z[0x0032])
0x15, 0x00, // LogicalMinimum(0)
0x26, 0xFF, 0x0F, // LogicalMaximum(4,095)
0x95, 0x02, // ReportCount(2)
0x95, 0x03, // ReportCount(3)
0x75, 0x10, // ReportSize(16)
0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
0xC0, // EndCollection()
@ -54,12 +55,12 @@ pub const CUSTOM_DESCRIPTOR: &[u8] = &[
];
#[derive(Clone, Copy, Debug, Eq, PartialEq, Default, PackedStruct)]
#[packed_struct(endian = "lsb", size_bytes = "7")]
#[packed_struct(endian = "lsb", size_bytes = "9")] // MUST be <= 64 else we get problem cause InBytes64 or OutBytes64
pub struct CustomInputReport {
#[packed_field]
pub report_id: u8,
#[packed_field]
pub axis: [u16; 2],
pub axis: [u16; 3],
#[packed_field]
pub buttons: u16,
}
@ -76,7 +77,7 @@ pub struct CustomOutputReport {
}
pub struct CustomDevice<'a, B: UsbBus> {
interface: Interface<'a, B, InBytes8, OutBytes8, ReportSingle>,
interface: Interface<'a, B, InBytes64, OutBytes64, ReportSingle>,
}
impl<'a, B: UsbBus> CustomDevice<'a, B> {
@ -98,7 +99,7 @@ impl<'a, B: UsbBus> CustomDevice<'a, B> {
}
impl<'a, B: UsbBus> DeviceClass<'a> for CustomDevice<'a, B> {
type I = Interface<'a, B, InBytes8, OutBytes8, ReportSingle>;
type I = Interface<'a, B, InBytes64, OutBytes64, ReportSingle>;
fn interface(&mut self) -> &mut Self::I {
&mut self.interface
@ -112,7 +113,7 @@ impl<'a, B: UsbBus> DeviceClass<'a> for CustomDevice<'a, B> {
}
pub struct CustomConfig<'a> {
interface: InterfaceConfig<'a, InBytes8, OutBytes8, ReportSingle>,
interface: InterfaceConfig<'a, InBytes64, OutBytes64, ReportSingle>,
}
impl<'a> Default for CustomConfig<'a> {
@ -134,7 +135,7 @@ impl<'a> Default for CustomConfig<'a> {
impl<'a> CustomConfig<'a> {
#[must_use]
pub fn new(interface: InterfaceConfig<'a, InBytes8, OutBytes8, ReportSingle>) -> Self {
pub fn new(interface: InterfaceConfig<'a, InBytes64, OutBytes64, ReportSingle>) -> Self {
Self { interface }
}
}

View file

@ -37,7 +37,7 @@ struct MyPins {
pa2: Pin<'A', 2, Analog>,
pb0: Pin<'B', 0, Output<PushPull>>,
pc1: Pin<'C', 1, Input<PullDown>>,
pc3: Pin<'C', 3, Output<PushPull>>,
pc3: Pin<'C', 3, Analog>,
pc15: Pin<'C', 15, Input<PullDown>>,
}
@ -140,7 +140,7 @@ fn main() -> ! {
pa2: gpioa.pa2.into_analog(&mut gpioa.crl),
pb0: gpiob.pb0.into_push_pull_output(&mut gpiob.crl),
pc1: gpioc.pc1.into_pull_down_input(&mut gpioc.crl),
pc3: gpioc.pc3.into_push_pull_output(&mut gpioc.crl),
pc3: gpioc.pc3.into_analog(&mut gpioc.crl),
pc15: gpioc.pc15.into_pull_down_input(&mut gpioc.crh),
};
@ -166,12 +166,15 @@ fn main() -> ! {
// if report != last {
match consumer.device().write_report(&report) {
Err(UsbHidError::WouldBlock) => {}
Err(UsbHidError::UsbError(usb_device::UsbError::BufferOverflow)) => {
core::panic!("Failed to write consumer report, report is too big: {:?}", e)
}
Ok(_) => {
// last = report;
}
Err(e) => {
// TODO use a suitable pin once we know the pinout
input_pins.pb0.set_high(); // set as indicator that this has happened
// input_pins.pb0.set_high(); // set as indicator that this has happened
core::panic!("Failed to write consumer report: {:?}", e)
}
}
@ -198,12 +201,6 @@ fn main() -> ! {
else {
input_pins.pb0.set_low();
}
if output.leds & 0x2 == 0x2 {
input_pins.pc3.set_high();
}
else {
input_pins.pc3.set_low();
}
// Check generic input field
// Calibration bit
@ -259,13 +256,13 @@ fn calculate_factor(min: u16, max: u16) -> f32 {
// Returns a CustomInputReport from the inputs given
fn get_report(pins: &mut MyPins, adc1: &mut adc::Adc<pac::ADC1>, cal: &Calibration) -> CustomInputReport {
let mut values: [u16; 2] = [0; 2];
let mut values: [u16; 3] = [0; 3];
values[0] = adc1.read(&mut pins.pa1).unwrap();
values[1] = adc1.read(&mut pins.pa2).unwrap();
values[1] = adc1.read(&mut pins.pc3).unwrap();
let mut buttons: u16 = 0;
// Axis
let mut values_norm: [u16; 2] = [0; 2];
let mut values_norm: [u16; 3] = [0; 3];
let mut i = 0;
loop {
if values[i] < cal.data[i].min {