lanyard.health.LegacyBatteryPoll.1.0

Read the state of one battery pack. DEPRECATED -- use the BatteryStatus.2.0 message instead.

Full name lanyard.health.LegacyBatteryPoll
Version 1.0
Kind Service
Fixed port ID 258
Least supported transport Classic CAN

Wire layout

Section Extent (bytes) Max serialized (bytes)
Request 1 1
Response 6 6

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

# Read the state of one battery pack. DEPRECATED -- use the
# BatteryStatus.2.0 message instead.
#
# LEAST SUPPORTED TRANSPORT: Classic CAN.
#
# WHY IT IS STILL HERE: this is the showroom's deprecation example. The
# @deprecated directive marks a definition as scheduled for removal
# without deleting it, so that nodes still speaking it keep working
# while integrators migrate.
#
# WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
# ...` notice to this comment block and emits an IS_DEPRECATED constant,
# so the marking is visible to a developer who never opens the DSDL. Go
# picks it up as a real deprecation (its toolchain keys on a
# `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
# @deprecated */` JSDoc block, which is what tsc and editors read.
#
# C, C++, and Rust go further and add `__attribute__((deprecated))`,
# `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
# says it too. That is the default: a deprecation only a comment-reader
# can see is one nobody acts on. Each generated file silences the
# diagnostic across its own body, so including these headers is clean
# under -Werror and only your code naming the type is flagged. `dsdlc
# --no-deprecation-attributes` drops the attributes for a -Werror build
# that has nowhere to migrate to yet.
#
# Note the placement: @deprecated appears in the request section, ahead
# of the first attribute, and applies to the whole service. The language
# accepts it nowhere else -- not after a field, and not in the response
# section -- because a service is deprecated or not as a unit; you
# cannot retire half a request/response pair.
#
# MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
# which the pack publishes at 2 Hz on its own. Polling cost the bus a
# request and a response per pack per interval and gave the flight
# controller a scheduling problem it did not need.

@deprecated

uint8 battery_index
# Zero-based index of the pack to read.

@sealed

---

uint16 voltage_mv
# Pack terminal voltage in millivolts.

int16 current_ca
# Pack current in centiamperes. Positive is discharge.

uint8 remaining_pct
# State of charge as a percentage, 0 to 100.

int8 temperature_c
# Hottest cell temperature in whole degrees Celsius. Note that the
# replacement message reports temperature in kelvin via the standard SI
# type, so a migration is not a straight field copy.

@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

No aggregate declaration found in the generated artifact.

