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,
83 kCurrent = 4,
86 };
87
88 enum class ParameterStatus {
89 kOK = 0,
90 kInvalidID = 1,
91 kMismatchType = 2,
92 kAccessMode = 3,
93 kInvalid = 4,
95 };
96
97 enum class PeriodicFrame {
98 kStatus0 = 0,
99 kStatus1 = 1,
100 kStatus2 = 2,
101 kStatus3 = 3,
102 kStatus4 = 4,
103 kStatus5 = 5,
104 kStatus6 = 6,
105 kStatus7 = 7,
106 kStatus8 = 8,
107 kStatus9 = 9,
108 };
109
112 double voltage;
113 double current;
121 uint64_t timestamp;
122 };
123
158 uint64_t timestamp;
159 };
160
164 uint64_t timestamp;
165 };
166
171 uint64_t timestamp;
172 };
173
177 uint64_t timestamp;
178 };
179
183 uint64_t timestamp;
184 };
185
190 uint64_t timestamp;
191 };
192
195 uint64_t timestamp;
196 };
197
199 double setpoint;
202 uint64_t timestamp;
203 };
207 uint64_t timestamp;
208 };
209
210 enum class SparkModel {
211 kUnknown = 0,
212 kSparkFlex = 1,
213 kSparkMax = 2,
214 };
215
219 virtual ~SparkLowLevel();
220
228 uint32_t GetFirmwareVersion();
229
230 uint32_t GetFirmwareVersion(bool& isDebugBuild);
231
238 std::string GetFirmwareString();
239
247 std::vector<uint8_t> GetSerialNumber();
248
255 int GetDeviceId() const;
256
264
271 PeriodicStatus0 GetPeriodicStatus0();
272
279 PeriodicStatus1 GetPeriodicStatus1();
280
287 PeriodicStatus2 GetPeriodicStatus2();
288
295 PeriodicStatus3 GetPeriodicStatus3();
296
303 PeriodicStatus4 GetPeriodicStatus4();
304
311 PeriodicStatus5 GetPeriodicStatus5();
312
319 PeriodicStatus6 GetPeriodicStatus6();
320
327 PeriodicStatus7 GetPeriodicStatus7();
328
335 PeriodicStatus8 GetPeriodicStatus8();
336
343 PeriodicStatus9 GetPeriodicStatus9();
344
358 void SetPeriodicFrameTimeout(int timeoutMs);
359
374 void SetCANMaxRetries(int numRetries);
375
385 void SetControlFramePeriodMs(int periodMs);
386
391
392protected:
396 double arbFeedforward = 0, int arbFFUnits = 0);
397
398 float GetSafeFloat(float f);
399
402 // The type is void* because we don't want to expose c_Spark_handle to
403 // the consumers of this header file
405
406private:
407 explicit SparkLowLevel(int deviceID, MotorType type, SparkModel model);
408
409 int m_deviceID;
410};
411
412} // 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:291
static const uint8_t kAPIMinorVersion
Definition: SparkLowLevel.h:72
ParameterStatus
Definition: SparkLowLevel.h:88
REVLibError SetpointCommand(double value, SparkLowLevel::ControlType ctrl=ControlType::kDutyCycle, ClosedLoopSlot pidSlot=ClosedLoopSlot::kSlot0, double arbFeedforward=0, int arbFFUnits=0)
Definition: SparkLowLevel.cpp:319
MotorType GetMotorType()
Definition: SparkLowLevel.cpp:122
MotorType
Definition: SparkLowLevel.h:76
SparkModel m_expectedSparkModel
Definition: SparkLowLevel.h:401
void SetControlFramePeriodMs(int periodMs)
Definition: SparkLowLevel.cpp:134
float GetSafeFloat(float f)
Definition: SparkLowLevel.cpp:330
MotorType m_motorType
Definition: SparkLowLevel.h:400
PeriodicStatus2 GetPeriodicStatus2()
Definition: SparkLowLevel.cpp:210
PeriodicStatus9 GetPeriodicStatus9()
Definition: SparkLowLevel.cpp:306
virtual ~SparkLowLevel()
Definition: SparkLowLevel.cpp:83
PeriodicStatus4 GetPeriodicStatus4()
Definition: SparkLowLevel.cpp:237
PeriodicStatus3 GetPeriodicStatus3()
Definition: SparkLowLevel.cpp:223
PeriodicStatus0 GetPeriodicStatus0()
Definition: SparkLowLevel.cpp:139
static const uint16_t kAPIMajorVersion
Definition: SparkLowLevel.h:71
void * m_sparkMaxHandle
Definition: SparkLowLevel.h:404
PeriodicStatus5 GetPeriodicStatus5()
Definition: SparkLowLevel.cpp:252
PeriodicStatus1 GetPeriodicStatus1()
Definition: SparkLowLevel.cpp:166
void SetPeriodicFrameTimeout(int timeoutMs)
Definition: SparkLowLevel.cpp:124
std::string GetFirmwareString()
Definition: SparkLowLevel.cpp:103
SparkModel
Definition: SparkLowLevel.h:210
std::vector< uint8_t > GetSerialNumber()
Definition: SparkLowLevel.cpp:118
PeriodicStatus6 GetPeriodicStatus6()
Definition: SparkLowLevel.cpp:265
static const uint32_t kAPIVersion
Definition: SparkLowLevel.h:74
void SetCANMaxRetries(int numRetries)
Definition: SparkLowLevel.cpp:129
void CreateSimFaultManager()
Definition: SparkLowLevel.cpp:335
static const uint8_t kAPIBuildVersion
Definition: SparkLowLevel.h:73
uint32_t GetFirmwareVersion()
Definition: SparkLowLevel.cpp:88
PeriodicFrame
Definition: SparkLowLevel.h:97
PeriodicStatus7 GetPeriodicStatus7()
Definition: SparkLowLevel.cpp:279
ControlType
Definition: SparkLowLevel.h:78
int GetDeviceId() const
Definition: SparkLowLevel.cpp:120
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:110
bool inverted
Definition: SparkLowLevel.h:119
bool hardForwardLimitReached
Definition: SparkLowLevel.h:115
bool softForwardLimitReached
Definition: SparkLowLevel.h:117
uint64_t timestamp
Definition: SparkLowLevel.h:121
double current
Definition: SparkLowLevel.h:113
double appliedOutput
Definition: SparkLowLevel.h:111
double voltage
Definition: SparkLowLevel.h:112
bool primaryHeartbeatLock
Definition: SparkLowLevel.h:120
bool hardReverseLimitReached
Definition: SparkLowLevel.h:116
bool softReverseLimitReached
Definition: SparkLowLevel.h:118
uint8_t motorTemperature
Definition: SparkLowLevel.h:114
Definition: SparkLowLevel.h:124
bool extEepromWarning
Definition: SparkLowLevel.h:136
bool brownoutStickyWarning
Definition: SparkLowLevel.h:149
bool motorTypeStickyFault
Definition: SparkLowLevel.h:142
bool drvStickyFault
Definition: SparkLowLevel.h:146
bool isFollower
Definition: SparkLowLevel.h:157
bool escEepromStickyWarning
Definition: SparkLowLevel.h:151
bool firmwareFault
Definition: SparkLowLevel.h:132
bool sensorStickyFault
Definition: SparkLowLevel.h:143
bool sensorWarning
Definition: SparkLowLevel.h:137
uint64_t timestamp
Definition: SparkLowLevel.h:158
bool stallStickyWarning
Definition: SparkLowLevel.h:154
bool hasResetStickyWarning
Definition: SparkLowLevel.h:155
bool brownoutWarning
Definition: SparkLowLevel.h:133
bool firmwareStickyFault
Definition: SparkLowLevel.h:148
bool overcurrentWarning
Definition: SparkLowLevel.h:134
bool canFault
Definition: SparkLowLevel.h:128
bool stallWarning
Definition: SparkLowLevel.h:138
bool otherFault
Definition: SparkLowLevel.h:125
bool hasResetWarning
Definition: SparkLowLevel.h:139
bool sensorFault
Definition: SparkLowLevel.h:127
bool overcurrentStickyWarning
Definition: SparkLowLevel.h:150
bool canStickyFault
Definition: SparkLowLevel.h:144
bool drvFault
Definition: SparkLowLevel.h:130
bool otherStickyFault
Definition: SparkLowLevel.h:141
bool escEepromFault
Definition: SparkLowLevel.h:131
bool escEepromStickyFault
Definition: SparkLowLevel.h:147
bool escEepromWarning
Definition: SparkLowLevel.h:135
bool otherStickyWarning
Definition: SparkLowLevel.h:156
bool otherWarning
Definition: SparkLowLevel.h:140
bool extEepromStickyWarning
Definition: SparkLowLevel.h:152
bool sensorStickyWarning
Definition: SparkLowLevel.h:153
bool temperatureStickyFault
Definition: SparkLowLevel.h:145
bool temperatureFault
Definition: SparkLowLevel.h:129
bool motorTypeFault
Definition: SparkLowLevel.h:126
Definition: SparkLowLevel.h:161
double primaryEncoderPosition
Definition: SparkLowLevel.h:163
double primaryEncoderVelocity
Definition: SparkLowLevel.h:162
uint64_t timestamp
Definition: SparkLowLevel.h:164
Definition: SparkLowLevel.h:167
uint64_t timestamp
Definition: SparkLowLevel.h:171
double analogVoltage
Definition: SparkLowLevel.h:168
double analogVelocity
Definition: SparkLowLevel.h:169
double analogPosition
Definition: SparkLowLevel.h:170
Definition: SparkLowLevel.h:174
uint64_t timestamp
Definition: SparkLowLevel.h:177
double externalOrAltEncoderPosition
Definition: SparkLowLevel.h:176
double externalOrAltEncoderVelocity
Definition: SparkLowLevel.h:175
Definition: SparkLowLevel.h:180
double dutyCycleEncoderVelocity
Definition: SparkLowLevel.h:181
uint64_t timestamp
Definition: SparkLowLevel.h:183
double dutyCycleEncoderPosition
Definition: SparkLowLevel.h:182
Definition: SparkLowLevel.h:186
bool dutyCycleNoSignal
Definition: SparkLowLevel.h:189
uint64_t timestamp
Definition: SparkLowLevel.h:190
double dutyCyclePeriod
Definition: SparkLowLevel.h:188
double unadjustedDutyCycle
Definition: SparkLowLevel.h:187
Definition: SparkLowLevel.h:193
double iAccumulation
Definition: SparkLowLevel.h:194
uint64_t timestamp
Definition: SparkLowLevel.h:195
Definition: SparkLowLevel.h:198
bool isAtSetpoint
Definition: SparkLowLevel.h:200
double setpoint
Definition: SparkLowLevel.h:199
uint64_t timestamp
Definition: SparkLowLevel.h:202
ClosedLoopSlot selectedPidSlot
Definition: SparkLowLevel.h:201
Definition: SparkLowLevel.h:204
double maxMotionSetpointVelocity
Definition: SparkLowLevel.h:206
double maxMotionSetpointPosition
Definition: SparkLowLevel.h:205
uint64_t timestamp
Definition: SparkLowLevel.h:207