blob: 73ed37941771c06c71369d8cfa2e2980884573a9 [file] [log] [blame]
Brian Silverman26e4e522015-12-17 01:56:40 -05001/*----------------------------------------------------------------------------*/
2/* Copyright (c) FIRST 2014. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
5/*----------------------------------------------------------------------------*/
6#pragma once
7
8#include "SpeedController.h"
9
10/**
11 * Interface for "smart" CAN-based speed controllers.
12 * @see CANJaguar
13 * @see CANTalon
14 */
15class CANSpeedController : public SpeedController {
16 public:
17 enum ControlMode {
18 kPercentVbus = 0,
19 kCurrent = 1,
20 kSpeed = 2,
21 kPosition = 3,
22 kVoltage = 4,
23 kFollower = 5 // Not supported in Jaguar.
24 };
25
26 // Helper function for the ControlMode enum
27 std::string GetModeName(ControlMode mode) {
28 switch(mode) {
29 case kPercentVbus: return "PercentVbus";
30 case kCurrent: return "Current";
31 case kSpeed: return "Speed";
32 case kPosition: return "Position";
33 case kVoltage: return "Voltage";
34 case kFollower: return "Follower";
35 default: return "[unknown control mode]";
36 }
37 }
38
39 // Helper function for the ControlMode enum
40 virtual bool IsModePID(ControlMode mode) const = 0;
41
42 enum Faults {
43 kCurrentFault = 1,
44 kTemperatureFault = 2,
45 kBusVoltageFault = 4,
46 kGateDriverFault = 8,
47 /* SRX extensions */
48 kFwdLimitSwitch = 0x10,
49 kRevLimitSwitch = 0x20,
50 kFwdSoftLimit = 0x40,
51 kRevSoftLimit = 0x80,
52 };
53
54 enum Limits { kForwardLimit = 1, kReverseLimit = 2 };
55
56 enum NeutralMode {
57 /** Use the NeutralMode that is set by the jumper wire on the CAN device */
58 kNeutralMode_Jumper = 0,
59 /** Stop the motor's rotation by applying a force. */
60 kNeutralMode_Brake = 1,
61 /** Do not attempt to stop the motor. Instead allow it to coast to a stop
62 without applying resistance. */
63 kNeutralMode_Coast = 2
64 };
65
66 enum LimitMode {
67 /** Only use switches for limits */
68 kLimitMode_SwitchInputsOnly = 0,
69 /** Use both switches and soft limits */
70 kLimitMode_SoftPositionLimits = 1,
71 /* SRX extensions */
72 /** Disable switches and disable soft limits */
73 kLimitMode_SrxDisableSwitchInputs = 2,
74 };
75
76 virtual float Get() const = 0;
77 virtual void Set(float value, uint8_t syncGroup = 0) = 0;
78 virtual void Disable() = 0;
79 virtual void SetP(double p) = 0;
80 virtual void SetI(double i) = 0;
81 virtual void SetD(double d) = 0;
82 virtual void SetPID(double p, double i, double d) = 0;
83 virtual double GetP() const = 0;
84 virtual double GetI() const = 0;
85 virtual double GetD() const = 0;
86 virtual float GetBusVoltage() const = 0;
87 virtual float GetOutputVoltage() const = 0;
88 virtual float GetOutputCurrent() const = 0;
89 virtual float GetTemperature() const = 0;
90 virtual double GetPosition() const = 0;
91 virtual double GetSpeed() const = 0;
92 virtual bool GetForwardLimitOK() const = 0;
93 virtual bool GetReverseLimitOK() const = 0;
94 virtual uint16_t GetFaults() const = 0;
95 virtual void SetVoltageRampRate(double rampRate) = 0;
96 virtual uint32_t GetFirmwareVersion() const = 0;
97 virtual void ConfigNeutralMode(NeutralMode mode) = 0;
98 virtual void ConfigEncoderCodesPerRev(uint16_t codesPerRev) = 0;
99 virtual void ConfigPotentiometerTurns(uint16_t turns) = 0;
100 virtual void ConfigSoftPositionLimits(double forwardLimitPosition,
101 double reverseLimitPosition) = 0;
102 virtual void DisableSoftPositionLimits() = 0;
103 virtual void ConfigLimitMode(LimitMode mode) = 0;
104 virtual void ConfigForwardLimit(double forwardLimitPosition) = 0;
105 virtual void ConfigReverseLimit(double reverseLimitPosition) = 0;
106 virtual void ConfigMaxOutputVoltage(double voltage) = 0;
107 virtual void ConfigFaultTime(float faultTime) = 0;
108 // Hold off on interface until we figure out ControlMode enums.
109 // virtual void SetControlMode(ControlMode mode) = 0;
110 // virtual ControlMode GetControlMode() const = 0;
111};