VelocAI logo Bluetooth Explorer Documentation

Bluetooth GATT Characteristic Reference

Cross Trainer Data (0x2ACE)

org.bluetooth.characteristic.cross_trainer_data

The Cross Trainer Data characteristic is used to send training-related data to the Client from a cross trainer (Server).

Quick Summary

Payload length is 41 bytes. This page is generated from official GATT XML and presented as implementation-ready guidance.

At a Glance

Key reference details for BLE implementation, interoperability testing, and AI-assisted troubleshooting.

PropertyValue
NameCross Trainer Data
UUID0x2ACE
Typeorg.bluetooth.characteristic.cross_trainer_data
XML RootCharacteristic
Source Fileorg.bluetooth.characteristic.cross_trainer_data.xml
Field Count21

Field Specification

Parsed field definitions from the source XML value structure.

Field Requirement Format Unit Exponent Notes
FlagsMandatory24bit---
Instantaneous SpeedC1uint16org.bluetooth.unit.velocity.kilometre_per_hour-2Kilometer per hour with a resolution of 0.01
Average SpeedC2uint16org.bluetooth.unit.velocity.kilometre_per_hour-2Kilometer per hour with a resolution of 0.01
Total DistanceC3uint24org.bluetooth.unit.length.metre-Meters with a resolution of 1
Step Per MinuteC4uint16org.bluetooth.unit.step_per_minute-Step/minute with a resolution of 1
Average Step RateC4uint16org.bluetooth.unit.step_per_minute-Step/minute with a resolution of 1
Stride CountC5uint16org.bluetooth.unit.unitless-1Unitless with a resolution of 0.1
Positive Elevation GainC6uint16org.bluetooth.unit.length.metre-Meters with a resolution of 1
Negative Elevation GainC6uint16org.bluetooth.unit.length.metre-Meters with a resolution of 1
InclinationC7sint16org.bluetooth.unit.percentage-1Percent with a resolution of 0.1
Ramp Angle SettingC7sint16org.bluetooth.unit.plane_angle.degree-1Degree with a resolution of 0.1
Resistance LevelC8sint16org.bluetooth.unit.unitless-1Unitless with a resolution of 0.1
Instantaneous PowerC9sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Average PowerC10sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Total EnergyC11uint16org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Energy Per HourC11uint16org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Energy Per MinuteC11uint8org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Heart RateC12uint8org.bluetooth.unit.period.beats_per_minute-Beats per minute with a resolution of 1
Metabolic EquivalentC13uint8org.bluetooth.unit.metabolic_equivalent-1Metabolic Equivalent with a resolution of 0.1
Elapsed TimeC14uint16org.bluetooth.unit.time.second-Second with a resolution of 1
Remaining TimeC15uint16org.bluetooth.unit.time.second-Second with a resolution of 1

Bit Map

Bit-level enumerations extracted from the XML BitField definition.

Field Bit Size Name 0 Means 1 Means
Flags01More DataFalseTrue
Flags11Average Speed presentFalseTrue
Flags21Total Distance PresentFalseTrue
Flags31Step Count presentFalseTrue
Flags41Stride Count presentFalseTrue
Flags51Elevation Gain presentFalseTrue
Flags61Inclination and Ramp Angle Setting presentFalseTrue
Flags71Resistance Level PresentFalseTrue
Flags81Instantaneous Power presentFalseTrue
Flags91Average Power presentFalseTrue
Flags101Expended Energy presentFalseTrue
Flags111Heart Rate presentFalseTrue
Flags121Metabolic Equivalent presentFalseTrue
Flags131Elapsed Time presentFalseTrue
Flags141Remaining Time presentFalseTrue
Flags151Movement DirectionForwardBackward

Byte Layout and Decode

Payload length is 41 bytes.

function decodePayload(dataView, offset = 0) {
  // Parse flags (24bit) according to Bluetooth format rules.
  const instantaneous_speed = dataView.getUint16(offset + 0, true);
  const average_speed = dataView.getUint16(offset + 2, true);
  // Parse total_distance (uint24) according to Bluetooth format rules.
  const step_per_minute = dataView.getUint16(offset + 4, true);
  const average_step_rate = dataView.getUint16(offset + 6, true);
  const stride_count = dataView.getUint16(offset + 8, true);
  const positive_elevation_gain = dataView.getUint16(offset + 10, true);
  const negative_elevation_gain = dataView.getUint16(offset + 12, true);
  const inclination = dataView.getInt16(offset + 14, true);
  return { flags, instantaneous_speed, average_speed, total_distance, step_per_minute, average_step_rate };
}

Use Cases and Integration Notes

BLE Telemetry

Map characteristic values into dashboards and alerts for device observability.

Firmware Regression

Compare decoded fields across builds to detect protocol or scaling changes.

App Integration

Build stable parsing paths that convert raw payloads into typed app models.

Implementation Checklist

  • Validate payload length and mandatory fields before decode.
  • Decode with Bluetooth-specified signedness, unit, and exponent handling.
  • Convert units at presentation boundaries to avoid drift in business logic.
  • Persist raw packets and decoded values for reproducible troubleshooting.

FAQ

What is Cross Trainer Data in Bluetooth GATT?

Cross Trainer Data is defined as a Bluetooth GATT characteristic entry with type org.bluetooth.characteristic.cross_trainer_data and UUID 0x2ACE.

What UUID identifies Cross Trainer Data?

The UUID for Cross Trainer Data is 0x2ACE.

How should I parse Cross Trainer Data?

Payload length is 41 bytes.

Where does this definition come from?

This page is generated from the Bluetooth SIG mirror XML in the oesmith/gatt-xml repository.

How does this page support BLE implementation?

The page combines structured tables, practical Q&A, and JSON-LD metadata to help teams validate integrations and troubleshoot consistently.