REVLib - C++
SparkLowLevel.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2025 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 <stdint.h>
32
33#include <string>
34#include <vector>
35
36#include <frc/motorcontrol/MotorController.h>
37
38#include "rev/ClosedLoopTypes.h"
39#include "rev/REVLibError.h"
40
41// Defined in HIL tester source
42class ConfigBase;
43
44namespace rev::spark {
45
46class SparkBase;
47
48class SparkLowLevel : public frc::MotorController {
49 friend class SparkBase;
50 friend class SparkMax;
51 friend class SparkFlex;
52 friend class SparkAnalogSensor;
54 friend class SparkLimitSwitch;
62 friend class SparkLimitSwitchSim;
66
67 // Defined in HIL tester source
68 friend class ::ConfigBase;
69
70public:
71 static const uint16_t kAPIMajorVersion;
72 static const uint8_t kAPIMinorVersion;
73 static const uint8_t kAPIBuildVersion;
74 static const uint32_t kAPIVersion;
75
76 enum class MotorType { kBrushed = 0, kBrushless = 1 };
77
78 enum class ControlType {
79 kDutyCycle = 0,
80 kVelocity = 1,
81 kVoltage = 2,
82 kPosition = 3,
88 [[deprecated("We recommend migrating to MAXMotion instead.")]] = 4,
89 kCurrent = 5,
95 [[deprecated("We recommend migrating to MAXMotion instead.")]] = 6,
98 };
99
100 enum class ParameterStatus {
101 kOK = 0,
102 kInvalidID = 1,
103 kMismatchType = 2,
104 kAccessMode = 3,
105 kInvalid = 4,
107 };
108
109 enum class PeriodicFrame {
110 kStatus0 = 0,
111 kStatus1 = 1,
112 kStatus2 = 2,
113 kStatus3 = 3,
114 kStatus4 = 4,
115 kStatus5 = 5,
116 kStatus6 = 6,
117 kStatus7 = 7,
118 kStatus8 = 8,
119 kStatus9 = 9,
120 };
121
124 double voltage;
125 double current;
133 uint64_t timestamp;
134 };
135
170 uint64_t timestamp;
171 };
172
176 uint64_t timestamp;
177 };
178
183 uint64_t timestamp;
184 };
185
189 uint64_t timestamp;
190 };
191
195 uint64_t timestamp;
196 };
197
202 uint64_t timestamp;
203 };
204
207 uint64_t timestamp;
208 };
209
211 double setpoint;
214 uint64_t timestamp;
215 };
219 uint64_t timestamp;
220 };
221
222 enum class SparkModel {
223 kSparkMax = 0,
224 kSparkFlex = 1,
225 kUnknown = 255,
226 };
227
231 virtual ~SparkLowLevel();
232
240 uint32_t GetFirmwareVersion();
241
242 uint32_t GetFirmwareVersion(bool& isDebugBuild);
243
250 std::string GetFirmwareString();
251
259 std::vector<uint8_t> GetSerialNumber();
260
267 int GetDeviceId() const;
268
276
283 PeriodicStatus0 GetPeriodicStatus0();
284
291 PeriodicStatus1 GetPeriodicStatus1();
292
299 PeriodicStatus2 GetPeriodicStatus2();
300
307 PeriodicStatus3 GetPeriodicStatus3();
308
315 PeriodicStatus4 GetPeriodicStatus4();
316
323 PeriodicStatus5 GetPeriodicStatus5();
324
331 PeriodicStatus6 GetPeriodicStatus6();
332
339 PeriodicStatus7 GetPeriodicStatus7();
340
347 PeriodicStatus8 GetPeriodicStatus8();
348
355 PeriodicStatus9 GetPeriodicStatus9();
356
370 void SetPeriodicFrameTimeout(int timeoutMs);
371
386 void SetCANMaxRetries(int numRetries);
387
397 void SetControlFramePeriodMs(int periodMs);
398
403
404protected:
408 double arbFeedforward = 0, int arbFFUnits = 0);
409
410 float GetSafeFloat(float f);
411
414 // The type is void* because we don't want to expose c_Spark_handle to
415 // the consumers of this header file
417
418private:
419 explicit SparkLowLevel(int deviceID, MotorType type, SparkModel model);
420
421 int m_deviceID;
422};
423
424} // namespace rev::spark
Definition: SparkAbsoluteEncoder.h:44
Definition: SparkAbsoluteEncoderSim.h:43
Definition: SparkAnalogSensor.h:51
Definition: SparkAnalogSensorSim.h:43
Definition: SparkBase.h:58
Definition: SparkClosedLoopController.h:50
Definition: SparkExternalEncoderSim.h:42
Definition: SparkFlexExternalEncoder.h:42
Definition: SparkFlex.h:37
Definition: SparkLimitSwitch.h:48
Definition: SparkLimitSwitchSim.h:43
Definition: SparkLowLevel.h:48
PeriodicStatus8 GetPeriodicStatus8()
Definition: SparkLowLevel.cpp:290
static const uint8_t kAPIMinorVersion
Definition: SparkLowLevel.h:72
ParameterStatus
Definition: SparkLowLevel.h:100
REVLibError SetpointCommand(double value, SparkLowLevel::ControlType ctrl=ControlType::kDutyCycle, ClosedLoopSlot pidSlot=ClosedLoopSlot::kSlot0, double arbFeedforward=0, int arbFFUnits=0)
Definition: SparkLowLevel.cpp:318
MotorType GetMotorType()
Definition: SparkLowLevel.cpp:121
MotorType
Definition: SparkLowLevel.h:76
SparkModel m_expectedSparkModel
Definition: SparkLowLevel.h:413
void SetControlFramePeriodMs(int periodMs)
Definition: SparkLowLevel.cpp:133
float GetSafeFloat(float f)
Definition: SparkLowLevel.cpp:329
MotorType m_motorType
Definition: SparkLowLevel.h:412
PeriodicStatus2 GetPeriodicStatus2()
Definition: SparkLowLevel.cpp:209
PeriodicStatus9 GetPeriodicStatus9()
Definition: SparkLowLevel.cpp:305
virtual ~SparkLowLevel()
Definition: SparkLowLevel.cpp:83
PeriodicStatus4 GetPeriodicStatus4()
Definition: SparkLowLevel.cpp:236
PeriodicStatus3 GetPeriodicStatus3()
Definition: SparkLowLevel.cpp:222
PeriodicStatus0 GetPeriodicStatus0()
Definition: SparkLowLevel.cpp:138
static const uint16_t kAPIMajorVersion
Definition: SparkLowLevel.h:71
void * m_sparkMaxHandle
Definition: SparkLowLevel.h:416
PeriodicStatus5 GetPeriodicStatus5()
Definition: SparkLowLevel.cpp:251
PeriodicStatus1 GetPeriodicStatus1()
Definition: SparkLowLevel.cpp:165
void SetPeriodicFrameTimeout(int timeoutMs)
Definition: SparkLowLevel.cpp:123
std::string GetFirmwareString()
Definition: SparkLowLevel.cpp:102
SparkModel
Definition: SparkLowLevel.h:222
std::vector< uint8_t > GetSerialNumber()
Definition: SparkLowLevel.cpp:117
PeriodicStatus6 GetPeriodicStatus6()
Definition: SparkLowLevel.cpp:264
static const uint32_t kAPIVersion
Definition: SparkLowLevel.h:74
void SetCANMaxRetries(int numRetries)
Definition: SparkLowLevel.cpp:128
void CreateSimFaultManager()
Definition: SparkLowLevel.cpp:334
static const uint8_t kAPIBuildVersion
Definition: SparkLowLevel.h:73
uint32_t GetFirmwareVersion()
Definition: SparkLowLevel.cpp:87
PeriodicFrame
Definition: SparkLowLevel.h:109
PeriodicStatus7 GetPeriodicStatus7()
Definition: SparkLowLevel.cpp:278
ControlType
Definition: SparkLowLevel.h:78
int GetDeviceId() const
Definition: SparkLowLevel.cpp:119
Definition: SparkMaxAlternateEncoder.h:46
Definition: SparkMaxAlternateEncoderSim.h:42
Definition: SparkMax.h:37
Definition: SparkRelativeEncoder.h:46
Definition: SparkRelativeEncoderSim.h:43
Definition: SparkSimFaultManager.h:43
Definition: SparkLowLevel.cpp:40
ClosedLoopSlot
Definition: ClosedLoopTypes.h:35
@ kSlot0
Definition: ClosedLoopTypes.h:35
REVLibError
Definition: REVLibError.h:33
Definition: SparkLowLevel.h:122
bool inverted
Definition: SparkLowLevel.h:131
bool hardForwardLimitReached
Definition: SparkLowLevel.h:127
bool softForwardLimitReached
Definition: SparkLowLevel.h:129
uint64_t timestamp
Definition: SparkLowLevel.h:133
double current
Definition: SparkLowLevel.h:125
double appliedOutput
Definition: SparkLowLevel.h:123
double voltage
Definition: SparkLowLevel.h:124
bool primaryHeartbeatLock
Definition: SparkLowLevel.h:132
bool hardReverseLimitReached
Definition: SparkLowLevel.h:128
bool softReverseLimitReached
Definition: SparkLowLevel.h:130
uint8_t motorTemperature
Definition: SparkLowLevel.h:126
Definition: SparkLowLevel.h:136
bool extEepromWarning
Definition: SparkLowLevel.h:148
bool brownoutStickyWarning
Definition: SparkLowLevel.h:161
bool motorTypeStickyFault
Definition: SparkLowLevel.h:154
bool drvStickyFault
Definition: SparkLowLevel.h:158
bool isFollower
Definition: SparkLowLevel.h:169
bool escEepromStickyWarning
Definition: SparkLowLevel.h:163
bool firmwareFault
Definition: SparkLowLevel.h:144
bool sensorStickyFault
Definition: SparkLowLevel.h:155
bool sensorWarning
Definition: SparkLowLevel.h:149
uint64_t timestamp
Definition: SparkLowLevel.h:170
bool stallStickyWarning
Definition: SparkLowLevel.h:166
bool hasResetStickyWarning
Definition: SparkLowLevel.h:167
bool brownoutWarning
Definition: SparkLowLevel.h:145
bool firmwareStickyFault
Definition: SparkLowLevel.h:160
bool overcurrentWarning
Definition: SparkLowLevel.h:146
bool canFault
Definition: SparkLowLevel.h:140
bool stallWarning
Definition: SparkLowLevel.h:150
bool otherFault
Definition: SparkLowLevel.h:137
bool hasResetWarning
Definition: SparkLowLevel.h:151
bool sensorFault
Definition: SparkLowLevel.h:139
bool overcurrentStickyWarning
Definition: SparkLowLevel.h:162
bool canStickyFault
Definition: SparkLowLevel.h:156
bool drvFault
Definition: SparkLowLevel.h:142
bool otherStickyFault
Definition: SparkLowLevel.h:153
bool escEepromFault
Definition: SparkLowLevel.h:143
bool escEepromStickyFault
Definition: SparkLowLevel.h:159
bool escEepromWarning
Definition: SparkLowLevel.h:147
bool otherStickyWarning
Definition: SparkLowLevel.h:168
bool otherWarning
Definition: SparkLowLevel.h:152
bool extEepromStickyWarning
Definition: SparkLowLevel.h:164
bool sensorStickyWarning
Definition: SparkLowLevel.h:165
bool temperatureStickyFault
Definition: SparkLowLevel.h:157
bool temperatureFault
Definition: SparkLowLevel.h:141
bool motorTypeFault
Definition: SparkLowLevel.h:138
Definition: SparkLowLevel.h:173
double primaryEncoderPosition
Definition: SparkLowLevel.h:175
double primaryEncoderVelocity
Definition: SparkLowLevel.h:174
uint64_t timestamp
Definition: SparkLowLevel.h:176
Definition: SparkLowLevel.h:179
uint64_t timestamp
Definition: SparkLowLevel.h:183
double analogVoltage
Definition: SparkLowLevel.h:180
double analogVelocity
Definition: SparkLowLevel.h:181
double analogPosition
Definition: SparkLowLevel.h:182
Definition: SparkLowLevel.h:186
uint64_t timestamp
Definition: SparkLowLevel.h:189
double externalOrAltEncoderPosition
Definition: SparkLowLevel.h:188
double externalOrAltEncoderVelocity
Definition: SparkLowLevel.h:187
Definition: SparkLowLevel.h:192
double dutyCycleEncoderVelocity
Definition: SparkLowLevel.h:193
uint64_t timestamp
Definition: SparkLowLevel.h:195
double dutyCycleEncoderPosition
Definition: SparkLowLevel.h:194
Definition: SparkLowLevel.h:198
bool dutyCycleNoSignal
Definition: SparkLowLevel.h:201
uint64_t timestamp
Definition: SparkLowLevel.h:202
double dutyCyclePeriod
Definition: SparkLowLevel.h:200
double unadjustedDutyCycle
Definition: SparkLowLevel.h:199
Definition: SparkLowLevel.h:205
double iAccumulation
Definition: SparkLowLevel.h:206
uint64_t timestamp
Definition: SparkLowLevel.h:207
Definition: SparkLowLevel.h:210
bool isAtSetpoint
Definition: SparkLowLevel.h:212
double setpoint
Definition: SparkLowLevel.h:211
uint64_t timestamp
Definition: SparkLowLevel.h:214
ClosedLoopSlot selectedPidSlot
Definition: SparkLowLevel.h:213
Definition: SparkLowLevel.h:216
double maxMotionSetpointVelocity
Definition: SparkLowLevel.h:218
double maxMotionSetpointPosition
Definition: SparkLowLevel.h:217
uint64_t timestamp
Definition: SparkLowLevel.h:219