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

import typing

from hal_impl.data import hal_data, NotifyDict

from .ctre_sim_enums import ErrorCode


class PigeonIMU:

    def __init__(self):
        self.create_called = False

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

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

    def configSetParameter(self, param: int, value: float, subValue: int, ordinal: int, timeoutMs: int = 0) -> ErrorCode:
        '''Sets a parameter. Generally this is not used.

        This can be utilized in
        - Using new features without updating API installation.
        - Errata workarounds to circumvent API implementation.
        - Allows for rapid testing / unit testing of firmware.

        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(param, int)
        assert isinstance(value, (int, float))
        assert isinstance(subValue, int) and 0 <= subValue < 1<<8
        assert isinstance(ordinal, int)
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("configSetParameter not implemented in simulation (file a bug on github if you need it)")

    def configGetParameter(self, param: int, ordinal: int, timeoutMs: int = 0) -> float:
        '''Gets a parameter. Generally this is not used.

        This can be utilized in

        - Using new features without updating API installation.
        - Errata workarounds to circumvent API implementation.
        - Allows for rapid testing / unit testing of firmware.

        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(param, int)
        assert isinstance(ordinal, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError("configGetParameter not implemented in simulation (file a bug on github if you need it)")

    def configGetParameter_6(self, param: int, valueToSend: int, ordinal: int, timeoutMs: int = 0) -> typing.Tuple[int, int]:
        assert isinstance(param, int) and -1<<31 <= param < 1<<31
        assert isinstance(valueToSend, int) and -1<<31 <= valueToSend < 1<<31
        assert isinstance(ordinal, int) and -1<<31 <= ordinal < 1<<31
        assert isinstance(timeoutMs, int) and -1<<31 <= timeoutMs < 1<<31
        raise NotImplementedError("configGetParameter_6 not implemented in simulation (file a bug on github if you need it)")

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

        Sometimes it is necessary to save calibration/declination/offset
        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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(newValue, int)
        assert isinstance(paramIndex, int)
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("configSetCustomParam not implemented in simulation (file a bug on github if you need it)")

    def configGetCustomParam(self, paramIndex: int, timoutMs: int) -> int:
        '''Gets the value of a custom parameter. This is for arbitrary use.

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

        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(paramIndex, int)
        assert isinstance(timoutMs, int)
        raise NotImplementedError("configGetCustomParam not implemented in simulation (file a bug on github if you need it)")

    def configFactoryDefault(self, timeoutMs: int = 0) -> ErrorCode:
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("configFactoryDefault not implemented in simulation (file a bug on github if you need it)")

    def setYaw(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the Yaw register to the specified value.

        :param angleDeg: Degree of Yaw [+/- 23040 degrees]
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setYaw not implemented in simulation (file a bug on github if you need it)")

    def addYaw(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Atomically add to the Yaw register.

        :param angleDeg: Degrees to add to the Yaw register.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("addYaw not implemented in simulation (file a bug on github if you need it)")

    def setYawToCompass(self, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the Yaw register to match the current compass 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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setYawToCompass not implemented in simulation (file a bug on github if you need it)")

    def setFusedHeading(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the Fused Heading to the specified value.

        :param angleDeg: Degree of heading [+/- 23040 degrees]
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setFusedHeading not implemented in simulation (file a bug on github if you need it)")

    def addFusedHeading(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Atomically add to the Fused Heading register.

        :param angleDeg: Degrees to add to the Fused Heading register.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("addFusedHeading not implemented in simulation (file a bug on github if you need it)")

    def setFusedHeadingToCompass(self, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the Fused Heading register to match the current compass 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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setFusedHeadingToCompass not implemented in simulation (file a bug on github if you need it)")

    def setAccumZAngle(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the AccumZAngle.

        :param angleDeg: Degrees to set AccumZAngle to.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setAccumZAngle not implemented in simulation (file a bug on github if you need it)")

    def setTemperatureCompensationDisable(self, bTempCompDisable: int, timeoutMs: int = 0) -> ErrorCode:
        '''Disable/Enable Temp compensation. Pigeon has this on/False at boot.

        :param bTempCompDisable: Set to "False" to enable temperature compensation.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(bTempCompDisable, int)
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setTemperatureCompensationDisable not implemented in simulation (file a bug on github if you need it)")

    def setCompassDeclination(self, angleDegOffset: float, timeoutMs: int = 0) -> ErrorCode:
        '''Set the declination for compass. Declination is the difference between
        Earth Magnetic north, and the geographic "True North".

        :param angleDegOffset:  Degrees to set Compass Declination to.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDegOffset, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setCompassDeclination not implemented in simulation (file a bug on github if you need it)")

    def setCompassAngle(self, angleDeg: float, timeoutMs: int = 0) -> ErrorCode:
        '''Sets the compass angle. Although compass is absolute [0,360) degrees, the
        continuous compass register holds the wrap-arounds.

        :param angleDeg:
            Degrees to set continuous compass angle to.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(angleDeg, (int, float))
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setCompassAngle not implemented in simulation (file a bug on github if you need it)")

    def enterCalibrationMode(self, calMode: int, timeoutMs: int = 0) -> ErrorCode:
        '''Enters the Calbration mode.  See the Pigeon IMU documentation for More
        information on Calibration.

        :param calMode: Calibration to execute
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(calMode, int)
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("enterCalibrationMode not implemented in simulation (file a bug on github if you need it)")

    def _getGeneralStatus(self) -> typing.Tuple[int, int, int, int, float, int, int, int, int]:
        raise NotImplementedError("_getGeneralStatus not implemented in simulation (file a bug on github if you need it)")

    def getLastError(self) -> ErrorCode:
        '''Call GetLastError() generated by this object.

        Not all functions return an error code but can
        potentially report errors.

        This function can be used to retrieve those error codes.

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        retval = ErrorCode.OK
        raise NotImplementedError("getLastError not implemented in simulation (file a bug on github if you need it)")

    def get6dQuaternion(self) -> typing.List[float]:
        '''Get 6d Quaternion data.

        :param wxyz: [w, x, y, z]
        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("get6dQuaternion not implemented in simulation (file a bug on github if you need it)")

    def getYawPitchRoll(self) -> typing.List[float]:
        '''Get Yaw, Pitch, and Roll data.

        :param ypr_deg: [yaw, pitch, and roll]
        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getYawPitchRoll not implemented in simulation (file a bug on github if you need it)")

    def getAccumGyro(self) -> typing.List[float]:
        '''Get AccumGyro data.
        AccumGyro is the integrated gyro value on each axis.

        :param xyz_deg: [x, y, z]
        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getAccumGyro not implemented in simulation (file a bug on github if you need it)")

    def getAbsoluteCompassHeading(self) -> float:
        '''Get the absolute compass heading.

        :returns: compass heading [0,360) degrees.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getAbsoluteCompassHeading not implemented in simulation (file a bug on github if you need it)")

    def getCompassHeading(self) -> float:
        '''Get the continuous compass heading.

        :returns:
            continuous compass heading [-23040, 23040) degrees.
            Use SetCompassHeading to modify the wrap-around portion.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getCompassHeading not implemented in simulation (file a bug on github if you need it)")

    def getCompassFieldStrength(self) -> float:
        '''Gets the compass' measured magnetic field strength.

        :returns: field strength in Microteslas (uT).


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getCompassFieldStrength not implemented in simulation (file a bug on github if you need it)")

    def getTemp(self) -> float:
        '''Gets the temperature of the pigeon.

        :returns: Temperature in ('C)


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getTemp not implemented in simulation (file a bug on github if you need it)")

    def getState(self) -> int:
        '''Gets the current Pigeon state

        :returns: PigeonState enum


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getState not implemented in simulation (file a bug on github if you need it)")

    def getUpTime(self) -> int:
        '''Gets the current Pigeon uptime.

        :returns: How long has Pigeon been running in whole seconds. Value caps at 255.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getUpTime not implemented in simulation (file a bug on github if you need it)")

    def getRawMagnetometer(self) -> typing.List[int]:
        '''Get Raw Magnetometer data.

        :param rm_xyz: Array to fill with x[0], y[1], and z[2] data.
                       Number is equal to 0.6 microTeslas per unit.

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getRawMagnetometer not implemented in simulation (file a bug on github if you need it)")

    def getBiasedMagnetometer(self) -> typing.List[int]:
        '''Get Biased Magnetometer data.

        :param bm_xyz: Array to fill with x[0], y[1], and z[2] data.
                       Number is equal to 0.6 microTeslas per unit.

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getBiasedMagnetometer not implemented in simulation (file a bug on github if you need it)")

    def getBiasedAccelerometer(self) -> typing.List[int]:
        '''Get Biased Accelerometer data.

        :param ba_xyz: Array to fill with x[0], y[1], and z[2] data.
                       These are in fixed point notation Q2.14.  e.g. 16384 = 1G

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getBiasedAccelerometer not implemented in simulation (file a bug on github if you need it)")

    def getRawGyro(self) -> typing.List[float]:
        '''Get Raw Gyro data.

        :param xyz_dps: Array to fill with x[0], y[1], and z[2] data in degrees per second.

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getRawGyro not implemented in simulation (file a bug on github if you need it)")

    def getAccelerometerAngles(self) -> typing.List[float]:
        '''Get Accelerometer tilt angles.

        :param tiltAngles: Array to fill with x[0], y[1], and z[2] angles in degrees.

        :returns: The last ErrorCode generated.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getAccelerometerAngles not implemented in simulation (file a bug on github if you need it)")

    def _getFusedHeading2(self) -> typing.Tuple[int, int, float, int]:
        raise NotImplementedError("_getFusedHeading2 not implemented in simulation (file a bug on github if you need it)")

    def _getFusedHeading1(self) -> float:
        raise NotImplementedError("_getFusedHeading1 not implemented in simulation (file a bug on github if you need it)")

    def getResetCount(self) -> int:
        raise NotImplementedError("getResetCount not implemented in simulation (file a bug on github if you need it)")

    def getResetFlags(self) -> int:
        raise NotImplementedError("getResetFlags not implemented in simulation (file a bug on github if you need it)")

    def getFirmwareVersion(self) -> int:
        '''Gets the firmware version of the device.

        :returns:
            param holds the firmware version of the device. Device must be powered
            cycled at least once.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("getFirmwareVersion not implemented in simulation (file a bug on github if you need it)")

    def hasResetOccurred(self) -> bool:
        ''':returns: true iff a reset has occurred since last call.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        raise NotImplementedError("hasResetOccurred not implemented in simulation (file a bug on github if you need it)")

    def setLastError(self, value: int) -> ErrorCode:
        assert isinstance(value, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setLastError not implemented in simulation (file a bug on github if you need it)")

    def _getFaults(self) -> int:
        raise NotImplementedError("_getFaults not implemented in simulation (file a bug on github if you need it)")

    def _getStickyFaults(self) -> int:
        raise NotImplementedError("_getStickyFaults not implemented in simulation (file a bug on github if you need it)")

    def clearStickyFaults(self, timeoutMs: int = 0) -> ErrorCode:
        '''Clears the Sticky Faults

        :returns: Error Code generated by function. 0 indicates no error.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("clearStickyFaults not implemented in simulation (file a bug on github if you need it)")

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

        :param statusFrame:
            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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(frame, int)
        assert isinstance(periodMs, int) and 0 <= periodMs < 1<<8
        assert isinstance(timeoutMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setStatusFramePeriod not implemented in simulation (file a bug on github if you need it)")

    def getStatusFramePeriod(self, frame: int, timeoutMs: int = 0) -> int:
        '''Gets the period of the given status frame.

        :param frame:
            Frame to get the period of.
        :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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(frame, int)
        assert isinstance(timeoutMs, int)
        raise NotImplementedError("getStatusFramePeriod not implemented in simulation (file a bug on github if you need it)")

    def setControlFramePeriod(self, frame: int, periodMs: int) -> ErrorCode:
        '''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.


        .. note:: This function works on a real robot, but has not yet
                  been implemented in simulation mode. See :ref:`api_support`
                  for more details.

        '''
        assert isinstance(frame, int)
        assert isinstance(periodMs, int)
        retval = ErrorCode.OK
        raise NotImplementedError("setControlFramePeriod not implemented in simulation (file a bug on github if you need it)")


