lanyard.propulsion.EscStatus.1.0

High-rate telemetry from a single electronic speed controller (ESC).

Full name lanyard.propulsion.EscStatus
Version 1.0
Kind Message
Fixed port ID 6200
Least supported transport Classic CAN (CAN 2.0B)

Wire layout

Section Extent (bytes) Max serialized (bytes)
Message 7 7

A sealed type reports its extent as its exact serialized size; a delimited type reports the declared @extent, which bounds what a reader must be prepared to receive.

Definition

# High-rate telemetry from a single electronic speed controller (ESC).
#
# LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
# is sealed and hand-packed so that a complete serialized value fits
# inside the seven payload bytes of one classic-CAN frame, leaving the
# eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
# would cost an extra transfer-CRC and would make the message
# vulnerable to frame loss, which is unacceptable for a value published
# at 100 Hz per ESC on a shared bus.
#
# WHY SEALED: sealing removes the four-byte delimiter header that a
# delimited (extensible) type carries, and it lets the serializer emit
# a fixed-size, fully static layout. The price is that this definition
# can never gain a field: any addition is a breaking change requiring a
# new major version. See EscStatus.2.0 for the extensible successor and
# the reasoning behind the migration.
#
# The scaled-integer fields below are the classic embedded trade: they
# cost a multiply on each side but a fraction of the bits that an IEEE
# 754 float would.

uint14 erpm_x10
# Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
# by the motor pole pair count to recover mechanical RPM. Range 0 to
# 163,830 eRPM, which covers every rotorcraft ESC in the fleet.

uint12 dc_voltage_dv
# DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.

int12 dc_current_da
# DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
# A. Negative values indicate regenerative braking current flowing back
# into the pack.

int9 motor_temperature_c
# Motor winding temperature in whole degrees Celsius, range -256 to
# +255. Whole degrees are adequate because the thermal time constant of
# a motor is measured in tens of seconds.

uint4 error_flags
# Bit mask of latched controller faults. Cleared when the controller is
# re-armed.
#   bit 0 - over-current trip
#   bit 1 - over-temperature trip
#   bit 2 - desynchronization detected
#   bit 3 - supply under-voltage

void5
# Explicit padding to a whole number of bytes. Void fields are
# serialized as zeros and are not surfaced in generated code; they exist
# so that the wire layout is byte-aligned by construction rather than by
# accident.

@assert _offset_.max == 56
# The single-frame classic-CAN budget, asserted rather than merely
# documented. Adding a field or widening one breaks this build instead
# of silently pushing the message into a multi-frame transfer.

@sealed

Generated code

Declaration excerpts only -- the serialization bodies are omitted for length. Build the showroom target for the complete output in every language and profile.

C

/* High-rate telemetry from a single electronic speed controller (ESC). */
/*  */
/* LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition */
/* is sealed and hand-packed so that a complete serialized value fits */
/* inside the seven payload bytes of one classic-CAN frame, leaving the */
/* eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer */
/* would cost an extra transfer-CRC and would make the message */
/* vulnerable to frame loss, which is unacceptable for a value published */
/* at 100 Hz per ESC on a shared bus. */
/*  */
/* WHY SEALED: sealing removes the four-byte delimiter header that a */
/* delimited (extensible) type carries, and it lets the serializer emit */
/* a fixed-size, fully static layout. The price is that this definition */
/* can never gain a field: any addition is a breaking change requiring a */
/* new major version. See EscStatus.2.0 for the extensible successor and */
/* the reasoning behind the migration. */
/*  */
/* The scaled-integer fields below are the classic embedded trade: they */
/* cost a multiply on each side but a fraction of the bits that an IEEE */
/* 754 float would. */
typedef struct lanyard__propulsion__EscStatus {
  /* Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide */
  /* by the motor pole pair count to recover mechanical RPM. Range 0 to */
  /* 163,830 eRPM, which covers every rotorcraft ESC in the fleet. */
  uint16_t erpm_x10;
  /* DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V. */
  uint16_t dc_voltage_dv;
  /* DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7 */
  /* A. Negative values indicate regenerative braking current flowing back */
  /* into the pack. */
  int16_t dc_current_da;
  /* Motor winding temperature in whole degrees Celsius, range -256 to */
  /* +255. Whole degrees are adequate because the thermal time constant of */
  /* a motor is measured in tens of seconds. */
  int16_t motor_temperature_c;
  /* Bit mask of latched controller faults. Cleared when the controller is */
  /* re-armed. */
  /*   bit 0 - over-current trip */
  /*   bit 1 - over-temperature trip */
  /*   bit 2 - desynchronization detected */
  /*   bit 3 - supply under-voltage */
  uint8_t error_flags;
} lanyard__propulsion__EscStatus;

