blob: a0f31add7819c6ca52f5825d052fc5ba2ceb58d6 [file] [log] [blame]
Brian Silvermanf7f267a2017-02-04 16:16:08 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) FIRST 2014-2017. 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 the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#pragma once
9
10#include "SpeedController.h"
11
12namespace frc {
13
14/**
15 * Interface for "smart" CAN-based speed controllers.
16 */
17class CANSpeedController : public SpeedController {
18 public:
19 enum ControlMode {
20 kPercentVbus = 0,
21 kCurrent = 1,
22 kSpeed = 2,
23 kPosition = 3,
24 kVoltage = 4,
25 kFollower = 5,
26 kMotionProfile = 6,
27 };
28
29 // Helper function for the ControlMode enum
30 virtual bool IsModePID(ControlMode mode) const = 0;
31
32 enum Faults {
33 kCurrentFault = 1,
34 kTemperatureFault = 2,
35 kBusVoltageFault = 4,
36 kGateDriverFault = 8,
37 /* SRX extensions */
38 kFwdLimitSwitch = 0x10,
39 kRevLimitSwitch = 0x20,
40 kFwdSoftLimit = 0x40,
41 kRevSoftLimit = 0x80,
42 };
43
44 enum Limits { kForwardLimit = 1, kReverseLimit = 2 };
45
46 enum NeutralMode {
47 /** Use the NeutralMode that is set by the jumper wire on the CAN device */
48 kNeutralMode_Jumper = 0,
49 /** Stop the motor's rotation by applying a force. */
50 kNeutralMode_Brake = 1,
51 /** Do not attempt to stop the motor. Instead allow it to coast to a stop
52 without applying resistance. */
53 kNeutralMode_Coast = 2
54 };
55
56 enum LimitMode {
57 /** Only use switches for limits */
58 kLimitMode_SwitchInputsOnly = 0,
59 /** Use both switches and soft limits */
60 kLimitMode_SoftPositionLimits = 1,
61 /* SRX extensions */
62 /** Disable switches and disable soft limits */
63 kLimitMode_SrxDisableSwitchInputs = 2,
64 };
65
66 virtual double Get() const = 0;
67 virtual void Set(double value) = 0;
68 virtual void StopMotor() = 0;
69 virtual void Disable() = 0;
70 virtual void SetP(double p) = 0;
71 virtual void SetI(double i) = 0;
72 virtual void SetD(double d) = 0;
73 virtual void SetPID(double p, double i, double d) = 0;
74 virtual double GetP() const = 0;
75 virtual double GetI() const = 0;
76 virtual double GetD() const = 0;
77 virtual double GetBusVoltage() const = 0;
78 virtual double GetOutputVoltage() const = 0;
79 virtual double GetOutputCurrent() const = 0;
80 virtual double GetTemperature() const = 0;
81 virtual double GetPosition() const = 0;
82 virtual double GetSpeed() const = 0;
83 virtual bool GetForwardLimitOK() const = 0;
84 virtual bool GetReverseLimitOK() const = 0;
85 virtual uint16_t GetFaults() const = 0;
86 virtual void SetVoltageRampRate(double rampRate) = 0;
87 virtual int GetFirmwareVersion() const = 0;
88 virtual void ConfigNeutralMode(NeutralMode mode) = 0;
89 virtual void ConfigEncoderCodesPerRev(uint16_t codesPerRev) = 0;
90 virtual void ConfigPotentiometerTurns(uint16_t turns) = 0;
91 virtual void ConfigSoftPositionLimits(double forwardLimitPosition,
92 double reverseLimitPosition) = 0;
93 virtual void DisableSoftPositionLimits() = 0;
94 virtual void ConfigLimitMode(LimitMode mode) = 0;
95 virtual void ConfigForwardLimit(double forwardLimitPosition) = 0;
96 virtual void ConfigReverseLimit(double reverseLimitPosition) = 0;
97 virtual void ConfigMaxOutputVoltage(double voltage) = 0;
98 virtual void ConfigFaultTime(double faultTime) = 0;
99 // Hold off on interface until we figure out ControlMode enums.
100 // virtual void SetControlMode(ControlMode mode) = 0;
101 // virtual ControlMode GetControlMode() const = 0;
102};
103
104} // namespace frc