C++ (std)

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Request {
  // Zero-based index of the pack to read.
  std::uint8_t battery_index{};
  static constexpr const char* FULL_NAME = "lanyard.health.LegacyBatteryPoll.Request";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Request.1.0";
  static constexpr std::size_t EXTENT_BYTES = 1U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 1U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
};

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Response {
  // Pack terminal voltage in millivolts.
  std::uint16_t voltage_mv{};
  // Pack current in centiamperes. Positive is discharge.
  std::int16_t current_ca{};
  // State of charge as a percentage, 0 to 100.
  std::uint8_t remaining_pct{};
  // Hottest cell temperature in whole degrees Celsius. Note that the
  // replacement message reports temperature in kelvin via the standard SI
  // type, so a migration is not a straight field copy.
  std::int8_t temperature_c{};
  static constexpr const char* FULL_NAME = "lanyard.health.LegacyBatteryPoll.Response";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Response.1.0";
  static constexpr std::size_t EXTENT_BYTES = 6U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 6U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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.

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Request {
  // Zero-based index of the pack to read.
  std::uint8_t battery_index{};
  ::llvmdsdl::cpp::MemoryResource* _memory_resource{::llvmdsdl::cpp::default_memory_resource()};
  LegacyBatteryPoll__Request() = default;
  explicit LegacyBatteryPoll__Request(::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.health.LegacyBatteryPoll.Request";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Request.1.0";
  static constexpr std::size_t EXTENT_BYTES = 1U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 1U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__deserialize_(this, buffer, inout_buffer_size_bytes, memory_resource);
  }
};

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Response {
  // Pack terminal voltage in millivolts.
  std::uint16_t voltage_mv{};
  // Pack current in centiamperes. Positive is discharge.
  std::int16_t current_ca{};
  // State of charge as a percentage, 0 to 100.
  std::uint8_t remaining_pct{};
  // Hottest cell temperature in whole degrees Celsius. Note that the
  // replacement message reports temperature in kelvin via the standard SI
  // type, so a migration is not a straight field copy.
  std::int8_t temperature_c{};
  ::llvmdsdl::cpp::MemoryResource* _memory_resource{::llvmdsdl::cpp::default_memory_resource()};
  LegacyBatteryPoll__Response() = default;
  explicit LegacyBatteryPoll__Response(::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.health.LegacyBatteryPoll.Response";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Response.1.0";
  static constexpr std::size_t EXTENT_BYTES = 6U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 6U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__deserialize_(this, buffer, inout_buffer_size_bytes, memory_resource);
  }
};

C++ (autosar)

AUTOSAR C++14 subset profile.

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Request {
  // Zero-based index of the pack to read.
  std::uint8_t battery_index{};
  static constexpr const char* FULL_NAME = "lanyard.health.LegacyBatteryPoll.Request";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Request.1.0";
  static constexpr std::size_t EXTENT_BYTES = 1U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 1U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__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 LegacyBatteryPoll__Request__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
};

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
struct [[deprecated]] LegacyBatteryPoll__Response {
  // Pack terminal voltage in millivolts.
  std::uint16_t voltage_mv{};
  // Pack current in centiamperes. Positive is discharge.
  std::int16_t current_ca{};
  // State of charge as a percentage, 0 to 100.
  std::uint8_t remaining_pct{};
  // Hottest cell temperature in whole degrees Celsius. Note that the
  // replacement message reports temperature in kelvin via the standard SI
  // type, so a migration is not a straight field copy.
  std::int8_t temperature_c{};
  static constexpr const char* FULL_NAME = "lanyard.health.LegacyBatteryPoll.Response";
  static constexpr bool IS_DEPRECATED = true;
  static constexpr const char* FULL_NAME_AND_VERSION = "lanyard.health.LegacyBatteryPoll.Response.1.0";
  static constexpr std::size_t EXTENT_BYTES = 6U;
  static constexpr std::size_t SERIALIZATION_BUFFER_SIZE_BYTES = 6U;
  static constexpr bool ZOH_ALIAS_ELIGIBLE = true;
  static constexpr const char* ZOH_ALIAS_REASON = "eligible";
  LLVMDSDL_NODISCARD inline std::int8_t serialize(std::uint8_t* buffer, std::size_t* inout_buffer_size_bytes) const {
    return LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__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 LegacyBatteryPoll__Response__try_serialize_view_(view_bytes, view_size_bytes, buffer, inout_buffer_size_bytes);
  }
};

Rust (std)

/// Read the state of one battery pack. DEPRECATED -- use the
/// BatteryStatus.2.0 message instead.
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN.
/// 
/// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
/// @deprecated directive marks a definition as scheduled for removal
/// without deleting it, so that nodes still speaking it keep working
/// while integrators migrate.
/// 
/// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
/// ...` notice to this comment block and emits an IS_DEPRECATED constant,
/// so the marking is visible to a developer who never opens the DSDL. Go
/// picks it up as a real deprecation (its toolchain keys on a
/// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
/// @deprecated */` JSDoc block, which is what tsc and editors read.
/// 
/// C, C++, and Rust go further and add `__attribute__((deprecated))`,
/// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
/// says it too. That is the default: a deprecation only a comment-reader
/// can see is one nobody acts on. Each generated file silences the
/// diagnostic across its own body, so including these headers is clean
/// under -Werror and only your code naming the type is flagged. `dsdlc
/// --no-deprecation-attributes` drops the attributes for a -Werror build
/// that has nowhere to migrate to yet.
/// 
/// Note the placement: @deprecated appears in the request section, ahead
/// of the first attribute, and applies to the whole service. The language
/// accepts it nowhere else -- not after a field, and not in the response
/// section -- because a service is deprecated or not as a unit; you
/// cannot retire half a request/response pair.
/// 
/// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
/// which the pack publishes at 2 Hz on its own. Polling cost the bus a
/// request and a response per pack per interval and gave the flight
/// controller a scheduling problem it did not need.
/// 
/// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
/// in its DSDL definition and is scheduled for removal; migrate to a newer
/// version of this type.
#[deprecated]
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_health_LegacyBatteryPoll_1_0_Request {
    /// Zero-based index of the pack to read.
    pub battery_index: u8,
}

/// Read the state of one battery pack. DEPRECATED -- use the
/// BatteryStatus.2.0 message instead.
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN.
/// 
/// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
/// @deprecated directive marks a definition as scheduled for removal
/// without deleting it, so that nodes still speaking it keep working
/// while integrators migrate.
/// 
/// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
/// ...` notice to this comment block and emits an IS_DEPRECATED constant,
/// so the marking is visible to a developer who never opens the DSDL. Go
/// picks it up as a real deprecation (its toolchain keys on a
/// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
/// @deprecated */` JSDoc block, which is what tsc and editors read.
/// 
/// C, C++, and Rust go further and add `__attribute__((deprecated))`,
/// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
/// says it too. That is the default: a deprecation only a comment-reader
/// can see is one nobody acts on. Each generated file silences the
/// diagnostic across its own body, so including these headers is clean
/// under -Werror and only your code naming the type is flagged. `dsdlc
/// --no-deprecation-attributes` drops the attributes for a -Werror build
/// that has nowhere to migrate to yet.
/// 
/// Note the placement: @deprecated appears in the request section, ahead
/// of the first attribute, and applies to the whole service. The language
/// accepts it nowhere else -- not after a field, and not in the response
/// section -- because a service is deprecated or not as a unit; you
/// cannot retire half a request/response pair.
/// 
/// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
/// which the pack publishes at 2 Hz on its own. Polling cost the bus a
/// request and a response per pack per interval and gave the flight
/// controller a scheduling problem it did not need.
/// 
/// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
/// in its DSDL definition and is scheduled for removal; migrate to a newer
/// version of this type.
#[deprecated]
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_health_LegacyBatteryPoll_1_0_Response {
    /// Pack terminal voltage in millivolts.
    pub voltage_mv: u16,
    /// Pack current in centiamperes. Positive is discharge.
    pub current_ca: i16,
    /// State of charge as a percentage, 0 to 100.
    pub remaining_pct: u8,
    /// Hottest cell temperature in whole degrees Celsius. Note that the
    /// replacement message reports temperature in kelvin via the standard SI
    /// type, so a migration is not a straight field copy.
    pub temperature_c: i8,
}

Rust (no-std)

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

/// Read the state of one battery pack. DEPRECATED -- use the
/// BatteryStatus.2.0 message instead.
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN.
/// 
/// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
/// @deprecated directive marks a definition as scheduled for removal
/// without deleting it, so that nodes still speaking it keep working
/// while integrators migrate.
/// 
/// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
/// ...` notice to this comment block and emits an IS_DEPRECATED constant,
/// so the marking is visible to a developer who never opens the DSDL. Go
/// picks it up as a real deprecation (its toolchain keys on a
/// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
/// @deprecated */` JSDoc block, which is what tsc and editors read.
/// 
/// C, C++, and Rust go further and add `__attribute__((deprecated))`,
/// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
/// says it too. That is the default: a deprecation only a comment-reader
/// can see is one nobody acts on. Each generated file silences the
/// diagnostic across its own body, so including these headers is clean
/// under -Werror and only your code naming the type is flagged. `dsdlc
/// --no-deprecation-attributes` drops the attributes for a -Werror build
/// that has nowhere to migrate to yet.
/// 
/// Note the placement: @deprecated appears in the request section, ahead
/// of the first attribute, and applies to the whole service. The language
/// accepts it nowhere else -- not after a field, and not in the response
/// section -- because a service is deprecated or not as a unit; you
/// cannot retire half a request/response pair.
/// 
/// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
/// which the pack publishes at 2 Hz on its own. Polling cost the bus a
/// request and a response per pack per interval and gave the flight
/// controller a scheduling problem it did not need.
/// 
/// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
/// in its DSDL definition and is scheduled for removal; migrate to a newer
/// version of this type.
#[deprecated]
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_health_LegacyBatteryPoll_1_0_Request {
    /// Zero-based index of the pack to read.
    pub battery_index: u8,
}

/// Read the state of one battery pack. DEPRECATED -- use the
/// BatteryStatus.2.0 message instead.
/// 
/// LEAST SUPPORTED TRANSPORT: Classic CAN.
/// 
/// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
/// @deprecated directive marks a definition as scheduled for removal
/// without deleting it, so that nodes still speaking it keep working
/// while integrators migrate.
/// 
/// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
/// ...` notice to this comment block and emits an IS_DEPRECATED constant,
/// so the marking is visible to a developer who never opens the DSDL. Go
/// picks it up as a real deprecation (its toolchain keys on a
/// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
/// @deprecated */` JSDoc block, which is what tsc and editors read.
/// 
/// C, C++, and Rust go further and add `__attribute__((deprecated))`,
/// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
/// says it too. That is the default: a deprecation only a comment-reader
/// can see is one nobody acts on. Each generated file silences the
/// diagnostic across its own body, so including these headers is clean
/// under -Werror and only your code naming the type is flagged. `dsdlc
/// --no-deprecation-attributes` drops the attributes for a -Werror build
/// that has nowhere to migrate to yet.
/// 
/// Note the placement: @deprecated appears in the request section, ahead
/// of the first attribute, and applies to the whole service. The language
/// accepts it nowhere else -- not after a field, and not in the response
/// section -- because a service is deprecated or not as a unit; you
/// cannot retire half a request/response pair.
/// 
/// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
/// which the pack publishes at 2 Hz on its own. Polling cost the bus a
/// request and a response per pack per interval and gave the flight
/// controller a scheduling problem it did not need.
/// 
/// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
/// in its DSDL definition and is scheduled for removal; migrate to a newer
/// version of this type.
#[deprecated]
#[derive(Clone, Debug, PartialEq)]
pub struct lanyard_health_LegacyBatteryPoll_1_0_Response {
    /// Pack terminal voltage in millivolts.
    pub voltage_mv: u16,
    /// Pack current in centiamperes. Positive is discharge.
    pub current_ca: i16,
    /// State of charge as a percentage, 0 to 100.
    pub remaining_pct: u8,
    /// Hottest cell temperature in whole degrees Celsius. Note that the
    /// replacement message reports temperature in kelvin via the standard SI
    /// type, so a migration is not a straight field copy.
    pub temperature_c: i8,
}

Go

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
type LegacyBatteryPoll_1_0_Request struct {
  // Zero-based index of the pack to read.
  BatteryIndex uint8
}

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
// 
// Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
// in its DSDL definition and is scheduled for removal; migrate to a newer
// version of this type.
type LegacyBatteryPoll_1_0_Response struct {
  // Pack terminal voltage in millivolts.
  VoltageMv uint16
  // Pack current in centiamperes. Positive is discharge.
  CurrentCa int16
  // State of charge as a percentage, 0 to 100.
  RemainingPct uint8
  // Hottest cell temperature in whole degrees Celsius. Note that the
  // replacement message reports temperature in kelvin via the standard SI
  // type, so a migration is not a straight field copy.
  TemperatureC int8
}

TypeScript

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
/**
 * @deprecated lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated in its
 *   DSDL definition and is scheduled for removal; migrate to a newer
 *   version of this type.
 */
export interface LegacyBatteryPoll_1_0_Request {
  // Zero-based index of the pack to read.
  battery_index: number;
}

// Read the state of one battery pack. DEPRECATED -- use the
// BatteryStatus.2.0 message instead.
// 
// LEAST SUPPORTED TRANSPORT: Classic CAN.
// 
// WHY IT IS STILL HERE: this is the showroom's deprecation example. The
// @deprecated directive marks a definition as scheduled for removal
// without deleting it, so that nodes still speaking it keep working
// while integrators migrate.
// 
// WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
// ...` notice to this comment block and emits an IS_DEPRECATED constant,
// so the marking is visible to a developer who never opens the DSDL. Go
// picks it up as a real deprecation (its toolchain keys on a
// `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
// @deprecated */` JSDoc block, which is what tsc and editors read.
// 
// C, C++, and Rust go further and add `__attribute__((deprecated))`,
// `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
// says it too. That is the default: a deprecation only a comment-reader
// can see is one nobody acts on. Each generated file silences the
// diagnostic across its own body, so including these headers is clean
// under -Werror and only your code naming the type is flagged. `dsdlc
// --no-deprecation-attributes` drops the attributes for a -Werror build
// that has nowhere to migrate to yet.
// 
// Note the placement: @deprecated appears in the request section, ahead
// of the first attribute, and applies to the whole service. The language
// accepts it nowhere else -- not after a field, and not in the response
// section -- because a service is deprecated or not as a unit; you
// cannot retire half a request/response pair.
// 
// MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
// which the pack publishes at 2 Hz on its own. Polling cost the bus a
// request and a response per pack per interval and gave the flight
// controller a scheduling problem it did not need.
/**
 * @deprecated lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated in its
 *   DSDL definition and is scheduled for removal; migrate to a newer
 *   version of this type.
 */
export interface LegacyBatteryPoll_1_0_Response {
  // Pack terminal voltage in millivolts.
  voltage_mv: number;
  // Pack current in centiamperes. Positive is discharge.
  current_ca: number;
  // State of charge as a percentage, 0 to 100.
  remaining_pct: number;
  // Hottest cell temperature in whole degrees Celsius. Note that the
  // replacement message reports temperature in kelvin via the standard SI
  // type, so a migration is not a straight field copy.
  temperature_c: number;
}

export type LegacyBatteryPoll_1_0 = LegacyBatteryPoll_1_0_Request;

Python

# Read the state of one battery pack. DEPRECATED -- use the
# BatteryStatus.2.0 message instead.
# 
# LEAST SUPPORTED TRANSPORT: Classic CAN.
# 
# WHY IT IS STILL HERE: this is the showroom's deprecation example. The
# @deprecated directive marks a definition as scheduled for removal
# without deleting it, so that nodes still speaking it keep working
# while integrators migrate.
# 
# WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
# ...` notice to this comment block and emits an IS_DEPRECATED constant,
# so the marking is visible to a developer who never opens the DSDL. Go
# picks it up as a real deprecation (its toolchain keys on a
# `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
# @deprecated */` JSDoc block, which is what tsc and editors read.
# 
# C, C++, and Rust go further and add `__attribute__((deprecated))`,
# `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
# says it too. That is the default: a deprecation only a comment-reader
# can see is one nobody acts on. Each generated file silences the
# diagnostic across its own body, so including these headers is clean
# under -Werror and only your code naming the type is flagged. `dsdlc
# --no-deprecation-attributes` drops the attributes for a -Werror build
# that has nowhere to migrate to yet.
# 
# Note the placement: @deprecated appears in the request section, ahead
# of the first attribute, and applies to the whole service. The language
# accepts it nowhere else -- not after a field, and not in the response
# section -- because a service is deprecated or not as a unit; you
# cannot retire half a request/response pair.
# 
# MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
# which the pack publishes at 2 Hz on its own. Polling cost the bus a
# request and a response per pack per interval and gave the flight
# controller a scheduling problem it did not need.
# 
# Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
# in its DSDL definition and is scheduled for removal; migrate to a newer
# version of this type.
@dataclass(slots=True)
class LegacyBatteryPoll_1_0_Request:
    # Zero-based index of the pack to read.
    battery_index: int = 0

# Read the state of one battery pack. DEPRECATED -- use the
# BatteryStatus.2.0 message instead.
# 
# LEAST SUPPORTED TRANSPORT: Classic CAN.
# 
# WHY IT IS STILL HERE: this is the showroom's deprecation example. The
# @deprecated directive marks a definition as scheduled for removal
# without deleting it, so that nodes still speaking it keep working
# while integrators migrate.
# 
# WHAT THE GENERATED CODE CARRIES: every backend appends a `Deprecated:
# ...` notice to this comment block and emits an IS_DEPRECATED constant,
# so the marking is visible to a developer who never opens the DSDL. Go
# picks it up as a real deprecation (its toolchain keys on a
# `Deprecated: ` doc paragraph), and TypeScript additionally gets a `/**
# @deprecated */` JSDoc block, which is what tsc and editors read.
# 
# C, C++, and Rust go further and add `__attribute__((deprecated))`,
# `[[deprecated]]`, and `#[deprecated]` respectively, so the compiler
# says it too. That is the default: a deprecation only a comment-reader
# can see is one nobody acts on. Each generated file silences the
# diagnostic across its own body, so including these headers is clean
# under -Werror and only your code naming the type is flagged. `dsdlc
# --no-deprecation-attributes` drops the attributes for a -Werror build
# that has nowhere to migrate to yet.
# 
# Note the placement: @deprecated appears in the request section, ahead
# of the first attribute, and applies to the whole service. The language
# accepts it nowhere else -- not after a field, and not in the response
# section -- because a service is deprecated or not as a unit; you
# cannot retire half a request/response pair.
# 
# MIGRATION: subscribe to lanyard.health.BatteryStatus.2.0 (port 6251),
# which the pack publishes at 2 Hz on its own. Polling cost the bus a
# request and a response per pack per interval and gave the flight
# controller a scheduling problem it did not need.
# 
# Deprecated: lanyard.health.LegacyBatteryPoll.1.0 is marked @deprecated
# in its DSDL definition and is scheduled for removal; migrate to a newer
# version of this type.
@dataclass(slots=True)
class LegacyBatteryPoll_1_0_Response:
    # Pack terminal voltage in millivolts.
    voltage_mv: int = 0
    # Pack current in centiamperes. Positive is discharge.
    current_ca: int = 0
    # State of charge as a percentage, 0 to 100.
    remaining_pct: int = 0
    # Hottest cell temperature in whole degrees Celsius. Note that the
    # replacement message reports temperature in kelvin via the standard SI
    # type, so a migration is not a straight field copy.
    temperature_c: int = 0

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