diff --git a/.github/workflows/dist.yml b/.github/workflows/dist.yml index 334bd52..26b516a 100644 --- a/.github/workflows/dist.yml +++ b/.github/workflows/dist.yml @@ -11,7 +11,7 @@ on: jobs: ci: - uses: robotpy/build-actions/.github/workflows/package-ci.yml@v2026 + uses: robotpy/build-actions/.github/workflows/package-ci.yml@v2027 with: artifactory_repo_type: vendor enable_raspbian: false diff --git a/pyproject.toml b/pyproject.toml index b3af2fe..60c6d7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ requires = [ "semiwrap~=0.3.0", "hatch-meson~=0.1.0", "hatch-robotpy~=0.2.1", - "wpilib~=2026.2.1", + "wpilib==2027.0.0a6", ] @@ -16,7 +16,7 @@ dynamic = ["version"] description = "REVLib for RobotPy" license = "BSD-3-Clause" dependencies = [ - "wpilib>=2026.2.1,<2027", + "wpilib==2027.0.0a6", ] [[project.authors]] @@ -44,7 +44,7 @@ packages = ["rev"] artifact_id = "REVLib-cpp" group_id = "com.revrobotics.frc" repo_url = "https://maven.revrobotics.com" -version = "2026.0.4" +version = "2027.0.0-alpha-3" staticlibs = ["REVLib"] extract_to = "lib" @@ -52,7 +52,7 @@ extract_to = "lib" artifact_id = "REVLib-driver" group_id = "com.revrobotics.frc" repo_url = "https://maven.revrobotics.com" -version = "2026.0.4" +version = "2027.0.0-alpha-3" staticlibs = [ "REVLibDriver"] extract_to = "lib" @@ -60,7 +60,7 @@ extract_to = "lib" artifact_id = "RevLibBackendDriver" group_id = "com.revrobotics.frc" repo_url = "https://maven.revrobotics.com" -version = "2026.0.4" +version = "2027.0.0-alpha-3" staticlibs = [ "BackendDriver", ] @@ -71,7 +71,7 @@ use_headers = false artifact_id = "RevLibWpiBackendDriver" group_id = "com.revrobotics.frc" repo_url = "https://maven.revrobotics.com" -version = "2026.0.4" +version = "2027.0.0-alpha-3" staticlibs = [ "REVLibWpi", ] @@ -145,6 +145,9 @@ includes = [ [tool.semiwrap.extension_modules."rev._rev".headers] +# first +A301 = "first/A301.h" + # rev AbsoluteEncoder = "rev/AbsoluteEncoder.h" AnalogInput = "rev/AnalogInput.h" @@ -236,4 +239,5 @@ SparkRelativeEncoderSim = "rev/sim/SparkRelativeEncoderSim.h" SparkSimFaultManager = "rev/sim/SparkSimFaultManager.h" # rev/util +Signal = "rev/util/Signal.h" StatusLogger = "rev/util/StatusLogger.h" diff --git a/rev/__init__.py b/rev/__init__.py index 2478c87..d113cca 100644 --- a/rev/__init__.py +++ b/rev/__init__.py @@ -4,6 +4,7 @@ # autogenerated by 'semiwrap create-imports rev rev._rev' from ._rev import ( + A301, AbsoluteEncoder, AbsoluteEncoderConfig, AbsoluteEncoderConfigAccessor, @@ -25,6 +26,7 @@ DetachedEncoderLowLevel, DetachedEncoderSim, DetachedSignalsConfig, + DetachedSignalsConfigAccessor, EncoderConfig, EncoderConfigAccessor, ExternalEncoderConfig, @@ -52,6 +54,36 @@ ServoHubParameter, ServoHubSim, ServoHubSimFaultManager, + Signal_A301Faults, + Signal_A301Warnings, + Signal_ClosedLoopSlot, + Signal_DetachedFaults, + Signal_DetachedPeriodicStatus1, + Signal_DetachedPeriodicStatus2, + Signal_DetachedPeriodicStatus3, + Signal_DetachedPeriodicStatus4, + Signal_ServoHubFaults, + Signal_ServoHubPeriodicStatus0, + Signal_ServoHubPeriodicStatus1, + Signal_ServoHubPeriodicStatus2, + Signal_ServoHubPeriodicStatus3, + Signal_ServoHubPeriodicStatus4, + Signal_ServoHubWarnings, + Signal_SparkFaults, + Signal_SparkPeriodicStatus0, + Signal_SparkPeriodicStatus1, + Signal_SparkPeriodicStatus2, + Signal_SparkPeriodicStatus3, + Signal_SparkPeriodicStatus4, + Signal_SparkPeriodicStatus5, + Signal_SparkPeriodicStatus6, + Signal_SparkPeriodicStatus7, + Signal_SparkPeriodicStatus8, + Signal_SparkPeriodicStatus9, + Signal_SparkWarnings, + Signal_bool, + Signal_double, + Signal_int, SignalsConfig, SignalsConfigAccessor, SoftLimitConfig, @@ -90,6 +122,7 @@ ) __all__ = [ + "A301", "AbsoluteEncoder", "AbsoluteEncoderConfig", "AbsoluteEncoderConfigAccessor", @@ -111,6 +144,7 @@ "DetachedEncoderLowLevel", "DetachedEncoderSim", "DetachedSignalsConfig", + "DetachedSignalsConfigAccessor", "EncoderConfig", "EncoderConfigAccessor", "ExternalEncoderConfig", @@ -138,6 +172,36 @@ "ServoHubParameter", "ServoHubSim", "ServoHubSimFaultManager", + "Signal_A301Faults", + "Signal_A301Warnings", + "Signal_ClosedLoopSlot", + "Signal_DetachedFaults", + "Signal_DetachedPeriodicStatus1", + "Signal_DetachedPeriodicStatus2", + "Signal_DetachedPeriodicStatus3", + "Signal_DetachedPeriodicStatus4", + "Signal_ServoHubFaults", + "Signal_ServoHubPeriodicStatus0", + "Signal_ServoHubPeriodicStatus1", + "Signal_ServoHubPeriodicStatus2", + "Signal_ServoHubPeriodicStatus3", + "Signal_ServoHubPeriodicStatus4", + "Signal_ServoHubWarnings", + "Signal_SparkFaults", + "Signal_SparkPeriodicStatus0", + "Signal_SparkPeriodicStatus1", + "Signal_SparkPeriodicStatus2", + "Signal_SparkPeriodicStatus3", + "Signal_SparkPeriodicStatus4", + "Signal_SparkPeriodicStatus5", + "Signal_SparkPeriodicStatus6", + "Signal_SparkPeriodicStatus7", + "Signal_SparkPeriodicStatus8", + "Signal_SparkPeriodicStatus9", + "Signal_SparkWarnings", + "Signal_bool", + "Signal_double", + "Signal_int", "SignalsConfig", "SignalsConfigAccessor", "SoftLimitConfig", diff --git a/semiwrap/A301.yml b/semiwrap/A301.yml new file mode 100644 index 0000000..e4315fb --- /dev/null +++ b/semiwrap/A301.yml @@ -0,0 +1,73 @@ +extra_includes_first: +- rev/REVLibError.h + +classes: + first::a301::A301: + methods: + GetFirmwareVersion: + overloads: + "": + bool&: + GetFirmwareString: + GetBusId: + GetDeviceId: + HasActiveFault: + HasStickyFault: + HasActiveWarning: + HasStickyWarning: + GetFaults: + GetStickyFaults: + GetWarnings: + GetStickyWarnings: + GetBusVoltage: + GetAppliedOutput: + GetMotorTemperature: + GetRelativeEncoderPosition: + GetEncoderVelocity: + GetAbsoluteEncoderPosition: + ClearFaults: + SetVelocity: + SetPosition: + SetAbsolutePosition: + SetCurrent: + SetThrottle: + GetThrottle: + SetVoltage: + SetInverted: + GetInverted: + Disable: + A301: + GetMotorCurrent: + SetRelativeEncoderPosition: + first::a301::A301::Faults: + attributes: + other: + motorType: + sensor: + can: + temperature: + gateDriver: + escEeprom: + firmware: + rawBits: + methods: + Faults: + overloads: + "": + uint16_t: + first::a301::A301::Warnings: + attributes: + brownout: + overcurrent: + escEeprom: + extEeprom: + sensor: + stall: + hasReset: + other: + rawBits: + methods: + Warnings: + overloads: + "": + uint16_t: diff --git a/semiwrap/ColorMatch.yml b/semiwrap/ColorMatch.yml index 1b5df61..69477ca 100644 --- a/semiwrap/ColorMatch.yml +++ b/semiwrap/ColorMatch.yml @@ -6,6 +6,6 @@ classes: SetConfidenceThreshold: MatchColor: overloads: - const frc::Color&: - const frc::Color&, double&: + const wpi::util::Color&: + const wpi::util::Color&, double&: MatchClosestColor: diff --git a/semiwrap/DetachedEncoderLowLevel.yml b/semiwrap/DetachedEncoderLowLevel.yml index 860d190..dea46aa 100644 --- a/semiwrap/DetachedEncoderLowLevel.yml +++ b/semiwrap/DetachedEncoderLowLevel.yml @@ -16,6 +16,7 @@ classes: GetPeriodicStatus4: CreateSimFaultManager: DetachedEncoderLowLevel: + GetBusId: rev::detached::DetachedEncoderLowLevel::FirmwareVersion: attributes: year: @@ -39,13 +40,17 @@ classes: stickyCanTxFault: stickyCanRxFault: stickyEepromFault: + timestamp: rev::detached::DetachedEncoderLowLevel::PeriodicStatus2: attributes: rawAngle: angle: + timestamp: rev::detached::DetachedEncoderLowLevel::PeriodicStatus3: attributes: position: + timestamp: rev::detached::DetachedEncoderLowLevel::PeriodicStatus4: attributes: velocity: + timestamp: diff --git a/semiwrap/ServoHub.yml b/semiwrap/ServoHub.yml index 7278788..a2cf54f 100644 --- a/semiwrap/ServoHub.yml +++ b/semiwrap/ServoHub.yml @@ -41,6 +41,9 @@ classes: rawBits: methods: Faults: + overloads: + "": + uint16_t: rev::servohub::ServoHub::Warnings: attributes: brownout: @@ -56,3 +59,6 @@ classes: rawBits: methods: Warnings: + overloads: + "": + uint16_t: diff --git a/semiwrap/ServoHubLowLevel.yml b/semiwrap/ServoHubLowLevel.yml index 2c185ce..6f0ea1a 100644 --- a/semiwrap/ServoHubLowLevel.yml +++ b/semiwrap/ServoHubLowLevel.yml @@ -20,6 +20,7 @@ classes: GetPeriodicStatus4: CreateSimFaultManager: ServoHubLowLevel: + GetBusId: rev::servohub::ServoHubLowLevel::FirmwareVersion: attributes: firmwareFix: @@ -67,6 +68,8 @@ classes: stickyChannel4Overcurrent: stickyChannel5Overcurrent: timestamp: + lowBatteryFault: + stickyLowBatteryFault: rev::servohub::ServoHubLowLevel::PeriodicStatus2: attributes: channel0PulseWidth: diff --git a/semiwrap/Signal.yml b/semiwrap/Signal.yml new file mode 100644 index 0000000..e2045b0 --- /dev/null +++ b/semiwrap/Signal.yml @@ -0,0 +1,145 @@ +extra_includes_first: +- rev/SparkBase.h +- rev/DetachedEncoder.h +- rev/ServoHub.h +- first/A301.h + +classes: + rev::util::Signal: + template_params: + - T + typealias: + - "rev::REVLibError" + methods: + Signal: + Map: + ignore: true + Get: + overloads: + '[const]': + T [const]: + GetTimestamp: + GetError: + IsValid: + +templates: + Signal_double: + qualname: rev::util::Signal + params: + - double + Signal_bool: + qualname: rev::util::Signal + params: + - bool + Signal_int: + qualname: rev::util::Signal + params: + - int + Signal_ClosedLoopSlot: + qualname: rev::util::Signal + params: + - rev::spark::ClosedLoopSlot + Signal_SparkFaults: + qualname: rev::util::Signal + params: + - rev::spark::SparkBase::Faults + Signal_SparkWarnings: + qualname: rev::util::Signal + params: + - rev::spark::SparkBase::Warnings + Signal_SparkPeriodicStatus0: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus0 + Signal_SparkPeriodicStatus1: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus1 + Signal_SparkPeriodicStatus2: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus2 + Signal_SparkPeriodicStatus3: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus3 + Signal_SparkPeriodicStatus4: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus4 + Signal_SparkPeriodicStatus5: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus5 + Signal_SparkPeriodicStatus6: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus6 + Signal_SparkPeriodicStatus7: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus7 + Signal_SparkPeriodicStatus8: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus8 + Signal_SparkPeriodicStatus9: + qualname: rev::util::Signal + params: + - rev::spark::SparkLowLevel::PeriodicStatus9 + Signal_DetachedFaults: + qualname: rev::util::Signal + params: + - rev::detached::DetachedEncoder::Faults + Signal_DetachedPeriodicStatus1: + qualname: rev::util::Signal + params: + - rev::detached::DetachedEncoderLowLevel::PeriodicStatus1 + Signal_DetachedPeriodicStatus2: + qualname: rev::util::Signal + params: + - rev::detached::DetachedEncoderLowLevel::PeriodicStatus2 + Signal_DetachedPeriodicStatus3: + qualname: rev::util::Signal + params: + - rev::detached::DetachedEncoderLowLevel::PeriodicStatus3 + Signal_DetachedPeriodicStatus4: + qualname: rev::util::Signal + params: + - rev::detached::DetachedEncoderLowLevel::PeriodicStatus4 + Signal_ServoHubFaults: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHub::Faults + Signal_ServoHubWarnings: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHub::Warnings + Signal_ServoHubPeriodicStatus0: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHubLowLevel::PeriodicStatus0 + Signal_ServoHubPeriodicStatus1: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHubLowLevel::PeriodicStatus1 + Signal_ServoHubPeriodicStatus2: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHubLowLevel::PeriodicStatus2 + Signal_ServoHubPeriodicStatus3: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHubLowLevel::PeriodicStatus3 + Signal_ServoHubPeriodicStatus4: + qualname: rev::util::Signal + params: + - rev::servohub::ServoHubLowLevel::PeriodicStatus4 + Signal_A301Faults: + qualname: rev::util::Signal + params: + - first::a301::A301::Faults + Signal_A301Warnings: + qualname: rev::util::Signal + params: + - first::a301::A301::Warnings diff --git a/semiwrap/SparkBase.yml b/semiwrap/SparkBase.yml index d0d45b1..b621500 100644 --- a/semiwrap/SparkBase.yml +++ b/semiwrap/SparkBase.yml @@ -56,9 +56,7 @@ classes: PersistMode: ignore: true methods: - Set: SetVoltage: - Get: SetInverted: GetInverted: Disable: @@ -111,6 +109,8 @@ classes: GetReverseSoftLimit: ResumeFollowerModeAsync: PauseFollowerModeAsync: + SetThrottle: + GetThrottle: rev::spark::SparkBase::Faults: attributes: other: diff --git a/semiwrap/SparkLowLevel.yml b/semiwrap/SparkLowLevel.yml index 44c19eb..ad59cd6 100644 --- a/semiwrap/SparkLowLevel.yml +++ b/semiwrap/SparkLowLevel.yml @@ -27,6 +27,7 @@ classes: bool&: GetFirmwareString: GetSerialNumber: + GetBusId: GetDeviceId: GetMotorType: SetPeriodicFrameTimeout: diff --git a/tests/requirements.txt b/tests/requirements.txt index cdcf824..e079f8a 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,2 +1 @@ pytest -pyfrc<2027.0.0,>=2026.0.1b1 diff --git a/tests/test_cana301.py b/tests/test_cana301.py new file mode 100644 index 0000000..667c69d --- /dev/null +++ b/tests/test_cana301.py @@ -0,0 +1,11 @@ +import rev + + +def test_set_velocity(): + a301 = rev.A301(0, 0) + a301.setVelocity(12.34) + + +def test_set_position(): + a301 = rev.A301(0, 0) + a301.setPosition(12.34) diff --git a/tests/test_cansparkmax.py b/tests/test_cansparkmax.py index 5a0ce12..a3ec897 100644 --- a/tests/test_cansparkmax.py +++ b/tests/test_cansparkmax.py @@ -3,20 +3,20 @@ def test_setfeedbackdevice(): - s = rev.SparkMax(1, rev.SparkLowLevel.MotorType.kBrushless) + s = rev.SparkMax(0, 1, rev.SparkLowLevel.MotorType.kBrushless) e = s.getEncoder() p = s.getClosedLoopController() # assert p.setFeedbackDevice(e) == REVLibError.kOk def test_get_fwd_limit(): - sm = rev.SparkMax(2, rev.SparkLowLevel.MotorType.kBrushless) + sm = rev.SparkMax(0, 2, rev.SparkLowLevel.MotorType.kBrushless) switch = sm.getForwardLimitSwitch() switch.get() def test_current_limit(): - sm = rev.SparkMax(1, rev.SparkLowLevel.MotorType.kBrushless) + sm = rev.SparkMax(0, 1, rev.SparkLowLevel.MotorType.kBrushless) cfg = rev.SparkMaxConfig() cfg.secondaryCurrentLimit(50) sm.configure( @@ -49,7 +49,7 @@ def test_current_limit(): def test_pid_set(): - sm = rev.SparkMax(0, rev.SparkLowLevel.MotorType.kBrushless) + sm = rev.SparkMax(0, 0, rev.SparkLowLevel.MotorType.kBrushless) pid = sm.getClosedLoopController() # pid.setOutputRange(-1, 1) # pid.setP(0.005)