utils.spark_max_callbacks

  1# Third-party imports
  2import rev
  3
  4
  5class SparkMaxCallbacks:
  6    """
  7    Wraps a REV SparkMax motor and encoder into a dict of callbacks
  8    for PositionCalibration.
  9
 10    You usually don't need to use this class directly. Pass
 11    ``motor=`` to PositionCalibration and it creates these
 12    callbacks for you automatically.
 13
 14    Direct usage (if you want to customize one callback)::
 15
 16        # Start from SparkMax defaults, then override one
 17        cbs = SparkMaxCallbacks(motor, encoder).as_dict()
 18        cbs['on_limit_detected'] = my_custom_handler
 19        cal = PositionCalibration(name="Turret", ..., **cbs)
 20
 21    Returned callbacks and what they wrap:
 22
 23    ============================  ======================================
 24    Callback name                 SparkMax call
 25    ============================  ======================================
 26    ``set_motor_output``          ``motor.set(pct)``
 27    ``stop_motor``                ``motor.stopMotor()``
 28    ``set_position``              ``encoder.setPosition(value)``
 29    ``get_position``              ``encoder.getPosition()``
 30    ``get_velocity``              ``encoder.getVelocity()``
 31    ``get_forward_limit_switch``  ``motor.getForwardLimitSwitch().get()``
 32    ``get_reverse_limit_switch``  ``motor.getReverseLimitSwitch().get()``
 33    ``set_current_limit``         ``motor.configure(smartCurrentLimit)``
 34    ``set_soft_limits``           ``motor.configure(softLimit ...)``
 35    ``disable_soft_limits``       ``motor.configure(softLimit ...)``
 36    ``save_config``               reads ``motor.configAccessor``
 37    ``restore_config``            ``motor.configure(...)``
 38    ============================  ======================================
 39    """
 40
 41    def __init__(self, motor: rev.SparkMax, encoder=None):
 42        self._motor = motor
 43        self._encoder = encoder or motor.getEncoder()
 44
 45    def as_dict(self) -> dict:
 46        """Return all callbacks as a dict for PositionCalibration(**kwargs)."""
 47        return {
 48            'get_position': lambda: self._encoder.getPosition(),
 49            'get_velocity': lambda: self._encoder.getVelocity(),
 50            'set_position': lambda v: self._encoder.setPosition(v),
 51            'set_motor_output': lambda p: self._motor.set(p),
 52            'stop_motor': lambda: self._motor.stopMotor(),
 53            'set_current_limit': self._make_set_current_limit(),
 54            'set_soft_limits': self._make_set_soft_limits(),
 55            'disable_soft_limits': self._make_disable_soft_limits(),
 56            'save_config': self._make_save_config(),
 57            'restore_config': self._make_restore_config(),
 58            'get_forward_limit_switch': (
 59                lambda: self._motor.getForwardLimitSwitch().get()
 60            ),
 61            'get_reverse_limit_switch': (
 62                lambda: self._motor.getReverseLimitSwitch().get()
 63            ),
 64        }
 65
 66    def _make_set_current_limit(self):
 67        motor = self._motor
 68
 69        def set_current_limit(amps):
 70            cfg = rev.SparkMaxConfig()
 71            cfg.smartCurrentLimit(int(amps))
 72            motor.configure(
 73                cfg,
 74                rev.ResetMode.kNoResetSafeParameters,
 75                rev.PersistMode.kNoPersistParameters
 76            )
 77        return set_current_limit
 78
 79    def _make_set_soft_limits(self):
 80        motor = self._motor
 81
 82        def set_soft_limits(min_limit, max_limit):
 83            cfg = rev.SparkMaxConfig()
 84            (
 85                cfg.softLimit
 86                .forwardSoftLimit(max_limit)
 87                .forwardSoftLimitEnabled(True)
 88                .reverseSoftLimit(min_limit)
 89                .reverseSoftLimitEnabled(True)
 90            )
 91            motor.configure(
 92                cfg,
 93                rev.ResetMode.kNoResetSafeParameters,
 94                rev.PersistMode.kNoPersistParameters
 95            )
 96        return set_soft_limits
 97
 98    def _make_disable_soft_limits(self):
 99        motor = self._motor
