diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java index 408ca847ec..853b86873c 100644 --- a/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java +++ b/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2018 FIRST. All Rights Reserved. */ +/* Copyright (c) 2018-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -104,6 +104,22 @@ public class EncoderSim { EncoderDataJNI.setSamplesToAverage(m_index, samplesToAverage); } + public void setDistance(double distance) { + EncoderDataJNI.setDistance(m_index, distance); + } + + public double getDistance() { + return EncoderDataJNI.getDistance(m_index); + } + + public void setRate(double rate) { + EncoderDataJNI.setRate(m_index, rate); + } + + public double getRate() { + return EncoderDataJNI.getRate(m_index); + } + public void resetData() { EncoderDataJNI.resetData(m_index); } diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java index 17e242e7fd..e99504289f 100644 --- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java +++ b/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2018 FIRST. All Rights Reserved. */ +/* Copyright (c) 2018-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -51,5 +51,10 @@ public class EncoderDataJNI extends JNIWrapper { public static native int getSamplesToAverage(int index); public static native void setSamplesToAverage(int index, int samplesToAverage); + public static native void setDistance(int index, double distance); + public static native double getDistance(int index); + public static native void setRate(int index, double rate); + public static native double getRate(int index); + public static native void resetData(int index); } diff --git a/hal/src/main/native/include/mockdata/EncoderData.h b/hal/src/main/native/include/mockdata/EncoderData.h index d5d12be4b7..7ae3c4b592 100644 --- a/hal/src/main/native/include/mockdata/EncoderData.h +++ b/hal/src/main/native/include/mockdata/EncoderData.h @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2017-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2017-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -93,6 +93,11 @@ void HALSIM_RegisterEncoderAllCallbacks(int32_t index, HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify); +void HALSIM_SetEncoderDistance(int32_t index, double distance); +double HALSIM_GetEncoderDistance(int32_t index); +void HALSIM_SetEncoderRate(int32_t index, double rate); +double HALSIM_GetEncoderRate(int32_t index); + #ifdef __cplusplus } // extern "C" #endif diff --git a/hal/src/main/native/include/simulation/EncoderSim.h b/hal/src/main/native/include/simulation/EncoderSim.h index f80e8a875b..a97f1e3a9e 100644 --- a/hal/src/main/native/include/simulation/EncoderSim.h +++ b/hal/src/main/native/include/simulation/EncoderSim.h @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2018-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2018-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -156,6 +156,16 @@ class EncoderSim { void ResetData() { HALSIM_ResetEncoderData(m_index); } + void SetDistance(double distance) { + HALSIM_SetEncoderDistance(m_index, distance); + } + + double GetDistance() { return HALSIM_GetEncoderDistance(m_index); } + + void SetRate(double rate) { HALSIM_SetEncoderRate(m_index, rate); } + + double GetRate() { return HALSIM_GetEncoderRate(m_index); } + private: int m_index; }; diff --git a/hal/src/main/native/sim/jni/EncoderDataJNI.cpp b/hal/src/main/native/sim/jni/EncoderDataJNI.cpp index 8992b0c426..8d6eef8d13 100644 --- a/hal/src/main/native/sim/jni/EncoderDataJNI.cpp +++ b/hal/src/main/native/sim/jni/EncoderDataJNI.cpp @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2018 FIRST. All Rights Reserved. */ +/* Copyright (c) 2018-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -413,6 +413,54 @@ Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setSamplesToAverage HALSIM_SetEncoderSamplesToAverage(index, value); } +/* + * Class: edu_wpi_first_hal_sim_mockdata_EncoderDataJNI + * Method: setDistance + * Signature: (ID)V + */ +JNIEXPORT void JNICALL +Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setDistance + (JNIEnv*, jclass, jint index, jdouble value) +{ + HALSIM_SetEncoderDistance(index, value); +} + +/* + * Class: edu_wpi_first_hal_sim_mockdata_EncoderDataJNI + * Method: getDistance + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL +Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getDistance + (JNIEnv*, jclass, jint index) +{ + return HALSIM_GetEncoderDistance(index); +} + +/* + * Class: edu_wpi_first_hal_sim_mockdata_EncoderDataJNI + * Method: setRate + * Signature: (ID)V + */ +JNIEXPORT void JNICALL +Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setRate + (JNIEnv*, jclass, jint index, jdouble value) +{ + HALSIM_SetEncoderRate(index, value); +} + +/* + * Class: edu_wpi_first_hal_sim_mockdata_EncoderDataJNI + * Method: getRate + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL +Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getRate + (JNIEnv*, jclass, jint index) +{ + return HALSIM_GetEncoderRate(index); +} + /* * Class: edu_wpi_first_hal_sim_mockdata_EncoderDataJNI * Method: resetData diff --git a/hal/src/main/native/sim/mockdata/EncoderData.cpp b/hal/src/main/native/sim/mockdata/EncoderData.cpp index 33bd073a32..6a2fb4db63 100644 --- a/hal/src/main/native/sim/mockdata/EncoderData.cpp +++ b/hal/src/main/native/sim/mockdata/EncoderData.cpp @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2017-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2017-2020 FIRST. All Rights Reserved. */ /* 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. */ @@ -66,6 +66,32 @@ DEFINE_CAPI(HAL_Bool, ReverseDirection, reverseDirection) DEFINE_CAPI(int32_t, SamplesToAverage, samplesToAverage) DEFINE_CAPI(double, DistancePerPulse, distancePerPulse) +void HALSIM_SetEncoderDistance(int32_t index, double distance) { + auto& simData = SimEncoderData[index]; + simData.count = distance / simData.distancePerPulse; +} + +double HALSIM_GetEncoderDistance(int32_t index) { + auto& simData = SimEncoderData[index]; + return simData.count * simData.distancePerPulse; +} + +void HALSIM_SetEncoderRate(int32_t index, double rate) { + auto& simData = SimEncoderData[index]; + if (rate == 0) { + simData.period = std::numeric_limits::infinity(); + return; + } + + simData.period = simData.distancePerPulse / rate; +} + +double HALSIM_GetEncoderRate(int32_t index) { + auto& simData = SimEncoderData[index]; + + return simData.distancePerPulse / simData.period; +} + #define REGISTER(NAME) \ SimEncoderData[index].NAME.RegisterCallback(callback, param, initialNotify)