Skip to content

Commit

Permalink
Merge pull request #56 from Retro3223/master
Browse files Browse the repository at this point in the history
implement configGetParameter and configSetParameter
  • Loading branch information
virtuald committed Mar 22, 2018
2 parents c42dcdc + 51b8bab commit 336f41b
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 11 deletions.
1 change: 1 addition & 0 deletions ctre/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from ._impl import (
ControlMode,
ParamEnum,
ErrorCode,
FeedbackDevice,
RemoteFeedbackDevice,
Expand Down
95 changes: 92 additions & 3 deletions gen/MotController_data.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
sim_extra: |
from .ctre_sim_enums import ControlMode, FeedbackDevice, LimitSwitchSource
from .ctre_sim_enums import ControlMode, FeedbackDevice, LimitSwitchSource, ParamEnum
from wpilib import Notifier
_feedback2key = {
Expand Down Expand Up @@ -95,6 +95,9 @@ c_MotController_Create1:
'limit_switch_source_rev': LimitSwitchSource.Deactivated,
'limit_switch_follow_for': deviceId,
'limit_switch_follow_rev': deviceId,
'clear_pos_on_limit_fwd': 0,
'clear_pos_on_limit_rev': 0,
# These two values are set when the set()/setDemand() functions are called
'control_mode': 0,
Expand Down Expand Up @@ -1125,7 +1128,48 @@ c_MotController_ConfigGetCustomParam:
:returns: Value of the custom param.
c_MotController_ConfigSetParameter:
code: |
raise NotImplementedError
if param == ParamEnum.eOpenloopRamp:
self.hal_data['open_loop_ramp'] = value
elif param == ParamEnum.eClosedloopRamp:
self.hal_data['closed_loop_ramp'] = value
elif param == ParamEnum.eNeutralDeadband:
self.hal_data['neutral_deadband'] = value
elif param == ParamEnum.ePeakPosOutput:
self.hal_data['peak_fwd_output'] = value
elif param == ParamEnum.eNominalPosOutput:
self.hal_data['nom_fwd_output'] = value
elif param == ParamEnum.ePeakNegOutput:
self.hal_data['peak_rev_output'] = value
elif param == ParamEnum.eNominalNegOutput:
self.hal_data['nom_rev_output'] = value
elif param == ParamEnum.eProfileParamSlot_P:
self.hal_data['profile%d_p' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_I:
self.hal_data['profile%d_i' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_D:
self.hal_data['profile%d_d' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_F:
self.hal_data['profile%d_f' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_IZone:
self.hal_data['profile%d_izone' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_AllowableErr:
self.hal_data['profile%d_allowableError' % ordinal] = float(value)
elif param == ParamEnum.eProfileParamSlot_MaxIAccum:
self.hal_data['profile%d_max_iaccum' % ordinal] = float(value)
elif param == ParamEnum.eSampleVelocityPeriod:
self.hal_data['vel_measurement_period'] = int(value)
elif param == ParamEnum.eSampleVelocityWindow:
self.hal_data['vel_measurement_window'] = int(value)
elif param == ParamEnum.eMotMag_Accel:
self.hal_data['motionmagic_acceleration'] = value
elif param == ParamEnum.eMotMag_VelCruise:
self.hal_data['motionmagic_velocity'] = value
elif param == ParamEnum.eClearPositionOnLimitF:
self.hal_data['clear_pos_on_limit_fwd'] = int(value)
elif param == ParamEnum.eClearPositionOnLimitR:
self.hal_data['clear_pos_on_limit_rev'] = int(value)
else:
raise NotImplementedError
doc: |
Sets a parameter.
Expand All @@ -1144,7 +1188,48 @@ c_MotController_ConfigSetParameter:
:returns: Error Code generated by function. 0 indicates no error.
c_MotController_ConfigGetParameter:
code: |
raise NotImplementedError
if param == ParamEnum.eOpenloopRamp:
retval = self.hal_data['open_loop_ramp']
elif param == ParamEnum.eClosedloopRamp:
retval = self.hal_data['closed_loop_ramp']
elif param == ParamEnum.eNeutralDeadband:
retval = self.hal_data['neutral_deadband']
elif param == ParamEnum.ePeakPosOutput:
retval = self.hal_data['peak_fwd_output']
elif param == ParamEnum.eNominalPosOutput:
retval = self.hal_data['nom_fwd_output']
elif param == ParamEnum.ePeakNegOutput:
retval = self.hal_data['peak_rev_output']
elif param == ParamEnum.eNominalNegOutput:
retval = self.hal_data['nom_rev_output']
elif param == ParamEnum.eProfileParamSlot_P:
retval = self.hal_data['profile%d_p' % ordinal]
elif param == ParamEnum.eProfileParamSlot_I:
retval = self.hal_data['profile%d_i' % ordinal]
elif param == ParamEnum.eProfileParamSlot_D:
retval = self.hal_data['profile%d_d' % ordinal]
elif param == ParamEnum.eProfileParamSlot_F:
retval = self.hal_data['profile%d_f' % ordinal]
elif param == ParamEnum.eProfileParamSlot_IZone:
retval = self.hal_data['profile%d_izone' % ordinal]
elif param == ParamEnum.eProfileParamSlot_AllowableErr:
retval = self.hal_data['profile%d_allowableError' % ordinal]
elif param == ParamEnum.eProfileParamSlot_MaxIAccum:
retval = self.hal_data['profile%d_max_iaccum' % ordinal]
elif param == ParamEnum.eSampleVelocityPeriod:
retval = self.hal_data['vel_measurement_period']
elif param == ParamEnum.eSampleVelocityWindow:
retval = self.hal_data['vel_measurement_window']
elif param == ParamEnum.eMotMag_Accel:
retval = self.hal_data['motionmagic_acceleration']
elif param == ParamEnum.eMotMag_VelCruise:
retval = self.hal_data['motionmagic_velocity']
elif param == ParamEnum.eClearPositionOnLimitF:
retval = self.hal_data['clear_pos_on_limit_fwd']
elif param == ParamEnum.eClearPositionOnLimitR:
retval = self.hal_data['clear_pos_on_limit_rev']
else:
raise NotImplementedError
doc: |
Gets a parameter.
Expand Down Expand Up @@ -1502,6 +1587,10 @@ sim_class_extra: |
Notifier = Notifier
def _calculate_1ms(self):
if self.hal_data['clear_pos_on_limit_fwd'] and self.hal_data['limit_switch_closed_for']:
self.setSelectedSensorPosition(0, self.hal_data['pid_slot_select'], 0)
if self.hal_data['clear_pos_on_limit_rev'] and self.hal_data['limit_switch_closed_rev']:
self.setSelectedSensorPosition(0, self.hal_data['pid_slot_select'], 0)
calculating = True
if self.hal_data['control_mode'] == ControlMode.Position:
pos = self.getSelectedSensorPosition(self._pidIdx)
Expand Down
77 changes: 69 additions & 8 deletions tests/test_talonsrx.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,75 @@ def test_basemotorcontroller_configGetCustomParam(talon):
talon.configGetCustomParam(1, 2)


@pytest.mark.xfail(raises=NotImplementedError)
def test_basemotorcontroller_configGetParameter(talon):
talon.configGetParameter(1,2,3)
config_data = [
("eOpenloopRamp", 0, "open_loop_ramp", 0.5),
("eClosedloopRamp", 0, "closed_loop_ramp", 0.5),
("eNeutralDeadband", 0, "neutral_deadband", 0.5),
("ePeakPosOutput", 0, "peak_fwd_output", 0.5),
("eNominalPosOutput", 0, "nom_fwd_output", 0.5),
("ePeakNegOutput", 0, "peak_rev_output", 0.5),
("eNominalNegOutput", 0, "nom_rev_output", 0.5),
("eProfileParamSlot_P", 0, "profile0_p", 0.1),
("eProfileParamSlot_P", 1, "profile1_p", 0.2),
("eProfileParamSlot_I", 0, "profile0_i", 0.1),
("eProfileParamSlot_I", 1, "profile1_i", 0.2),
("eProfileParamSlot_D", 0, "profile0_d", 0.1),
("eProfileParamSlot_D", 1, "profile1_d", 0.2),
("eProfileParamSlot_F", 0, "profile0_f", 0.1),
("eProfileParamSlot_F", 1, "profile1_f", 0.2),
("eProfileParamSlot_IZone", 0, "profile0_izone", 200.0),
("eProfileParamSlot_IZone", 1, "profile1_izone", 300.0),
("eProfileParamSlot_AllowableErr", 0, "profile0_allowableError", 400.0),
("eProfileParamSlot_AllowableErr", 1, "profile1_allowableError", 401.0),
("eProfileParamSlot_MaxIAccum", 0, "profile0_max_iaccum", 101.0),
("eProfileParamSlot_MaxIAccum", 1, "profile1_max_iaccum", 102.0),
("eSampleVelocityPeriod", 0, "vel_measurement_period", 2.0),
("eSampleVelocityWindow", 0, "vel_measurement_window", 1.0),
("eMotMag_Accel", 0, "motionmagic_acceleration", 1.0),
("eMotMag_VelCruise", 0, "motionmagic_velocity", 1.0),
("eClearPositionOnLimitF", 0, "clear_pos_on_limit_fwd", 1.0),
("eClearPositionOnLimitR", 0, "clear_pos_on_limit_rev", 1.0),
]

@pytest.mark.parametrize("param_name, slot, cdata_key, value", config_data)
def test_basemotorcontroller_configGetParameter(talon, ctre, cdata, param_name, cdata_key, value, slot):
param = ctre.ParamEnum[param_name]
cdata[cdata_key] = value
assert talon.configGetParameter(param, slot, 0) == value


@pytest.mark.parametrize("param_name, slot, cdata_key, value", config_data)
def test_basemotorcontroller_configSetParameter(talon, ctre, cdata, param_name, cdata_key, value, slot):
param = ctre.ParamEnum[param_name]
talon.configSetParameter(param, value, 0, slot, 0)
assert cdata[cdata_key] == value


def test_clear_position_on_limit_forward(talon, cdata, ctre):
talon.selectProfileSlot(0, 0)
talon.configSelectedFeedbackSensor(talon.FeedbackDevice.QuadEncoder, 0, 0)
talon.configSetParameter(ctre.ParamEnum.eClearPositionOnLimitF, 1, 0, 0, 0)
cdata['limit_switch_closed_for'] = 0
cdata['quad_position'] = 10
talon._calculate_1ms()
assert cdata['quad_position'] == 10
cdata['limit_switch_closed_for'] = 1
talon._calculate_1ms()
assert cdata['quad_position'] == 0


def test_clear_position_on_limit_reverse(talon, cdata, ctre):
talon.selectProfileSlot(0, 0)
talon.configSelectedFeedbackSensor(talon.FeedbackDevice.QuadEncoder, 0, 0)
talon.configSetParameter(ctre.ParamEnum.eClearPositionOnLimitR, 1, 0, 0, 0)
cdata['limit_switch_closed_rev'] = 0
cdata['quad_position'] = 10
talon._calculate_1ms()
assert cdata['quad_position'] == 10
cdata['limit_switch_closed_rev'] = 1
talon._calculate_1ms()
assert cdata['quad_position'] == 0


def test_basemotorcontroller_configMaxIntegralAccumulator(talon, cdata):
talon.configMaxIntegralAccumulator(1, 2.0, 3)
Expand Down Expand Up @@ -197,11 +263,6 @@ def test_basemotorcontroller_configSetCustomParam(talon):
talon.configSetCustomParam(1,2,3)


@pytest.mark.xfail(raises=NotImplementedError)
def test_basemotorcontroller_configSetParameter(talon):
talon.configSetParameter(1,2,3,4,5)


def test_basemotorcontroller_configVelocityMeasurementPeriod(talon, cdata):
talon.configVelocityMeasurementPeriod(23, 0)
assert cdata['vel_measurement_period'] == 23
Expand Down

0 comments on commit 336f41b

Please sign in to comment.