Code cleanup

This commit is contained in:
Christoffer Martinsson 2025-07-24 22:16:03 +02:00
parent 9572df9e3b
commit 2e9f2f9fa3

View File

@ -62,27 +62,6 @@ const XTAL_FREQ_HZ: u32 = 12_000_000u32;
// | | 19 | 15 | 17 | | 24 | 20 | 22 | | // | | 19 | 15 | 17 | | 24 | 20 | 22 | |
// | | 18 | | 23 | | // | | 18 | | 23 | |
// --------------------------------------------------------------- // ---------------------------------------------------------------
// Config Layer (holding CONFIG button)
// ---------------------------------------------------------------
// |BOOT L| CAL U| | CONFIG | | - | - |
// ---------------------------------------------------------------
// | | - | - | - | | - | - | - | |
// | |
// | |C M10| | - | |
// | |C M7 | | - | |
// | -/- -/- |
// | | - | | - | |
// | | - | - | - | | - |C OK | - | |
// | | - | | - | |
// ---------------------------------------------------------------
//
pub const CONFIG_BUTTON: usize = 2;
pub const BOOT_BUTTON: usize = 0;
pub const CAL_BUTTON: usize = 1;
pub const CAL_DONE_BUTTON: usize = 20;
pub const CAL_M10_GIMBLE_BUTTON: usize = 8;
pub const CAL_M7_GIMBLE_BUTTON: usize = 9;
pub const BUTTON_FRONT_LEFT_LOWER: usize = 0; pub const BUTTON_FRONT_LEFT_LOWER: usize = 0;
pub const BUTTON_FRONT_LEFT_UPPER: usize = 1; pub const BUTTON_FRONT_LEFT_UPPER: usize = 1;
pub const BUTTON_FRONT_LEFT_EXTRA: usize = 25; pub const BUTTON_FRONT_LEFT_EXTRA: usize = 25;
@ -111,10 +90,15 @@ pub const BUTTON_TOP_RIGHT_HAT_RIGHT: usize = 22;
pub const BUTTON_TOP_RIGHT_HAT_DOWN: usize = 23; pub const BUTTON_TOP_RIGHT_HAT_DOWN: usize = 23;
pub const BUTTON_TOP_RIGHT_HAT_LEFT: usize = 24; pub const BUTTON_TOP_RIGHT_HAT_LEFT: usize = 24;
pub const USB_HAT_UP: usize = 33;
pub const USB_HAT_RIGHT: usize = 34;
pub const USB_HAT_DOWN: usize = 35;
pub const USB_HAT_LEFT: usize = 36;
// Special button functions // Special button functions
// Throttle hold: // Throttle hold:
pub const TH_BUTTON: usize = 7; pub const TH_BUTTON: usize = BUTTON_TOP_LEFT_MODE;
pub const VT_BUTTON: usize = 12; pub const VT_BUTTON: usize = BUTTON_TOP_RIGHT_MODE;
pub const BUTTON_ROWS: usize = 5; pub const BUTTON_ROWS: usize = 5;
pub const BUTTON_COLS: usize = 5; pub const BUTTON_COLS: usize = 5;
@ -141,6 +125,8 @@ pub const DEBOUNCE: u8 = 10;
pub const RELEASE_RIMEOUT: u16 = 30; // => 300ms pub const RELEASE_RIMEOUT: u16 = 30; // => 300ms
pub const EEPROM_DATA_LENGTH: usize = 25;
// Public types // Public types
#[derive(Copy, Clone, Default)] #[derive(Copy, Clone, Default)]
pub struct Button { pub struct Button {
@ -297,9 +283,10 @@ fn main() -> ! {
// Scan matrix to get initial state and check if bootloader should be entered // Scan matrix to get initial state and check if bootloader should be entered
// This is done by holding button 0 pressed while power on the unit // This is done by holding button 0 pressed while power on the unit
for _ in 0..10 { for _ in 0..10 {
// Scan 10 times to make sure debounce routine covered all buttons
button_matrix.scan_matrix(&mut delay); button_matrix.scan_matrix(&mut delay);
} }
if button_matrix.buttons_pressed()[0] { if button_matrix.buttons_pressed()[BUTTON_FRONT_LEFT_LOWER] {
status_led.update(StatusMode::Bootloader); status_led.update(StatusMode::Bootloader);
let gpio_activity_pin_mask: u32 = 0; let gpio_activity_pin_mask: u32 = 0;
let disable_interface_mask: u32 = 0; let disable_interface_mask: u32 = 0;
@ -434,7 +421,7 @@ fn main() -> ! {
item.center <<= 8; item.center <<= 8;
item.center |= eeprom.read_byte((index as u32 * 6) + 5).unwrap() as u16; item.center |= eeprom.read_byte((index as u32 * 6) + 5).unwrap() as u16;
} }
gimbal_mode = eeprom.read_byte(25).unwrap(); gimbal_mode = eeprom.read_byte(EEPROM_DATA_LENGTH as u32).unwrap();
loop { loop {
// Take care of USB HID poll requests // Take care of USB HID poll requests
@ -520,8 +507,24 @@ fn main() -> ! {
buttons[BUTTON_TOP_RIGHT_HAT].pressed = false; buttons[BUTTON_TOP_RIGHT_HAT].pressed = false;
} }
// Secondary way to enter bootloader (pressing all left hands buttons except the hat // Config Layer
if buttons[BOOT_BUTTON].pressed && buttons[CONFIG_BUTTON].pressed { // ---------------------------------------------------------------
// |BOOT L| CAL U| | CONFIG | | - | - |
// ---------------------------------------------------------------
// | | - | - | - | | - | - | - | |
// | |
// | |C M10| | - | |
// | |C M7 | | - | |
// | -/- -/- |
// | | - | | - | |
// | | - | - | - | | - |C OK | - | |
// | | - | | - | |
// ---------------------------------------------------------------
// Secondary way to enter bootloader
if buttons[BUTTON_FRONT_LEFT_LOWER].pressed
&& buttons[BUTTON_TOP_LEFT_MODE].pressed
&& buttons[BUTTON_TOP_RIGHT_MODE].pressed
{
status_led.update(StatusMode::Bootloader); status_led.update(StatusMode::Bootloader);
let gpio_activity_pin_mask: u32 = 0; let gpio_activity_pin_mask: u32 = 0;
let disable_interface_mask: u32 = 0; let disable_interface_mask: u32 = 0;
@ -531,9 +534,11 @@ fn main() -> ! {
); );
} }
// Calibration of center position (pressing all right hands buttons except // Calibration of center position
// the hat switch) if buttons[BUTTON_FRONT_LEFT_UPPER].pressed
if buttons[CAL_BUTTON].pressed && buttons[CONFIG_BUTTON].pressed { && buttons[BUTTON_TOP_LEFT_MODE].pressed
&& buttons[BUTTON_TOP_RIGHT_MODE].pressed
{
for (index, item) in axis.iter_mut().enumerate() { for (index, item) in axis.iter_mut().enumerate() {
item.center = smoother[index].value() as u16; item.center = smoother[index].value() as u16;
item.min = item.center; item.min = item.center;
@ -553,14 +558,16 @@ fn main() -> ! {
} }
} }
if calibration_active && buttons[CAL_M10_GIMBLE_BUTTON].pressed { // Calibration set M10 gimbal mode
if calibration_active && buttons[BUTTON_TOP_LEFT_UP].pressed {
gimbal_mode = GIMBAL_MODE_M10; gimbal_mode = GIMBAL_MODE_M10;
for (index, item) in axis.iter_mut().enumerate() { for (index, item) in axis.iter_mut().enumerate() {
item.center = smoother[index].value() as u16; item.center = smoother[index].value() as u16;
item.min = item.center; item.min = item.center;
item.max = item.center; item.max = item.center;
} }
} else if calibration_active && buttons[CAL_M7_GIMBLE_BUTTON].pressed { // Calibration set M7 gimbal mode
} else if calibration_active && buttons[BUTTON_TOP_LEFT_DOWN].pressed {
gimbal_mode = GIMBAL_MODE_M7; gimbal_mode = GIMBAL_MODE_M7;
for (index, item) in axis.iter_mut().enumerate() { for (index, item) in axis.iter_mut().enumerate() {
item.center = smoother[index].value() as u16; item.center = smoother[index].value() as u16;
@ -569,8 +576,8 @@ fn main() -> ! {
} }
} }
// Save calibration data to eeprom (pressing right hat switch) // Save calibration data to eeprom (pressing right hat switch)
else if calibration_active && buttons[CAL_DONE_BUTTON].pressed { else if calibration_active && buttons[BUTTON_TOP_RIGHT_HAT].pressed {
let mut eeprom_data: [u8; 25] = [0; 25]; let mut eeprom_data: [u8; EEPROM_DATA_LENGTH] = [0; EEPROM_DATA_LENGTH];
for (index, item) in axis.iter_mut().enumerate() { for (index, item) in axis.iter_mut().enumerate() {
eeprom_data[index * 6] = item.min as u8; eeprom_data[index * 6] = item.min as u8;
eeprom_data[(index * 6) + 1] = (item.min >> 8) as u8; eeprom_data[(index * 6) + 1] = (item.min >> 8) as u8;
@ -579,12 +586,12 @@ fn main() -> ! {
eeprom_data[(index * 6) + 4] = item.center as u8; eeprom_data[(index * 6) + 4] = item.center as u8;
eeprom_data[(index * 6) + 5] = (item.center >> 8) as u8; eeprom_data[(index * 6) + 5] = (item.center >> 8) as u8;
} }
eeprom_data[24] = gimbal_mode; eeprom_data[EEPROM_DATA_LENGTH - 1] = gimbal_mode;
let _ = eeprom.write_page(0x01, &eeprom_data); let _ = eeprom.write_page(0x01, &eeprom_data);
calibration_active = false; calibration_active = false;
} }
// // ON/OFF switch for Throttle hold mode // ON/OFF switch for Throttle hold mode
throttle_hold_enable = axis[GIMBAL_AXIS_LEFT_Y].hold != AXIS_CENTER; throttle_hold_enable = axis[GIMBAL_AXIS_LEFT_Y].hold != AXIS_CENTER;
// Process axis values // Process axis values
@ -632,7 +639,7 @@ fn main() -> ! {
} }
// Update Virtual RY // Update Virtual RY
let virtual_step: u16 = 2; let virtual_step: u16 = 5;
// Compensate value when changing direction // Compensate value when changing direction
if buttons[BUTTON_FRONT_LEFT_UPPER].pressed if buttons[BUTTON_FRONT_LEFT_UPPER].pressed
&& !buttons[BUTTON_FRONT_LEFT_LOWER].pressed && !buttons[BUTTON_FRONT_LEFT_LOWER].pressed
@ -712,7 +719,7 @@ fn main() -> ! {
usb_activity = true; usb_activity = true;
} }
// Generate led activity when gimbal is moved from idle position // Indicate activity when gimbal is moved from idle position
for item in axis.iter_mut() { for item in axis.iter_mut() {
if item.value != item.previous_value { if item.value != item.previous_value {
usb_activity = true; usb_activity = true;
@ -720,7 +727,7 @@ fn main() -> ! {
item.previous_value = item.value; item.previous_value = item.value;
} }
// Generate led activity when a button is pressed // Indicate activity when a button is pressed
for (index, key) in buttons.iter_mut().enumerate() { for (index, key) in buttons.iter_mut().enumerate() {
update_button_press_type(key, (timer.get_counter().ticks() / 1000) as u32); update_button_press_type(key, (timer.get_counter().ticks() / 1000) as u32);
@ -910,7 +917,7 @@ fn get_joystick_report(
let mut slider: i16 = axis_12bit_to_i16(ADC_MIN); let mut slider: i16 = axis_12bit_to_i16(ADC_MIN);
let mut hat: u8 = 8; // Hat center position let mut hat: u8 = 8; // Hat center position
// Virtual axix control. Disables z and rx axis and using girght gimbal Y axis to control // Virtual axix control. Disables z and rx axis and using right gimbal Y axis to control
// slider axis. Values from center stick to max or min will be recalculated to min to max. // slider axis. Values from center stick to max or min will be recalculated to min to max.
if *vt_enable { if *vt_enable {
if axis[GIMBAL_AXIS_RIGHT_X].value >= AXIS_CENTER { if axis[GIMBAL_AXIS_RIGHT_X].value >= AXIS_CENTER {
@ -942,8 +949,8 @@ fn get_joystick_report(
if key.enable_long_press { if key.enable_long_press {
if key.active_usb_button != 0 { if key.active_usb_button != 0 {
// Check if key is assigned as hat switch // Check if key is assigned as hat switch
if key.active_usb_button >= 33 && key.active_usb_button <= 36 { if key.active_usb_button >= USB_HAT_UP && key.active_usb_button <= USB_HAT_LEFT {
hat = (key.active_usb_button as u8 - 33) * 2; hat = (key.active_usb_button as u8 - USB_HAT_UP as u8) * 2;
} else { } else {
buttons |= 1 << (key.active_usb_button - 1); buttons |= 1 << (key.active_usb_button - 1);
} }
@ -951,8 +958,8 @@ fn get_joystick_report(
} else { } else {
if key.pressed && key.usb_button != 0 { if key.pressed && key.usb_button != 0 {
// Check if key is assigned as hat switch // Check if key is assigned as hat switch
if key.usb_button >= 33 && key.usb_button <= 36 { if key.usb_button >= USB_HAT_UP && key.usb_button <= USB_HAT_LEFT {
hat = (key.usb_button as u8 - 33) * 2; hat = (key.usb_button as u8 - USB_HAT_UP as u8) * 2;
} else { } else {
buttons |= 1 << (key.usb_button - 1); buttons |= 1 << (key.usb_button - 1);
} }