:py:mod:`phoenix6.hardware.core.core_candle` ============================================ .. py:module:: phoenix6.hardware.core.core_candle Module Contents --------------- .. py:class:: CoreCANdle(device_id: int, canbus: phoenix6.canbus.CANBus | str = CANBus()) Bases: :py:obj:`phoenix6.hardware.parent_device.ParentDevice` Class for CTR Electronics' CANdle® branded device, a device that controls LEDs over the CAN bus. Constructs a new CANdle object. .. versionchanged:: 2026 Constructing devices with a CAN bus string is deprecated for removal in the 2027 season. Construct devices using a CANBus instance instead. :param device_id: ID of the device, as configured in Phoenix Tuner :type device_id: int :param canbus: The CAN bus this device is on. Possible CAN bus strings are: - "rio" for the native roboRIO CAN bus - CANivore name or serial number - SocketCAN interface (non-FRC Linux only) - "*" for any CANivore seen by the program - empty string (default) to select the default for the system: - "rio" on roboRIO - "can0" on Linux - "*" on Windows :type canbus: CANBus | str, optional .. py:property:: sim_state :type: phoenix6.sim.candle_sim_state.CANdleSimState Get the simulation state for this device. This function reuses an allocated simulation state object, so it is safe to call this function multiple times in a robot loop. :returns: Simulation state :rtype: CANdleSimState .. py:attribute:: Configuration The configuration class for this device. .. py:attribute:: configurator .. py:method:: get_version_major(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] App Major Version number. - Minimum Value: 0 - Maximum Value: 255 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: VersionMajor Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_version_minor(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] App Minor Version number. - Minimum Value: 0 - Maximum Value: 255 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: VersionMinor Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_version_bugfix(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] App Bugfix Version number. - Minimum Value: 0 - Maximum Value: 255 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: VersionBugfix Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_version_build(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] App Build Version number. - Minimum Value: 0 - Maximum Value: 255 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: VersionBuild Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_version(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] Full Version of firmware in device. The format is a four byte value. - Minimum Value: 0 - Maximum Value: 4294967295 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Version Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_fault_field(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] Integer representing all fault flags reported by the device. These are device specific and are not used directly in typical applications. Use the signal specific GetFault_*() methods instead. - Minimum Value: 0 - Maximum Value: 4294967295 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: FaultField Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_sticky_fault_field(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] Integer representing all (persistent) sticky fault flags reported by the device. These are device specific and are not used directly in typical applications. Use the signal specific GetStickyFault_*() methods instead. - Minimum Value: 0 - Maximum Value: 4294967295 - Default Value: 0 - Units: Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFaultField Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_is_pro_licensed(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Whether the device is Phoenix Pro licensed. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: IsProLicensed Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_supply_voltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[phoenix6.units.volt] Measured supply voltage to the CANdle. - Minimum Value: 0.0 - Maximum Value: 32.767 - Default Value: 0 - Units: V Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: SupplyVoltage Status Signal Object :rtype: StatusSignal[volt] .. py:method:: get_five_v_rail_voltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[phoenix6.units.volt] The measured voltage of the 5V rail line. - Minimum Value: 0.0 - Maximum Value: 10.23 - Default Value: 0 - Units: V Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: FiveVRailVoltage Status Signal Object :rtype: StatusSignal[volt] .. py:method:: get_output_current(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[phoenix6.units.ampere] The measured output current. This includes both VBat and 5V output current. - Minimum Value: 0.0 - Maximum Value: 10.23 - Default Value: 0 - Units: A Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: OutputCurrent Status Signal Object :rtype: StatusSignal[ampere] .. py:method:: get_device_temp(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[phoenix6.units.celsius] The temperature that the CANdle measures itself to be at. - Minimum Value: -128 - Maximum Value: 127 - Default Value: 0 - Units: ℃ Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: DeviceTemp Status Signal Object :rtype: StatusSignal[celsius] .. py:method:: get_v_bat_modulation(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[float] The applied VBat modulation duty cycle. This signal will report 1.0 if the VBatOutputMode is configured to be always on, and 0.0 if configured to be always off. Otherwise, this will report the applied modulation from the last ModulateVBatOut request. - Minimum Value: 0.0 - Maximum Value: 1.0 - Default Value: 0 - Units: frac Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: VBatModulation Status Signal Object :rtype: StatusSignal[float] .. py:method:: get_max_simultaneous_animation_count(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[int] The maximum number of simultaneous animations supported by the current version of CANdle firmware. Any control request using an animation slot greater than or equal to this signal will be ignored. - Minimum Value: 0 - Maximum Value: 31 - Default Value: 0 - Units: Default Rates: - CAN 2.0: 10.0 Hz - CAN FD: 10.0 Hz (TimeSynced with Pro) This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: MaxSimultaneousAnimationCount Status Signal Object :rtype: StatusSignal[int] .. py:method:: get_fault_hardware(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Hardware fault occurred - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_Hardware Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_hardware(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Hardware fault occurred - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_Hardware Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_undervoltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device supply voltage dropped to near brownout levels - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_Undervoltage Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_undervoltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device supply voltage dropped to near brownout levels - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_Undervoltage Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_boot_during_enable(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device boot while detecting the enable signal - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_BootDuringEnable Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_boot_during_enable(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device boot while detecting the enable signal - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_BootDuringEnable Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_unlicensed_feature_in_use(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] An unlicensed feature is in use, device may not behave as expected. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_UnlicensedFeatureInUse Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_unlicensed_feature_in_use(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] An unlicensed feature is in use, device may not behave as expected. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_UnlicensedFeatureInUse Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_overvoltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device supply voltage is too high (above 30 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_Overvoltage Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_overvoltage(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device supply voltage is too high (above 30 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_Overvoltage Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_5_v_too_high(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device 5V line is too high (above 6 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_5VTooHigh Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_5_v_too_high(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device 5V line is too high (above 6 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_5VTooHigh Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_5_v_too_low(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device 5V line is too low (below 4 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_5VTooLow Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_5_v_too_low(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device 5V line is too low (below 4 V). - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_5VTooLow Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_thermal(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device temperature exceeded limit. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_Thermal Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_thermal(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] Device temperature exceeded limit. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_Thermal Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_software_fuse(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] CANdle output current exceeded the 6 A limit. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_SoftwareFuse Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_software_fuse(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] CANdle output current exceeded the 6 A limit. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_SoftwareFuse Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_fault_short_circuit(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] CANdle has detected the output pin is shorted. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: Fault_ShortCircuit Status Signal Object :rtype: StatusSignal[bool] .. py:method:: get_sticky_fault_short_circuit(refresh: bool = True) -> phoenix6.status_signal.StatusSignal[bool] CANdle has detected the output pin is shorted. - Default Value: False Default Rates: - CAN: 4.0 Hz This refreshes and returns a cached StatusSignal object. :param refresh: Whether to refresh the StatusSignal before returning it; defaults to true :type refresh: bool :returns: StickyFault_ShortCircuit Status Signal Object :rtype: StatusSignal[bool] .. py:method:: set_control(request: phoenix6.controls.modulate_v_bat_out.ModulateVBatOut) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.solid_color.SolidColor) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.empty_animation.EmptyAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.color_flow_animation.ColorFlowAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.fire_animation.FireAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.larson_animation.LarsonAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.rainbow_animation.RainbowAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.rgb_fade_animation.RgbFadeAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.single_fade_animation.SingleFadeAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.strobe_animation.StrobeAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.twinkle_animation.TwinkleAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.controls.twinkle_off_animation.TwinkleOffAnimation) -> phoenix6.status_code.StatusCode set_control(request: phoenix6.hardware.parent_device.SupportsSendRequest) -> phoenix6.status_code.StatusCode .. py:method:: clear_sticky_faults(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear the sticky faults in the device. This typically has no impact on the device functionality. Instead, it just clears telemetry faults that are accessible via API and Tuner Self-Test. :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_hardware(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Hardware fault occurred :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_undervoltage(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device supply voltage dropped to near brownout levels :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_boot_during_enable(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device boot while detecting the enable signal :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_unlicensed_feature_in_use(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: An unlicensed feature is in use, device may not behave as expected. :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_overvoltage(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device supply voltage is too high (above 30 V). :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_5_v_too_high(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device 5V line is too high (above 6 V). :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_5_v_too_low(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device 5V line is too low (below 4 V). :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_thermal(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: Device temperature exceeded limit. :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_software_fuse(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: CANdle output current exceeded the 6 A limit. :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode .. py:method:: clear_sticky_fault_short_circuit(timeout_seconds: phoenix6.units.second = 0.1) -> phoenix6.status_code.StatusCode Clear sticky fault: CANdle has detected the output pin is shorted. :param timeout_seconds: Maximum time to wait up to in seconds. :type timeout_seconds: second :returns: StatusCode of the set command :rtype: StatusCode