2024-09-18 13:05:17 -04:00

89 lines
2.2 KiB
C++

/*
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 "EZ-Template/util.hpp"
#include "api.h"
namespace ez {
class slew {
public:
slew();
/**
* Struct for constants.
*/
struct Constants {
double min_speed = 0;
double distance_to_travel = 0;
};
Constants constants;
/**
* Sets constants for slew. 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
* \param minimum_speed
* the starting speed for the movement
*/
slew(double distance, int minimum_speed);
/**
* Sets constants for slew. 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
* \param minimum_speed
* the starting speed for the movement
*/
void constants_set(double distance, int minimum_speed);
Constants constants_get();
/**
* Initializes slew for the motion.
*
* \param enabled
* true enables slew, false disables slew
* \param maximum_speed
* the target speed the robot will ramp up too
* \param target
* the target position for the motion
* \param current
* the position at the start of the motion
*/
void initialize(bool enabled, double maximum_speed, double target, double current);
/**
* Iterates slew and ramps up speed the farther along the motion the robot gets.
*
* \param current
* current sensor value
*/
double iterate(double current);
/**
* Returns true if slew is enabled, and false if it isn't.
*/
bool enabled();
/**
* Returns the last output of iterate.
*/
double output();
private:
int sign = 0;
double error = 0;
double x_intercept = 0;
double y_intercept = 0;
double slope = 0;
double last_output = 0;
bool is_enabled = false;
double max_speed = 0;
};
}; // namespace ez