100
101        def disable_soft_limits(forward, reverse):
102            cfg = rev.SparkMaxConfig()
103            if forward:
104                cfg.softLimit.forwardSoftLimitEnabled(False)
105            if reverse:
106                cfg.softLimit.reverseSoftLimitEnabled(False)
107            motor.configure(
108                cfg,
109                rev.ResetMode.kNoResetSafeParameters,
110                rev.PersistMode.kNoPersistParameters
111            )
112        return disable_soft_limits
113
114    def _make_save_config(self):
115        motor = self._motor
116
117        def save_config():
118            ca = motor.configAccessor
119            return {
120                'current_limit': ca.getSmartCurrentLimit(),
121                'current_free_limit': ca.getSmartCurrentFreeLimit(),
122                'current_rpm_limit': ca.getSmartCurrentRPMLimit(),
123                'fwd_soft_limit_enabled': (
124                    ca.softLimit.getForwardSoftLimitEnabled()
125                ),
126                'rev_soft_limit_enabled': (
127                    ca.softLimit.getReverseSoftLimitEnabled()
128                ),
129                'fwd_soft_limit': ca.softLimit.getForwardSoftLimit(),
130                'rev_soft_limit': ca.softLimit.getReverseSoftLimit(),
131            }
132        return save_config
133
134    def _make_restore_config(self):
135        motor = self._motor
136
137        def restore_config(saved):
138            cfg = rev.SparkMaxConfig()
139            cfg.smartCurrentLimit(
140                int(saved['current_limit']),
141                int(saved['current_free_limit']),
142                int(saved['current_rpm_limit'])
143            )
144            (
145                cfg.softLimit
146                .forwardSoftLimitEnabled(saved['fwd_soft_limit_enabled'])
147                .reverseSoftLimitEnabled(saved['rev_soft_limit_enabled'])
148            )
149            motor.configure(
150                cfg,
151                rev.ResetMode.kNoResetSafeParameters,
152                rev.PersistMode.kNoPersistParameters
153            )
154        return restore_config
class SparkMaxCallbacks:
  6class SparkMaxCallbacks:
  7    """
  8    Wraps a REV SparkMax motor and encoder into a dict of callbacks
  9    for PositionCalibration.
 10
 11    You usually don't need to use this class directly. Pass
 12    ``motor=`` to PositionCalibration and it creates these
 13    callbacks for you automatically.
 14
 15    Direct usage (if you want to customize one callback)::
 16
 17        # Start from SparkMax defaults, then override one
 18        cbs = SparkMaxCallbacks(motor, encoder).as_dict()
 19        cbs['on_limit_detected'] = my_custom_handler
 20        cal = PositionCalibration(name="Turret", ..., **cbs)
 21
 22    Returned callbacks and what they wrap:
 23
 24    ============================  ======================================
 25    Callback name                 SparkMax call
 26    ============================  ======================================
 27    ``set_motor_output``          ``motor.set(pct)``
 28    ``stop_motor``                ``motor.stopMotor()``
 29    ``set_position``              ``encoder.setPosition(value)``
 30    ``get_position``              ``encoder.getPosition()``
 31    ``get_velocity``              ``encoder.getVelocity()``
 32    ``get_forward_limit_switch``  ``motor.getForwardLimitSwitch().get()``
 33    ``get_reverse_limit_switch``  ``motor.getReverseLimitSwitch().get()``
 34    ``set_current_limit``         ``motor.configure(smartCurrentLimit)``
 35    ``set_soft_limits``           ``motor.configure(softLimit ...)``
 36    ``disable_soft_limits``       ``motor.configure(softLimit ...)``
 37    ``save_config``               reads ``motor.configAccessor``
 38    ``restore_config``            ``motor.configure(...)``
 39    ============================  ======================================
 40    """
 41
 42    def __init__(self, motor: rev.SparkMax, encoder=None):
 43        self._motor = motor
 44        self._encoder = encoder or motor.getEncoder()
 45
 46    def as_dict(self) -> dict:
 47        """Return all callbacks as a dict for PositionCalibration(**kwargs)."""
 48        return {
 49            'get_position': lambda: self._encoder.getPosition(),
 50            'get_velocity': lambda: self._encoder.getVelocity(),
 51            'set_position': lambda v: self._encoder.setPosition(v),
 52            'set_motor_output': lambda p: self._motor.set(p),
 53            'stop_motor': lambda: self._motor.stopMotor(),
 54            'set_current_limit': self._make_set_current_limit(),
 55            'set_soft_limits': self._make_set_soft_limits(),
 56            'disable_soft_limits': self._make_disable_soft_limits(),
 57            'save_config': self._make_save_config(),
 58            'restore_config': self._make_restore_config(),
 59            'get_forward_limit_switch': (
 60                lambda: self._motor.getForwardLimitSwitch().get()
 61            ),
 62            'get_reverse_limit_switch': (
 63                lambda: self._motor.getReverseLimitSwitch().get()
 64            ),
 65        }
 66
 67    def _make_set_current_limit(self):
 68        motor = self._motor
 69
 70        def set_current_limit(amps):
 71            cfg = rev.SparkMaxConfig()
 72            cfg.smartCurrentLimit(int(amps))
 73            motor.configure(
 74                cfg,
 75                rev.ResetMode.kNoResetSafeParameters,
 76                rev.PersistMode.kNoPersistParameters
 77            )
 78        return set_current_limit
 79
 80    def _make_set_soft_limits(self):
 81        motor = self._motor
 82
 83        def set_soft_limits(min_limit, max_limit):
 84            cfg = rev.SparkMaxConfig()
 85            (
 86                cfg.softLimit
 87                .forwardSoftLimit(max_limit)
 88                .forwardSoftLimitEnabled(True)
 89                .reverseSoftLimit(min_limit)
 90                .reverseSoftLimitEnabled(True)
 91            )
 92            motor.configure(
 93                cfg,
 94                rev.ResetMode.kNoResetSafeParameters,
 95                rev.PersistMode.kNoPersistParameters
 96            )
 97        return set_soft_limits
 98
 99    def _make_disable_soft_limits(self):
