REVLib - C++
SparkBase.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-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 <atomic>
32
33#include "rev/ConfigureTypes.h"
34#include "rev/REVLibError.h"
39#include "rev/SparkLowLevel.h"
41#include "rev/SparkSoftLimit.h"
42#include "rev/util/Signal.h"
43
44// Defined in HIL tester source
45class ConfigBase;
46
47namespace rev::spark {
48
49class SparkBaseConfig;
50
51class SparkBase : public SparkLowLevel {
52 friend class SparkMax;
53 friend class SparkFlex;
54 friend class SparkLimitSwitch;
55 friend class SparkSoftLimit;
59 friend class SparkSim;
61
62 // Defined in HIL tester source
63 friend class ::ConfigBase;
64
65public:
66 enum class IdleMode { kCoast = 0, kBrake = 1 };
67
69
71
73
74 struct Faults {
75 bool other{};
76 bool motorType{};
77 bool sensor{};
78 bool can{};
80 bool gateDriver{};
81 bool escEeprom{};
82 bool firmware{};
83 int rawBits{};
84
85 Faults() = default;
86
87 explicit Faults(uint16_t faults) {
88 rawBits = faults;
89 other = (faults & 0x1) != 0;
90 motorType = (faults & 0x2) != 0;
91 sensor = (faults & 0x4) != 0;
92 can = (faults & 0x8) != 0;
93 temperature = (faults & 0x10) != 0;
94 gateDriver = (faults & 0x20) != 0;
95 escEeprom = (faults & 0x40) != 0;
96 firmware = (faults & 0x80) != 0;
97 }
98 };
99
100 struct Warnings {
101 bool brownout{};
103 bool escEeprom{};
104 bool extEeprom{};
105 bool sensor{};
106 bool stall{};
107 bool hasReset{};
108 bool other{};
109 int rawBits{};
110
111 Warnings() = default;
112
113 explicit Warnings(uint16_t warnings) {
114 rawBits = warnings;
115 brownout = (warnings & 0x1) != 0;
116 overcurrent = (warnings & 0x2) != 0;
117 escEeprom = (warnings & 0x4) != 0;
118 extEeprom = (warnings & 0x8) != 0;
119 sensor = (warnings & 0x10) != 0;
120 stall = (warnings & 0x20) != 0;
121 hasReset = (warnings & 0x40) != 0;
122 other = (warnings & 0x80) != 0;
123 }
124 };
125
129 ~SparkBase() override = default;
130
131 /**** Speed Controller Interface ****/
138 void SetThrottle(double throttle) override;
139
150 void SetVoltage(wpi::units::volt_t output) override;
151
158 double GetThrottle() const override;
159
169 [[deprecated("Use SparkBaseConfig.Inverted() with Configure() instead")]]
170 void SetInverted(bool isInverted) override;
171
181 [[deprecated(
182 "Use SparkBaseConfigAccessor.GetInverted() via SparkMax.configAccessor "
183 "or SparkFlex.configAccessor instead")]]
184 bool GetInverted() const override;
185
189 void Disable() override;
190
194 void
195 StopMotor(); // override; TODO: (2027 - StopMotor moved to MotorSafety)
196
197 /* ***** Extended Functions ****** */
198
222 [[deprecated(
223 "Use Configure(SparkBaseConfig&, rev::ResetMode, rev::PersistMode) "
224 "instead. This method will be removed in 2027.")]]
225 virtual REVLibError Configure(SparkBaseConfig& config, ResetMode resetMode,
226 PersistMode persistMode);
227
249 virtual REVLibError Configure(SparkBaseConfig& config,
250 rev::ResetMode resetMode,
251 rev::PersistMode persistMode);
252
281 [[deprecated(
282 "Use ConfigureAsync(SparkBaseConfig&, rev::ResetMode, "
283 "rev::PersistMode) instead. This method will be removed in 2027.")]]
285 ResetMode resetMode,
286 PersistMode persistMode);
287
315 rev::ResetMode resetMode,
316 rev::PersistMode persistMode);
317
324
331
338
344
352
360
366
372
384
402
412
427
435
444
452
460
468
476
487
495
506
513
524
531
538
543
549 REVLibError SetCANTimeout(int milliseconds);
550
560
561protected:
562 // Only used for Get() or Set() API
563 double m_setpoint{0.0};
564
577 SparkBase(int busID, int deviceID, MotorType type, SparkModel model);
578
579 // Used by the HIL tester
581
586 uint8_t GetMotorInterface();
587
595
596protected:
598 std::atomic<bool> m_relativeEncoderCreated{false};
599
601 std::atomic<bool> m_analogSensorCreated{false};
602
604 std::atomic<bool> m_absoluteEncoderCreated{false};
605
607 std::atomic<bool> m_closedLoopControllerCreated{false};
608
610 std::atomic<bool> m_forwardLimitSwitchCreated{false};
611
613 std::atomic<bool> m_reverseLimitSwitchCreated{false};
614
616 std::atomic<bool> m_forwardSoftLimitCreated{false};
617
619 std::atomic<bool> m_reverseSoftLimitCreated{false};
620};
621
622} // namespace rev::spark
Definition: SparkAbsoluteEncoder.h:43
Definition: SparkAnalogSensor.h:41
Definition: SparkBaseConfig.h:46
Definition: SparkBase.h:51
std::atomic< bool > m_forwardSoftLimitCreated
Definition: SparkBase.h:616
SparkRelativeEncoder & GetEncoder()
Definition: SparkBase.cpp:150
uint8_t GetMotorInterface()
Definition: SparkBase.cpp:190
std::atomic< bool > m_absoluteEncoderCreated
Definition: SparkBase.h:604
IdleMode
Definition: SparkBase.h:66
rev::REVLibError PauseFollowerModeAsync()
Definition: SparkBase.cpp:223
rev::util::Signal< bool > IsFollower() const
Definition: SparkBase.cpp:229
rev::util::Signal< double > GetAppliedOutput() const
Definition: SparkBase.cpp:347
REVLibError SetCANTimeout(int milliseconds)
Definition: SparkBase.cpp:369
SoftLimitDirection
Definition: SparkBase.h:68
virtual SparkAbsoluteEncoder & GetAbsoluteEncoder()
Definition: SparkBase.cpp:160
rev::util::Signal< bool > HasStickyWarning() const
Definition: SparkBase.cpp:249
rev::util::Signal< bool > HasActiveWarning() const
Definition: SparkBase.cpp:244
std::atomic< bool > m_relativeEncoderCreated
Definition: SparkBase.h:598
rev::util::Signal< double > GetMotorTemperature() const
Definition: SparkBase.cpp:357
std::atomic< bool > m_reverseSoftLimitCreated
Definition: SparkBase.h:619
std::atomic< bool > m_forwardLimitSwitchCreated
Definition: SparkBase.h:610
~SparkBase() override=default
rev::util::Signal< bool > HasActiveFault() const
Definition: SparkBase.cpp:234
SparkClosedLoopController & GetClosedLoopController()
Definition: SparkBase.cpp:165
rev::util::Signal< Warnings > GetStickyWarnings() const
Definition: SparkBase.cpp:317
std::atomic< bool > m_reverseLimitSwitchCreated
Definition: SparkBase.h:613
SparkLimitSwitch m_ReverseLimitSwitch
Definition: SparkBase.h:612
std::atomic< bool > m_analogSensorCreated
Definition: SparkBase.h:601
std::atomic< bool > m_closedLoopControllerCreated
Definition: SparkBase.h:607
SparkClosedLoopController m_ClosedLoopController
Definition: SparkBase.h:606
void Disable() override
Definition: SparkBase.cpp:96
REVLibError ClearFaults()
Definition: SparkBase.cpp:363
SparkRelativeEncoder GetEncoderEvenIfAlreadyCreated()
Definition: SparkBase.cpp:381
rev::util::Signal< double > GetBusVoltage() const
Definition: SparkBase.cpp:342
double m_setpoint
Definition: SparkBase.h:563
ResetMode
Definition: SparkBase.h:70
SparkSoftLimit m_ForwardSoftLimit
Definition: SparkBase.h:615
rev::util::Signal< Faults > GetStickyFaults() const
Definition: SparkBase.cpp:273
rev::REVLibError PauseFollowerMode()
Definition: SparkBase.cpp:217
void SetInverted(bool isInverted) override
Definition: SparkBase.cpp:76
rev::util::Signal< double > GetOutputCurrent() const
Definition: SparkBase.cpp:352
double GetThrottle() const override
Definition: SparkBase.cpp:74
virtual REVLibError Configure(SparkBaseConfig &config, ResetMode resetMode, PersistMode persistMode)
Definition: SparkBase.cpp:100
SparkAnalogSensor m_AnalogSensor
Definition: SparkBase.h:600
REVLibError GetLastError()
Definition: SparkBase.cpp:375
void StopMotor()
Definition: SparkBase.cpp:98
rev::util::Signal< bool > HasStickyFault() const
Definition: SparkBase.cpp:239
bool GetInverted() const override
Definition: SparkBase.cpp:85
virtual SparkLimitSwitch & GetReverseLimitSwitch()
Definition: SparkBase.cpp:175
SparkBase::SparkModel GetSparkModel()
Definition: SparkBase.cpp:198
virtual REVLibError ConfigureAsync(SparkBaseConfig &config, ResetMode resetMode, PersistMode persistMode)
Definition: SparkBase.cpp:129
SparkAnalogSensor & GetAnalog()
Definition: SparkBase.cpp:155
rev::util::Signal< Faults > GetFaults() const
Definition: SparkBase.cpp:254
rev::REVLibError ResumeFollowerMode()
Definition: SparkBase.cpp:205
SparkAbsoluteEncoder m_AbsoluteEncoder
Definition: SparkBase.h:603
SparkSoftLimit & GetForwardSoftLimit()
Definition: SparkBase.cpp:180
SparkSoftLimit & GetReverseSoftLimit()
Definition: SparkBase.cpp:185
SparkRelativeEncoder m_RelativeEncoder
Definition: SparkBase.h:597
void SetThrottle(double throttle) override
Definition: SparkBase.cpp:59
rev::util::Signal< Warnings > GetWarnings() const
Definition: SparkBase.cpp:295
rev::REVLibError ResumeFollowerModeAsync()
Definition: SparkBase.cpp:211
PersistMode
Definition: SparkBase.h:72
SparkSoftLimit m_ReverseSoftLimit
Definition: SparkBase.h:618
void SetVoltage(wpi::units::volt_t output) override
Definition: SparkBase.cpp:65
SparkLimitSwitch m_ForwardLimitSwitch
Definition: SparkBase.h:609
virtual SparkLimitSwitch & GetForwardLimitSwitch()
Definition: SparkBase.cpp:170
Definition: SparkClosedLoopController.h:40
Definition: SparkFlex.h:37
Definition: SparkLimitSwitch.h:38
Definition: SparkLowLevel.h:49
MotorType
Definition: SparkLowLevel.h:77
friend class SparkBase
Definition: SparkLowLevel.h:50
SparkModel
Definition: SparkLowLevel.h:211
Definition: SparkMaxAlternateEncoder.h:43
Definition: SparkMax.h:40
Definition: SparkRelativeEncoder.h:43
Definition: SparkSim.h:48
Definition: SparkSoftLimit.h:48
Definition: Signal.h:42
Definition: AnalogInput.h:35
REVLibError
Definition: REVLibError.h:33
PersistMode
Definition: ConfigureTypes.h:35
ResetMode
Definition: ConfigureTypes.h:33
Definition: SparkBase.h:74
int rawBits
Definition: SparkBase.h:83
bool motorType
Definition: SparkBase.h:76
bool other
Definition: SparkBase.h:75
Faults(uint16_t faults)
Definition: SparkBase.h:87
bool temperature
Definition: SparkBase.h:79
bool can
Definition: SparkBase.h:78
bool gateDriver
Definition: SparkBase.h:80
bool escEeprom
Definition: SparkBase.h:81
bool sensor
Definition: SparkBase.h:77
bool firmware
Definition: SparkBase.h:82
Definition: SparkBase.h:100
bool extEeprom
Definition: SparkBase.h:104
bool escEeprom
Definition: SparkBase.h:103
bool overcurrent
Definition: SparkBase.h:102
bool hasReset
Definition: SparkBase.h:107
bool sensor
Definition: SparkBase.h:105
int rawBits
Definition: SparkBase.h:109
bool other
Definition: SparkBase.h:108
Warnings(uint16_t warnings)
Definition: SparkBase.h:113
bool stall
Definition: SparkBase.h:106
bool brownout
Definition: SparkBase.h:101