use std::vec::Vec;
use log::warn;
use vexide::{
controller::{ButtonState, ControllerState},
prelude::{AdiDigitalOut, Controller, Motor},
};
#[allow(dead_code)]
pub struct ControllerControl {
state: ControllerState,
controlkey: ButtonState,
}
#[allow(dead_code)]
impl ControllerControl {
pub fn new(controller: &Controller, button: ControllerButton) -> Self {
let state = get_state(controller);
let control_button = get_button_state(state, button);
ControllerControl {
state,
controlkey: control_button,
}
}
pub fn button_to_adi_toggle(
&self,
button: ControllerButton,
adi_devices: Vec<&mut AdiDigitalOut>,
ctrl: bool,
) {
let button_state = get_button_state(self.state, button);
if button_state.is_now_released() && self.controlkey.is_pressed() == ctrl {
for device in adi_devices {
device.toggle().unwrap_or_else(|e| {
warn!("ADI Toggle Error: {}", e);
});
}
}
}
pub fn button_to_adi_high(
&self,
button: ControllerButton,
adi_devices: Vec<&mut AdiDigitalOut>,
ctrl: bool,
) {
let button_state = get_button_state(self.state, button);
if button_state.is_now_released() && self.controlkey.is_pressed() == ctrl {
for device in adi_devices {
device.set_high().unwrap_or_else(|e| {
warn!("ADI Set High Error: {}", e);
});
}
}
}
pub fn button_to_adi_low(
&self,
button: ControllerButton,
adi_devices: Vec<&mut AdiDigitalOut>,
ctrl: bool,
) {
let button_state = get_button_state(self.state, button);
if button_state.is_now_released() && self.controlkey.is_pressed() == ctrl {
for device in adi_devices {
device.set_low().unwrap_or_else(|e| {
warn!("ADI Set Low Error: {}", e);
});
}
}
}
pub fn dual_button_to_adi(
&self,
button_high: ControllerButton,
button_low: ControllerButton,
adi_devices: Vec<&mut AdiDigitalOut>,
ctrl: bool,
) {
let button_high_state = get_button_state(self.state, button_high);
let button_low_state = get_button_state(self.state, button_low);
if self.controlkey.is_pressed() == ctrl {
if button_high_state.is_now_released() {
for device in adi_devices {
device.set_high().unwrap_or_else(|e| {
warn!("ADI Toggle Error: {}", e);
});
}
} else if button_low_state.is_now_released() {
for device in adi_devices {
device.set_low().unwrap_or_else(|e| {
warn!("ADI Toggle Error: {}", e);
});
}
}
}
}
pub fn button_to_motors(
&self,
button: ControllerButton,
motors: Vec<&mut Motor>,
active_pwr: f64,
passive_pwr: f64,
ctrl: bool,
) {
let button_state = get_button_state(self.state, button);
if self.controlkey.is_pressed() == ctrl {
if button_state.is_pressed() {
for motor in motors {
motor.set_voltage(active_pwr).unwrap_or_else(|e| {
warn!("Motor Set Voltage Error: {}", e);
});
}
} else {
for motor in motors {
motor.set_voltage(passive_pwr).unwrap_or_else(|e| {
warn!("Motor Set Voltage Error: {}", e);
});
}
}
}
}
pub fn dual_button_to_motors(
&self,
button_high: ControllerButton,
button_low: ControllerButton,
motors: Vec<&mut Motor>,
high_pwr: f64,
low_pwr: f64,
passive_pwr: f64,
ctrl: bool,
) {
let button_high_state = get_button_state(self.state, button_high);
let button_low_state = get_button_state(self.state, button_low);
if self.controlkey.is_pressed() == ctrl {
if button_high_state.is_pressed() {
for motor in motors {
motor.set_voltage(high_pwr).unwrap_or_else(|e| {
warn!("Motor Set Voltage Error: {}", e);
});
}
} else if button_low_state.is_pressed() {
for motor in motors {
motor.set_voltage(low_pwr).unwrap_or_else(|e| {
warn!("Motor Set Voltage Error: {}", e);
});
}
} else {
for motor in motors {
motor.set_voltage(passive_pwr).unwrap_or_else(|e| {
warn!("Motor Set Voltage Error: {}", e);
});
}
}
}
}
}
#[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
pub enum ControllerButton {
ButtonA,
ButtonB,
ButtonX,
ButtonY,
ButtonUp,
ButtonDown,
ButtonLeft,
ButtonRight,
ButtonL1,
ButtonL2,
ButtonR1,
ButtonR2,
}
fn get_button_state(state: ControllerState, button: ControllerButton) -> ButtonState {
match button {
ControllerButton::ButtonA => state.button_a,
ControllerButton::ButtonB => state.button_b,
ControllerButton::ButtonX => state.button_x,
ControllerButton::ButtonY => state.button_y,
ControllerButton::ButtonUp => state.button_up,
ControllerButton::ButtonDown => state.button_down,
ControllerButton::ButtonLeft => state.button_left,
ControllerButton::ButtonRight => state.button_right,
ControllerButton::ButtonL1 => state.button_l1,
ControllerButton::ButtonL2 => state.button_l2,
ControllerButton::ButtonR1 => state.button_r1,
ControllerButton::ButtonR2 => state.button_r2,
}
}
fn get_state(controller: &Controller) -> ControllerState {
controller.state().unwrap_or_else(|e| {
warn!("Controller State Error: {}", e);
ControllerState::default()
})
}