REVLib - C++
CANSparkBase.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2024 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#ifdef _MSC_VER
32// Disable deprecation warnings for this file when using VS compiler
33#pragma warning(disable : 4996)
34#endif
35
36#ifdef __GNUC__
37#pragma GCC diagnostic push
38#pragma GCC diagnostic ignored "-Wdeprecated"
39#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
40#endif
41
42#include <stdint.h>
43
44#include <atomic>
45#include <map>
46#include <memory>
47#include <string>
48
49#include "rev/CANAnalog.h"
50#include "rev/CANDigitalInput.h"
51#include "rev/CANEncoder.h"
54#include "rev/CANSparkMaxDriver.h"
55#include "rev/REVLibError.h"
66
67// Defined in HIL tester source
68class ConfigBase;
69
70namespace rev {
71
73 friend class CANSparkMax;
74 friend class CANSparkFlex;
75 friend class SparkMaxLimitSwitch;
79
80 // Defined in HIL tester source
81 friend class ::ConfigBase;
82
83public:
84 enum class IdleMode { kCoast = 0, kBrake = 1 };
85
87 enum class WPI_DEPRECATED("You don't need this") InputMode {
88 kPWM = 0,
89 kCAN = 1
90 };
91
93
94 enum class FaultID {
95 kBrownout = 0,
96 kOvercurrent = 1,
97 kIWDTReset = 2,
98 kMotorFault = 3,
99 kSensorFault = 4,
100 kStall = 5,
101 kEEPROMCRC = 6,
102 kCANTX = 7,
103 kCANRX = 8,
104 kHasReset = 9,
105 kDRVFault = 10,
106 kOtherFault = 11,
107 kSoftLimitFwd = 12,
108 kSoftLimitRev = 13,
109 kHardLimitFwd = 14,
110 kHardLimitRev = 15
111 };
112
114 int arbId;
116 };
117
118 static constexpr ExternalFollower kFollowerDisabled{0, 0};
119
123 static constexpr ExternalFollower kFollowerSparkMax{0x2051800, 26};
124
125 static constexpr ExternalFollower kFollowerSpark{0x2051800, 26};
126 static constexpr ExternalFollower kFollowerPhoenix{0x2040080, 27};
127
131 ~CANSparkBase() override = default;
132
133 /**** Speed Controller Interface ****/
139 void Set(double speed) override;
140
151 void SetVoltage(units::volt_t output) override;
152
158 double Get() const override;
159
168 void SetInverted(bool isInverted) override;
169
177 bool GetInverted() const override;
178
182 void Disable() override;
183
187 void StopMotor() override;
188
201
208 int countsPerRev);
209
217 WPI_DEPRECATED(
218 "@deprecated Use GetEncoder(SparkRelativeEncoder::Type, int) instead")
220 int countsPerRev);
221
230 WPI_DEPRECATED(
231 "Use GetEncoder(SparkMaxRelativeEncoder::Type, int) "
232 "instead")
233 SparkRelativeEncoder GetEncoder(CANEncoder::EncoderType encoderType,
234 int countsPerRev);
235
242 SparkAnalogSensor::Mode mode = SparkAnalogSensor::Mode::kAbsolute);
243
251 WPI_DEPRECATED("Use GetAnalog(SparkAnalogSensor::Mode) instead")
253
259 WPI_DEPRECATED("Use GetAnalog(SparkMaxAnalogSensor::Mode) instead")
260 SparkAnalogSensor GetAnalog(CANAnalog::AnalogMode mode);
261
268 SparkAbsoluteEncoder::Type encoderType =
269 SparkAbsoluteEncoder::Type::kDutyCycle);
270
276 WPI_DEPRECATED("Use GetAbsoluteEncoder(SparkAbsoluteEncoder::Type) instead")
278 SparkMaxAbsoluteEncoder::Type encoderType);
279
284
295
307 WPI_DEPRECATED(
308 "@deprecated Use GetForwardLimitSwitch(SparkLimitSwitch::Type) instead")
310 SparkMaxLimitSwitch::Type switchType);
311
325 WPI_DEPRECATED(
326 "Use "
328 "instead")
330 CANDigitalInput::LimitSwitchPolarity polarity);
331
342
354 WPI_DEPRECATED(
355 "@deprecated Use GetReverseLimitSwitch(SparkLimitSwitch::Type) instead")
357 SparkMaxLimitSwitch::Type switchType);
358
372 WPI_DEPRECATED(
373 "Use "
375 "instead")
377 CANDigitalInput::LimitSwitchPolarity polarity);
378
396 REVLibError SetSmartCurrentLimit(unsigned int limit);
397
422 REVLibError SetSmartCurrentLimit(unsigned int stallLimit,
423 unsigned int freeLimit,
424 unsigned int limitRPM = 20000);
425
453 REVLibError SetSecondaryCurrentLimit(double limit, int limitCycles = 0);
454
461
473
482 REVLibError EnableVoltageCompensation(double nominalVoltage);
483
490
497
506 REVLibError SetOpenLoopRampRate(double rate);
507
517
526 double GetOpenLoopRampRate();
527
536 double GetClosedLoopRampRate();
537
551 REVLibError Follow(const CANSparkBase& leader, bool invert = false);
552
568 REVLibError Follow(ExternalFollower leader, int deviceID,
569 bool invert = false);
570
577 bool IsFollower();
578
582 uint16_t GetFaults();
583
587 uint16_t GetStickyFaults();
588
592 bool GetFault(FaultID faultID) const;
593
597 bool GetStickyFault(FaultID faultID) const;
598
602 double GetBusVoltage();
603
607 double GetAppliedOutput();
608
612 double GetOutputCurrent();
613
617 double GetMotorTemperature();
618
625
630
638 REVLibError SetCANTimeout(int milliseconds);
639
647 REVLibError EnableSoftLimit(SoftLimitDirection direction, bool enable);
648
653
665 REVLibError SetSoftLimit(SoftLimitDirection direction, double limit);
666
674 double GetSoftLimit(SoftLimitDirection direction);
675
685
686protected:
698 void attemptToSetDataportConfigOrThrow(c_SparkMax_DataPortConfig config,
699 std::string errorText);
700
701private:
702 // Only used for Get() or Set() API
703 double m_setpoint{0.0};
704
705 std::atomic<bool> m_relativeEncoderCreated{false};
706 std::atomic<bool> m_analogSensorCreated{false};
707 std::atomic<bool> m_absoluteEncoderCreated{false};
708 std::atomic<bool> m_pidControllerCreated{false};
709 std::atomic<bool> m_forwardLimitSwitchCreated{false};
710 std::atomic<bool> m_reverseLimitSwitchCreated{false};
711
721 explicit CANSparkBase(int deviceID, MotorType type, SparkModel model);
722
726 int GetFeedbackDeviceID();
727
728 // Used by the HIL tester
729 SparkRelativeEncoder GetEncoderEvenIfAlreadyCreated(
730 SparkRelativeEncoder::Type encoderType =
732 int countsPerRev = 42);
733
738 uint8_t GetMotorInterface();
739
746 REVLibError SetSimFreeSpeed(double freeSpeed);
747
755 REVLibError SetSimStallTorque(double stallTorque);
756
763 CANSparkBase::SparkModel GetSparkModel();
764};
765
766} // namespace rev
767
768#ifdef __GNUC__
769#pragma GCC diagnostic pop
770#endif
Definition: CANAnalog.h:44
Definition: CANDigitalInput.h:40
Definition: CANEncoder.h:45
Definition: CANSparkBase.h:72
double GetOpenLoopRampRate()
Definition: CANSparkBase.cpp:321
REVLibError SetOpenLoopRampRate(double rate)
Definition: CANSparkBase.cpp:309
static constexpr ExternalFollower kFollowerSparkMax
Definition: CANSparkBase.h:123
double GetClosedLoopRampRate()
Definition: CANSparkBase.cpp:328
SparkAnalogSensor GetAnalog(SparkAnalogSensor::Mode mode=SparkAnalogSensor::Mode::kAbsolute)
Definition: CANSparkBase.cpp:115
SparkLimitSwitch GetReverseLimitSwitch(SparkLimitSwitch::Type switchType)
Definition: CANSparkBase.cpp:207
REVLibError EnableSoftLimit(SoftLimitDirection direction, bool enable)
Definition: CANSparkBase.cpp:429
static constexpr ExternalFollower kFollowerDisabled
Definition: CANSparkBase.h:118
REVLibError DisableVoltageCompensation()
Definition: CANSparkBase.cpp:296
virtual SparkRelativeEncoder GetEncoder()=0
SoftLimitDirection
Definition: CANSparkBase.h:92
REVLibError Follow(const CANSparkBase &leader, bool invert=false)
Definition: CANSparkBase.cpp:335
double GetAppliedOutput()
Definition: CANSparkBase.cpp:390
bool GetInverted() const override
Definition: CANSparkBase.cpp:68
IdleMode GetIdleMode()
Definition: CANSparkBase.cpp:276
~CANSparkBase() override=default
double GetVoltageCompensationNominalVoltage()
Definition: CANSparkBase.cpp:302
double GetBusVoltage()
Definition: CANSparkBase.cpp:383
void StopMotor() override
Definition: CANSparkBase.cpp:77
bool GetStickyFault(FaultID faultID) const
Definition: CANSparkBase.cpp:376
SparkPIDController GetPIDController()
Definition: CANSparkBase.cpp:163
uint16_t GetStickyFaults()
Definition: CANSparkBase.cpp:362
static constexpr ExternalFollower kFollowerSpark
Definition: CANSparkBase.h:125
void SetVoltage(units::volt_t output) override
Definition: CANSparkBase.cpp:52
REVLibError SetCANTimeout(int milliseconds)
Definition: CANSparkBase.cpp:423
REVLibError SetIdleMode(IdleMode mode)
Definition: CANSparkBase.cpp:269
IdleMode
Definition: CANSparkBase.h:84
REVLibError ClearFaults()
Definition: CANSparkBase.cpp:411
InputMode
Definition: CANSparkBase.h:87
double Get() const override
Definition: CANSparkBase.cpp:61
FaultID
Definition: CANSparkBase.h:94
REVLibError BurnFlash()
Definition: CANSparkBase.cpp:417
bool IsFollower()
Definition: CANSparkBase.cpp:348
double GetMotorTemperature()
Definition: CANSparkBase.cpp:404
REVLibError GetLastError()
Definition: CANSparkBase.cpp:495
REVLibError SetSmartCurrentLimit(unsigned int limit)
Definition: CANSparkBase.cpp:241
SparkLimitSwitch GetForwardLimitSwitch(SparkLimitSwitch::Type switchType)
Definition: CANSparkBase.cpp:173
void SetInverted(bool isInverted) override
Definition: CANSparkBase.cpp:63
uint16_t GetFaults()
Definition: CANSparkBase.cpp:355
bool GetFault(FaultID faultID) const
Definition: CANSparkBase.cpp:369
void attemptToSetDataportConfigOrThrow(c_SparkMax_DataPortConfig config, std::string errorText)
Definition: CANSparkBase.cpp:517
static constexpr ExternalFollower kFollowerPhoenix
Definition: CANSparkBase.h:126
REVLibError SetSecondaryCurrentLimit(double limit, int limitCycles=0)
Definition: CANSparkBase.cpp:254
void Disable() override
Definition: CANSparkBase.cpp:75
void Set(double speed) override
Definition: CANSparkBase.cpp:46
REVLibError EnableVoltageCompensation(double nominalVoltage)
Definition: CANSparkBase.cpp:290
double GetOutputCurrent()
Definition: CANSparkBase.cpp:397
bool IsSoftLimitEnabled(SoftLimitDirection direction)
Definition: CANSparkBase.cpp:472
double GetSoftLimit(SoftLimitDirection direction)
Definition: CANSparkBase.cpp:457
SparkAbsoluteEncoder GetAbsoluteEncoder(SparkAbsoluteEncoder::Type encoderType=SparkAbsoluteEncoder::Type::kDutyCycle)
Definition: CANSparkBase.cpp:144
REVLibError SetClosedLoopRampRate(double rate)
Definition: CANSparkBase.cpp:315
REVLibError SetSoftLimit(SoftLimitDirection direction, double limit)
Definition: CANSparkBase.cpp:443
Definition: CANSparkFlex.h:38
Definition: CANSparkLowLevel.h:51
MotorType
Definition: CANSparkLowLevel.h:78
SparkModel
Definition: CANSparkLowLevel.h:164
friend class CANSparkBase
Definition: CANSparkLowLevel.h:57
Definition: CANSparkMax.h:38
Definition: SparkAbsoluteEncoder.h:38
Definition: SparkAnalogSensor.h:38
Definition: SparkLimitSwitch.h:38
Definition: SparkMaxAbsoluteEncoder.h:49
Definition: SparkMaxAlternateEncoder.h:46
Definition: SparkMaxAnalogSensor.h:59
Definition: SparkMaxLimitSwitch.h:55
Definition: SparkMaxRelativeEncoder.h:51
Definition: SparkPIDController.h:38
Definition: SparkRelativeEncoder.h:42
Type
Definition: SparkRelativeEncoder.h:50
Definition: CANSparkLowLevel.cpp:39
REVLibError
Definition: REVLibError.h:33
Definition: CANSparkBase.h:113
int configId
Definition: CANSparkBase.h:115
int arbId
Definition: CANSparkBase.h:114