REVLib - C++
A301.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2026 REV Robotics
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of REV Robotics nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#pragma once
30
31#include <memory>
32#include <string>
33
34#include <wpi/hardware/motor/MotorController.hpp>
35
36// TODO
37#include "rev/REVLibError.h"
38#include "rev/util/Signal.h"
39
40namespace first::a301 {
41
42namespace internal {
43class A301;
44} // namespace internal
45
46// The default A301 device ID is set to 3 out of the factory.
47constexpr int defaultDeviceId{3};
48
49class A301 : public wpi::MotorController {
50public:
60 explicit A301(int busId);
61
71 A301(int busId, int deviceId);
72
76 ~A301() override;
77
84 int GetBusId() const;
85
92 int GetDeviceId() const;
93
95 uint8_t major;
96 uint8_t minor;
97 uint16_t patch;
98 uint8_t prerelease;
99 };
100
108
115 std::string GetFirmwareString() const;
116
125
133
141
149
150 struct Faults {
151 bool other{};
152 bool sensor{};
153 bool can{};
156 bool escEeprom{};
157 bool firmware{};
159 uint16_t rawBits{};
160
161 Faults() = default;
162
163 explicit Faults(uint16_t faults);
164 };
165
173
184
185 struct Warnings {
188 bool brownout{};
190 bool escEeprom{};
191 bool extEeprom{};
192 bool sensor{};
193 bool stall{};
194 bool hasReset{};
195 bool other{};
196 uint16_t rawBits{};
197
198 Warnings() = default;
199
200 explicit Warnings(uint16_t warnings);
201 };
202
210
221
228
235
242
249
250 enum class GearboxRPM {
252 kRPM_215,
253 kRPM_500,
254 };
255
262
270
278
286
294
302
307
314 rev::REVLibError SetVelocity(double velocity);
315
322 rev::REVLibError SetRelativePosition(double position);
323
332 double speed);
333
340 rev::REVLibError SetAbsolutePosition(double absPosition);
341
352 double speed);
353
354 enum class IdleMode {
355 kCoast,
356 kBrake,
357 };
358
365
371 IdleMode GetIdleMode() const;
372
379
386
393
403
410 double GetAbsoluteEncoderRangeOffset() const;
411
418 rev::REVLibError SetCurrent(double current);
419
420 /**** MotorController Interface ****/
421
428 void SetThrottle(double throttle) override;
429
436 double GetThrottle() const override;
437
447 void SetVoltage(wpi::units::volt_t output) override;
448
454 void SetInverted(bool isInverted) override;
455
461 bool GetInverted() const override;
462
466 void Disable() override;
467
468 /**** Signals Configuration Interface ****/
469
483 A301& FaultsPeriodMs(int period_ms);
484
491 int GetFaultsPeriodMs() const;
492
506 A301& WarningsPeriodMs(int period_ms);
507
514 int GetWarningsPeriodMs() const;
515
529 A301& BusVoltagePeriodMs(int period_ms);
530
537 int GetBusVoltagePeriodMs() const;
538
552 A301& AppliedOutputPeriodMs(int period_ms);
553
560 int GetAppliedOutputPeriodMs() const;
561
575 A301& MotorCurrentPeriodMs(int period_ms);
576
583 int GetMotorCurrentPeriodMs() const;
584
598 A301& MotorTemperaturePeriodMs(int period_ms);
599
606 int GetMotorTemperaturePeriodMs() const;
607
622
630
644 A301& EncoderVelocityPeriodMs(int period_ms);
645
652 int GetEncoderVelocityPeriodMs() const;
653
668
676
677private:
678 std::unique_ptr<internal::A301> p;
679};
680
681} // namespace first::a301
Definition: A301.h:49
rev::REVLibError SetVelocity(double velocity)
Definition: A301.cpp:556
rev::util::Signal< bool > HasActiveFault() const
Definition: A301.cpp:380
rev::util::Signal< bool > HasActiveWarning() const
Definition: A301.cpp:390
int GetFaultsPeriodMs() const
Definition: A301.cpp:674
void Disable() override
Definition: A301.cpp:667
~A301() override
A301 & FaultsPeriodMs(int period_ms)
Definition: A301.cpp:669
rev::REVLibError EnableAbsolutePositionContinuousInput()
Definition: A301.cpp:595
rev::REVLibError SetAbsoluteEncoderPosition(double position)
Definition: A301.cpp:625
rev::util::Signal< double > GetMotorTemperature() const
Definition: A301.cpp:511
int GetDeviceId() const
Definition: A301.cpp:352
int GetBusId() const
Definition: A301.cpp:350
bool GetInverted() const override
Definition: A301.cpp:661
rev::REVLibError DisableAbsolutePositionContinuousInput()
Definition: A301.cpp:601
rev::REVLibError SetRelativePositionWithSpeed(double position, double speed)
Definition: A301.cpp:565
bool IsAbsolutePositionContinuousInputEnabled() const
Definition: A301.cpp:607
rev::REVLibError ClearFaults()
Definition: A301.cpp:551
rev::util::Signal< double > GetBusVoltage() const
Definition: A301.cpp:496
int GetMotorTemperaturePeriodMs() const
Definition: A301.cpp:729
rev::util::Signal< Warnings > GetStickyWarnings() const
Definition: A301.cpp:468
rev::util::Signal< double > GetMotorCurrent() const
Definition: A301.cpp:506
int GetEncoderVelocityPeriodMs() const
Definition: A301.cpp:751
rev::util::Signal< bool > HasStickyFault() const
Definition: A301.cpp:385
rev::util::Signal< GearboxRPM > GetGearboxRPM() const
Definition: A301.cpp:517
int GetAbsoluteEncoderPositionPeriodMs() const
Definition: A301.cpp:762
rev::REVLibError SetRelativeEncoderPosition(double position)
Definition: A301.cpp:619
rev::REVLibError SetCurrent(double current)
Definition: A301.cpp:615
rev::util::Signal< double > GetEncoderVelocity() const
Definition: A301.cpp:540
IdleMode GetIdleMode() const
Definition: A301.cpp:589
rev::util::Signal< Warnings > GetWarnings() const
Definition: A301.cpp:443
rev::util::Signal< bool > HasStickyWarning() const
Definition: A301.cpp:395
void SetThrottle(double throttle) override
Definition: A301.cpp:643
A301 & BusVoltagePeriodMs(int period_ms)
Definition: A301.cpp:691
A301 & MotorTemperaturePeriodMs(int period_ms)
Definition: A301.cpp:724
A301 & WarningsPeriodMs(int period_ms)
Definition: A301.cpp:680
void SetVoltage(wpi::units::volt_t output) override
Definition: A301.cpp:651
int GetMotorCurrentPeriodMs() const
Definition: A301.cpp:718
rev::REVLibError SetIdleMode(IdleMode idleMode)
Definition: A301.cpp:582
double GetAbsoluteEncoderRangeOffset() const
Definition: A301.cpp:637
A301 & MotorCurrentPeriodMs(int period_ms)
Definition: A301.cpp:713
rev::util::Signal< double > GetAppliedOutput() const
Definition: A301.cpp:501
A301 & RelativeEncoderPositionPeriodMs(int period_ms)
Definition: A301.cpp:735
rev::util::Signal< double > GetAbsoluteEncoderPosition() const
Definition: A301.cpp:545
rev::REVLibError SetAbsoluteEncoderRangeOffset(double offset)
Definition: A301.cpp:631
A301 & AppliedOutputPeriodMs(int period_ms)
Definition: A301.cpp:702
int GetBusVoltagePeriodMs() const
Definition: A301.cpp:696
double GetThrottle() const override
Definition: A301.cpp:649
rev::util::Signal< double > GetRelativeEncoderPosition() const
Definition: A301.cpp:534
A301(int busId)
Definition: A301.cpp:346
rev::util::Signal< Faults > GetFaults() const
Definition: A301.cpp:400
std::string GetFirmwareString() const
Definition: A301.cpp:365
int GetAppliedOutputPeriodMs() const
Definition: A301.cpp:707
void SetInverted(bool isInverted) override
Definition: A301.cpp:657
A301 & EncoderVelocityPeriodMs(int period_ms)
Definition: A301.cpp:746
int GetWarningsPeriodMs() const
Definition: A301.cpp:685
int GetRelativeEncoderPositionPeriodMs() const
Definition: A301.cpp:740
rev::util::Signal< Faults > GetStickyFaults() const
Definition: A301.cpp:420
rev::REVLibError SetRelativePosition(double position)
Definition: A301.cpp:560
FirmwareVersion GetFirmwareVersion() const
Definition: A301.cpp:354
GearboxRPM
Definition: A301.h:250
rev::REVLibError SetAbsolutePosition(double absPosition)
Definition: A301.cpp:571
A301 & AbsoluteEncoderPositionPeriodMs(int period_ms)
Definition: A301.cpp:757
rev::REVLibError SetAbsolutePositionWithSpeed(double absPosition, double speed)
Definition: A301.cpp:576
IdleMode
Definition: A301.h:354
Definition: Signal.h:42
Definition: A301.cpp:42
constexpr int defaultDeviceId
Definition: A301.h:47
REVLibError
Definition: REVLibError.h:33
Definition: A301.h:150
bool gateDriver
Definition: A301.h:155
bool other
Definition: A301.h:151
bool temperature
Definition: A301.h:154
bool escEeprom
Definition: A301.h:156
bool sensor
Definition: A301.h:152
uint16_t rawBits
Definition: A301.h:159
bool can
Definition: A301.h:153
bool motorStartup
Definition: A301.h:158
bool firmware
Definition: A301.h:157
uint8_t prerelease
Definition: A301.h:98
uint16_t patch
Definition: A301.h:97
uint8_t major
Definition: A301.h:95
uint8_t minor
Definition: A301.h:96
Definition: A301.h:185
bool escEeprom
Definition: A301.h:190
bool stall
Definition: A301.h:193
bool sensor
Definition: A301.h:192
bool overvoltage
Definition: A301.h:186
bool brownout
Definition: A301.h:188
bool other
Definition: A301.h:195
bool hasReset
Definition: A301.h:194
bool motorLoopSpeed
Definition: A301.h:187
bool overcurrent
Definition: A301.h:189
bool extEeprom
Definition: A301.h:191
uint16_t rawBits
Definition: A301.h:196