2017-09-28 23:30:00 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
2018-01-02 09:20:21 -08:00
|
|
|
/* Copyright (c) 2017-2018 FIRST. All Rights Reserved. */
|
2017-09-28 23:30:00 -07:00
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include "frc/drive/RobotDriveBase.h"
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include <hal/HAL.h>
|
2017-09-28 23:30:00 -07:00
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include "frc/Base.h"
|
|
|
|
|
#include "frc/SpeedController.h"
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
using namespace frc;
|
|
|
|
|
|
|
|
|
|
RobotDriveBase::RobotDriveBase() { m_safetyHelper.SetSafetyEnabled(true); }
|
|
|
|
|
|
|
|
|
|
void RobotDriveBase::SetDeadband(double deadband) { m_deadband = deadband; }
|
|
|
|
|
|
|
|
|
|
void RobotDriveBase::SetMaxOutput(double maxOutput) { m_maxOutput = maxOutput; }
|
|
|
|
|
|
2018-05-09 23:18:55 -04:00
|
|
|
void RobotDriveBase::FeedWatchdog() { m_safetyHelper.Feed(); }
|
|
|
|
|
|
2017-09-28 23:30:00 -07:00
|
|
|
void RobotDriveBase::SetExpiration(double timeout) {
|
|
|
|
|
m_safetyHelper.SetExpiration(timeout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double RobotDriveBase::GetExpiration() const {
|
|
|
|
|
return m_safetyHelper.GetExpiration();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool RobotDriveBase::IsAlive() const { return m_safetyHelper.IsAlive(); }
|
|
|
|
|
|
|
|
|
|
bool RobotDriveBase::IsSafetyEnabled() const {
|
|
|
|
|
return m_safetyHelper.IsSafetyEnabled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RobotDriveBase::SetSafetyEnabled(bool enabled) {
|
|
|
|
|
m_safetyHelper.SetSafetyEnabled(enabled);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double RobotDriveBase::Limit(double value) {
|
|
|
|
|
if (value > 1.0) {
|
|
|
|
|
return 1.0;
|
|
|
|
|
}
|
|
|
|
|
if (value < -1.0) {
|
|
|
|
|
return -1.0;
|
|
|
|
|
}
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double RobotDriveBase::ApplyDeadband(double value, double deadband) {
|
|
|
|
|
if (std::abs(value) > deadband) {
|
|
|
|
|
if (value > 0.0) {
|
|
|
|
|
return (value - deadband) / (1.0 - deadband);
|
|
|
|
|
} else {
|
|
|
|
|
return (value + deadband) / (1.0 - deadband);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return 0.0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-29 23:33:19 -07:00
|
|
|
void RobotDriveBase::Normalize(wpi::MutableArrayRef<double> wheelSpeeds) {
|
2017-09-28 23:30:00 -07:00
|
|
|
double maxMagnitude = std::abs(wheelSpeeds[0]);
|
|
|
|
|
for (size_t i = 1; i < wheelSpeeds.size(); i++) {
|
|
|
|
|
double temp = std::abs(wheelSpeeds[i]);
|
|
|
|
|
if (maxMagnitude < temp) {
|
|
|
|
|
maxMagnitude = temp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (maxMagnitude > 1.0) {
|
|
|
|
|
for (size_t i = 0; i < wheelSpeeds.size(); i++) {
|
|
|
|
|
wheelSpeeds[i] = wheelSpeeds[i] / maxMagnitude;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|