1456 lines
42 KiB
C++
Raw Permalink Normal View History

2024-09-18 13:05:17 -04:00
/*
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <functional>
#include <iostream>
#include <tuple>
#include "EZ-Template/PID.hpp"
#include "EZ-Template/slew.hpp"
#include "EZ-Template/util.hpp"
#include "okapi/api/units/QAngle.hpp"
#include "okapi/api/units/QLength.hpp"
#include "okapi/api/units/QTime.hpp"
#include "pros/motors.h"
using namespace ez;
namespace ez {
class Drive {
public:
/**
* Joysticks will return 0 when they are within this number. Set with opcontrol_joystick_threshold_set()
*/
int JOYSTICK_THRESHOLD;
/**
* Global current brake mode.
*/
pros::motor_brake_mode_e_t CURRENT_BRAKE = pros::E_MOTOR_BRAKE_COAST;
/**
* Global current mA.
*/
int CURRENT_MA = 2500;
/**
* Current swing type.
*/
e_swing current_swing;
/**
* Vector of pros motors for the left chassis.
*/
std::vector<pros::Motor> left_motors;
/**
* Vector of pros motors for the right chassis.
*/
std::vector<pros::Motor> right_motors;
/**
* Vector of pros motors that are disconnected from the drive.
*/
std::vector<int> pto_active;
/**
* Inertial sensor.
*/
pros::Imu imu;
/**
* Left tracking wheel.
*/
pros::ADIEncoder left_tracker;
/**
* Right tracking wheel.
*/
pros::ADIEncoder right_tracker;
/**
* Left rotation tracker.
*/
pros::Rotation left_rotation;
/**
* Right rotation tracker.
*/
pros::Rotation right_rotation;
/**
* PID objects.
*/
PID headingPID;
PID turnPID;
PID forward_drivePID;
PID leftPID;
PID rightPID;
PID backward_drivePID;
PID swingPID;
PID forward_swingPID;
PID backward_swingPID;
/**
* Slew objects.
*/
ez::slew slew_left;
ez::slew slew_right;
ez::slew slew_forward;
ez::slew slew_backward;
ez::slew slew_turn;
ez::slew slew_swing_forward;
ez::slew slew_swing_backward;
ez::slew slew_swing;
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_set(okapi::QLength distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_forward_set(okapi::QLength distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_backward_set(okapi::QLength distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi angle unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_set(okapi::QAngle distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi angle unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_forward_set(okapi::QAngle distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi angle unit
* \param min_speed
* the starting speed for the movement
*/
void slew_swing_constants_backward_set(okapi::QAngle distance, int min_speed);
/**
* Sets constants for slew for turns. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi angle unit
* \param min_speed
* the starting speed for the movement
*/
void slew_turn_constants_set(okapi::QAngle distance, int min_speed);
/**
* Sets constants for slew for driving forward. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_drive_constants_forward_set(okapi::QLength distance, int min_speed);
/**
* Sets constants for slew for driving backward. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_drive_constants_backward_set(okapi::QLength distance, int min_speed);
/**
* Sets constants for slew for driving. Slew ramps up the speed of the robot until the set distance is traveled.
*
* \param distance
* the distance the robot travels before reaching max speed, an okapi distance unit
* \param min_speed
* the starting speed for the movement
*/
void slew_drive_constants_set(okapi::QLength distance, int min_speed);
/**
* Current mode of the drive.
*/
e_mode mode;
/**
* Sets current mode of drive.
*/
void drive_mode_set(e_mode p_mode);
/**
* Returns current mode of drive.
*/
e_mode drive_mode_get();
/**
* Calibrates imu and initializes sd card to curve.
*/
void initialize();
/**
* Tasks for autonomous.
*/
pros::Task ez_auto;
/**
* Creates a Drive Controller using internal encoders.
*
* \param left_motor_ports
* Input {1, -2...}. Make ports negative if reversed!
* \param right_motor_ports
* Input {-3, 4...}. Make ports negative if reversed!
* \param imu_port
* Port the IMU is plugged into.
* \param wheel_diameter
* Diameter of your drive wheels. Remember 4" is 4.125"!
* \param ticks
* Motor cartridge RPM
* \param ratio
* External gear ratio, wheel gear / motor gear.
*/
Drive(std::vector<int> left_motor_ports, std::vector<int> right_motor_ports, int imu_port, double wheel_diameter, double ticks, double ratio);
/**
* Creates a Drive Controller using encoders plugged into the brain.
*
* \param left_motor_ports
* Input {1, -2...}. Make ports negative if reversed!
* \param right_motor_ports
* Input {-3, 4...}. Make ports negative if reversed!
* \param imu_port
* Port the IMU is plugged into.
* \param wheel_diameter
* Diameter of your sensored wheels. Remember 4" is 4.125"!
* \param ticks
* Ticks per revolution of your encoder.
* \param ratio
* External gear ratio, wheel gear / sensor gear.
* \param left_tracker_ports
* Input {1, 2}. Make ports negative if reversed!
* \param right_tracker_ports
* Input {3, 4}. Make ports negative if reversed!
*/
Drive(std::vector<int> left_motor_ports, std::vector<int> right_motor_ports, int imu_port, double wheel_diameter, double ticks, double ratio, std::vector<int> left_tracker_ports, std::vector<int> right_tracker_ports);
/**
* Creates a Drive Controller using encoders plugged into a 3 wire expander.
*
* \param left_motor_ports
* Input {1, -2...}. Make ports negative if reversed!
* \param right_motor_ports
* Input {-3, 4...}. Make ports negative if reversed!
* \param imu_port
* Port the IMU is plugged into.
* \param wheel_diameter
* Diameter of your sensored wheels. Remember 4" is 4.125"!
* \param ticks
* Ticks per revolution of your encoder.
* \param ratio
* External gear ratio, wheel gear / sensor gear.
* \param left_tracker_ports
* Input {1, 2}. Make ports negative if reversed!
* \param right_tracker_ports
* Input {3, 4}. Make ports negative if reversed!
* \param expander_smart_port
* Port the expander is plugged into.
*/
Drive(std::vector<int> left_motor_ports, std::vector<int> right_motor_ports, int imu_port, double wheel_diameter, double ticks, double ratio, std::vector<int> left_tracker_ports, std::vector<int> right_tracker_ports, int expander_smart_port);
/**
* Creates a Drive Controller using rotation sensors.
*
* \param left_motor_ports
* Input {1, -2...}. Make ports negative if reversed!
* \param right_motor_ports
* Input {-3, 4...}. Make ports negative if reversed!
* \param imu_port
* Port the IMU is plugged into.
* \param wheel_diameter
* Diameter of your sensored wheels. Remember 4" is 4.125"!
* \param ratio
* External gear ratio, wheel gear / sensor gear.
* \param left_tracker_port
* Make ports negative if reversed!
* \param right_tracker_port
* Make ports negative if reversed!
*/
Drive(std::vector<int> left_motor_ports, std::vector<int> right_motor_ports, int imu_port, double wheel_diameter, double ratio, int left_rotation_port, int right_rotation_port);
/**
* Sets drive defaults.
*/
void drive_defaults_set();
/////
//
// User Control
//
/////
/**
* Sets the chassis to controller joysticks using tank control. Run is usercontrol.
* This passes the controller through the curve functions, but is disabled by default. Use opcontrol_curve_buttons_toggle() to enable it.
*/
void opcontrol_tank();
/**
* Sets the chassis to controller joysticks using standard arcade control. Run is usercontrol.
* This passes the controller through the curve functions, but is disabled by default. Use opcontrol_curve_buttons_toggle() to enable it.
*
* \param stick_type
* ez::SINGLE or ez::SPLIT control
*/
void opcontrol_arcade_standard(e_type stick_type);
/**
* Sets the chassis to controller joysticks using flipped arcade control. Run is usercontrol.
* This passes the controller through the curve functions, but is disabled by default. Use opcontrol_curve_buttons_toggle() to enable it.
*
* \param stick_type
* ez::SINGLE or ez::SPLIT control
*/
void opcontrol_arcade_flipped(e_type stick_type);
/**
* Initializes left and right curves with the SD card, recommended to run in initialize().
*/
void opcontrol_curve_sd_initialize();
/**
* Sets the default joystick curves.
*
* \param left
* Left default curve.
* \param right
* Right default curve.
*/
void opcontrol_curve_default_set(double left, double right = 0);
/**
* Gets the default joystick curves, in {left, right}
*/
std::vector<double> opcontrol_curve_default_get();
/**
* Runs a P loop on the drive when the joysticks are released.
*
* \param kp
* Constant for the p loop.
*/
void opcontrol_drive_activebrake_set(double kp);
/**
* Returns kP for active brake.
*/
double opcontrol_drive_activebrake_get();
/**
* Enables/disables modifying the joystick input curves with the controller. True enables, false disables.
*
* \param input
* bool input
*/
void opcontrol_curve_buttons_toggle(bool toggle);
/**
* Gets the current state of the toggle. Enables/disables modifying the joystick input curves with the controller. True enables, false disables.
*/
bool opcontrol_curve_buttons_toggle_get();
/**
* Sets buttons for modifying the left joystick curve.
*
* \param decrease
* a pros button enumerator
* \param increase
* a pros button enumerator
*/
void opcontrol_curve_buttons_left_set(pros::controller_digital_e_t decrease, pros::controller_digital_e_t increase);
/**
* Returns a vector of pros controller buttons user for the left joystick curve, in {decrease, increase}
*/
std::vector<pros::controller_digital_e_t> opcontrol_curve_buttons_left_get();
/**
* Sets buttons for modifying the right joystick curve.
*
* \param decrease
* a pros button enumerator
* \param increase
* a pros button enumerator
*/
void opcontrol_curve_buttons_right_set(pros::controller_digital_e_t decrease, pros::controller_digital_e_t increase);
/**
* Returns a vector of pros controller buttons user for the right joystick curve, in {decrease, increase}
*/
std::vector<pros::controller_digital_e_t> opcontrol_curve_buttons_right_get();
/**
* Outputs a curve from 5225A In the Zone. This gives more control over the robot at lower speeds. https://www.desmos.com/calculator/rcfjjg83zx
*
* \param x
* joystick input
*/
double opcontrol_curve_left(double x);
/**
* Outputs a curve from 5225A In the Zone. This gives more control over the robot at lower speeds. https://www.desmos.com/calculator/rcfjjg83zx
*
* \param x
* joystick input
*/
double opcontrol_curve_right(double x);
/**
* Sets a new threshold for the joystick. The joysticks wil not return a value if they are within this.
*
* \param threshold
* new threshold
*/
void opcontrol_joystick_threshold_set(int threshold);
/**
* Gets a new threshold for the joystick. The joysticks wil not return a value if they are within this.
*/
int opcontrol_joystick_threshold_get();
/**
* Resets drive sensors at the start of opcontrol.
*/
void opcontrol_drive_sensors_reset();
/**
* Sets minimum value distance constants.
*
* \param l_stick
* input for left joystick
* \param r_stick
* input for right joystick
*/
void opcontrol_joystick_threshold_iterate(int l_stick, int r_stick);
/////
//
// PTO
//
/////
/**
* Checks if the motor is currently in pto_list. Returns true if it's already in pto_list.
*
* \param check_if_pto
* motor to check.
*/
bool pto_check(pros::Motor check_if_pto);
/**
* Adds motors to the pto list, removing them from the drive.
*
* \param pto_list
* list of motors to remove from the drive.
*/
void pto_add(std::vector<pros::Motor> pto_list);
/**
* Removes motors from the pto list, adding them to the drive. You cannot use the first index in a pto.
*
* \param pto_list
* list of motors to add to the drive.
*/
void pto_remove(std::vector<pros::Motor> pto_list);
/**
* Adds/removes motors from drive. You cannot use the first index in a pto.
*
* \param pto_list
* list of motors to add/remove from the drive.
* \param toggle
* if true, adds to list. if false, removes from list.
*/
void pto_toggle(std::vector<pros::Motor> pto_list, bool toggle);
/////
//
// PROS Wrapers
//
/////
/**
* Sets the chassis to voltage. Disables PID when called.
*
* \param left
* voltage for left side, -127 to 127
* \param right
* voltage for right side, -127 to 127
*/
void drive_set(int left, int right);
/**
* Gets the chassis to voltage, -127 to 127. Returns {left, right}
*/
std::vector<int> drive_get();
/**
* Changes the way the drive behaves when it is not under active user control
*
* \param brake_type
* the 'brake mode' of the motor e.g. 'pros::E_MOTOR_BRAKE_COAST' 'pros::E_MOTOR_BRAKE_BRAKE' 'pros::E_MOTOR_BRAKE_HOLD'
*/
void drive_brake_set(pros::motor_brake_mode_e_t brake_type);
/**
* Returns the brake mode of the drive in pros_brake_mode_e_t_
*/
pros::motor_brake_mode_e_t drive_brake_get();
/**
* Sets the limit for the current on the drive.
*
* \param mA
* input in milliamps
*/
void drive_current_limit_set(int mA);
/**
* Gets the limit for the current on the drive.
*/
int drive_current_limit_get();
/**
* Toggles set drive in autonomous. True enables, false disables.
*/
void pid_drive_toggle(bool toggle);
/**
* Gets the current state of the toggle. This toggles set drive in autonomous. True enables, false disables.
*/
bool pid_drive_toggle_get();
/**
* Toggles printing in autonomous. True enables, false disables.
*/
void pid_print_toggle(bool toggle);
/**
* Gets the current state of the toggle. This toggles printing in autonomous. True enables, false disables.
*/
bool pid_print_toggle_get();
/////
//
// Telemetry
//
/////
/**
* The position of the right motor.
*/
double drive_sensor_right();
/**
* The position of the right motor.
*/
int drive_sensor_right_raw();
/**
* The velocity of the right motor.
*/
int drive_velocity_right();
/**
* The watts of the right motor.
*/
double drive_mA_right();
/**
* Return TRUE when the motor is over current.
*/
bool drive_current_right_over();
/**
* The position of the left motor.
*/
double drive_sensor_left();
/**
* The position of the left motor.
*/
int drive_sensor_left_raw();
/**
* The velocity of the left motor.
*/
int drive_velocity_left();
/**
* The watts of the left motor.
*/
double drive_mA_left();
/**
* Return TRUE when the motor is over current.
*/
bool drive_current_left_over();
/**
* Reset all the chassis motors, recommended to run at the start of your autonomous routine.
*/
void drive_sensor_reset();
/**
* Resets the current gyro value. Defaults to 0, recommended to run at the start of your autonomous routine.
*
* \param new_heading
* New heading value.
*/
void drive_imu_reset(double new_heading = 0);
/**
* Returns the current gyro value.
*/
double drive_imu_get();
/**
* Calibrates the IMU, recommended to run in initialize().
*
* \param run_loading_animation
* bool for running loading animation
*/
bool drive_imu_calibrate(bool run_loading_animation = true);
/**
* Loading display while the IMU calibrates.
*/
void drive_imu_display_loading(int iter);
/**
* Practice mode for driver practice that shuts off the drive if you go max speed.
*
* @param toggle True if you want this mode enables and False if you want it disabled.
*/
void opcontrol_joystick_practicemode_toggle(bool toggle);
/**
* Gets current state of the toggle. Practice mode for driver practice that shuts off the drive if you go max speed.
*/
bool opcontrol_joystick_practicemode_toggle_get();
/**
* Reversal for drivetrain in opcontrol that flips the left and right side and the direction of the drive
*
* @param toggle True if you want your drivetrain reversed and False if you do not.
*/
void opcontrol_drive_reverse_set(bool toggle);
/**
* Gets current state of the toggle. Reversal for drivetrain in opcontrol that flips the left and right side and the direction of the drive.
*/
bool opcontrol_drive_reverse_get();
/////
//
// Autonomous Functions
//
/////
/**
* Sets the robot to move forward using PID with okapi units.
*
* \param target
* target value in inches
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
* \param toggle_heading
* toggle for heading correction
*/
void pid_drive_set(okapi::QLength p_target, int speed, bool slew_on = false, bool toggle_heading = true);
/**
* Sets the robot to move forward using PID without okapi units.
*
* \param target
* target value as a double, unit is inches
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
* \param toggle_heading
* toggle for heading correction
*/
void pid_drive_set(double target, int speed, bool slew_on = false, bool toggle_heading = true);
/**
* Sets the robot to turn using PID.
*
* \param target
* target value as a double, unit is degrees
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
*/
void pid_turn_set(double target, int speed, bool slew_on = false);
/**
* Sets the robot to turn using PID with okapi units.
*
* \param p_target
* target value in degrees
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
*/
void pid_turn_set(okapi::QAngle p_target, int speed, bool slew_on = false);
/**
* Sets the robot to turn relative to current heading using PID with okapi units.
*
* \param p_target
* target value in okapi angle units
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
*/
void pid_turn_relative_set(okapi::QAngle p_target, int speed, bool slew_on = false);
/**
* Sets the robot to turn relative to current heading using PID without okapi units.
*
* \param p_target
* target value as a double, unit is degrees
* \param speed
* 0 to 127, max speed during motion
* \param slew_on
* ramp up from a lower speed to your target speed
*/
void pid_turn_relative_set(double target, int speed, bool slew_on = false);
/**
* Turn using only the left or right side without okapi units.
*
* \param type
* L_SWING or R_SWING
* \param p_target
* target value as a double, unit is degrees
* \param speed
* 0 to 127, max speed during motion
* \param opposite_speed
* -127 to 127, max speed of the opposite side of the drive during the swing. This is used for arcs, and is defaulted to 0.
*/
void pid_swing_set(e_swing type, double target, int speed, int opposite_speed = 0, bool slew_on = false);
/**
* Turn using only the left or right side with okapi units.
*
* \param type
* L_SWING or R_SWING
* \param p_target
* target value in degrees
* \param speed
* 0 to 127, max speed during motion
* \param opposite_speed
* -127 to 127, max speed of the opposite side of the drive during the swing. This is used for arcs, and is defaulted to 0.
*/
void pid_swing_set(e_swing type, okapi::QAngle p_target, int speed, int opposite_speed = 0, bool slew_on = false);
/**
* Sets the robot to turn only using the left or right side relative to current heading using PID with okapi units.
*
* \param type
* L_SWING or R_SWING
* \param p_target
* target value in okapi angle units
* \param speed
* 0 to 127, max speed during motion
* \param opposite_speed
* -127 to 127, max speed of the opposite side of the drive during the swing. This is used for arcs, and is defaulted to 0.
*/
void pid_swing_relative_set(e_swing type, okapi::QAngle p_target, int speed, int opposite_speed = 0, bool slew_on = false);
/**
* Sets the robot to turn only using the left or right side relative to current heading using PID without okapi units.
*
* \param type
* L_SWING or R_SWING
* \param p_target
* target value as a double, unit is degrees
* \param speed
* 0 to 127, max speed during motion
* \param opposite_speed
* -127 to 127, max speed of the opposite side of the drive during the swing. This is used for arcs, and is defaulted to 0.
*/
void pid_swing_relative_set(e_swing type, double target, int speed, int opposite_speed = 0, bool slew_on = false);
/**
* Resets all PID targets to 0.
*/
void pid_targets_reset();
/**
* Sets heading of gyro and target of PID, okapi angle.
*/
void drive_angle_set(okapi::QAngle p_angle);
/**
* Sets heading of gyro and target of PID, takes double as an angle.
*/
void drive_angle_set(double angle);
/**
* Lock the code in a while loop until the robot has settled.
*/
void pid_wait();
/**
* Lock the code in a while loop until this position has passed for turning or swinging with okapi units.
*
* \param target
* for turning, using okapi units
*/
void pid_wait_until(okapi::QAngle target);
/**
* Lock the code in a while loop until this position has passed for driving with okapi units.
*
* \param target
* for driving, using okapi units
*/
void pid_wait_until(okapi::QLength target);
/**
* Lock the code in a while loop until this position has passed for driving without okapi units.
*
* \param target
* for driving or turning, using a double. degrees for turns/swings, inches for driving.
*/
void pid_wait_until(double target);
/**
* Autonomous interference detection. Returns true when interfered, and false when nothing happened.
*/
bool interfered = false;
/**
* @brief Set the ratio of the robot
*
* @param ratio
* ratio of the gears
*/
void drive_ratio_set(double ratio);
/**
* Changes max speed during a drive motion.
*
* \param speed
* new clipped speed
*/
void pid_speed_max_set(int speed);
/**
* Returns max speed of drive during autonomous.
*/
int pid_speed_max_get();
/**
* @brief Set the turn pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_turn_constants_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_turn_constants_get();
/**
* @brief Set the swing pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_swing_constants_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants. Returns -1 if fwd and rev constants aren't the same!
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_swing_constants_get();
/**
* @brief Set the forward swing pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_swing_constants_forward_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_swing_constants_forward_get();
/**
* @brief Set the backward swing pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_swing_constants_backward_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_swing_constants_backward_get();
/**
* @brief Set the heading pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_heading_constants_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_heading_constants_get();
/**
* @brief Set the drive pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_drive_constants_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants. Returns -1 if fwd and rev constants aren't the same!
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_drive_constants_get();
/**
* @brief Set the forward pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_drive_constants_forward_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_drive_constants_forward_get();
/**
* @brief Set the backwards pid constants object
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
void pid_drive_constants_backward_set(double p, double i = 0.0, double d = 0.0, double p_start_i = 0.0);
/**
* @brief returns PID constants with PID::Constants.
*
* @param p kP
* @param i kI
* @param d kD
* @param p_start_i start_I
*/
PID::Constants pid_drive_constants_backward_get();
/**
* Sets minimum power for swings when kI and startI are enabled.
*
* \param min
* new clipped speed
*/
void pid_swing_min_set(int min);
/**
* The minimum power for turns when kI and startI are enabled.
*
* \param min
* new clipped speed
*/
void pid_turn_min_set(int min);
/**
* Returns minimum power for swings when kI and startI are enabled.
*/
int pid_swing_min_get();
/**
* Returns minimum power for turns when kI and startI are enabled.
*/
int pid_turn_min_get();
/**
* Set's constants for drive exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error. In okapi units.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this. In okapi units.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error. In okapi units.
* \param p_big_error
* Sets big_error. Timer will start when error is within this. In okapi units.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0. In okapi units.
*/
void pid_drive_exit_condition_set(okapi::QTime p_small_exit_time, okapi::QLength p_small_error, okapi::QTime p_big_exit_time, okapi::QLength p_big_error, okapi::QTime p_velocity_exit_time, okapi::QTime p_mA_timeout);
/**
* Set's constants for turn exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error. In okapi units.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this. In okapi units.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error. In okapi units.
* \param p_big_error
* Sets big_error. Timer will start when error is within this. In okapi units.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0. In okapi units.
*/
void pid_turn_exit_condition_set(okapi::QTime p_small_exit_time, okapi::QAngle p_small_error, okapi::QTime p_big_exit_time, okapi::QAngle p_big_error, okapi::QTime p_velocity_exit_time, okapi::QTime p_mA_timeout);
/**
* Set's constants for swing exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error. In okapi units.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this. In okapi units.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error. In okapi units.
* \param p_big_error
* Sets big_error. Timer will start when error is within this. In okapi units.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0. In okapi units.
*/
void pid_swing_exit_condition_set(okapi::QTime p_small_exit_time, okapi::QAngle p_small_error, okapi::QTime p_big_exit_time, okapi::QAngle p_big_error, okapi::QTime p_velocity_exit_time, okapi::QTime p_mA_timeout);
/**
* Set's constants for drive exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error.
* \param p_big_error
* Sets big_error. Timer will start when error is within this.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0.
*/
void pid_drive_exit_condition_set(int p_small_exit_time, double p_small_error, int p_big_exit_time, double p_big_error, int p_velocity_exit_time, int p_mA_timeout);
/**
* Set's constants for turn exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error.
* \param p_big_error
* Sets big_error. Timer will start when error is within this.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0.
*/
void pid_turn_exit_condition_set(int p_small_exit_time, double p_small_error, int p_big_exit_time, double p_big_error, int p_velocity_exit_time, int p_mA_timeout);
/**
* Set's constants for swing exit conditions.
*
* \param p_small_exit_time
* Sets small_exit_time. Timer for to exit within smalL_error.
* \param p_small_error
* Sets smalL_error. Timer will start when error is within this.
* \param p_big_exit_time
* Sets big_exit_time. Timer for to exit within big_error.
* \param p_big_error
* Sets big_error. Timer will start when error is within this.
* \param p_velocity_exit_time
* Sets velocity_exit_time. Timer will start when velocity is 0.
*/
void pid_swing_exit_condition_set(int p_small_exit_time, double p_small_error, int p_big_exit_time, double p_big_error, int p_velocity_exit_time, int p_mA_timeout);
/**
* Returns current tick_per_inch()
*/
double drive_tick_per_inch();
/**
* Returns current tick_per_inch()
*/
void opcontrol_curve_buttons_iterate();
/**
* Enables PID Tuner
*/
void pid_tuner_enable();
/**
* Disables PID Tuner
*/
void pid_tuner_disable();
/**
* Toggles PID tuner between enabled and disables
*/
void pid_tuner_toggle();
/**
* Checks if PID Tuner is enabled. True is enabled, false is disables.
*/
bool pid_tuner_enabled();
/**
* Iterates through controller inputs to modify PID constants
*/
void pid_tuner_iterate();
/**
* Toggle for printing the display of the PID Tuner to the brain
*
* \param input
* true prints to brain, false doesn't
*/
void pid_tuner_print_brain_set(bool input);
/**
* Toggle for printing the display of the PID Tuner to the terminal
*
* \param input
* true prints to terminal, false doesn't
*/
void pid_tuner_print_terminal_set(bool input);
/**
* Returns true if printing to terminal is enabled
*/
bool pid_tuner_print_terminal_enabled();
/**
* Returns true if printing to brain is enabled
*/
bool pid_tuner_print_brain_enabled();
/**
* Sets the value that PID Tuner increments P
*
* \param p
* double, p will increase by this
*/
void pid_tuner_increment_p_set(double p);
/**
* Sets the value that PID Tuner increments I
*
* \param p
* double, i will increase by this
*/
void pid_tuner_increment_i_set(double i);
/**
* Sets the value that PID Tuner increments D
*
* \param p
* double, d will increase by this
*/
void pid_tuner_increment_d_set(double d);
/**
* Sets the value that PID Tuner increments Start I
*
* \param p
* double, start i will increase by this
*/
void pid_tuner_increment_start_i_set(double start_i);
/**
* Returns the value that PID Tuner increments P
*/
double pid_tuner_increment_p_get();
/**
* Returns the value that PID Tuner increments I
*/
double pid_tuner_increment_i_get();
/**
* Returns the value that PID Tuner increments D
*/
double pid_tuner_increment_d_get();
/**
* Returns the value that PID Tuner increments Start I
*/
double pid_tuner_increment_start_i_get();
private: // !Auton
bool drive_toggle = true;
bool print_toggle = true;
int swing_min = 0;
int turn_min = 0;
bool practice_mode_is_on = false;
int swing_opposite_speed = 0;
bool slew_swing_fwd_using_angle = false;
bool slew_swing_rev_using_angle = false;
bool slew_swing_using_angle = false;
bool pid_tuner_terminal_b = false;
bool pid_tuner_lcd_b = true;
struct const_and_name {
std::string name = "";
PID::Constants *consts;
};
std::vector<const_and_name> constants;
void pid_tuner_print();
void pid_tuner_value_modify(float p, float i, float d, float start);
void pid_tuner_value_increase();
void pid_tuner_value_decrease();
void pid_tuner_print_brain();
void pid_tuner_print_terminal();
void pid_tuner_brain_init();
int column = 0;
int row = 0;
std::string arrow = " <--\n";
bool last_controller_curve_state = false;
bool last_auton_selector_state = false;
bool pid_tuner_on = false;
std::string complete_pid_tuner_output = "";
float p_increment = 0.1, i_increment = 0.001, d_increment = 0.25, start_i_increment = 1.0;
/**
* Private wait until for drive
*/
void wait_until_drive(double target);
void wait_until_turn_swing(double target);
/**
* Sets the chassis to voltage.
*
* \param left
* voltage for left side, -127 to 127
* \param right
* voltage for right side, -127 to 127
*/
void private_drive_set(int left, int right);
/**
* Returns joystick value clipped to JOYSTICK_THRESH
*/
int clipped_joystick(int joystick);
/**
* Heading bool.
*/
bool heading_on = true;
/**
* Active brake kp constant.
*/
double active_brake_kp = 0;
/**
* Tick per inch calculation.
*/
double TICK_PER_REV;
double TICK_PER_INCH;
double CIRCUMFERENCE;
double CARTRIDGE;
double RATIO;
double WHEEL_DIAMETER;
/**
* Max speed for autonomous.
*/
int max_speed;
/**
* Tasks
*/
void drive_pid_task();
void swing_pid_task();
void turn_pid_task();
void ez_auto_task();
/**
* Starting value for left/right
*/
double l_start = 0;
double r_start = 0;
/**
* Enable/disable modifying controller curve with controller.
*/
bool disable_controller = true; // True enables, false disables.
/**
* Is tank drive running?
*/
bool is_tank;
#define DRIVE_INTEGRATED 1
#define DRIVE_ADI_ENCODER 2
#define DRIVE_ROTATION 3
/**
* Is tracking?
*/
int is_tracker = DRIVE_INTEGRATED;
/**
* Save input to sd card
*/
void save_l_curve_sd();
void save_r_curve_sd();
/**
* Struct for buttons for increasing/decreasing curve with controller
*/
struct button_ {
bool lock = false;
bool release_reset = false;
int release_timer = 0;
int hold_timer = 0;
int increase_timer;
pros::controller_digital_e_t button;
};
button_ l_increase_;
button_ l_decrease_;
button_ r_increase_;
button_ r_decrease_;
/**
* Function for button presses.
*/
void button_press(button_ *input_name, int button, std::function<void()> changeCurve, std::function<void()> save);
/**
* The left and right curve scalers.
*/
double left_curve_scale;
double right_curve_scale;
/**
* Increase and decrease left and right curve scale.
*/
void l_decrease();
void l_increase();
void r_decrease();
void r_increase();
/**
* Boolean to flip which side is the front of the robot for driver control.
*/
bool is_reversed = false;
};
}; // namespace ez