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
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(...)
============================ ======================================
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).