C++ (std)

// High-rate telemetry from a single electronic speed controller (ESC).
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
// is sealed and hand-packed so that a complete serialized value fits
// inside the seven payload bytes of one classic-CAN frame, leaving the
// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
// would cost an extra transfer-CRC and would make the message
// vulnerable to frame loss, which is unacceptable for a value published
// at 100 Hz per ESC on a shared bus.
// 
// WHY SEALED: sealing removes the four-byte delimiter header that a
// delimited (extensible) type carries, and it lets the serializer emit
// a fixed-size, fully static layout. The price is that this definition
// can never gain a field: any addition is a breaking change requiring a
// new major version. See EscStatus.2.0 for the extensible successor and
// the reasoning behind the migration.
// 
// The scaled-integer fields below are the classic embedded trade: they
// cost a multiply on each side but a fraction of the bits that an IEEE
// 754 float would.
struct EscStatus_1_0 {
  // Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
  // by the motor pole pair count to recover mechanical RPM. Range 0 to
  // 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
  std::uint16_t erpm_x10{};
  // DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
  std::uint16_t dc_voltage_dv{};
  // DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
  // A. Negative values indicate regenerative braking current flowing back
  // into the pack.
  std::int16_t dc_current_da{};
  // Motor winding temperature in whole degrees Celsius, range -256 to
  // +255. Whole degrees are adequate because the thermal time constant of
  // a motor is measured in tens of seconds.
  std::int16_t motor_temperature_c{};
  // Bit mask of latched controller faults. Cleared when the controller is
  // re-armed.
  //   bit 0 - over-current trip
  //   bit 1 - over-temperature trip
  //   bit 2 - desynchronization detected
  //   bit 3 - supply under-voltage
  std::uint8_t error_flags{};
  static constexpr const char* FULL_NAME = "lanyard.propulsion.EscStatus";
  static constexpr bool IS_DEPRECATED = false;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.propulsion.EscStatus.1.0";
  static constexpr std::size_t EXTENT_BYTES = 7U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 7U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = false;
  static constexpr const char* ZOH_ALIAS_REASON = "sub-byte-field";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return EscStatus_1_0__serialize_(this, buffer, inout_buffer_size_bytes);
  }
  LLVMDSDL_NODISCARD inline std::int8_t deserialize(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__deserialize_(this, buffer, inout_buffer_size_bytes);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_deserialize_view(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes, const std::uint8_t** out_view_bytes) {
    return EscStatus_1_0__try_deserialize_view_(buffer, inout_buffer_size_bytes, out_view_bytes);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_serialize_view(const std::uint8_t* view_bytes, std::size_t view_size_bytes, std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
};

C++ (pmr)

Polymorphic-allocator profile: variable-length fields route through std::pmr.

// High-rate telemetry from a single electronic speed controller (ESC).
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
// is sealed and hand-packed so that a complete serialized value fits
// inside the seven payload bytes of one classic-CAN frame, leaving the
// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
// would cost an extra transfer-CRC and would make the message
// vulnerable to frame loss, which is unacceptable for a value published
// at 100 Hz per ESC on a shared bus.
// 
// WHY SEALED: sealing removes the four-byte delimiter header that a
// delimited (extensible) type carries, and it lets the serializer emit
// a fixed-size, fully static layout. The price is that this definition
// can never gain a field: any addition is a breaking change requiring a
// new major version. See EscStatus.2.0 for the extensible successor and
// the reasoning behind the migration.
// 
// The scaled-integer fields below are the classic embedded trade: they
// cost a multiply on each side but a fraction of the bits that an IEEE
// 754 float would.
struct EscStatus_1_0 {
  // Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
  // by the motor pole pair count to recover mechanical RPM. Range 0 to
  // 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
  std::uint16_t erpm_x10{};
  // DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
  std::uint16_t dc_voltage_dv{};
  // DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
  // A. Negative values indicate regenerative braking current flowing back
  // into the pack.
  std::int16_t dc_current_da{};
  // Motor winding temperature in whole degrees Celsius, range -256 to
  // +255. Whole degrees are adequate because the thermal time constant of
  // a motor is measured in tens of seconds.
  std::int16_t motor_temperature_c{};
  // Bit mask of latched controller faults. Cleared when the controller is
  // re-armed.
  //   bit 0 - over-current trip
  //   bit 1 - over-temperature trip
  //   bit 2 - desynchronization detected
  //   bit 3 - supply under-voltage
  std::uint8_t error_flags{};
  ::llvmdsdl::cpp::MemoryResource* _memory_resource{::llvmdsdl::cpp::default_memory_resource()};
  EscStatus_1_0() = default;
  explicit EscStatus_1_0(::llvmdsdl::cpp::MemoryResource* memory_resource) { set_memory_resource(memory_resource); }
  void set_memory_resource(::llvmdsdl::cpp::MemoryResource* memory_resource) {
    _memory_resource = (memory_resource != nullptr) ? memory_resource : ::llvmdsdl::cpp::default_memory_resource();
  }
  static constexpr const char* FULL_NAME = "lanyard.propulsion.EscStatus";
  static constexpr bool IS_DEPRECATED = false;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.propulsion.EscStatus.1.0";
  static constexpr std::size_t EXTENT_BYTES = 7U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 7U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = false;
  static constexpr const char* ZOH_ALIAS_REASON = "sub-byte-field";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return EscStatus_1_0__serialize_(this, buffer, inout_buffer_size_bytes, _memory_resource);
  }
  LLVMDSDL_NODISCARD inline std::int8_t deserialize(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__deserialize_(this, buffer, inout_buffer_size_bytes, _memory_resource);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_deserialize_view(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes, const std::uint8_t** out_view_bytes) {
    return EscStatus_1_0__try_deserialize_view_(buffer, inout_buffer_size_bytes, out_view_bytes);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_serialize_view(const std::uint8_t* view_bytes, std::size_t view_size_bytes, std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes, ::llvmdsdl::cpp::MemoryResource* memory_resource) const {
    return EscStatus_1_0__serialize_(this, buffer, inout_buffer_size_bytes, memory_resource);
  }
  LLVMDSDL_NODISCARD inline std::int8_t deserialize(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes, ::llvmdsdl::cpp::MemoryResource* memory_resource) {
    return EscStatus_1_0__deserialize_(this, buffer, inout_buffer_size_bytes, memory_resource);
  }
};

C++ (autosar)

AUTOSAR C++14 subset profile.

// High-rate telemetry from a single electronic speed controller (ESC).
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
// is sealed and hand-packed so that a complete serialized value fits
// inside the seven payload bytes of one classic-CAN frame, leaving the
// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
// would cost an extra transfer-CRC and would make the message
// vulnerable to frame loss, which is unacceptable for a value published
// at 100 Hz per ESC on a shared bus.
// 
// WHY SEALED: sealing removes the four-byte delimiter header that a
// delimited (extensible) type carries, and it lets the serializer emit
// a fixed-size, fully static layout. The price is that this definition
// can never gain a field: any addition is a breaking change requiring a
// new major version. See EscStatus.2.0 for the extensible successor and
// the reasoning behind the migration.
// 
// The scaled-integer fields below are the classic embedded trade: they
// cost a multiply on each side but a fraction of the bits that an IEEE
// 754 float would.
struct EscStatus_1_0 {
  // Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
  // by the motor pole pair count to recover mechanical RPM. Range 0 to
  // 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
  std::uint16_t erpm_x10{};
  // DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
  std::uint16_t dc_voltage_dv{};
  // DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
  // A. Negative values indicate regenerative braking current flowing back
  // into the pack.
  std::int16_t dc_current_da{};
  // Motor winding temperature in whole degrees Celsius, range -256 to
  // +255. Whole degrees are adequate because the thermal time constant of
  // a motor is measured in tens of seconds.
  std::int16_t motor_temperature_c{};
  // Bit mask of latched controller faults. Cleared when the controller is
  // re-armed.
  //   bit 0 - over-current trip
  //   bit 1 - over-temperature trip
  //   bit 2 - desynchronization detected
  //   bit 3 - supply under-voltage
  std::uint8_t error_flags{};
  static constexpr const char* FULL_NAME = "lanyard.propulsion.EscStatus";
  static constexpr bool IS_DEPRECATED = false;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.propulsion.EscStatus.1.0";
  static constexpr std::size_t EXTENT_BYTES = 7U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 7U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = false;
  static constexpr const char* ZOH_ALIAS_REASON = "sub-byte-field";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return EscStatus_1_0__serialize_(this, buffer, inout_buffer_size_bytes);
  }
  LLVMDSDL_NODISCARD inline std::int8_t deserialize(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__deserialize_(this, buffer, inout_buffer_size_bytes);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_deserialize_view(const std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes, const std::uint8_t** out_view_bytes) {
    return EscStatus_1_0__try_deserialize_view_(buffer, inout_buffer_size_bytes, out_view_bytes);
  }
  LLVMDSDL_NODISCARD static inline std::int8_t try_serialize_view(const std::uint8_t* view_bytes, std::size_t view_size_bytes, std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) {
    return EscStatus_1_0__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
};

Rust (std)

/// High-rate telemetry from a single electronic speed controller (ESC).
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
/// is sealed and hand-packed so that a complete serialized value fits
/// inside the seven payload bytes of one classic-CAN frame, leaving the
/// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
/// would cost an extra transfer-CRC and would make the message
/// vulnerable to frame loss, which is unacceptable for a value published
/// at 100 Hz per ESC on a shared bus.
/// 
/// WHY SEALED: sealing removes the four-byte delimiter header that a
/// delimited (extensible) type carries, and it lets the serializer emit
/// a fixed-size, fully static layout. The price is that this definition
/// can never gain a field: any addition is a breaking change requiring a
/// new major version. See EscStatus.2.0 for the extensible successor and
/// the reasoning behind the migration.
/// 
/// The scaled-integer fields below are the classic embedded trade: they
/// cost a multiply on each side but a fraction of the bits that an IEEE
/// 754 float would.
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_propulsion_EscStatus_1_0 {
    /// Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
    /// by the motor pole pair count to recover mechanical RPM. Range 0 to
    /// 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
    pub erpm_x10: u16,
    /// DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
    pub dc_voltage_dv: u16,
    /// DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
    /// A. Negative values indicate regenerative braking current flowing back
    /// into the pack.
    pub dc_current_da: i16,
    /// Motor winding temperature in whole degrees Celsius, range -256 to
    /// +255. Whole degrees are adequate because the thermal time constant of
    /// a motor is measured in tens of seconds.
    pub motor_temperature_c: i16,
    /// Bit mask of latched controller faults. Cleared when the controller is
    /// re-armed.
    ///   bit 0 - over-current trip
    ///   bit 1 - over-temperature trip
    ///   bit 2 - desynchronization detected
    ///   bit 3 - supply under-voltage
    pub error_flags: u8,
}

Rust (no-std)

no_std + alloc profile, as a flight-controller firmware build would use.

/// High-rate telemetry from a single electronic speed controller (ESC).
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
/// is sealed and hand-packed so that a complete serialized value fits
/// inside the seven payload bytes of one classic-CAN frame, leaving the
/// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
/// would cost an extra transfer-CRC and would make the message
/// vulnerable to frame loss, which is unacceptable for a value published
/// at 100 Hz per ESC on a shared bus.
/// 
/// WHY SEALED: sealing removes the four-byte delimiter header that a
/// delimited (extensible) type carries, and it lets the serializer emit
/// a fixed-size, fully static layout. The price is that this definition
/// can never gain a field: any addition is a breaking change requiring a
/// new major version. See EscStatus.2.0 for the extensible successor and
/// the reasoning behind the migration.
/// 
/// The scaled-integer fields below are the classic embedded trade: they
/// cost a multiply on each side but a fraction of the bits that an IEEE
/// 754 float would.
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_propulsion_EscStatus_1_0 {
    /// Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
    /// by the motor pole pair count to recover mechanical RPM. Range 0 to
    /// 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
    pub erpm_x10: u16,
    /// DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
    pub dc_voltage_dv: u16,
    /// DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
    /// A. Negative values indicate regenerative braking current flowing back
    /// into the pack.
    pub dc_current_da: i16,
    /// Motor winding temperature in whole degrees Celsius, range -256 to
    /// +255. Whole degrees are adequate because the thermal time constant of
    /// a motor is measured in tens of seconds.
    pub motor_temperature_c: i16,
    /// Bit mask of latched controller faults. Cleared when the controller is
    /// re-armed.
    ///   bit 0 - over-current trip
    ///   bit 1 - over-temperature trip
    ///   bit 2 - desynchronization detected
    ///   bit 3 - supply under-voltage
    pub error_flags: u8,
}

Go

// High-rate telemetry from a single electronic speed controller (ESC).
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
// is sealed and hand-packed so that a complete serialized value fits
// inside the seven payload bytes of one classic-CAN frame, leaving the
// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
// would cost an extra transfer-CRC and would make the message
// vulnerable to frame loss, which is unacceptable for a value published
// at 100 Hz per ESC on a shared bus.
// 
// WHY SEALED: sealing removes the four-byte delimiter header that a
// delimited (extensible) type carries, and it lets the serializer emit
// a fixed-size, fully static layout. The price is that this definition
// can never gain a field: any addition is a breaking change requiring a
// new major version. See EscStatus.2.0 for the extensible successor and
// the reasoning behind the migration.
// 
// The scaled-integer fields below are the classic embedded trade: they
// cost a multiply on each side but a fraction of the bits that an IEEE
// 754 float would.
type EscStatus_1_0 struct {
  // Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
  // by the motor pole pair count to recover mechanical RPM. Range 0 to
  // 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
  ErpmX10 uint16
  // DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
  DcVoltageDv uint16
  // DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
  // A. Negative values indicate regenerative braking current flowing back
  // into the pack.
  DcCurrentDa int16
  // Motor winding temperature in whole degrees Celsius, range -256 to
  // +255. Whole degrees are adequate because the thermal time constant of
  // a motor is measured in tens of seconds.
  MotorTemperatureC int16
  // Bit mask of latched controller faults. Cleared when the controller is
  // re-armed.
  //   bit 0 - over-current trip
  //   bit 1 - over-temperature trip
  //   bit 2 - desynchronization detected
  //   bit 3 - supply under-voltage
  ErrorFlags uint8
}

TypeScript

// High-rate telemetry from a single electronic speed controller (ESC).
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
// is sealed and hand-packed so that a complete serialized value fits
// inside the seven payload bytes of one classic-CAN frame, leaving the
// eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
// would cost an extra transfer-CRC and would make the message
// vulnerable to frame loss, which is unacceptable for a value published
// at 100 Hz per ESC on a shared bus.
// 
// WHY SEALED: sealing removes the four-byte delimiter header that a
// delimited (extensible) type carries, and it lets the serializer emit
// a fixed-size, fully static layout. The price is that this definition
// can never gain a field: any addition is a breaking change requiring a
// new major version. See EscStatus.2.0 for the extensible successor and
// the reasoning behind the migration.
// 
// The scaled-integer fields below are the classic embedded trade: they
// cost a multiply on each side but a fraction of the bits that an IEEE
// 754 float would.
export interface EscStatus_1_0 {
  // Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
  // by the motor pole pair count to recover mechanical RPM. Range 0 to
  // 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
  erpm_x10: number;
  // DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
  dc_voltage_dv: number;
  // DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
  // A. Negative values indicate regenerative braking current flowing back
  // into the pack.
  dc_current_da: number;
  // Motor winding temperature in whole degrees Celsius, range -256 to
  // +255. Whole degrees are adequate because the thermal time constant of
  // a motor is measured in tens of seconds.
  motor_temperature_c: number;
  // Bit mask of latched controller faults. Cleared when the controller is
  // re-armed.
  //   bit 0 - over-current trip
  //   bit 1 - over-temperature trip
  //   bit 2 - desynchronization detected
  //   bit 3 - supply under-voltage
  error_flags: number;
}

Python

# High-rate telemetry from a single electronic speed controller (ESC).
# 
# LEAST SUPPORTED TRANSPORT: Classic CAN (CAN 2.0B). This definition
# is sealed and hand-packed so that a complete serialized value fits
# inside the seven payload bytes of one classic-CAN frame, leaving the
# eighth byte for the Cyphal/CAN tail byte. A multi-frame transfer
# would cost an extra transfer-CRC and would make the message
# vulnerable to frame loss, which is unacceptable for a value published
# at 100 Hz per ESC on a shared bus.
# 
# WHY SEALED: sealing removes the four-byte delimiter header that a
# delimited (extensible) type carries, and it lets the serializer emit
# a fixed-size, fully static layout. The price is that this definition
# can never gain a field: any addition is a breaking change requiring a
# new major version. See EscStatus.2.0 for the extensible successor and
# the reasoning behind the migration.
# 
# The scaled-integer fields below are the classic embedded trade: they
# cost a multiply on each side but a fraction of the bits that an IEEE
# 754 float would.
@dataclass(slots=True)
class EscStatus_1_0:
    # Electrical RPM divided by ten. Multiply by ten to recover eRPM; divide
    # by the motor pole pair count to recover mechanical RPM. Range 0 to
    # 163,830 eRPM, which covers every rotorcraft ESC in the fleet.
    erpm_x10: int = 0
    # DC bus voltage in decivolts (0.1 V per LSB). Range 0 to 409.5 V.
    dc_voltage_dv: int = 0
    # DC bus current in deciamperes (0.1 A per LSB). Range -204.8 to +204.7
    # A. Negative values indicate regenerative braking current flowing back
    # into the pack.
    dc_current_da: int = 0
    # Motor winding temperature in whole degrees Celsius, range -256 to
    # +255. Whole degrees are adequate because the thermal time constant of
    # a motor is measured in tens of seconds.
    motor_temperature_c: int = 0
    # Bit mask of latched controller faults. Cleared when the controller is
    # re-armed.
    #   bit 0 - over-current trip
    #   bit 1 - over-temperature trip
    #   bit 2 - desynchronization detected
    #   bit 3 - supply under-voltage
    error_flags: int = 0

Every build recipe compiles this definition along with the rest of the namespace.