ReduxLib C++ 2024.2.0
|
#include <Canandmag.h>
Public Member Functions | |
Canandmag (int canID) | |
units::turn_t | GetPosition () |
units::turn_t | GetAbsPosition () |
bool | SetPosition (units::turn_t newPosition, units::second_t timeout=50_ms) |
bool | SetAbsPosition (units::turn_t newPosition, units::second_t timeout=50_ms, bool ephemeral=false) |
bool | ZeroAll (units::second_t timeout=50_ms) |
units::turns_per_second_t | GetVelocity () |
bool | MagnetInRange () |
CanandmagFaults | GetStickyFaults () |
CanandmagFaults | GetActiveFaults () |
units::celsius_t | GetTemperature () |
void | ClearStickyFaults () |
void | SetPartyMode (uint8_t level) |
![]() | |
virtual void | HandleMessage (CanandMessage &msg)=0 |
virtual CanandAddress & | GetAddress ()=0 |
bool | IsConnected (units::second_t timeout=2_s) |
virtual std::string | GetDeviceClassName () |
std::string | GetDeviceName () |
virtual void | PreHandleMessage (CanandMessage &msg) |
void | CheckReceivedFirmwareVersion () |
virtual CanandFirmwareVersion | GetMinimumFirmwareVersion () |
bool | SendCANMessage (uint8_t apiIndex, uint8_t *data, uint8_t length) |
template<std::size_t len> requires (len < 8U) | |
void | SendCANMessage (uint8_t msgId, std::span< std::byte, len > data) |
Class for the CAN interface of the Canandmag.
If you are using a Canandmag with Spark Max or Talon with the PWM output, see our Spark Max docs or our Talon SRX docs for information on how to use the encoder with the Rev and CTRE APIs.
The C++ vendordep uses the units library for all dimensioned values, including settings.
Operations that receive data from the device (position, velocity, faults, temperature) generally do not block. The object receives data asynchronously from the CAN packet receive thread and reads thus return the last data received.
Operations that set settings or change offsets will generally wait for up to 50ms by default as they will usually wait for a confirmation packet to be received in response – unless the blocking timeout is set to zero, in which case the operation swill not block.
Example code:
redux::sensors::canandmag::Canandmag::Canandmag | ( | int | canID | ) |
Constructor with the device's id. This object will be constant with respect to whatever CAN id assigned to it, so if a device changes id it may change which device this object reads from.
canID | the device id to use |
void redux::sensors::canandmag::Canandmag::ClearStickyFaults | ( | ) |
Clears sticky faults.
It is recommended to clear this during initialization, so one can check if the encoder loses power during operation later.
This call does not block, so it may take up to the next status frame (default every 1000 ms) for the sticky faults to be updated.
units::turn_t redux::sensors::canandmag::Canandmag::GetAbsPosition | ( | ) |
Gets the current absolute position of the encoder, in a scaled value from 0 inclusive to 1 exclusive. By default, higher values are in the counter-clockwise direction from the sensor face.
This value will persist across encoder power cycles making it appropriate for swerves/arms/etc.
CanandmagFaults redux::sensors::canandmag::Canandmag::GetActiveFaults | ( | ) |
Fetches active faults. Active faults are only active for as long as the error state exists.
units::turn_t redux::sensors::canandmag::Canandmag::GetPosition | ( | ) |
Gets the current integrated position in rotations.
This value does not wrap around, so turning a sensed axle multiple rotations will return multiple sensed rotations of position. By default, positive is in the counter-clockwise direction from the sensor face.
On encoder power-on, unlike the absolute value, this value will always initialize to zero.
CanandmagFaults redux::sensors::canandmag::Canandmag::GetStickyFaults | ( | ) |
Fetches sticky faults. Sticky faults are the active faults, except once set they do not become unset until ClearStickyFaults() is called.
units::celsius_t redux::sensors::canandmag::Canandmag::GetTemperature | ( | ) |
Get onboard encoder temperature readings in degrees Celsius.
units::turns_per_second_t redux::sensors::canandmag::Canandmag::GetVelocity | ( | ) |
Returns the measured velocity in rotations per second.
bool redux::sensors::canandmag::Canandmag::MagnetInRange | ( | ) |
Returns whether the encoder magnet is in range of the sensor or not. This can be seen visually on the sensor – a green LED is in range, whereas a red LED is out of range.
bool redux::sensors::canandmag::Canandmag::SetAbsPosition | ( | units::turn_t | newPosition, |
units::second_t | timeout = 50_ms , |
||
bool | ephemeral = false |
||
) |
Sets the new absolute position value for the encoder which will (by default) persist across reboots.
newPosition | new absolute position in fraction of a rotation (acceptable range [0..1)) |
timeout | maximum time to wait for the operation to be confirmed (default 0.050 seconds). Set to 0 to not check (and not block). |
ephemeral | if true, set the setting ephemerally – the new zero offset will not persist on power cycle. |
void redux::sensors::canandmag::Canandmag::SetPartyMode | ( | uint8_t | level | ) |
Controls "party mode" – an encoder identification tool that blinks the onboard LED various colors at a user-specified strobe period. The strobe period of the LED will be (50 milliseconds * level). Setting this to 0 disables party mode.
This function does not block.
level | the party level value to set. |
bool redux::sensors::canandmag::Canandmag::SetPosition | ( | units::turn_t | newPosition, |
units::second_t | timeout = 50_ms |
||
) |
Sets the new relative (multi-turn) position of the encoder to the given value.
Note that this does not update the absolute position, and this value is lost on a power cycle. To update the absolute position, use Canandmag::SetAbsPosition
newPosition | new position in rotations |
timeout | maximum time to wait for the operation to be confirmed (default 0.050 seconds). Set to 0 to not check (and not block). |
bool redux::sensors::canandmag::Canandmag::ZeroAll | ( | units::second_t | timeout = 50_ms | ) |
Sets both the current absolute and relative encoder position to 0 – generally equivalent to pressing the physical zeroing button on the encoder.
timeout | maximum time in seconds to wait for each operation to be confirmed (there are 2 ops for zeroing both absolute and relative positions, so the wait is up to 2x timouet). Set to 0 to not check (and not block). |