diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp index d759e261f3..26552eb72a 100644 --- a/wpilibc/src/main/native/cppcs/RobotBase.cpp +++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "WPILibVersion.h" @@ -138,6 +139,10 @@ class WPILibMathShared : public wpi::math::MathShared { break; } } + + units::second_t GetTimestamp() override { + return units::second_t{wpi::Now() * 1.0e-6}; + } }; } // namespace diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index 83b9daabd9..7a8d3bfb16 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -16,6 +16,7 @@ import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUsageId; import edu.wpi.first.networktables.MultiSubscriber; import edu.wpi.first.networktables.NetworkTableInstance; +import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.wpilibj.livewindow.LiveWindow; import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; import edu.wpi.first.wpilibj.util.WPILibVersion; @@ -128,6 +129,11 @@ public abstract class RobotBase implements AutoCloseable { break; } } + + @Override + public double getTimestamp() { + return WPIUtilJNI.now() * 1.0e-6; + } }); } diff --git a/wpimath/src/main/java/edu/wpi/first/math/MathShared.java b/wpimath/src/main/java/edu/wpi/first/math/MathShared.java index 483dad35bb..3c2b843388 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/MathShared.java +++ b/wpimath/src/main/java/edu/wpi/first/math/MathShared.java @@ -20,4 +20,11 @@ public interface MathShared { * @param count the usage count */ void reportUsage(MathUsageId id, int count); + + /** + * Get the current time. + * + * @return Time in seconds + */ + double getTimestamp(); } diff --git a/wpimath/src/main/java/edu/wpi/first/math/MathSharedStore.java b/wpimath/src/main/java/edu/wpi/first/math/MathSharedStore.java index 0dbc03d0e4..d6e3e9655f 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/MathSharedStore.java +++ b/wpimath/src/main/java/edu/wpi/first/math/MathSharedStore.java @@ -4,6 +4,8 @@ package edu.wpi.first.math; +import edu.wpi.first.util.WPIUtilJNI; + public final class MathSharedStore { private static MathShared mathShared; @@ -23,6 +25,11 @@ public final class MathSharedStore { @Override public void reportUsage(MathUsageId id, int count) {} + + @Override + public double getTimestamp() { + return WPIUtilJNI.now() * 1.0e-6; + } }; } return mathShared; @@ -56,4 +63,13 @@ public final class MathSharedStore { public static void reportUsage(MathUsageId id, int count) { getMathShared().reportUsage(id, count); } + + /** + * Get the time. + * + * @return The time in seconds. + */ + public static double getTimestamp() { + return getMathShared().getTimestamp(); + } } diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java index 45dbf23cd2..b530a82232 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java @@ -4,6 +4,7 @@ package edu.wpi.first.math.estimator; +import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.Matrix; import edu.wpi.first.math.Nat; @@ -17,7 +18,6 @@ import edu.wpi.first.math.kinematics.DifferentialDriveKinematics; import edu.wpi.first.math.kinematics.DifferentialDriveOdometry; import edu.wpi.first.math.numbers.N1; import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.util.WPIUtilJNI; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; @@ -292,7 +292,7 @@ public class DifferentialDrivePoseEstimator { public Pose2d update( Rotation2d gyroAngle, double distanceLeftMeters, double distanceRightMeters) { return updateWithTime( - WPIUtilJNI.now() * 1.0e-6, gyroAngle, distanceLeftMeters, distanceRightMeters); + MathSharedStore.getTimestamp(), gyroAngle, distanceLeftMeters, distanceRightMeters); } /** diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java index c61a915952..9c664f9ae4 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java @@ -4,6 +4,7 @@ package edu.wpi.first.math.estimator; +import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.Matrix; import edu.wpi.first.math.Nat; @@ -18,7 +19,6 @@ import edu.wpi.first.math.kinematics.MecanumDriveOdometry; import edu.wpi.first.math.kinematics.MecanumDriveWheelPositions; import edu.wpi.first.math.numbers.N1; import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.util.WPIUtilJNI; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; @@ -269,7 +269,7 @@ public class MecanumDrivePoseEstimator { * @return The estimated pose of the robot in meters. */ public Pose2d update(Rotation2d gyroAngle, MecanumDriveWheelPositions wheelPositions) { - return updateWithTime(WPIUtilJNI.now() * 1.0e-6, gyroAngle, wheelPositions); + return updateWithTime(MathSharedStore.getTimestamp(), gyroAngle, wheelPositions); } /** diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java index 78d4cdf8da..0717b1b81e 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java @@ -4,6 +4,7 @@ package edu.wpi.first.math.estimator; +import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.Matrix; import edu.wpi.first.math.Nat; @@ -18,7 +19,6 @@ import edu.wpi.first.math.kinematics.SwerveDriveOdometry; import edu.wpi.first.math.kinematics.SwerveModulePosition; import edu.wpi.first.math.numbers.N1; import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.util.WPIUtilJNI; import java.util.Arrays; import java.util.Map; import java.util.NoSuchElementException; @@ -271,7 +271,7 @@ public class SwerveDrivePoseEstimator { * @return The estimated pose of the robot in meters. */ public Pose2d update(Rotation2d gyroAngle, SwerveModulePosition[] modulePositions) { - return updateWithTime(WPIUtilJNI.now() * 1.0e-6, gyroAngle, modulePositions); + return updateWithTime(MathSharedStore.getTimestamp(), gyroAngle, modulePositions); } /** diff --git a/wpimath/src/main/java/edu/wpi/first/math/filter/Debouncer.java b/wpimath/src/main/java/edu/wpi/first/math/filter/Debouncer.java index 8da45e9586..3472198d4b 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/filter/Debouncer.java +++ b/wpimath/src/main/java/edu/wpi/first/math/filter/Debouncer.java @@ -4,7 +4,7 @@ package edu.wpi.first.math.filter; -import edu.wpi.first.util.WPIUtilJNI; +import edu.wpi.first.math.MathSharedStore; /** * A simple debounce filter for boolean streams. Requires that the boolean change value from @@ -60,11 +60,11 @@ public class Debouncer { } private void resetTimer() { - m_prevTimeSeconds = WPIUtilJNI.now() * 1e-6; + m_prevTimeSeconds = MathSharedStore.getTimestamp(); } private boolean hasElapsed() { - return (WPIUtilJNI.now() * 1e-6) - m_prevTimeSeconds >= m_debounceTimeSeconds; + return MathSharedStore.getTimestamp() - m_prevTimeSeconds >= m_debounceTimeSeconds; } /** diff --git a/wpimath/src/main/java/edu/wpi/first/math/filter/SlewRateLimiter.java b/wpimath/src/main/java/edu/wpi/first/math/filter/SlewRateLimiter.java index 668b8b1ea2..b951163fa3 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/filter/SlewRateLimiter.java +++ b/wpimath/src/main/java/edu/wpi/first/math/filter/SlewRateLimiter.java @@ -4,8 +4,8 @@ package edu.wpi.first.math.filter; +import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUtil; -import edu.wpi.first.util.WPIUtilJNI; /** * A class that limits the rate of change of an input value. Useful for implementing voltage, @@ -33,7 +33,7 @@ public class SlewRateLimiter { m_positiveRateLimit = positiveRateLimit; m_negativeRateLimit = negativeRateLimit; m_prevVal = initialValue; - m_prevTime = WPIUtilJNI.now() * 1e-6; + m_prevTime = MathSharedStore.getTimestamp(); } /** @@ -67,7 +67,7 @@ public class SlewRateLimiter { * @return The filtered value, which will not change faster than the slew rate. */ public double calculate(double input) { - double currentTime = WPIUtilJNI.now() * 1e-6; + double currentTime = MathSharedStore.getTimestamp(); double elapsedTime = currentTime - m_prevTime; m_prevVal += MathUtil.clamp( @@ -85,6 +85,6 @@ public class SlewRateLimiter { */ public void reset(double value) { m_prevVal = value; - m_prevTime = WPIUtilJNI.now() * 1e-6; + m_prevTime = MathSharedStore.getTimestamp(); } } diff --git a/wpimath/src/main/native/cpp/MathShared.cpp b/wpimath/src/main/native/cpp/MathShared.cpp index 5252e876fc..b53d080ac0 100644 --- a/wpimath/src/main/native/cpp/MathShared.cpp +++ b/wpimath/src/main/native/cpp/MathShared.cpp @@ -5,6 +5,9 @@ #include "wpimath/MathShared.h" #include +#include + +#include "units/time.h" using namespace wpi::math; @@ -15,6 +18,9 @@ class DefaultMathShared : public MathShared { void ReportWarningV(fmt::string_view format, fmt::format_args args) override { } void ReportUsage(MathUsageId id, int count) override {} + units::second_t GetTimestamp() override { + return units::second_t{wpi::Now() * 1.0e-6}; + } }; } // namespace diff --git a/wpimath/src/main/native/cpp/estimator/DifferentialDrivePoseEstimator.cpp b/wpimath/src/main/native/cpp/estimator/DifferentialDrivePoseEstimator.cpp index 55118fde14..4574c4a769 100644 --- a/wpimath/src/main/native/cpp/estimator/DifferentialDrivePoseEstimator.cpp +++ b/wpimath/src/main/native/cpp/estimator/DifferentialDrivePoseEstimator.cpp @@ -8,6 +8,7 @@ #include "frc/StateSpaceUtil.h" #include "frc/estimator/AngleStatistics.h" +#include "wpimath/MathShared.h" using namespace frc; @@ -153,7 +154,7 @@ void DifferentialDrivePoseEstimator::AddVisionMeasurement( Pose2d DifferentialDrivePoseEstimator::Update(const Rotation2d& gyroAngle, units::meter_t leftDistance, units::meter_t rightDistance) { - return UpdateWithTime(units::microsecond_t(wpi::Now()), gyroAngle, + return UpdateWithTime(wpi::math::MathSharedStore::GetTimestamp(), gyroAngle, leftDistance, rightDistance); } diff --git a/wpimath/src/main/native/cpp/estimator/MecanumDrivePoseEstimator.cpp b/wpimath/src/main/native/cpp/estimator/MecanumDrivePoseEstimator.cpp index b32ce831ca..c2fbb10389 100644 --- a/wpimath/src/main/native/cpp/estimator/MecanumDrivePoseEstimator.cpp +++ b/wpimath/src/main/native/cpp/estimator/MecanumDrivePoseEstimator.cpp @@ -8,6 +8,7 @@ #include "frc/StateSpaceUtil.h" #include "frc/estimator/AngleStatistics.h" +#include "wpimath/MathShared.h" using namespace frc; @@ -163,7 +164,7 @@ void frc::MecanumDrivePoseEstimator::AddVisionMeasurement( Pose2d frc::MecanumDrivePoseEstimator::Update( const Rotation2d& gyroAngle, const MecanumDriveWheelPositions& wheelPositions) { - return UpdateWithTime(units::microsecond_t(wpi::Now()), gyroAngle, + return UpdateWithTime(wpi::math::MathSharedStore::GetTimestamp(), gyroAngle, wheelPositions); } diff --git a/wpimath/src/main/native/cpp/filter/Debouncer.cpp b/wpimath/src/main/native/cpp/filter/Debouncer.cpp index 4e909a2503..841768eb20 100644 --- a/wpimath/src/main/native/cpp/filter/Debouncer.cpp +++ b/wpimath/src/main/native/cpp/filter/Debouncer.cpp @@ -4,6 +4,8 @@ #include "frc/filter/Debouncer.h" +#include "wpimath/MathShared.h" + using namespace frc; Debouncer::Debouncer(units::second_t debounceTime, DebounceType type) @@ -21,11 +23,12 @@ Debouncer::Debouncer(units::second_t debounceTime, DebounceType type) } void Debouncer::ResetTimer() { - m_prevTime = units::microsecond_t(wpi::Now()); + m_prevTime = wpi::math::MathSharedStore::GetTimestamp(); } bool Debouncer::HasElapsed() const { - return units::microsecond_t(wpi::Now()) - m_prevTime >= m_debounceTime; + return wpi::math::MathSharedStore::GetTimestamp() - m_prevTime >= + m_debounceTime; } bool Debouncer::Calculate(bool input) { diff --git a/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h b/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h index aaad4a559a..b819c93110 100644 --- a/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h +++ b/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h @@ -18,6 +18,7 @@ #include "frc/kinematics/SwerveDriveKinematics.h" #include "frc/kinematics/SwerveDriveOdometry.h" #include "units/time.h" +#include "wpimath/MathShared.h" namespace frc { @@ -272,7 +273,7 @@ class SwerveDrivePoseEstimator { Pose2d Update( const Rotation2d& gyroAngle, const wpi::array& modulePositions) { - return UpdateWithTime(units::microsecond_t(wpi::Now()), gyroAngle, + return UpdateWithTime(wpi::math::MathSharedStore::GetTimestamp(), gyroAngle, modulePositions); } diff --git a/wpimath/src/main/native/include/frc/filter/SlewRateLimiter.h b/wpimath/src/main/native/include/frc/filter/SlewRateLimiter.h index 542cd9453d..a720c09b8c 100644 --- a/wpimath/src/main/native/include/frc/filter/SlewRateLimiter.h +++ b/wpimath/src/main/native/include/frc/filter/SlewRateLimiter.h @@ -10,6 +10,7 @@ #include #include "units/time.h" +#include "wpimath/MathShared.h" namespace frc { /** @@ -45,7 +46,8 @@ class SlewRateLimiter { : m_positiveRateLimit{positiveRateLimit}, m_negativeRateLimit{negativeRateLimit}, m_prevVal{initialValue}, - m_prevTime{units::microsecond_t(wpi::Now())} {} + m_prevTime{ + units::microsecond_t(wpi::math::MathSharedStore::GetTimestamp())} {} /** * Creates a new SlewRateLimiter with the given positive rate limit and @@ -77,7 +79,7 @@ class SlewRateLimiter { * rate. */ Unit_t Calculate(Unit_t input) { - units::second_t currentTime = units::microsecond_t(wpi::Now()); + units::second_t currentTime = wpi::math::MathSharedStore::GetTimestamp(); units::second_t elapsedTime = currentTime - m_prevTime; m_prevVal += std::clamp(input - m_prevVal, m_negativeRateLimit * elapsedTime, @@ -94,7 +96,7 @@ class SlewRateLimiter { */ void Reset(Unit_t value) { m_prevVal = value; - m_prevTime = units::microsecond_t(wpi::Now()); + m_prevTime = wpi::math::MathSharedStore::GetTimestamp(); } private: diff --git a/wpimath/src/main/native/include/wpimath/MathShared.h b/wpimath/src/main/native/include/wpimath/MathShared.h index 3b9b3cd937..8e0698d44a 100644 --- a/wpimath/src/main/native/include/wpimath/MathShared.h +++ b/wpimath/src/main/native/include/wpimath/MathShared.h @@ -9,6 +9,8 @@ #include #include +#include "units/time.h" + namespace wpi::math { enum class MathUsageId { @@ -31,6 +33,7 @@ class WPILIB_DLLEXPORT MathShared { virtual void ReportWarningV(fmt::string_view format, fmt::format_args args) = 0; virtual void ReportUsage(MathUsageId id, int count) = 0; + virtual units::second_t GetTimestamp() = 0; template inline void ReportError(const S& format, Args&&... args) { @@ -70,6 +73,10 @@ class WPILIB_DLLEXPORT MathSharedStore { static void ReportUsage(MathUsageId id, int count) { GetMathShared().ReportUsage(id, count); } + + static units::second_t GetTimestamp() { + return GetMathShared().GetTimestamp(); + } }; } // namespace wpi::math