100        motor = self._motor
101
102        def disable_soft_limits(forward, reverse):
103            cfg = rev.SparkMaxConfig()
104            if forward:
105                cfg.softLimit.forwardSoftLimitEnabled(False)
106            if reverse:
107                cfg.softLimit.reverseSoftLimitEnabled(False)
108            motor.configure(
109                cfg,
110                rev.ResetMode.kNoResetSafeParameters,
111                rev.PersistMode.kNoPersistParameters
112            )
113        return disable_soft_limits
114
115    def _make_save_config(self):
116        motor = self._motor
117
118        def save_config():
119            ca = motor.configAccessor
120            return {
121                'current_limit': ca.getSmartCurrentLimit(),
122                'current_free_limit': ca.getSmartCurrentFreeLimit(),
123                'current_rpm_limit': ca.getSmartCurrentRPMLimit(),
124                'fwd_soft_limit_enabled': (
125                    ca.softLimit.getForwardSoftLimitEnabled()
126                ),
127                'rev_soft_limit_enabled': (
128                    ca.softLimit.getReverseSoftLimitEnabled()
129                ),
130                'fwd_soft_limit': ca.softLimit.getForwardSoftLimit(),
131                'rev_soft_limit': ca.softLimit.getReverseSoftLimit(),
132            }
133        return save_config
134
135    def _make_restore_config(self):
136        motor = self._motor
137
138        def restore_config(saved):
139            cfg = rev.SparkMaxConfig()
140            cfg.smartCurrentLimit(
141                int(saved['current_limit']),
142                int(saved['current_free_limit']),
143                int(saved['current_rpm_limit'])
144            )
145            (
146                cfg.softLimit
147                .forwardSoftLimitEnabled(saved['fwd_soft_limit_enabled'])
148                .reverseSoftLimitEnabled(saved['rev_soft_limit_enabled'])
149            )
150            motor.configure(
151                cfg,
152                rev.ResetMode.kNoResetSafeParameters,
153                rev.PersistMode.kNoPersistParameters
154            )
155        return restore_config

Wraps a REV SparkMax motor and encoder into a dict of callbacks for PositionCalibration.

You usually don't need to use this class directly. Pass motor= to PositionCalibration and it creates these callbacks for you automatically.

Direct usage (if you want to customize one callback)::

# Start from SparkMax defaults, then override one
cbs = SparkMaxCallbacks(motor, encoder).as_dict()
cbs['on_limit_detected'] = my_custom_handler
cal = PositionCalibration(name="Turret", ..., **cbs)

Returned callbacks and what they wrap:

============================ ====================================== Callback name SparkMax call ============================ ====================================== set_motor_output motor.set(pct) stop_motor motor.stopMotor() set_position encoder.setPosition(value) get_position encoder.getPosition() get_velocity encoder.getVelocity() get_forward_limit_switch motor.getForwardLimitSwitch().get() get_reverse_limit_switch motor.getReverseLimitSwitch().get() set_current_limit motor.configure(smartCurrentLimit) set_soft_limits motor.configure(softLimit ...) disable_soft_limits motor.configure(softLimit ...) save_config reads motor.configAccessor restore_config motor.configure(...) ============================ ======================================

SparkMaxCallbacks(motor: rev._rev.SparkMax, encoder=None)
42    def __init__(self, motor: rev.SparkMax, encoder=None):
43        self._motor = motor
44        self._encoder = encoder or motor.getEncoder()
def as_dict(self) -> dict:
46    def as_dict(self) -> dict:
47        """Return all callbacks as a dict for PositionCalibration(**kwargs)."""
48        return {
49            'get_position': lambda: self._encoder.getPosition(),
50            'get_velocity': lambda: self._encoder.getVelocity(),
51            'set_position': lambda v: self._encoder.setPosition(v),
52            'set_motor_output': lambda p: self._motor.set(p),
53            'stop_motor': lambda: self._motor.stopMotor(),
54            'set_current_limit': self._make_set_current_limit(),
55            'set_soft_limits': self._make_set_soft_limits(),
56            'disable_soft_limits': self._make_disable_soft_limits(),
57            'save_config': self._make_save_config(),
58            'restore_config': self._make_restore_config(),
59            'get_forward_limit_switch': (
60                lambda: self._motor.getForwardLimitSwitch().get()
61            ),
62            'get_reverse_limit_switch': (
63                lambda: self._motor.getReverseLimitSwitch().get()
64            ),
65        }

Return all callbacks as a dict for PositionCalibration(**kwargs).