#
# This file is autogenerated, do not edit manually. Instead,
# edit gen/MotController_data.yml
#

import typing

from hal_impl.data import hal_data

class MotController:

    def __init__(self):
        self.create_called = False

    def create1(self, baseArbId: int) -> None:
        assert isinstance(baseArbId, int)
        self.create_called = True

    def getDeviceNumber(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def setDemand(self, mode: int, demand0: int, demand1: int) -> int:
        assert isinstance(mode, int)
        assert isinstance(demand0, int)
        assert isinstance(demand1, int)
        raise NotImplementedError

    def setNeutralMode(self, neutralMode: int) -> None:
        '''Sets the mode of operation during neutral throttle output.

        :param neutralMode:
            The desired mode of operation when the Controller output
            throttle is neutral (ie brake/coast)

        '''
        assert isinstance(neutralMode, int)
        raise NotImplementedError

    def setSensorPhase(self, PhaseSensor: bool) -> None:
        '''Sets the phase of the sensor. Use when controller forward/reverse output
        doesn't correlate to appropriate forward/reverse reading of sensor.

        Pick a value so that positive PercentOutput yields a positive change in sensor.
        After setting this, user can freely call SetInvert() with any value.


        :param PhaseSensor:
            Indicates whether to invert the phase of the sensor.

        '''
        assert isinstance(PhaseSensor, bool)
        raise NotImplementedError

    def setInverted(self, invert: bool) -> None:
        assert isinstance(invert, bool)
        raise NotImplementedError

    def configOpenLoopRamp(self, secondsFromNeutralToFull: float, timeoutMs: int) -> int:
        '''Configures the open-loop ramp rate of throttle output.

        :param secondsFromNeutralToFull:
            Minimum desired time to go from neutral to full throttle. A
            value of '0' will disable the ramp.
        :param timeoutMs:
            Timeout value in ms. Function will generate error if config is
            not successful within timeout.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(secondsFromNeutralToFull, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configClosedLoopRamp(self, secondsFromNeutralToFull: float, timeoutMs: int) -> int:
        '''Configures the closed-loop ramp rate of throttle output.

        :param secondsFromNeutralToFull:
            Minimum desired time to go from neutral to full throttle. A
            value of '0' will disable the ramp.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(secondsFromNeutralToFull, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configPeakOutputForward(self, percentOut: float, timeoutMs: int) -> int:
        '''Configures the forward peak output percentage.

        :param percentOut:
            Desired peak output percentage [0,1].
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(percentOut, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configPeakOutputReverse(self, percentOut: float, timeoutMs: int) -> int:
        '''Configures the reverse peak output percentage.

        :param percentOut:
            Desired peak output percentage.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(percentOut, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configNominalOutputForward(self, percentOut: float, timeoutMs: int) -> int:
        '''Configures the forward nominal output percentage.

        :param percentOut:
            Nominal (minimum) percent output [0,+1].
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(percentOut, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configNominalOutputReverse(self, percentOut: float, timeoutMs: int) -> int:
        '''Configures the reverse nominal output percentage.

        :param percentOut:
            Nominal (minimum) percent output [-1,0].
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(percentOut, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configNeutralDeadband(self, percentDeadband: float, timeoutMs: int) -> int:
        '''Configures the output deadband percentage.

        :param percentDeadband: 
            Desired deadband percentage. Minimum is 0.1%, Maximum is 25%.
            Pass 0.04 for 4% (factory default).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(percentDeadband, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configVoltageCompSaturation(self, voltage: float, timeoutMs: int) -> int:
        '''Configures the Voltage Compensation saturation voltage.

        :param voltage:
            This is the max voltage to apply to the hbridge when voltage
            compensation is enabled.  For example, if 10 (volts) is specified
            and a TalonSRX is commanded to 0.5 (PercentOutput, closed-loop, etc)
            then the TalonSRX will attempt to apply a duty-cycle to produce 5V.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(voltage, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configVoltageMeasurementFilter(self, filterWindowSamples: int, timeoutMs: int) -> int:
        '''Configures the voltage measurement filter.

        :param filterWindowSamples:
            Number of samples in the rolling average of voltage
            measurement.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(filterWindowSamples, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def enableVoltageCompensation(self, enable: bool) -> None:
        '''Enables voltage compensation. If enabled, voltage compensation works in
        all control modes.

        :param enable:
            Enable state of voltage compensation.

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def getBusVoltage(self) -> typing.Tuple[int, float]:
        '''Gets the bus voltage seen by the device.

        :returns: The bus voltage value (in volts).

        '''
        raise NotImplementedError

    def getMotorOutputPercent(self) -> typing.Tuple[int, float]:
        '''Gets the output percentage of the motor controller.

        :returns: Output of the motor controller (in percent).

        '''
        raise NotImplementedError

    def getOutputCurrent(self) -> typing.Tuple[int, float]:
        '''Gets the output current of the motor controller.

        :returns: The output current (in amps).

        '''
        raise NotImplementedError

    def getTemperature(self) -> typing.Tuple[int, float]:
        '''Gets the temperature of the motor controller.

        :returns: Temperature of the motor controller (in 'C)

        '''
        raise NotImplementedError

    def configSelectedFeedbackSensor(self, feedbackDevice: int, pidIdx: int, timeoutMs: int) -> int:
        '''Select the feedback device for the motor controller.
        Most CTRE CAN motor controllers will support remote sensors over CAN.

        :param feedbackDevice:
            Feedback Device to select.
        :type: feedbackDevice: :class:`.FeedbackDevice` or :class:`.RemoteFeedbackDevice`
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
            See Phoenix-Documentation for how to interpret.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(feedbackDevice, int)
        assert isinstance(pidIdx, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configRemoteFeedbackFilter(self, deviceID: int, remoteSensorSource: int, remoteOrdinal: int, timeoutMs: int) -> int:
        '''Select what remote device and signal to assign to Remote Sensor 0 or Remote Sensor 1.
        After binding a remote device and signal to Remote Sensor X, you may select Remote Sensor X
        as a PID source for closed-loop features.

        :param deviceID:
            The CAN ID of the remote sensor device.
        :param remoteSensorSource:
            The remote sensor device and signal type to bind.
        :param remoteOrdinal:
            0 for configuring Remote Sensor 0
            1 for configuring Remote Sensor 1
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(deviceID, int)
        assert isinstance(remoteSensorSource, int)
        assert isinstance(remoteOrdinal, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configSensorTerm(self, sensorTerm: int, feedbackDevice: int, timeoutMs: int) -> int:
        '''Select what sensor term should be bound to switch feedback device.

        Sensor Sum = Sensor Sum Term 0 - Sensor Sum Term 1

        Sensor Difference = Sensor Diff Term 0 - Sensor Diff Term 1

        The four terms are specified with this routine.  Then Sensor Sum/Difference
        can be selected for closed-looping.

        :param sensorTerm: Which sensor term to bind to a feedback source.
        :param feedbackDevice: The sensor signal to attach to sensorTerm.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(sensorTerm, int)
        assert isinstance(feedbackDevice, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getSelectedSensorPosition(self, pidIdx: int) -> typing.Tuple[int, int]:
        '''Get the selected sensor position.

        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
            See Phoenix-Documentation for how to interpret.
        :returns: Position of selected sensor (in Raw Sensor Units).

        '''
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def getSelectedSensorVelocity(self, pidIdx: int) -> typing.Tuple[int, int]:
        '''Get the selected sensor velocity.

        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
            See Phoenix-Documentation for how to interpret.
        :returns: selected sensor (in raw sensor units) per 100ms.

        '''
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def setSelectedSensorPosition(self, sensorPos: int, pidIdx: int, timeoutMs: int) -> int:
        '''Sets the sensor position to the given value.

        :param sensorPos:
            Position to set for the selected sensor (in raw sensor units).
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(sensorPos, int)
        assert isinstance(pidIdx, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def setControlFramePeriod(self, frame: int, periodMs: int) -> int:
        '''Sets the period of the given control frame.

        :param frame:
            Frame whose period is to be changed.
        :param periodMs:
            Period in ms for the given frame.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(frame, int)
        assert isinstance(periodMs, int)
        raise NotImplementedError

    def setStatusFramePeriod(self, frame: int, periodMs: int, timeoutMs: int) -> int:
        '''Sets the period of the given status frame.

        User ensure CAN Bus utilization is not high.
         
        This setting is not persistent and is lost when device is reset. If this
        is a concern, calling application can use HasReset() to determine if the
        status frame needs to be reconfigured.

        :param frame:
            Frame whose period is to be changed.
        :param periodMs:
            Period in ms for the given frame.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(frame, int)
        assert isinstance(periodMs, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getStatusFramePeriod(self, frame: int, timeoutMs: int) -> typing.Tuple[int, int]:
        '''Gets the period of the given status frame.

        :param frame:
            Frame to get the period of.
        :type frame: :class:`.StatusFrame` or :class:`.StatusFrameEnhanced`
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Period of the given status frame.

        '''
        assert isinstance(frame, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configVelocityMeasurementPeriod(self, period: int, timeoutMs: int) -> int:
        '''Sets the period over which velocity measurements are taken.

        :param period:
            Desired period for the velocity measurement. see :class:`.VelocityMeasPeriod`
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(period, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configVelocityMeasurementWindow(self, windowSize: int, timeoutMs: int) -> int:
        '''Sets the number of velocity samples used in the rolling average velocity
        measurement.

        :param windowSize:
            Number of samples in the rolling average of velocity
            measurement. Valid values are 1,2,4,8,16,32. If another value
            is specified, it will truncate to nearest support value.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(windowSize, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configForwardLimitSwitchSource(self, type: int, normalOpenOrClose: int, deviceID: int, timeoutMs: int) -> int:
        '''Configures the forward limit switch for a remote source. For example, a
        CAN motor controller may need to monitor the Limit-F pin of another Talon
        or CANifier.

        :param type:
            Remote limit switch source. User can choose between a remote
            Talon SRX, CANifier, or deactivate the feature.
        :param normalOpenOrClose:
            Setting for normally open, normally closed, or disabled. This
            setting matches the web-based configuration drop down.
        :param deviceID:
            Device ID of remote source (Talon SRX or CANifier device ID).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(type, int)
        assert isinstance(normalOpenOrClose, int)
        assert isinstance(deviceID, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configReverseLimitSwitchSource(self, type: int, normalOpenOrClose: int, deviceID: int, timeoutMs: int) -> int:
        '''Configures the reverse limit switch for a remote source. For example, a
        CAN motor controller may need to monitor the Limit-R pin of another Talon
        or CANifier.

        :param type:
            Remote limit switch source. User can choose between a remote
            Talon SRX, CANifier, or deactivate the feature.
        :param normalOpenOrClose:
            Setting for normally open, normally closed, or disabled. This
            setting matches the web-based configuration drop down.
        :param deviceID:
            Device ID of remote source (Talon SRX or CANifier device ID).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(type, int)
        assert isinstance(normalOpenOrClose, int)
        assert isinstance(deviceID, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def overrideLimitSwitchesEnable(self, enable: bool) -> None:
        '''Sets the enable state for limit switches.

        :param enable:
            Enable state for limit switches.

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def configForwardSoftLimitThreshold(self, forwardSensorLimit: int, timeoutMs: int) -> int:
        '''Configures the forward soft limit threhold.

        :param forwardSensorLimit:
            Forward Sensor Position Limit (in raw Sensor Units).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(forwardSensorLimit, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configReverseSoftLimitThreshold(self, reverseSensorLimit: int, timeoutMs: int) -> int:
        '''Configures the reverse soft limit threshold.

        :param reverseSensorLimit:
            Reverse Sensor Position Limit (in Raw Sensor Units).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(reverseSensorLimit, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configForwardSoftLimitEnable(self, enable: bool, timeoutMs: int) -> int:
        '''Configures the forward soft limit enable.

        :param enable:
            Forward Sensor Position Limit Enable.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(enable, bool)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configReverseSoftLimitEnable(self, enable: bool, timeoutMs: int) -> int:
        '''Configures the reverse soft limit enable.

        :param enable:
            Reverse Sensor Position Limit Enable.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(enable, bool)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def overrideSoftLimitsEnable(self, enable: bool) -> None:
        '''Can be used to override-disable the soft limits.
        This function can be used to quickly disable soft limits without
        having to modify the persistent configuration.

        :param enable:
            Enable state for soft limit switches.

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def config_kP(self, slotIdx: int, value: float, timeoutMs: int) -> int:
        '''Sets the 'P' constant in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param value:
            Value of the P constant.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(value, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def config_kI(self, slotIdx: int, value: float, timeoutMs: int) -> int:
        '''Sets the 'I' constant in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param value:
            Value of the I constant.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(value, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def config_kD(self, slotIdx: int, value: float, timeoutMs: int) -> int:
        '''Sets the 'D' constant in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param value:
            Value of the D constant.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(value, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def config_kF(self, slotIdx: int, value: float, timeoutMs: int) -> int:
        '''Sets the 'F' constant in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param value:
            Value of the F constant.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(value, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def config_IntegralZone(self, slotIdx: int, izone: float, timeoutMs: int) -> int:
        '''Sets the Integral Zone constant in the given parameter slot. If the
        (absolute) closed-loop error is outside of this zone, integral
        accumulator is automatically cleared. This ensures than integral wind up
        events will stop after the sensor gets far enough from its target.

        :param slotIdx:
            Parameter slot for the constant.
        :param izone:
            Value of the Integral Zone constant. (closed loop error units X 1ms).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(izone, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configAllowableClosedloopError(self, slotIdx: int, allowableClosedLoopError: int, timeoutMs: int) -> int:
        '''Sets the allowable closed-loop error in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param allowableClosedLoopError:
            Value of the allowable closed-loop error.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(allowableClosedLoopError, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configMaxIntegralAccumulator(self, slotIdx: int, iaccum: float, timeoutMs: int) -> int:
        '''Sets the maximum integral accumulator in the given parameter slot.

        :param slotIdx:
            Parameter slot for the constant.
        :param iaccum:
            Value to set for the integral accumulator (closed loop error
            units X 1ms).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(iaccum, (int, float))
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def setIntegralAccumulator(self, iaccum: float, pidIdx: int, timeoutMs: int) -> int:
        '''Sets the integral accumulator. Typically this is used to clear/zero the
        integral accumulator, however some use cases may require seeding the
        accumulator for a faster response.

        :param iaccum:
            Value to set for the integral accumulator (closed loop error
            units X 1ms).
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(iaccum, (int, float))
        assert isinstance(pidIdx, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getClosedLoopError(self, pidIdx: int) -> typing.Tuple[int, int]:
        '''Gets the closed-loop error.  The units depend on which control mode is in
        use. See Phoenix-Documentation information on units.

        :param slotIdx:
            Parameter slot of the constant.
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
        :returns: Closed-loop error value.

        '''
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def getIntegralAccumulator(self, pidIdx: int) -> typing.Tuple[int, float]:
        '''Gets the iaccum value.

        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
        :returns: Integral accumulator value.

        '''
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def getErrorDerivative(self, pidIdx: int) -> typing.Tuple[int, float]:
        '''Gets the derivative of the closed-loop error.

        :param slotIdx:
            Parameter slot of the constant.
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.
        :returns: The error derivative value.

        '''
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def selectProfileSlot(self, slotIdx: int, pidIdx: int) -> int:
        '''Selects which profile slot to use for closed-loop control.

        :param slotIdx:
            Profile slot to select.
        :param pidIdx:
            0 for Primary closed-loop. 1 for cascaded closed-loop.

        '''
        assert isinstance(slotIdx, int)
        assert isinstance(pidIdx, int)
        raise NotImplementedError

    def getActiveTrajectoryPosition(self) -> typing.Tuple[int, int]:
        '''Gets the active trajectory target position using
        MotionMagic/MotionProfile control modes.

        :returns: The Active Trajectory Position in sensor units.

        '''
        raise NotImplementedError

    def getActiveTrajectoryVelocity(self) -> typing.Tuple[int, int]:
        '''Gets the active trajectory target velocity using
        MotionMagic/MotionProfile control modes.

        :returns: The Active Trajectory Velocity in sensor units per 100ms.

        '''
        raise NotImplementedError

    def getActiveTrajectoryHeading(self) -> typing.Tuple[int, float]:
        '''Gets the active trajectory target heading using
        MotionMagicArc/MotionProfileArc control modes.

        :returns: The Active Trajectory Heading in degreees.

        '''
        raise NotImplementedError

    def getActiveTrajectoryAll(self) -> typing.Tuple[int, int, int, float]:
        raise NotImplementedError

    def configMotionCruiseVelocity(self, sensorUnitsPer100ms: int, timeoutMs: int) -> int:
        '''Sets the Motion Magic Cruise Velocity.  This is the peak target velocity
        that the motion magic curve generator can use.

        :param sensorUnitsPer100ms:
            Motion Magic Cruise Velocity (in raw Sensor Units per 100 ms).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(sensorUnitsPer100ms, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configMotionAcceleration(self, sensorUnitsPer100msPerSec: int, timeoutMs: int) -> int:
        '''Sets the Motion Magic Acceleration. This is the target acceleration that
        the motion magic curve generator can use.

        :param sensorUnitsPer100msPerSec:
            Motion Magic Acceleration (in raw sensor units per 100 ms per
            second).
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(sensorUnitsPer100msPerSec, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def clearMotionProfileTrajectories(self) -> int:
        '''Clear the buffered motion profile in both controller's RAM (bottom), and in the
        API (top).

        '''
        raise NotImplementedError

    def getMotionProfileTopLevelBufferCount(self) -> typing.Tuple[int, int]:
        '''Retrieve just the buffer count for the api-level (top) buffer. This
        routine performs no CAN or data structure lookups, so its fast and ideal
        if caller needs to quickly poll the progress of trajectory points being
        emptied into controller's RAM. Otherwise just use GetMotionProfileStatus.

        :returns: number of trajectory points in the top buffer.

        '''
        raise NotImplementedError

    def pushMotionProfileTrajectory(self, position: float, velocity: float, headingDeg: float, profileSlotSelect: int, isLastPoint: bool, zeroPos: bool) -> int:
        '''Push another trajectory point into the top level buffer (which is emptied
        into the motor controller's bottom buffer as room allows).

        :param trajPt: 
            to push into buffer.

            The members should be filled in with these values...
            
            targPos:  servo position in sensor units.
            targVel:  velocity to feed-forward in sensor units
            per 100ms.
            profileSlotSelect  which slot to pull PIDF gains from.  Currently
            supports 0,1,2,3.
            isLastPoint  set to nonzero to signal motor controller to keep processing this
            trajectory point, instead of jumping to the next one
            when timeDurMs expires.  Otherwise MP executer will
            eventually see an empty buffer after the last point
            expires, causing it to assert the IsUnderRun flag.
            However this may be desired if calling application
            never wants to terminate the MP.
            zeroPos  set to nonzero to signal motor controller to "zero" the selected
            position sensor before executing this trajectory point.
            Typically the first point should have this set only thus
            allowing the remainder of the MP positions to be relative to
            zero.
        :returns: 
            CTR_OKAY if trajectory point push ok. ErrorCode if buffer is
            full due to kMotionProfileTopBufferCapacity.

        '''
        assert isinstance(position, (int, float))
        assert isinstance(velocity, (int, float))
        assert isinstance(headingDeg, (int, float))
        assert isinstance(profileSlotSelect, int)
        assert isinstance(isLastPoint, bool)
        assert isinstance(zeroPos, bool)
        raise NotImplementedError

    def isMotionProfileTopLevelBufferFull(self) -> typing.Tuple[int, bool]:
        '''Retrieve just the buffer full for the api-level (top) buffer. This
        routine performs no CAN or data structure lookups, so its fast and ideal
        if caller needs to quickly poll. Otherwise just use
        GetMotionProfileStatus.

        :returns: number of trajectory points in the top buffer.

        '''
        raise NotImplementedError

    def processMotionProfileBuffer(self) -> int:
        '''This must be called periodically to funnel the trajectory points from the
        API's top level buffer to the controller's bottom level buffer. Recommendation
        is to call this twice as fast as the execution rate of the motion
        profile. So if MP is running with 20ms trajectory points, try calling
        this routine every 10ms. All motion profile functions are thread-safe
        through the use of a mutex, so there is no harm in having the caller
        utilize threading.

        '''
        raise NotImplementedError

    def getMotionProfileStatus(self) -> typing.Tuple[int, int, int, int, bool, bool, bool, bool, int, int]:
        '''Retrieve all status information.
        For best performance, Caller can snapshot all status information regarding the
        motion profile executer.

        :param statusToFill: 
            Caller supplied object to fill.

            The members are filled, as follows...
            
            topBufferRem:   The available empty slots in the trajectory buffer.
            The robot API holds a "top buffer" of trajectory points, so your applicaion
            can dump several points at once.  The API will then stream them into the
            low-level buffer, allowing the motor controller to act on them.
            
            topBufferRem: The number of points in the top trajectory buffer.
            
            btmBufferCnt: The number of points in the low level controller buffer.
            
            hasUnderrun:    Set if isUnderrun ever gets set.
            Only is cleared by clearMotionProfileHasUnderrun() to ensure
            
            isUnderrun:     This is set if controller needs to shift a point from its buffer into
            the active trajectory point however
            the buffer is empty.
            This gets cleared automatically when is resolved.
            
            activePointValid:   True if the active trajectory point has not empty, false otherwise. The members in activePoint are only valid if this signal is set.
            
            isLast: is set/cleared based on the MP executer's current
            trajectory point's IsLast value.  This assumes
            IsLast was set when PushMotionProfileTrajectory
            was used to insert the currently processed trajectory
            point.
            
            profileSlotSelect: The currently processed trajectory point's
            selected slot.  This can differ in the currently selected slot used
            for Position and Velocity servo modes
            
            outputEnable:       The current output mode of the motion profile
            executer (disabled, enabled, or hold).  When changing the set()
            value in MP mode, it's important to check this signal to
            confirm the change takes effect before interacting with the top buffer.

        '''
        raise NotImplementedError

    def clearMotionProfileHasUnderrun(self, timeoutMs: int) -> int:
        '''Clear the "Has Underrun" flag. Typically this is called after application
        has confirmed an underrun had occured.

        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def changeMotionControlFramePeriod(self, periodMs: int) -> int:
        '''Calling application can opt to speed up the handshaking between the robot
        API and the controller to increase the download rate of the controller's Motion
        Profile. Ideally the period should be no more than half the period of a
        trajectory point.

        :param periodMs:
            The transmit period in ms.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(periodMs, int)
        raise NotImplementedError

    def getLastError(self) -> int:
        '''Gets the last error generated by this object.

        :returns: Last Error Code generated by a function.

        '''
        raise NotImplementedError

    def getFirmwareVersion(self) -> typing.Tuple[int, int]:
        '''Gets the firmware version of the device.

        :returns: Firmware version of device. For example: version 1-dot-2 
            is 0x0102.

        '''
        raise NotImplementedError

    def hasResetOccurred(self) -> typing.Tuple[int, bool]:
        ''':returns: Returns true if the device has reset since last call

        '''
        raise NotImplementedError

    def configSetCustomParam(self, newValue: int, paramIndex: int, timeoutMs: int) -> int:
        '''Sets the value of a custom parameter. This is for arbitrary use.

        Sometimes it is necessary to save calibration/limit/target information 
        in the device. Particularly if the device is part of a subsystem that 
        can be replaced.

        :param newValue:
            Value for custom parameter.
        :param paramIndex:
            Index of custom parameter [0,1].
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(newValue, int)
        assert isinstance(paramIndex, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configGetCustomParam(self, paramIndex: int, timoutMs: int) -> typing.Tuple[int, int]:
        '''Gets the value of a custom parameter.

        :param paramIndex:
            Index of custom parameter [0,1].
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.
        :returns: Value of the custom param.

        '''
        assert isinstance(paramIndex, int)
        assert isinstance(timoutMs, int)
        raise NotImplementedError

    def configSetParameter(self, param: int, value: float, subValue: int, ordinal: int, timeoutMs: int) -> int:
        '''Sets a parameter.

        :param param:
            Parameter enumeration.
        :param value:
            Value of parameter.
        :param subValue:
            Subvalue for parameter. Maximum value of 255.
        :param ordinal:
            Ordinal of parameter.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.
        :returns: Error Code generated by function. 0 indicates no error.

        '''
        assert isinstance(param, int)
        assert isinstance(value, (int, float))
        assert isinstance(subValue, int)
        assert isinstance(ordinal, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configGetParameter(self, param: int, ordinal: int, timeoutMs: int) -> typing.Tuple[int, float]:
        '''Gets a parameter.

        :param param:
            Parameter enumeration.
        :param ordinal:
            Ordinal of parameter.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for
            config success and report an error if it times out.
            If zero, no blocking or checking is performed.

        :returns: Value of parameter.

        '''
        assert isinstance(param, int)
        assert isinstance(ordinal, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configPeakCurrentLimit(self, amps: int, timeoutMs: int) -> int:
        '''Configure the peak allowable current (when current limit is enabled).

        Current limit is activated when current exceeds the peak limit for longer
        than the peak duration. Then software will limit to the continuous limit.
        This ensures current limiting while allowing for momentary excess current
        events.

        For simpler current-limiting (single threshold) use
        ConfigContinuousCurrentLimit() and set the peak to zero:
        ConfigPeakCurrentLimit(0).

        Not available on the Victor SPX

        :param amps:
            Amperes to limit.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.

        '''
        assert isinstance(amps, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configPeakCurrentDuration(self, milliseconds: int, timeoutMs: int) -> int:
        '''Configure the peak allowable duration (when current limit is enabled).

        Current limit is activated when current exceeds the peak limit for longer
        than the peak duration. Then software will limit to the continuous limit.
        This ensures current limiting while allowing for momentary excess current
        events.

        For simpler current-limiting (single threshold) use
        ConfigContinuousCurrentLimit() and set the peak to zero:
        ConfigPeakCurrentLimit(0).

        Not available on the Victor SPX

        :param milliseconds:
            How long to allow current-draw past peak limit.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.

        '''
        assert isinstance(milliseconds, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def configContinuousCurrentLimit(self, amps: int, timeoutMs: int) -> int:
        '''Configure the continuous allowable current-draw (when current limit is
        enabled).

        Current limit is activated when current exceeds the peak limit for longer
        than the peak duration. Then software will limit to the continuous limit.
        This ensures current limiting while allowing for momentary excess current
        events.

        For simpler current-limiting (single threshold) use
        ConfigContinuousCurrentLimit() and set the peak to zero:
        ConfigPeakCurrentLimit(0).

        Not available on the Victor SPX

        :param amps:
            Amperes to limit.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.

        '''
        assert isinstance(amps, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def enableCurrentLimit(self, enable: bool) -> int:
        '''Enable or disable Current Limit.

        :param enable:
            Enable state of current limit.

        Not available on the Victor SPX

        see :meth:`.configPeakCurrentLimit`, :meth:`.configPeakCurrentDuration`, 
        :meth:`.configContinuousCurrentLimit`

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def setLastError(self, error: int) -> int:
        assert isinstance(error, int)
        raise NotImplementedError

    def getAnalogIn(self) -> typing.Tuple[int, int]:
        '''Get the position of whatever is in the analog pin of the Talon,
        regardless of whether it is actually being used for feedback.

        :returns: 
            the 24bit analog value. The bottom ten bits is the ADC (0 - 1023)
            on the analog pin of the Talon. The upper 14 bits tracks the
            overflows and underflows (continuous sensor).

        '''
        raise NotImplementedError

    def setAnalogPosition(self, newPosition: int, timeoutMs: int) -> int:
        '''Sets analog position.

        :param newPosition:
            The new position.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: an ErrorCode.

        '''
        assert isinstance(newPosition, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getAnalogInRaw(self) -> typing.Tuple[int, int]:
        '''Get the position of whatever is in the analog pin of the Talon,
        regardless of whether it is actually being used for feedback.

        :returns: the ADC (0 - 1023) on analog pin of the Talon.

        '''
        raise NotImplementedError

    def getAnalogInVel(self) -> typing.Tuple[int, int]:
        '''Get the velocity of whatever is in the analog pin of the Talon,
        regardless of whether it is actually being used for feedback.

        :returns: the speed in units per 100ms where 1024 units is one rotation.

        '''
        raise NotImplementedError

    def getQuadraturePosition(self) -> typing.Tuple[int, int]:
        '''Get the quadrature position of the Talon, regardless of whether
        it is actually being used for feedback.

        :returns: the Error code of the request.

        '''
        raise NotImplementedError

    def setQuadraturePosition(self, newPosition: int, timeoutMs: int) -> int:
        '''Change the quadrature reported position. Typically this is used to "zero"
        the sensor. This only works with Quadrature sensor. To set the selected
        sensor position regardless of what type it is, see
        SetSelectedSensorPosition in the motor controller class.

        :param newPosition:
            The position value to apply to the sensor.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: error code.

        '''
        assert isinstance(newPosition, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getQuadratureVelocity(self) -> typing.Tuple[int, int]:
        '''Get the quadrature velocity, regardless of whether
        it is actually being used for feedback.

        :returns: the value (0 - 1023) on the analog pin of the Talon.

        '''
        raise NotImplementedError

    def getPulseWidthPosition(self) -> typing.Tuple[int, int]:
        '''Gets pulse width position, regardless of whether
        it is actually being used for feedback.

        :returns: the pulse width position.

        '''
        raise NotImplementedError

    def setPulseWidthPosition(self, newPosition: int, timeoutMs: int) -> int:
        '''Sets pulse width position.

        :param newPosition:
            The position value to apply to the sensor.
        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: an ErrErrorCode

        '''
        assert isinstance(newPosition, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def getPulseWidthVelocity(self) -> typing.Tuple[int, int]:
        '''Gets pulse width velocity, regardless of whether
        it is actually being used for feedback.

        :returns: the pulse width velocity  in units per 100ms (where 4096 units is 1 rotation).

        '''
        raise NotImplementedError

    def getPulseWidthRiseToFallUs(self) -> typing.Tuple[int, int]:
        '''Gets pulse width rise to fall time.

        :returns: the pulse width rise to fall time in microseconds.

        '''
        raise NotImplementedError

    def getPulseWidthRiseToRiseUs(self) -> typing.Tuple[int, int]:
        '''Gets pulse width rise to rise time.

        :returns: the pulse width rise to rise time in microseconds.

        '''
        raise NotImplementedError

    def getPinStateQuadA(self) -> typing.Tuple[int, int]:
        '''
        '''
        raise NotImplementedError

    def getPinStateQuadB(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def getPinStateQuadIdx(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def isFwdLimitSwitchClosed(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def isRevLimitSwitchClosed(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def getFaults(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def getStickyFaults(self) -> typing.Tuple[int, int]:
        raise NotImplementedError

    def clearStickyFaults(self, timeoutMs: int) -> int:
        '''Clears all sticky faults.

        :param timeoutMs:
            Timeout value in ms. If nonzero, function will wait for config
            success and report an error if it times out. If zero, no
            blocking or checking is performed.
        :returns: Last Error Code generated by a function.

        '''
        assert isinstance(timeoutMs, int)
        raise NotImplementedError

    def selectDemandType(self, enable: bool) -> int:
        '''For now this simply updates the CAN signal to the motor controller.
        Future firmware updates will use this to control advanced cascaded loop behavior.

        :param value:

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def setMPEOutput(self, MpeOutput: int) -> int:
        assert isinstance(MpeOutput, int)
        raise NotImplementedError

    def enableHeadingHold(self, enable: bool) -> int:
        '''Enables a future feature called "Heading Hold".
        For now this simply updates the CAN signal to the motor controller.
        Future firmware updates will use this.

        :param enable: true/false enable

        '''
        assert isinstance(enable, bool)
        raise NotImplementedError

    def getAnalogInAll(self) -> typing.Tuple[int, int, int, int]:
        raise NotImplementedError

    def getQuadratureSensor(self) -> typing.Tuple[int, int, int]:
        raise NotImplementedError

    def getPulseWidthAll(self) -> typing.Tuple[int, int, int, int, int]:
        raise NotImplementedError

    def getQuadPinStates(self) -> typing.Tuple[int, int, int, int]:
        raise NotImplementedError

    def getLimitSwitchState(self) -> typing.Tuple[int, int, int]:
        raise NotImplementedError

