Skip to content

Project Releases

This page tracks releases for all projects in the vexide organization.

February 2025
  • Fixed

    • Fixed a compilation error when trying to build with the field-control feature.
  • Fixed

    • Improved the reliability of wireless uploads, specifically when switching radio channels between download and pit mode. In general, there should be less of a delay when switching between channels, as well as less “Packet Timeout” errors.
January 2025
  • Changed

    • Updated the static template to support vexide 0.6.1.
  • Fixed

    • Fixed docs.rs build failures.
    • Fixed outdated dependencies of vexide-graphics.
  • Added

    • Added support for differential uploads in vexide 0.6.0. This can be configured using the upload-strategy CLI argument or metadata option.

    Changed

    • Uploads will now only reupload the ini file (program configuration) if it has changed.
    • Redesigned progress bars and other logs to match the styling used by cargo.
    • Decreased the amount of log messages that are printed to users by default.
    • Relaxed timeout durations on the code responsible for switching radio channels.
    • Adjusted our file naming format on flash to match the one used by VEXCode and PROS.

    Fixed

    • Fixed cargo v5 terminal when using a controller.
    Read More
    • Fixed cargo v5 rm not erasing files from flash.
    • Fixed an issue affecting vexide projects in cargo workspaces where programs could sometimes upload using the metadata of another project in the same workspace.
  • This release includes work on our new uploading strategy. Check out the update post for more info.

    Added

    • Added functions to get VEXos version and uptime. (#278)
    • Added a self-modifying memory patcher to vexide_startup that applies patches over the current program. This will be paired with cargo-v5 changes to allow for much faster uploading.

    Fixed

    • Fixed error handling for encoder port numbers. (#264)
    • Fixed error handling for rangefinder port numbers. (#268)
    • Fixed an internal issue regarding units with Motor::set_position.
    • Fixed File::seek seeking to the wrong position when using SeekFrom::End with a negative offset. (#267)
    • Fixed a rare issue with IMU calibration timing out at the start of some programs. (#275, #279)
    • Recursive panics (panics that occur within vexide_panic’s handler) will now immediately abort rather than potentially causing a stack overflow. (#275)
    Read More

    Changed

    • Renamed Once::is_complete to Once::is_completed for consistency with the standard library. (#257) (Breaking Change)
    • All Position methods are now usable in const context. (#254)
    • Two-wire ADI devices (AdiEncoder and AdiRangeFinder) now take their ports as separate arguments instead of a tuple. (#271) (Breaking Change)
    • AdiEncoder and AdiRangeFinder will now panic if invalid port pairings are passed rather than return a Result. (#271) (Breaking Change)
    • AdiDevice is now const-generic over the number of ports used by the device. (#271) (Breaking Change)
    • Replaced AdiDevice::port_number with AdiDevice::port_numbers. (#271) (Breaking Change)

    Removed

    • Replaced vexide_core::allocator::init_heap with vexide_core::allocator::claim, which allows claiming uninitialized memory spans as heap space.
    • The Nul, InvalidLine, and InvalidColumn ControllerError variants have been removed. These errors now cause panics. (#266) (Breaking Change)
    • DisplayError has been removed and Display::draw_buffer now panics when given a buffer of invalid size. (#266) (Breaking Change)
    • The InvalidId and InvalidIdInCode AiVisionError variants have been removed. These errors now cause panics. (#266) (Breaking Change)
    • VisionError::InvalidId has been removed. Invalid signature IDs given to VisionSensor will now cause panics. (#266) (Breaking Change)
    • The lock functions on Stdin and Stdout are now async. (#265) (Breaking Change)
    • Stdin and Stdout instances can no longer be instantiated using struct initialization syntax. Prefer using stdin()/stdout(). (#281) (Breaking Change)

    Removed

    • Removed the Deref implementation and force method on LazyLock to prevent deadlocks. use the async LazyLock::get instead. (#265) (Breaking Change)
    • Removed the Read and Write implementations on Stdin and Stdout respectively to prevent deadlocks. (#265) (Breaking Change)
    • Removed EncoderError and RangeFinderError. The respective devices now just return PortError. (#271) (Breaking Change)

    New Contributors

    • @Saylar27 made their first contribution in #279!
    • @ion098 made their first contribution in #278!
December 2024
  • Fixed

    • Fixed docs.rs build by updating to vex-sdk 0.26.0. No functional changes from 0.5.0.
  • Added

    • Filesystem Access: cargo-v5 can now list, download, view, and erase files from flash on a brain through the ls, cat, and rm subcommands (NO you can’t delete system files sorry guys :c).
    • Event Logs: cargo v5 log allows you to view a brain’s event log directly from your computer, which logs stuff like program runs, port connects/disconnects, device and OS errors, power on/off, field control status, etc…
    • Device Listing: cargo v5 lsdev/cargo v5 devices will list all devices currently connected to a brain, as well as their firmware/bootloader version for debugging purposes or checking if a port got disconnected.
    • Screenshots: You can save a capture of your brain’s screen with cargo v5 screenshot/cargo v5 sc.
    • cargo-v5 will now emit temporary log files for debugging purposes.

    Changed

    • cargo v5 run will now immediately stop the running program when closed or quit with the ^C escape sequence.
  • Fixed

    • Fixed a minor issue with cargo v5 ls where file load addresses would be incorrectly displayed.

    Changed

    • cargo-v5 will now cache the locally downloaded template when the fetch-template feature is enabled.
  • Added

    • cargo-v5 will now cache the locally downloaded template when the fetch-template feature is enabled.
    • Added the llvm-floatabi field to the armv7a-vex-v5 target spec to support builds on the latest rustc nightly versions.

    Fixed

    • Fixed an issue with cargo v5 screenshot capturing images with too large of a buffer.
    • Fixed a compiler error from the directories dependency when the fetch-template feature was enabled.
November 2024
  • vexide 0.5.0 is our biggest update of all time. We focused on hopefully finalizing all of our device APIs in this update and on improving the quality of our documentation. We highly recommend reading our Thanksgiving blog post for more info.

    Added

    • You can now detect controller release occurrences with ButtonState::is_now_released.
    • Added support for 5.5W motors with a new constructor (Motor::new_exp) and four new getters (Motor::max_voltage, Motor::motor_type, Motor::is_v5, and Motor::is_exp) for Motor. (#167)
    • Added support for the V5 Workcell Electromagnet smart device. (#176)
    • The conditions upon which functions return errors are now documented. (#155).
    • Implemented the Copy trait for BannerTheme.
    • Added a getter that retrieves a Controller’s identifier. (#189)
    • Added support for controllers in DynamicPeripherals. (#196)
    • Added the ability to return Smart Ports, ADI ports, the display, and controllers to DynamicPeripherals. (#196)
    • Added a SmartDevice::UPDATE_INTERVAL constant for all devices, representing the amount of time between data updates from a given device. (#199) (Breaking Change)
    • Added a toggle method to AdiDigitalOut to toggle between level outputs (210).
    Read More
    • Added the OpticalSensor::GESTURE_UPDATE_INTERVAL (50mS) constant (#211).
    • Added a toggle method to AdiDigitalOut to toggle between level outputs.
    • Added a SerialPort::set_baud_rate method for the adjusting baudrate of a generic serial smartport after initialization. (#217)
    • Added fields containing relevant failure information to several error types (#221) (Breaking Change)
    • Added support for the power button in the Controller API. (#231) (Breaking Change)
    • Added implementations of Mul<i64> and Div<i64> for Position, allowing for opaque scaling (#230)
    • Added panic hook support comparable to the Rust standard library through vexide::panic::set_hook and vexide::panic::take_hook (#234)
    • Added support for legacy ADI servos through the AdiServo API. (#241)
    • Added support for the V5 AI Vision Sensor (#58)
    • Added FOV constants to the Vision Sensor (#58)
    • Added missing Send and Sync impls for RwLock. (#239)
    • Added the Proportional font family and support for fractional font scaling. (#248) (Breaking Change)
    • Added AdiDigitalOut::with_initial_state to set the initial state of a digital output while creating it (#246)
    • Added Display::draw_text to write Text to a Display. (#247)
    • Added support for the legacy Yaw Rate Gyroscope through the AdiGyroscope struct. (#236)
    • Added support for reading/writing to the Brain’s SDCard slot using the vexide::core::fs module. (#22)

    Fixed

    • AdiAddrLed::set_pixel will now correctly return an error if the device’s ADI expander is disconnected. (#155)
    • The dbg!(); now works as expected when no arguments are supplied to it. (#175)
    • Motor::velocity now correctly returns the estimated velocity instead of target velocity. (#184) (Breaking Change)
    • Removed useless generics from AdiAddrLed::new. (#197) (Breaking Change)
    • IMU calibration timeouts should no longer appear when the IMU is in working condition. (#212)
    • Fixed an issue preventing ADI updates in fast loops. (#210)
    • Motor::status can now actually return the MotorStatus::BUSY flag. (#211)
    • Fixed a memory leak on every RadioLink construction. (#220)
    • Fixed a panic in RadioLink::open that would occur if a program using a VEXlink radio was ran twice. (#243)
    • Fixed a bug with IMU reset offsets being applied incorrectly. (#242)

    Changed

    • Controller state is now returned all at once to reduce error checking. (#152) (Breaking Change)
    • Controller bumper naming scheme has been changed from <left/right>_trigger_<1/2> to button_<r/l><1/2>. (#204) (Breaking Change)
    • Button::was_pressed has been renamed to ButtonState::is_now_pressed.
    • battery::capacity now returns from 0.0-1.0 rather than 0-100.
    • battery::voltage is now returned in volts rather than millivolts.
    • battery::current is now returned in amps rather than milliamps.
    • Changed the incorrect return types of AdiSolenoid::is_open and AdiSolenoid::is_closed from LogicLevel to bool. (#164) (Breaking Change)
    • Renamed Motor::MAX_VOLTAGE to Motor::V5_MAX_VOLTAGE and added Motor::EXP_MAX_VOLTAGE. (#167) (Breaking Change)
    • Moved the ability to convert Smart devices to SmartPorts out of the SmartDevice trait and into the devices themselves. (#171) (Breaking Change)
    • Renamed SmartDeviceType::Magnet to SmartDeviceType::Electromagnet. (#176) (Breaking Change)
    • Getters and constructors will now create warnings when their return values are not used. (#155)
    • Renamed OpticalSensor::rgb to OpticalSensor::color and OpticalSensor::raw to OpticalSensor::raw_color (#179) (Breaking Change).
    • Made the following functions infallible: AdiAccelerometer::sensitivity, AdiAccelerometer::max_acceleration, AdiPotentiometer::potentiometer_type, AdiPotentiometer::max_angle, Motor::target, and RotationSensor::direction. (#182) (Breaking Change)
    • OpticalSensor::led_brightness now returns a number from 0.0 - 1.0 rather than a number from 1 - 100. (#155) (Breaking Change)
    • Renamed Motor::update_profiled_velocity to Motor::set_profiled_velocity. (#155) (Breaking Change)
    • Mutex is now ?Sized, matching the behavior of the standard library. (#202) (Breaking Change)
    • Switched to the rgb for color storage. vexide::devices::color is now vexide::devices::rgb which re-exports the Rgb type. (#201) (Breaking Change)
    • Renamed AddrledError::Adi to AddrledError::Port. (#203) (Breaking Change)
    • Renamed GpsImu::set_data_rate to GpsImu::set_data_interval. (#199) (Breaking Change)
    • Renamed InertialSensor::set_data_rate to InertialSensor::set_data_interval. (#199) (Breaking Change)
    • Renamed Motor::DATA_WRITE_INTERVAL to Motor::WRITE_INTERVAL. (#199) (Breaking Change)
    • Renamed InertialSensor::accel to InertialSensor::acceleration (#213) (Breaking Change)
    • Renamed GpsImu::accel to GpsImu::acceleration (#211) (Breaking Change)
    • SerialPort::read_byte now takes &mut self. (#215) (Breaking Change)
    • OpticalSensor::last_gesture now returns an Option<Gesture> if no gesture was detected. (#215) (Breaking Change)
    • The time field on Gesture is now returned as an instance of SmartDeviceTimestamp. (#215) (Breaking Change)
    • Gesture and GestureDirection no longer implements Default. (#215) (Breaking Change)
    • Renamed vexide::devices::geometry to vexide::devices::math. (#218) (Breaking Change)
    • Replaced the custom Point2 type with mint’s Point2 type for better interop. (#218) (Breaking Change)
    • SmartPort::device_type now returns an Option<SmartDeviceType> which returns None if no device is connected or configured to a port. (#219) (Breaking Change)
    • Renamed the LinkError::NonTerminatingNul and ControllerError::NonTerminatingNul variants to simply Nul and added a source error. (#220) (Breaking Change)
    • Made ControllerScreen methods and Controller::rumble asynchronous and added synchronous try_<action> variants. (#222) (Breaking Change)
    • Renamed ControllerScreen::MAX_LINE_LENGTH to ControllerScreen::MAX_COLUMNS. (#222) (Breaking Change)
    • Refactored InertialCalibrateFuture to an opaque wrapper over the internal state machine. (#225) (Breaking Change)
    • GpsSensor::new is now infallible and no longer returns a Result. (#240) (Breaking Change)
    • RadioLink::new can now only fail on NulError and will not bail if a radio is disconnected. (#240) (Breaking Change)
    • RadioLink::unread_bytes can now return a LinkError::ReadError. (#243)
    • RadioLink::is_linked is now infallible. (#243) (Breaking Change)

    Removed

    • Removed Motor::DATA_READ_INTERVAL. Use Motor::UPDATE_INTERVAL instead. (#199) (Breaking Change)
    • Removed InertialSensor::CALIBRATION_TIMEOUT and replaced it with the InertialSensor::CALIBRATION_START_TIMEOUT and InertialSensor::CALIBRATION_START_TIMEOUT constants. (#212) (Breaking Change)
    • AdiDigitalOut::level now reads the actual reported level value from VEXos, and thus now returns a Result. (#210) (Breaking Change)
    • Removed the defunct usd module from vexide::devices. (#198) (Breaking Change)
    • Removed AdiSolenoid. Use AdiDigitalOut instead. (#210) (Breaking Change)
    • Removed the deprecated ZERO_POSITION and ZERO_VELOCITY Motor status flags. (#211) (Breaking Change)
    • GestureDirection::None has been removed, as OpticalSensor::next_gesture now returns an Option<Gesture>. (#215) (Breaking Change)
    • GestureDirection no longer has a From conversion for u32. (#215) (Breaking Change)
    • Removed the nalgebra feature. All math types should natively support nalgebra conversions without any additional features. (#218) (Breaking Change)
    • Removed SmartDeviceType::None. SmartPort::device_type now returns an Option<SmartDeviceType> which serves the same purpose. (#219) (Breaking Change)
    • Removed Position-to-Position Mul/Div ops, as they were mathematically unsound. Prefer using Position-to-scalar operations for this. (#237) (Breaking Change)
    • Removed LinkError::Nul. (#240) (Breaking Change)
    • Removed LinkError::Port, because it was broken. VEXlink will no longer perform port validation. (#243) (Breaking Change)
    • Removed the TextSize enum. Use the associated constants on the new FontSize struct instead. (#248) (Breaking Change)

    New Contributors

    @zabackary made their first contribution in #164!

  • This is an alpha release of Hydrozoa, a new open source Java/Kotlin runtime for VEX V5, which adds API-level documentation and improves the APIs for motors, peripherals, and display widgets.

    The Maven Central listing can be found here: https://central.sonatype.com/artifact/dev.vexide/hydrozoa/0.1.0-alpha.2 API docs can be found here: https://javadoc.io/doc/dev.vexide/hydrozoa/0.1.0-alpha.2 Source code for the Java SDK can be found here: https://github.com/vexide/Hydrozoa-Java A changelog can be found here: https://github.com/vexide/Hydrozoa-Java/releases/tag/v0.1.0-alpha.2 A template for new projects can be found here: https://github.com/vexide/Hydrozoa-Java-Template

  • Symbolizer for VEX V5 is out! It’s a new extension for Visual Studio Code which makes it easier to debug crashes on VEX V5 robots by finding the lines of code on which the crash happened. It’s really useful for stepping through vexide (or PROS) backtraces or quickly revealing the location of an abort!

    VEX Forum post: https://www.vexforum.com/t/debug-robot-code-crashes-with-symbolizer-for-vex-v5/132038?u=lewis Visual Studio Marketplace: https://marketplace.visualstudio.com/items?itemName=vexide.symbolizer-for-vex-v5

  • This is a beta release of evian with preliminary support for vexide 0.5.0. It also further reorganizes modules compared to beta.1.

    This release includes a few new key features:

    • 2D distance-parameterized trapezoidal trajectory generation for Differential-configuration drivetrains.
    • Ramsete unicycle controller command (trajectory follower) for Differential-configuration drivetrains.
    • Rough implementation of a boomerang controller in the Seeking motions struct (completely untested and unoptimized).
    • Cubic bezier splines in evian::math.
    • 1D distance-parameterized trapezoidal motion profiling for general-purpose use in evian::math.

    API docs for this release (still largely incomplete): https://docs.rs/evian/0.3.0-beta.2/evian/index.html An example of evian’s trajectory following capabilities can be seen here: https://github.com/vexide/evian/blob/master/examples/trajectory.rs

    Please keep in mind that these APIs are unstable not thoroughly tested, so competition use of evian is not recommended at this point in time (unless you are working with your own motion algorithms and localization on top of it).

  • This is a beta release of evian, with a rewritten architecture. You can view an example of it in use here: https://github.com/vexide/evian/blob/master/examples/testing.rs

    This version depends on the latest vexide release candidate, so you will also have to use that to test it. At this point in time, the general architecture (how things are structured and passed around) is nearly finalized, but the implementations of things (specifically the stuff in tracking and the commands) are not hardware tested and incomplete (some may even panic with todo!). It’s highly discouraged from using those for competition purposes in this release.

  • Added

    • You can now create new vexide projects with the cargo v5 new and cargo v5 init commands.
    • Added support for user input in cargo v5 terminal.
    • Added the ability to use cargo-v5 as a field controller through the cargo v5 fc command. This can only be used if installed with the optional field-control feature.

    Fixed

    • Target specification now uses the correct VFPv3 float ABI.
    • Uploads will now only be attempted when a successful build occurs.
October 2024
  • Fixed

    • Fixed an issue related to the calling convention of vex-sdk functions causing docs.rs api reference build failures. (#165)
  • Added

    • Uploads will now switch the radio to the download channel when uploading wirelessly.

    Changed

    • Switched back to an internal implementation of objcopy for producing binary artifacts. cargo-binutils is therefore no longer required.
  • vexide 0.4.1 is a hotfix for a hard-float related issue with VEXos syscalls.

    Fixed

    • Updated to vex-sdk 0.21.0, fixing ABI incompatibilities between the VEXos calling convention and the hard-float ABI introduced in vexide 0.4.0. This should fix broken functions that pass floats to the SDK. (#156)
  • Added

    • cargo v5 run provides a cargo runner capable of building and uploading a program, running the program, and opening the terminal in one command.

    Changed

    • Added support for vexide 0.4.0’s new target specification using the ARM hard-float ABI.
    • Previous target specification files will now be overwritten.
    • The package.metadata.v5 field in Cargo.toml is now no longer required for projects.
  • This is the fall vexide update (0.4.0) changelog! This is only the changelog for the vexide crate. For more in-depth info and a project update, read our fall update blog post.

    Added

    • Added support for the V5 GPS Sensor (#79)
    • Added support for custom banner themes configurable through the vexide::main macro (#127)

    Fixed

    • Fixed an issue where the distance sensor relative_size returned a u32 when it can be negative. (#116)
    • Fixed an issue preventing the Screen::draw_buffer function from working properly. (#128)
    • Fixed an issue where panic messages would not be displayed even when the display_panics feature was enabled if the screens render mode was set to DoubleBuffered. (#134)
    • GpsImu should now validate on the correct port. (#141)
    Read More

    Changed

    • Refactored the distance sensor API. All readings from the sensor are now read at once in a object method that can be possibly None if no object was detected. (#122) (Breaking Change)
    • Adjusted distance sensor status code errors to be more clear.
    • Overhauled the design of the startup banner.
    • Adjusted distance sensor error names. (#113) (Breaking Change)
    • Renamed SmartDevice::port_index and SmartPort::index to SmartDevice::port_number and SmartPort::port_number. (#121) (Breaking Change)
    • Renamed AdiDevice::port_index and AdiPort::index to AdiDevice::port_number and AdiDevice::port_number. (#121) (Breaking Change)
    • SmartPort::device_type now no longer returns a Result. (#121) (Breaking Change)
    • Updated the names of certain misspelled enum variants, constants, and fields. (#132) (Breaking Change)
    • Marks many futures as #[must_use] to warn when futures are created without awaiting them. (#112)
    • Changes the banner attribute syntax in the vexide::main macro. (#127) (Breaking Change)
    • Controller joystick axis getters now return f64 instead of f32. (#133) (Breaking Change)
    • Fixed an issue where the async executor would block indefinetly on the first program run after a Brain reboot (#139)
    • Removed the critical_section module from vexide_core, since vexide doesn’t use interrupts and it can potentially break VEXos operations. (#144) (Breaking Change)
    • Switched to a hard-float libm build with up to 6 times faster floating point operations. (#145)
September 2024 August 2024
  • Fixed

    Switched to the cargo-binutils version of objcopy as an emergency fix for our implementation sometimes producing binaries with undefined behavior.

    In order to use this newer version, you will need to install cargo-binutils:

    rustup component add llvm-toolscargo install cargo-binutils
July 2024
  • Fixed

    • Fixed an issue with the object dependency not compiling on windows.
    • Fixed an issue with V5 serialport identification on non-linux platforms.
  • This is the first major vexide update this summer! This blog post is focused solely on the new update to the vexide crate. To read about our summer plans and everything else included in this release, take a look at our blog post on that subject. I highly recommend reading it!

    Now for the vexide changes!

    Added

    • The startup banner and code signature may now be configured using parameters passed to vexide::main. (#102)
    • Added the ProgramOwner, ProgramType, and ProgramFlags types for code signature configuration. (#76)
    • Created new force_rust_libm feature to force the use of a slower, 100% Rust, libm implementation. This is useful for building on WASM. (#106)
    • Optimized floating point math operations available through the Float extension trait. (#77)
    • Added text metrics getters to the Text widget. (#83)
    • Added alignment support for the Text widget. (#85)
    • CompetitonBuilder functions can now return a ControlFlow in order to explicitly end execution. (#89)
    • Point2 can now be converted to mint when using the nalgebra feature. (#91)
    Read More

    Fixed

    • Peripherals can now be mutated in the main function (#75)
    • Panic messages now output over serial even on display_panics feature.

    Changed

    • Updated vex-sdk to version 0.17.0. (#76)
    • Renamed ColdHeader to CodeSignature. (#76) (Breaking Change)
    • Renamed the entrypoint symbol from _entry to _start. (#76) (Breaking Change)
    • Renamed __stack_start and __stack_end symbols to __stack_top and __stack_bottom respectively. (#76) (Breaking Change)
    • Renamed the .cold_magic section to .code_signature. (#76) (Breaking Change)
    • Made fields on screen widgets public. (#81)
    • Renamed Competition to CompetitionRuntime, CompetitionRobotExt to CompetitionExt, and CompetitionRobot to Competition. (#87) (Breaking Change)
    • Removed the Error associated type from the Competition trait and made all methods infallible. (#87) (Breaking Change)

    Removed

    • The no-banner feature has been removed from vexide-startup and must now be toggled through the vexide:main attribute. (#102) (Breaking Change)
    • Removed the useless __rodata_start and __rodata_end symbols.
    • Support for vexide-math has been dropped. (#78) (Breaking Change)
  • Added

    • You can now pass pre-objcopied program binaries (.bin) files to cargo v5 upload using the --file argument.

    Changed

    • Cut down on some dependencies to improve compile times.

    Fixed

    • Fixed a bug with the internal implementation of objcopy in cargo-v5 generating invalid user programs.
  • Initial release of vex-v5-serial. See our blog post for a high-level overview of what this crate aims to do and solve.

May 2024
  • vexide 0.2.1 has been released! We have made a couple very small updates, but hopefully that should end now.

    Fixed

    • Fixed debug builds causing data aborts.
  • vexide version 0.2.0 has been released!

    Added

    • Added TICKS_PER_ROTATION constant to AdiEncoder for use with Position.

    Fixed

    • Removed unintentional re-exports from vexide-core program module. (Breaking Change)
    • Fixed vision panicking after getting garbage data from vex-sdk.
    • Corrected incorrect axis getters in the Controller API.
  • This is the initial release of vexide. See our release post for more information!

April 2024
  • Added

    • New Motor API (Breaking Change) (#66)

      • Added MotorControl enum for controlling motor targets (#66).
      • Added support for onboard velocity and position control in motors (#66).
      • Added missing motor telemetry functions velocity, efficiency, gearset, current_limit.
      • Added support for current and voltage limiting in motors.
      • Added Motor::raw_position for getting raw IME ticks at a given timestamp.
      • Added support for getting motor fault flags (e.g. over-temperature, over-current, H-bridge faults).
      • Added support for internal motor PID tuning. Feature gated behind dangerous_motor_tuning, as this can cause hardware damage and is not recommended.
      • Added various constants for convenience around Motor and Gearset.
    • Added Controller API to the pros::prelude module. (#108)

    • relative_size method on DistanceSensor for getting a guess at an object’s relative size. (#73)

    Fixed

    Read More
    • pros_sys bindings to the Motors C API now takes the correct port type (i8) as of PROS 4 (Breaking Change) (#66).
    • Fixed the unintended unsafe context present in the sync_robot and async_robot family of macros (Breaking Change) (#107).

    Changed

    • Renamed DistanceSensor::object_velocity to DistanceSensor::velocity.
    • Adjusted distance_confidence to return a value from [0.0, 1.0] rather than 0-100 to match other percentage getters.
    • Refactored the Motor API (Breaking Change) (#66)
      • Adjusts constructor arguments for Motor to allow passing Gearset and a direction instead of brake_mode at construction. (Breaking Change) (#66)
      • Renamed Motor::get_state to Motor::state. (Breaking Change) (#66)
      • Changed Motor::reversed to return Result<bool, _>`` rather than just falseifPROS_ERR` is returned. (Breaking Change) (#66)
      • Adjusted motor targeting to work around the MotorControl enum.
      • Adjusted motor reverse flag to use Direction enum rather than a boolean.
      • Motor braking is now stateless and requires an explicit method to be called to use BrakeModes other than BrakeMode::Coast.
      • Renamed Motor::current_draw to Motor::current.
      • Renamed Motor::get_state to Motor::status.
    • Status structs containing device bits now use the bitflags! crate. (Breaking Change) (#66)
    • Renamed InertialSensor::calibrating to InertialSensor::calibrating (Breaking CHange) (#66)
    • AdiEncoder now returns Position rather than just degrees (Breaking Change) (#106).

    Removed

    • Removed MotorStoppedFuture, as it was broken due to hardware not returning the stopped flag (Breaking Change) (#66).
    • Removed Motor::set_output and Motor::set_raw_output in favor of set_voltage.
March 2024
  • Added

    • Added feedforward motor controllers (#80)
    • Lightly document all APIs with missing documentation. (#70)
    • Added Debug, Copy, and Clone derives for common structs (#70)
    • Screen drawing API. (#81)
    • Added screen field to Peripherals and DynamicPeripherals::take_screen method. (#81)
    • Added AdiSolenoid, a wrapper over AdiDigitalOut for actuating SMC pneumatic solenoids. (#61)
    • Added AdiSwitch, another AdiDigitalOut wrapper that abstracts bumper switches and limit switches. (#61)
    • Added AdiLineTracker for abstracting the EDR line tracker sensor.
    • Implemented TryFrom for Gearset.
    • Adds support for getting brake modes from motors. (#66)

    Fixed

    Read More
    • Fix error handling and error type variats in ADI bindings
    • Fix AsynRobot only running opcontrol
    • Properly handle EADDRINUSE return for smart port errors (Breaking Change) (#97)

    Changed

    • Re-exported printing macros from pros::io. (#82)
    • Applied several lints to improve code quality. (#70)
    • Updated to PROS version 4. (Breaking Change) (#81)
    • Moved vision::Rgb into its own color.rs file. (Breaking Change) (#81)
    • The VEXOS target has been updated to improve file size and floating point operation speed. (#81)
    • Peripherals::new() is no longer const (**Breaking Change) (#81)
    • Updated panic handler to print to the brain display as well as over serial (#81)
    • Refactors digital and analog ADI input/output. (Breaking Change) (#61)
      • Adds LogicLevel rather than bools for controlling digital devices.
      • Adds 0-5V voltage getters and setters for analog ADI.
      • Changed analog getters and setters to use u16 data.
    • Changed AdiPotentiometer to return degrees rather than tenth degrees (Breaking Change) (#61).
      • Renamed AdiPotentiometer::value to AdiPotentiometer::angle.
    • Refactors AdiMotor to match the smart motor APIs, having output/raw output getters/setters.
    • Renamed AdiUltrasonic::value to AdiUltrasonic::distance (Breaking Change) (#61).
    • Renamed AdiEncoder::value to AdiEncoder::position (Breaking Change) (#61).
    • Repurposed AdiAnalogOut as AdiPwmOut to correct match port output. (Breaking Change) (#90).
    • Moved most device-related constants into their associated struct impl (Breaking Change) (#98).
    • Renamed IMU_RESET_TIMEOUT to InertialSensor::CALIBRATION_TIMEOUT (Breaking Change) (#98).
    • Repurposed the pros crate as a metapackage without any code of its own. (Breaking Change) (#86)
    • Split the pros-rs into several small subcrates. (Breaking Change) (#86)
      • pros-async with the async executor and robot trait.
      • pros-devices for device bindings.
      • pros-sync for the sync robot trait.
      • pros-core with basic abstractions over pros-sys needed to compile a program to the brain.
      • pros-math with commonly used controllers and other mathematical models.
      • pros-panic for the panic handler implementation.

    Removed

    • LVGL bindings (pros-sys) and colors (pros). (Breaking Change) (#81)
    • LLEMU/lcd bindings. (Breaking Change) (#81)
    • Re-exported printing macros from pros::io. (#82)
    • Applied several lints to improve code quality. (#70)
    • Removed the confusingly named write, ewrite, writeln, and ewriteln macros. (Breaking Change) (#82)
    • Removed AdiDigitalIn::new_press, instead swapping it for AdiSwitch::was_pressed. (Breaking Change) (#61)
January 2024
  • Added

    • SmartPort struct for device access. (#34)
    • SmartDevice trait for common functionality across smart port devices. (#34)
    • Methods to get a device’s port number as well as determine if the device is plugged in or not. (#34)
    • Added various missing derives for hardware-related data structures. (#34)
    • CompetitionSystem and CompetitionMode structs for better retrieving information about the robot’s competition state. (#38)
    • competition::system method for retrieving the type of competition control the robot is connected to. (#38)
    • New From implementation to convert Quaternion and Euler to their pros-sys equivalents. (#45)
    • pros::io module for I/O related operations. (#30)
    • Various types from the no_std_io have are re-exported from this module to provide missing functionality from std. (#30)
    • Macros for printing to stdout (println, print, eprintln, etc…) (#30)
    • All ADI device bindings (#55)
    • LocalKey now has Cell/RefCell-specific methods for setting and taking values. (#42)
    • Peripherals and DynamicPeripherals structs to ensure that you have only registered one device on a given smart or ADI port. (#53)
    Read More
    • Support for ADI Expander modules with AdiExpander. (#63)

    Fixed

    • Fixed competition state-related getters in the pros::competition module. (#38)
    • Fixed error handling in IMU sensor bindings. (#37)
    • Fixed errors in doctests and examples throughout the crate. (#37)
    • Fixed Missing ERRNO and ADI config variants in pros-sys (#55)
    • Fixed incorrect error handling with InertialSensor::status. (#65)
    • Controller::status now handles errors by returning Result<ControllerStatus, ControllerError>. (Breaking Change) (#74)

    Changed

    • Overhauled the competition module with more straightforward getters for competition state. (#38) (Breaking Change)
    • LLEMU-related macros have been prefixed with llemu_ (e.g. llemu_println). (Breaking Change) (#30)
    • Added Debug, Copy, and Clone derives for common structs (#37)
    • Renamed InertialSensor::is_calibrating to InertialSensor::calibrating. (Breaking Change) (#65)
    • Battery API functions now return Result<_, BatteryError>. (Breaking Change) (#62)
    • Renamed battery::get_capacity to battery::capacity, battery::get_current -> battery::current, battery::get_temperature -> battery::temperature, battery::get_voltage -> battery::voltage. (Breaking Change) (#62)

    Removed

    • Removed several broken bindings in pros_sys relating to competition state. (#38) (Breaking Change)
    • LocalKey no longer implements set for non-Cell/RefCell stored values. (Breaking change) (#42)
    • Removed the now-redundant InertialStatus::error function. (Breaking Change) (#65)
  • Fixed

    • GPS sensor set_offset function now returns a result. The relevant PROS C bindings have been fixed as well. (Breaking change)
    • FreeRTOS task creation now does not garble data that the provided closure captured.
    • Grammar in the feature request template has been fixed.
    • Wasm build flags have been updated and fixed.

    Changed

    • Panicking behavior has been improved so that spawned tasks will not panic the entire program.
    • Panic messages are now improved and printed over the serial connection.
    • AsyncRobot should now be implemented using the newly stabilized async trait syntax instead of the old async_trait attribute macro. (Breaking change)

    Removed

    Read More
    • A nonexistent runner for armv7a-vexos-eabi target has been removed from the cargo config.
  • Added

    • Standard library like Instants
    • Optical sensor bindings.
    • IMU sensor bindings.

    Fixed

    • The async executor now does not starve the OS of cycles when unnecessary.

    Changed

    • Updated readme with fixed grammar.
  • Added

    • Add methods to controller for checking individual buttons and axes.

    Changed

    • Write doc comments for previously undocumented modules and functions.