diff --git a/README.md b/README.md
index 294f931..90a6c45 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ encode policies): [`docs/CAPABILITY_BOUNDARY.md`](docs/CAPABILITY_BOUNDARY.md).
Long-term strict-conformance **roadmap** (target architecture, not current
guarantees): [`docs/FIT_CONFORMANCE_DESIGN.md`](docs/FIT_CONFORMANCE_DESIGN.md).
-Profile in use: `21.213.0` (`fit_tool.SDK_VERSION`).
+Profile in use: `21.218.0` (`fit_tool.SDK_VERSION`).
## Installation
diff --git a/docs/CAPABILITY_BOUNDARY.md b/docs/CAPABILITY_BOUNDARY.md
index e2f40b2..b911e6b 100644
--- a/docs/CAPABILITY_BOUNDARY.md
+++ b/docs/CAPABILITY_BOUNDARY.md
@@ -7,7 +7,7 @@ strict-conformance **target** architecture remains
[`FIT_CONFORMANCE_DESIGN.md`](FIT_CONFORMANCE_DESIGN.md) (not a guarantee of
what the installed package already does).
-Bundled Profile version: **`21.213.0`** (`fit_tool.SDK_VERSION` / `fit_tool/gen/`).
+Bundled Profile version: **`21.218.0`** (`fit_tool.SDK_VERSION` / `fit_tool/gen/`).
Protocol version string: **`2.4`** (`fit_tool.PROTOCOL_VERSION`).
---
@@ -58,7 +58,7 @@ this package against the matrix above, not against full protocol conformance.
| Level | What it checks | Status in code |
| --- | --- | --- |
| `ConformanceLevel.WIRE` | Local IDs, definition field layout/sizes, data records vs active definition | Implemented |
-| `ConformanceLevel.PROFILE` | Scoped Profile semantics via `profile_scope=` / `ProfileScope` | **CORE (default):** developer-field declarations + **ambiguous native subfields** as ERROR. **DOMAIN (opt-in):** CORE + native base-type and closed-enum checks on high-frequency Activity/Workout messages. **FULL (opt-in):** same native rules for the gen-exported catalog from Profile.xlsx `21.213.0`. FULL is never default `strict` (§3.1 O1). Open/ranged enums (e.g. `activity_class`) are excluded from closed-enum checks |
+| `ConformanceLevel.PROFILE` | Scoped Profile semantics via `profile_scope=` / `ProfileScope` | **CORE (default):** developer-field declarations + **ambiguous native subfields** as ERROR. **DOMAIN (opt-in):** CORE + native base-type and closed-enum checks on high-frequency Activity/Workout messages. **FULL (opt-in):** same native rules for the gen-exported catalog from Profile.xlsx `21.218.0`. FULL is never default `strict` (§3.1 O1). Open/ranged enums (e.g. `activity_class`) are excluded from closed-enum checks |
| `ConformanceLevel.FILE_TYPE` | `file_id` first/unique + required fields; Activity, Workout, and Course rules | **`IMPLEMENTED_FILE_TYPES`** = Activity, Workout, Course; other `file_id.type` values **fail closed** |
| `ConformanceLevel.PRESERVATION` | Post-edit rewrite loss (e.g. `UnknownField.raw_bytes` cleared) | **Opt-in** — not in `DEFAULT_LEVELS` / Builder `strict=True` |
diff --git a/docs/EPIC_SHA12_RELEASE_NOTES.md b/docs/EPIC_SHA12_RELEASE_NOTES.md
index fa9de7d..0048540 100644
--- a/docs/EPIC_SHA12_RELEASE_NOTES.md
+++ b/docs/EPIC_SHA12_RELEASE_NOTES.md
@@ -15,7 +15,7 @@ subfields, unknown fields, post-edit PRESERVATION, encode policies, PROFILE
scopes CORE/DOMAIN/FULL, Workout + Course FILE_TYPE). Stage 5 (**L**) publishes
honest Supported/Partial/Not-supported claims.
-Profile / SDK version: **`21.213.0`** (`SDK_VERSION`, `fit_tool/gen/`).
+Profile / SDK version: **`21.218.0`** (`SDK_VERSION`, `fit_tool/gen/`).
## User-visible capabilities (rollup)
diff --git a/docs/FIT_CONFORMANCE_DESIGN.md b/docs/FIT_CONFORMANCE_DESIGN.md
index c1e10e0..ffcc65b 100644
--- a/docs/FIT_CONFORMANCE_DESIGN.md
+++ b/docs/FIT_CONFORMANCE_DESIGN.md
@@ -49,7 +49,7 @@ public-claims pass that keeps this table and `docs/CAPABILITY_BOUNDARY.md` hones
| Unknown field ids on known messages (decode retain + raw bytes) | Phase 3 | **E** SHA-17 | **Done** `UnknownField` + `raw_bytes` on main path |
| Post-edit PRESERVATION (edited files, dirty records) | Phase 4 / PRESERVATION level | **F** SHA-18 | **Done** per-record dirty + mixed encode; opt-in PRESERVATION findings |
| Encode policies (canonical vs preserve, strict vs repair) | Phase 4 §6 | **G** SHA-19 | **Done** `EncodeMode` + policy matrix; no silent invalid clamp; `repair()` still future |
-| PROFILE scopes from bundled Profile.xlsx `21.213.0` | Phase 3 PROFILE / §3.1 | **H** SHA-20 | **Done** CORE/DOMAIN/FULL + gen `field_catalog`; default remains CORE; native required fields / units still residual |
+| PROFILE scopes from bundled Profile.xlsx `21.218.0` | Phase 3 PROFILE / §3.1 | **H** SHA-20 | **Done** CORE/DOMAIN/FULL + gen `field_catalog`; default remains CORE; native required fields / units still residual |
| Workout FILE_TYPE rules | Phase 4 §7 | **I** SHA-21 | **Done** required messages/fields; SDK Workout*.fit pass FILE_TYPE |
| Course FILE_TYPE rules | Phase 4 §7 | **J** SHA-22 | **Done** Course required messages/fields; Activity + Workout unchanged |
| Public capability matrix / release-note pass | Phase 5 | **L** SHA-23 | **This pass** — README + this section + §11 residual checklist + Towncrier epic notes |
@@ -82,7 +82,7 @@ Passing one dimension must not be reported as passing all four.
The conformance target is the Garmin FIT Protocol documentation and the exact
`Profile.xlsx` version committed under `fit_tool/gen/`. The current repository
-uses Profile `21.213.0`.
+uses Profile `21.218.0`.
Official references:
@@ -791,7 +791,7 @@ Honest status vs the bullets above. **None** of these residuals re-open C–J as
| Garmin cross-validation | **Incomplete** | SDK samples used as smokes/fixtures; not a release gate for full interop |
| Non-`xfail` tests for listed constructs | **Partial** | Strong constructive coverage for C–J; expand goldens / remove any remaining known-gap xfails as follow-up |
| Strict mode no silent repair | **Met** | `strict=True` / DEFAULT_LEVELS never clamp or auto-repair; no `repair()` on strict path |
-| Published SDK/Profile version | **Met** | Profile / SDK `21.213.0` (`fit_tool/gen/`, `SDK_VERSION`) |
+| Published SDK/Profile version | **Met** | Profile / SDK `21.218.0` (`fit_tool/gen/`, `SDK_VERSION`) |
**Bottom line:** SHA-12 may move to `done` / `in_review` with the residuals
above explicit. Do **not** flip public marketing to “full Garmin FIT
diff --git a/fit_tool/__init__.py b/fit_tool/__init__.py
index 60939b9..e836754 100755
--- a/fit_tool/__init__.py
+++ b/fit_tool/__init__.py
@@ -13,7 +13,7 @@
# import ``from fit_tool import SDK_VERSION`` during package initialization
# (e.g. fit_file_header) see a fully assigned name.
PROTOCOL_VERSION = '2.4'
-SDK_VERSION = '21.213.0'
+SDK_VERSION = '21.218.0'
FIT_DATA_TYPE = b'.FIT'
from fit_tool.api import ( # noqa: E402
diff --git a/fit_tool/gen/Profile_21.213.0.xlsx b/fit_tool/gen/Profile_21.213.0.xlsx
deleted file mode 100644
index dd579cc..0000000
Binary files a/fit_tool/gen/Profile_21.213.0.xlsx and /dev/null differ
diff --git a/fit_tool/gen/Profile_21.218.0.xlsx b/fit_tool/gen/Profile_21.218.0.xlsx
new file mode 100644
index 0000000..63c1310
Binary files /dev/null and b/fit_tool/gen/Profile_21.218.0.xlsx differ
diff --git a/fit_tool/profile/component_registry.py b/fit_tool/profile/component_registry.py
index 0d854ba..fd924bd 100644
--- a/fit_tool/profile/component_registry.py
+++ b/fit_tool/profile/component_registry.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
# Main-field components only (subfield-gated components omitted — see Stage 2 D).
"""Profile component registry for decode-time expansion.
diff --git a/fit_tool/profile/field_catalog.py b/fit_tool/profile/field_catalog.py
index 2c08cb1..eb4d841 100644
--- a/fit_tool/profile/field_catalog.py
+++ b/fit_tool/profile/field_catalog.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
"""Native field and closed-enum catalog for PROFILE validation.
Generated from the bundled Garmin Profile spreadsheet by ``gen-profile``.
@@ -16,10 +16,10 @@
from fit_tool.base_type import BaseType
-PROFILE_SDK_VERSION = '21.213.0'
-PROFILE_MESSAGE_COUNT = 123
-PROFILE_FIELD_COUNT = 1407
-PROFILE_ENUM_TYPE_COUNT = 100
+PROFILE_SDK_VERSION = '21.218.0'
+PROFILE_MESSAGE_COUNT = 124
+PROFILE_FIELD_COUNT = 1566
+PROFILE_ENUM_TYPE_COUNT = 115
# (global_message_number, field_id) → (name, BaseType, type_name, units, scale, offset)
PROFILE_FIELDS: dict[tuple[int, int], tuple[str, BaseType, str, str, float, float]] = {
@@ -238,6 +238,8 @@
(18, 70): ('best_lap_index', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
(18, 71): ('min_altitude', BaseType.UINT16, 'uint16', 'm', 5.0, 500.0), # session
(18, 78): ('active_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # session
+ (18, 79): ('avg_strokes_per_length', BaseType.UINT16, 'uint16', 'strokes/length', 10.0, 0.0), # session
+ (18, 80): ('avg_swolf', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
(18, 82): ('player_score', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
(18, 83): ('opponent_score', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
(18, 84): ('opponent_name', BaseType.STRING, 'string', '', 1.0, 0.0), # session
@@ -262,6 +264,9 @@
(18, 103): ('avg_left_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # session
(18, 104): ('avg_right_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # session
(18, 105): ('avg_combined_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # session
+ (18, 106): ('num_segment_laps', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
+ (18, 107): ('front_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
+ (18, 108): ('rear_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # session
(18, 110): ('sport_profile_name', BaseType.STRING, 'string', '', 1.0, 0.0), # session
(18, 111): ('sport_index', BaseType.UINT8, 'uint8', '', 1.0, 0.0), # session
(18, 112): ('time_standing', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # session
@@ -323,6 +328,7 @@
(18, 208): ('avg_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # session
(18, 209): ('min_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # session
(18, 210): ('max_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # session
+ (18, 211): ('avg_grade_adjusted_speed', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # session
(18, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # session
(18, 254): ('message_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # session
(19, 0): ('event', BaseType.ENUM, 'event', '', 1.0, 0.0), # lap
@@ -352,6 +358,10 @@
(19, 24): ('lap_trigger', BaseType.ENUM, 'lap_trigger', '', 1.0, 0.0), # lap
(19, 25): ('sport', BaseType.ENUM, 'sport', '', 1.0, 0.0), # lap
(19, 26): ('event_group', BaseType.UINT8, 'uint8', '', 1.0, 0.0), # lap
+ (19, 27): ('nec_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # lap
+ (19, 28): ('nec_long', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # lap
+ (19, 29): ('swc_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # lap
+ (19, 30): ('swc_long', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # lap
(19, 32): ('num_lengths', BaseType.UINT16, 'uint16', 'lengths', 1.0, 0.0), # lap
(19, 33): ('normalized_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # lap
(19, 34): ('left_right_balance', BaseType.UINT16, 'left_right_balance_100', '', 1.0, 0.0), # lap
@@ -385,6 +395,7 @@
(19, 63): ('min_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # lap
(19, 70): ('active_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # lap
(19, 71): ('wkt_step_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # lap
+ (19, 73): ('avg_swolf', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
(19, 74): ('opponent_score', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
(19, 75): ('stroke_count', BaseType.UINT16, 'uint16', 'counts', 1.0, 0.0), # lap
(19, 76): ('zone_count', BaseType.UINT16, 'uint16', 'counts', 1.0, 0.0), # lap
@@ -401,11 +412,14 @@
(19, 87): ('avg_saturated_hemoglobin_percent', BaseType.UINT16, 'uint16', '%', 10.0, 0.0), # lap
(19, 88): ('min_saturated_hemoglobin_percent', BaseType.UINT16, 'uint16', '%', 10.0, 0.0), # lap
(19, 89): ('max_saturated_hemoglobin_percent', BaseType.UINT16, 'uint16', '%', 10.0, 0.0), # lap
+ (19, 90): ('avg_strokes_per_length', BaseType.UINT16, 'uint16', 'strokes / length', 10.0, 0.0), # lap
(19, 91): ('avg_left_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # lap
(19, 92): ('avg_right_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # lap
(19, 93): ('avg_left_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # lap
(19, 94): ('avg_right_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # lap
(19, 95): ('avg_combined_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # lap
+ (19, 96): ('front_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
+ (19, 97): ('rear_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
(19, 98): ('time_standing', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # lap
(19, 99): ('stand_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
(19, 100): ('avg_left_pco', BaseType.SINT8, 'sint8', 'mm', 1.0, 0.0), # lap
@@ -442,11 +456,13 @@
(19, 151): ('jump_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # lap
(19, 153): ('avg_grit', BaseType.FLOAT32, 'float32', 'kGrit', 1.0, 0.0), # lap
(19, 154): ('avg_flow', BaseType.FLOAT32, 'float32', 'Flow', 1.0, 0.0), # lap
+ (19, 155): ('metabolic_calories', BaseType.UINT16, 'uint16', 'kcal', 1.0, 0.0), # lap
(19, 156): ('total_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # lap
(19, 157): ('total_fractional_descent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # lap
(19, 158): ('avg_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # lap
(19, 159): ('min_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # lap
(19, 160): ('max_core_temperature', BaseType.UINT16, 'uint16', 'C', 100.0, 0.0), # lap
+ (19, 161): ('avg_grade_adjusted_speed', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # lap
(19, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # lap
(19, 254): ('message_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # lap
(20, 0): ('position_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # record
@@ -759,6 +775,7 @@
(101, 23): ('enhanced_max_respiration_rate', BaseType.UINT16, 'uint16', 'Breaths/min', 100.0, 0.0), # length
(101, 24): ('avg_respiration_rate', BaseType.UINT8, 'uint8', '', 1.0, 0.0), # length
(101, 25): ('max_respiration_rate', BaseType.UINT8, 'uint8', '', 1.0, 0.0), # length
+ (101, 26): ('metabolic_calories', BaseType.UINT16, 'uint16', 'kcal', 1.0, 0.0), # length
(101, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # length
(101, 254): ('message_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # length
(103, 0): ('local_timestamp', BaseType.UINT32, 'local_date_time', 's', 1.0, 0.0), # monitoring_info
@@ -767,6 +784,8 @@
(103, 4): ('cycles_to_calories', BaseType.UINT16, 'uint16', 'kcal/cycle', 5000.0, 0.0), # monitoring_info
(103, 5): ('resting_metabolic_rate', BaseType.UINT16, 'uint16', 'kcal / day', 1.0, 0.0), # monitoring_info
(103, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # monitoring_info
+ (104, 2): ('capacity', BaseType.UINT8, 'uint8', '%', 1.0, 0.0), # battery
+ (104, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # battery
(106, 0): ('manufacturer', BaseType.UINT16, 'manufacturer', '', 1.0, 0.0), # slave_device
(106, 1): ('product', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # slave_device
(127, 0): ('bluetooth_enabled', BaseType.UINT8, 'bool', '', 1.0, 0.0), # connectivity
@@ -901,6 +920,7 @@
(142, 85): ('total_flow', BaseType.FLOAT32, 'float32', 'Flow', 1.0, 0.0), # segment_lap
(142, 86): ('avg_grit', BaseType.FLOAT32, 'float32', 'kGrit', 1.0, 0.0), # segment_lap
(142, 87): ('avg_flow', BaseType.FLOAT32, 'float32', 'Flow', 1.0, 0.0), # segment_lap
+ (142, 88): ('metabolic_calories', BaseType.UINT16, 'uint16', 'kcal', 1.0, 0.0), # segment_lap
(142, 89): ('total_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # segment_lap
(142, 90): ('total_fractional_descent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # segment_lap
(142, 91): ('enhanced_avg_altitude', BaseType.UINT32, 'uint32', 'm', 5.0, 500.0), # segment_lap
@@ -1102,6 +1122,7 @@
(209, 0): ('timestamp_ms', BaseType.UINT16, 'uint16', 'ms', 1.0, 0.0), # barometer_data
(209, 1): ('sample_time_offset', BaseType.UINT16, 'uint16', 'ms', 1.0, 0.0), # barometer_data
(209, 2): ('baro_pres', BaseType.UINT32, 'uint32', 'Pa', 1.0, 0.0), # barometer_data
+ (209, 3): ('enhanced_altitude', BaseType.UINT32, 'uint32', 'm', 5.0, 500.0), # barometer_data
(209, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # barometer_data
(210, 0): ('sensor_type', BaseType.ENUM, 'sensor_type', '', 1.0, 0.0), # one_d_sensor_calibration
(210, 1): ('calibration_factor', BaseType.UINT32, 'uint32', '', 1.0, 0.0), # one_d_sensor_calibration
@@ -1287,8 +1308,16 @@
(312, 3): ('total_distance', BaseType.UINT32, 'uint32', 'm', 100.0, 0.0), # split
(312, 4): ('avg_speed', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
(312, 9): ('start_time', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # split
+ (312, 11): ('sport', BaseType.ENUM, 'sport', '', 1.0, 0.0), # split
+ (312, 12): ('sub_sport', BaseType.ENUM, 'sub_sport', '', 1.0, 0.0), # split
(312, 13): ('total_ascent', BaseType.UINT16, 'uint16', 'm', 1.0, 0.0), # split
(312, 14): ('total_descent', BaseType.UINT16, 'uint16', 'm', 1.0, 0.0), # split
+ (312, 15): ('avg_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # split
+ (312, 16): ('max_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # split
+ (312, 17): ('nec_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
+ (312, 18): ('nec_long', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
+ (312, 19): ('swc_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
+ (312, 20): ('swc_long', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
(312, 21): ('start_position_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
(312, 22): ('start_position_long', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
(312, 23): ('end_position_lat', BaseType.SINT32, 'sint32', 'degrees', 11930464.711111112, 0.0), # split
@@ -1297,11 +1326,85 @@
(312, 26): ('avg_vert_speed', BaseType.SINT32, 'sint32', 'm/s', 1000.0, 0.0), # split
(312, 27): ('end_time', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # split
(312, 28): ('total_calories', BaseType.UINT32, 'uint32', 'kcal', 1.0, 0.0), # split
+ (312, 29): ('avg_cadence', BaseType.UINT16, 'uint16', 'rpm', 128.0, 0.0), # split
+ (312, 30): ('max_cadence', BaseType.UINT16, 'uint16', 'rpm', 128.0, 0.0), # split
+ (312, 31): ('total_cycles', BaseType.UINT32, 'uint32', 'cycles', 1.0, 0.0), # split
+ (312, 32): ('avg_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split
+ (312, 33): ('max_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split
+ (312, 34): ('min_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split
+ (312, 35): ('avg_vertical_oscillation', BaseType.UINT16, 'uint16', 'mm', 10.0, 0.0), # split
+ (312, 36): ('avg_vertical_ratio', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split
+ (312, 37): ('avg_stance_time', BaseType.UINT16, 'uint16', 'ms', 10.0, 0.0), # split
+ (312, 38): ('avg_stance_time_balance', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split
+ (312, 39): ('avg_step_length', BaseType.UINT16, 'uint16', 'mm', 10.0, 0.0), # split
+ (312, 40): ('avg_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split
+ (312, 41): ('max_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split
+ (312, 42): ('normalized_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split
+ (312, 43): ('left_right_balance', BaseType.UINT16, 'left_right_balance_100', '', 1.0, 0.0), # split
+ (312, 44): ('time_standing', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 45): ('avg_left_pco', BaseType.SINT8, 'sint8', 'mm', 1.0, 0.0), # split
+ (312, 46): ('avg_right_pco', BaseType.SINT8, 'sint8', 'mm', 1.0, 0.0), # split
+ (312, 47): ('avg_left_power_phase', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split
+ (312, 48): ('avg_left_power_phase_peak', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split
+ (312, 49): ('avg_right_power_phase', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split
+ (312, 50): ('avg_right_power_phase_peak', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split
+ (312, 51): ('avg_power_position', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split
+ (312, 52): ('max_power_position', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split
+ (312, 53): ('avg_left_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split
+ (312, 54): ('avg_right_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split
+ (312, 55): ('avg_left_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split
+ (312, 56): ('avg_right_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split
+ (312, 57): ('avg_combined_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split
+ (312, 58): ('avg_flow', BaseType.FLOAT32, 'float32', 'Flow', 1.0, 0.0), # split
+ (312, 59): ('total_grit', BaseType.FLOAT32, 'float32', 'kGrit', 1.0, 0.0), # split
+ (312, 62): ('swim_stroke', BaseType.ENUM, 'swim_stroke', '', 1.0, 0.0), # split
+ (312, 63): ('num_active_lengths', BaseType.UINT16, 'uint16', 'lengths', 1.0, 0.0), # split
+ (312, 64): ('avg_swolf', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 65): ('avg_stroke_distance', BaseType.UINT16, 'uint16', 'm', 100.0, 0.0), # split
+ (312, 66): ('avg_strokes_per_length', BaseType.UINT16, 'uint16', 'strokes / length', 10.0, 0.0), # split
+ (312, 67): ('first_lap_index', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 68): ('num_laps', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 69): ('climb_grading_scale', BaseType.ENUM, 'climb_grading_scale', '', 1.0, 0.0), # split
+ (312, 70): ('climb_grade_value', BaseType.UINT32, 'uint32', '', 1.0, 0.0), # split
+ (312, 71): ('status', BaseType.ENUM, 'split_status', '', 1.0, 0.0), # split
+ (312, 72): ('num_falls', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 73): ('climb_send', BaseType.UINT8, 'bool', '', 1.0, 0.0), # split
(312, 74): ('start_elevation', BaseType.UINT32, 'uint32', 'm', 5.0, 500.0), # split
(312, 78): ('active_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 79): ('metabolic_calories', BaseType.UINT16, 'uint16', 'kcal', 1.0, 0.0), # split
+ (312, 80): ('total_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split
+ (312, 81): ('total_fractional_descent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split
+ (312, 88): ('avg_grade', BaseType.SINT16, 'sint16', '%', 100.0, 0.0), # split
+ (312, 89): ('max_grade', BaseType.SINT16, 'sint16', '%', 100.0, 0.0), # split
+ (312, 90): ('min_cadence', BaseType.UINT16, 'uint16', 'rpm', 128.0, 0.0), # split
+ (312, 93): ('avg_grade_adjusted_speed', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
+ (312, 94): ('avg_stress', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 99): ('avg_vam', BaseType.UINT16, 'uint16', 'm/s', 1000.0, 0.0), # split
+ (312, 104): ('jump_count', BaseType.UINT8, 'uint8', '', 1.0, 0.0), # split
(312, 110): ('total_moving_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 112): ('dive_section_type', BaseType.ENUM, 'dive_section_type', '', 1.0, 0.0), # split
+ (312, 113): ('avg_ascent_rate', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
+ (312, 114): ('max_ascent_rate', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
+ (312, 115): ('avg_descent_rate', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
+ (312, 116): ('max_descent_rate', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split
+ (312, 117): ('total_ascent_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 118): ('total_descent_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 119): ('total_hang_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split
+ (312, 120): ('apnea_discipline', BaseType.ENUM, 'apnea_discipline', '', 1.0, 0.0), # split
+ (312, 121): ('avg_depth', BaseType.UINT32, 'uint32', 'm', 1000.0, 0.0), # split
+ (312, 122): ('max_depth', BaseType.UINT32, 'uint32', 'm', 1000.0, 0.0), # split
+ (312, 124): ('min_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # split
+ (312, 127): ('surface_interval', BaseType.UINT32, 'uint32', 's', 1.0, 0.0), # split
+ (312, 142): ('total_fractional_cycles', BaseType.UINT8, 'uint8', 'cycles', 128.0, 0.0), # split
+ (312, 144): ('avg_stance_time_percent', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split
+ (312, 168): ('total_anaerobic_training_effect', BaseType.UINT8, 'uint8', '', 10.0, 0.0), # split
+ (312, 169): ('front_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 170): ('rear_gear_shift_count', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split
+ (312, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # split
(312, 254): ('message_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # split
(313, 0): ('split_type', BaseType.ENUM, 'split_type', '', 1.0, 0.0), # split_summary
+ (313, 1): ('sport', BaseType.ENUM, 'sport', '', 1.0, 0.0), # split_summary
+ (313, 2): ('sub_sport', BaseType.ENUM, 'sub_sport', '', 1.0, 0.0), # split_summary
(313, 3): ('num_splits', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
(313, 4): ('total_timer_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split_summary
(313, 5): ('total_distance', BaseType.UINT32, 'uint32', 'm', 100.0, 0.0), # split_summary
@@ -1313,8 +1416,64 @@
(313, 11): ('max_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # split_summary
(313, 12): ('avg_vert_speed', BaseType.SINT32, 'sint32', 'm/s', 1000.0, 0.0), # split_summary
(313, 13): ('total_calories', BaseType.UINT32, 'uint32', 'kcal', 1.0, 0.0), # split_summary
+ (313, 14): ('avg_cadence', BaseType.UINT16, 'uint16', 'rpm', 128.0, 0.0), # split_summary
+ (313, 15): ('max_cadence', BaseType.UINT16, 'uint16', 'rpm', 128.0, 0.0), # split_summary
+ (313, 16): ('total_cycles', BaseType.UINT32, 'uint32', 'cycles', 1.0, 0.0), # split_summary
+ (313, 17): ('avg_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split_summary
+ (313, 18): ('max_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split_summary
+ (313, 19): ('min_temperature', BaseType.SINT8, 'sint8', 'C', 1.0, 0.0), # split_summary
+ (313, 20): ('avg_vertical_oscillation', BaseType.UINT16, 'uint16', 'mm', 10.0, 0.0), # split_summary
+ (313, 21): ('avg_vertical_ratio', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split_summary
+ (313, 22): ('avg_stance_time', BaseType.UINT16, 'uint16', 'ms', 10.0, 0.0), # split_summary
+ (313, 23): ('avg_stance_time_balance', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split_summary
+ (313, 24): ('avg_step_length', BaseType.UINT16, 'uint16', 'mm', 10.0, 0.0), # split_summary
+ (313, 25): ('avg_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split_summary
+ (313, 26): ('max_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split_summary
+ (313, 27): ('normalized_power', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split_summary
+ (313, 28): ('left_right_balance', BaseType.UINT16, 'left_right_balance_100', '', 1.0, 0.0), # split_summary
+ (313, 29): ('time_standing', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split_summary
+ (313, 30): ('avg_left_pco', BaseType.SINT8, 'sint8', 'mm', 1.0, 0.0), # split_summary
+ (313, 31): ('avg_right_pco', BaseType.SINT8, 'sint8', 'mm', 1.0, 0.0), # split_summary
+ (313, 32): ('avg_left_power_phase', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split_summary
+ (313, 33): ('avg_left_power_phase_peak', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split_summary
+ (313, 34): ('avg_right_power_phase', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split_summary
+ (313, 35): ('avg_right_power_phase_peak', BaseType.UINT8, 'uint8', 'degrees', 0.7111111, 0.0), # split_summary
+ (313, 36): ('avg_power_position', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split_summary
+ (313, 37): ('max_power_position', BaseType.UINT16, 'uint16', 'watts', 1.0, 0.0), # split_summary
+ (313, 38): ('avg_left_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split_summary
+ (313, 39): ('avg_right_torque_effectiveness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split_summary
+ (313, 40): ('avg_left_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split_summary
+ (313, 41): ('avg_right_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split_summary
+ (313, 42): ('avg_combined_pedal_smoothness', BaseType.UINT8, 'uint8', 'percent', 2.0, 0.0), # split_summary
+ (313, 43): ('avg_flow', BaseType.FLOAT32, 'float32', 'Flow', 1.0, 0.0), # split_summary
+ (313, 44): ('total_grit', BaseType.FLOAT32, 'float32', 'kGrit', 1.0, 0.0), # split_summary
+ (313, 47): ('swim_stroke', BaseType.ENUM, 'swim_stroke', '', 1.0, 0.0), # split_summary
+ (313, 48): ('num_active_lengths', BaseType.UINT16, 'uint16', 'lengths', 1.0, 0.0), # split_summary
+ (313, 49): ('avg_swolf', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
+ (313, 50): ('avg_stroke_distance', BaseType.UINT16, 'uint16', 'm', 100.0, 0.0), # split_summary
+ (313, 51): ('avg_strokes_per_length', BaseType.UINT16, 'uint16', 'strokes / length', 10.0, 0.0), # split_summary
+ (313, 52): ('avg_ascent', BaseType.UINT16, 'uint16', 'm', 1.0, 0.0), # split_summary
+ (313, 53): ('max_ascent', BaseType.UINT16, 'uint16', 'm', 1.0, 0.0), # split_summary
+ (313, 54): ('climb_grading_scale', BaseType.ENUM, 'climb_grading_scale', '', 1.0, 0.0), # split_summary
+ (313, 55): ('climb_max_grade_value', BaseType.UINT32, 'uint32', '', 1.0, 0.0), # split_summary
+ (313, 56): ('num_falls', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
+ (313, 58): ('num_climbs_attempted', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
+ (313, 59): ('num_climbs_completed', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
+ (313, 60): ('max_distance', BaseType.UINT32, 'uint32', 'm', 100.0, 0.0), # split_summary
+ (313, 64): ('metabolic_calories', BaseType.UINT16, 'uint16', 'kcal', 1.0, 0.0), # split_summary
(313, 65): ('active_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split_summary
+ (313, 66): ('total_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split_summary
+ (313, 67): ('total_fractional_descent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split_summary
+ (313, 68): ('avg_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split_summary
+ (313, 69): ('max_fractional_ascent', BaseType.UINT8, 'uint8', 'm', 100.0, 0.0), # split_summary
+ (313, 71): ('avg_grade_adjusted_speed', BaseType.UINT32, 'uint32', 'm/s', 1000.0, 0.0), # split_summary
+ (313, 72): ('avg_stress', BaseType.UINT16, 'uint16', '', 1.0, 0.0), # split_summary
(313, 77): ('total_moving_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split_summary
+ (313, 79): ('start_time', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # split_summary
+ (313, 87): ('min_heart_rate', BaseType.UINT8, 'uint8', 'bpm', 1.0, 0.0), # split_summary
+ (313, 91): ('avg_stance_time_percent', BaseType.UINT16, 'uint16', 'percent', 100.0, 0.0), # split_summary
+ (313, 101): ('max_total_timer_time', BaseType.UINT32, 'uint32', 's', 1000.0, 0.0), # split_summary
+ (313, 253): ('timestamp', BaseType.UINT32, 'date_time', 'ms', 0.001, -631065600000.0), # split_summary
(313, 254): ('message_index', BaseType.UINT16, 'message_index', '', 1.0, 0.0), # split_summary
(314, 0): ('processing_interval', BaseType.UINT16, 'uint16', 's', 1.0, 0.0), # hsa_body_battery_data
(314, 1): ('level', BaseType.SINT8, 'sint8', 'percent', 1.0, 0.0), # hsa_body_battery_data
@@ -1442,6 +1601,7 @@
'activity_type': frozenset({0, 1, 2, 3, 4, 5, 6, 8, 13, 254}),
'analog_watchface_layout': frozenset({0, 1, 2}),
'ant_network': frozenset({0, 1, 2, 3}),
+ 'apnea_discipline': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}),
'attitude_stage': frozenset({0, 1, 2, 3}),
'auto_sync_frequency': frozenset({0, 1, 2, 3, 4}),
'autolap_trigger': frozenset({0, 1, 2, 3, 4, 5, 6, 13}),
@@ -1450,11 +1610,16 @@
'bike_light_network_config_type': frozenset({0, 4, 5, 6}),
'body_location': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}),
'bp_status': frozenset({0, 1, 2, 3, 4}),
+ 'brazilian_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}),
+ 'british_adjectival_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}),
+ 'british_technical_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}),
'camera_event_type': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14}),
'camera_orientation_type': frozenset({0, 1, 2, 3}),
'ccr_setpoint_switch_mode': frozenset({0, 1}),
+ 'climb_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}),
'climb_pro_event': frozenset({0, 1, 2}),
'course_point': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}),
+ 'dankyu_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}),
'date_mode': frozenset({0, 1}),
'day_of_week': frozenset({0, 1, 2, 3, 4, 5, 6}),
'digital_watchface_layout': frozenset({0, 1, 2}),
@@ -1468,8 +1633,10 @@
'dive_backlight_mode': frozenset({0, 1}),
'dive_gas_mode': frozenset({0, 1}),
'dive_gas_status': frozenset({0, 1, 2}),
+ 'dive_section_type': frozenset({0, 1, 2}),
'event': frozenset({0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 32, 33, 36, 42, 43, 44, 45, 46, 47, 54, 56, 57, 71, 72, 73, 75, 76, 81, 82}),
'event_type': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}),
+ 'ewbank_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}),
'exd_data_units': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49}),
'exd_descriptors': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}),
'exd_display_type': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}),
@@ -1477,6 +1644,8 @@
'exd_qualifiers': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 242, 243, 244, 245, 246, 247, 248, 249, 250}),
'file': frozenset({1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 14, 15, 20, 28, 32, 34, 35, 40, 247, 254}),
'fitness_equipment_state': frozenset({0, 1, 2, 3}),
+ 'font_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}),
+ 'french_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}),
'gas_consumption_rate_type': frozenset({0, 1, 2}),
'gender': frozenset({0, 1}),
'goal': frozenset({0, 1, 2, 3, 4, 5, 6}),
@@ -1501,6 +1670,7 @@
'pwr_zone_calc': frozenset({0, 1}),
'radar_threat_level_type': frozenset({0, 1, 2, 3}),
'rider_position_type': frozenset({0, 1, 2, 3}),
+ 'saxon_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}),
'schedule': frozenset({0, 1}),
'segment_delete_status': frozenset({0, 1, 2}),
'segment_lap_status': frozenset({0, 1}),
@@ -1512,6 +1682,7 @@
'sleep_disruption_severity': frozenset({0, 1, 2, 3}),
'sleep_level': frozenset({0, 1, 2, 3, 4}),
'source_type': frozenset({0, 1, 2, 3, 4, 5}),
+ 'split_status': frozenset({0, 1, 2, 3}),
'split_type': frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 21, 22, 23, 28, 29}),
'spo2_measurement_type': frozenset({0, 1, 2, 3}),
'sport': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 53, 56, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 254}),
@@ -1527,6 +1698,8 @@
'tissue_model_type': frozenset({0}),
'tone': frozenset({0, 1, 2, 3}),
'turn_type': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}),
+ 'uiaa_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27}),
+ 'vermin_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}),
'watchface_mode': frozenset({0, 1, 2, 3}),
'water_type': frozenset({0, 1, 2, 3}),
'weather_report': frozenset({0, 1, 2}),
@@ -1536,7 +1709,8 @@
'wkt_step_duration': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31}),
'wkt_step_target': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}),
'workout_equipment': frozenset({0, 1, 2, 3, 4, 5}),
+ 'yds_grading_scale': frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68}),
}
-PROFILE_ENUM_FIELD_COUNT = 153
+PROFILE_ENUM_FIELD_COUNT = 164
diff --git a/fit_tool/profile/messages/aad_accel_features_message.py b/fit_tool/profile/messages/aad_accel_features_message.py
index 250f519..0ff9d0c 100644
--- a/fit_tool/profile/messages/aad_accel_features_message.py
+++ b/fit_tool/profile/messages/aad_accel_features_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/accelerometer_data_message.py b/fit_tool/profile/messages/accelerometer_data_message.py
index 117aca2..e6f3882 100644
--- a/fit_tool/profile/messages/accelerometer_data_message.py
+++ b/fit_tool/profile/messages/accelerometer_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/activity_message.py b/fit_tool/profile/messages/activity_message.py
index fb88ef8..6f061cd 100644
--- a/fit_tool/profile/messages/activity_message.py
+++ b/fit_tool/profile/messages/activity_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/ant_channel_id_message.py b/fit_tool/profile/messages/ant_channel_id_message.py
index ca8c691..662cdf7 100644
--- a/fit_tool/profile/messages/ant_channel_id_message.py
+++ b/fit_tool/profile/messages/ant_channel_id_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/ant_rx_message.py b/fit_tool/profile/messages/ant_rx_message.py
index 3f3e11b..d1de07e 100644
--- a/fit_tool/profile/messages/ant_rx_message.py
+++ b/fit_tool/profile/messages/ant_rx_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/ant_tx_message.py b/fit_tool/profile/messages/ant_tx_message.py
index 39b8928..4549b27 100644
--- a/fit_tool/profile/messages/ant_tx_message.py
+++ b/fit_tool/profile/messages/ant_tx_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/aviation_attitude_message.py b/fit_tool/profile/messages/aviation_attitude_message.py
index 7764ee8..4316c1e 100644
--- a/fit_tool/profile/messages/aviation_attitude_message.py
+++ b/fit_tool/profile/messages/aviation_attitude_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/barometer_data_message.py b/fit_tool/profile/messages/barometer_data_message.py
index 338f6dd..610d68d 100644
--- a/fit_tool/profile/messages/barometer_data_message.py
+++ b/fit_tool/profile/messages/barometer_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -54,6 +54,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
size=0,
growable=True),
BarometerDataBaroPresField(
+ size=0,
+ growable=True),
+ BarometerDataEnhancedAltitudeField(
size=0,
growable=True)
])
@@ -93,6 +96,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
BarometerDataBaroPresField(
size=cls._field_size_from_definition(
definition_message, BarometerDataBaroPresField.ID),
+ growable=False),
+ BarometerDataEnhancedAltitudeField(
+ size=cls._field_size_from_definition(
+ definition_message, BarometerDataEnhancedAltitudeField.ID),
growable=False)
])
message.growable = False
@@ -204,6 +211,28 @@ def baro_pres(self, value: list[int]):
+ @property
+ def enhanced_altitude(self) -> Optional[list[float]]:
+ field = self.get_field(BarometerDataEnhancedAltitudeField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @enhanced_altitude.setter
+ def enhanced_altitude(self, value: list[float]):
+ field = self.get_field(BarometerDataEnhancedAltitudeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
@@ -262,4 +291,23 @@ def __init__(self, size: int = 0, growable: bool = True):
growable = growable,
sub_fields = [
]
+ )
+
+
+class BarometerDataEnhancedAltitudeField(Field):
+ ID = 3
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='enhanced_altitude',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 500,
+ scale = 5,
+ size = size,
+ units = 'm',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
)
\ No newline at end of file
diff --git a/fit_tool/profile/messages/battery_message.py b/fit_tool/profile/messages/battery_message.py
new file mode 100644
index 0000000..08510c9
--- /dev/null
+++ b/fit_tool/profile/messages/battery_message.py
@@ -0,0 +1,169 @@
+# Autogenerated. Do not modify.
+#
+# Profile: 21.218.0
+from typing import Optional
+
+from fit_tool.base_type import BaseType
+from fit_tool.data_message import DataMessage
+from fit_tool.definition_message import DefinitionMessage
+from fit_tool.developer_field import DeveloperField
+from fit_tool.endian import Endian
+from fit_tool.field import Field
+from fit_tool.sub_field import SubField
+from fit_tool.profile.messages.common_fields import MessageIndexField, TimestampField
+from fit_tool.profile.profile_type import *
+from typing import List as list
+from typing import Dict as dict
+
+
+class BatteryMessage(DataMessage):
+ """BatteryMessage — use blank construct for authoring, ``from_definition`` for decode.
+
+ * ``BatteryMessage()`` — create path: growable fields, no wire definition.
+ * ``BatteryMessage.from_definition(definition, developer_fields=...)`` —
+ project a local definition onto this type (decode / MessageFactory path).
+ """
+
+ ID = 104
+ NAME = 'battery'
+
+ @staticmethod
+ def _field_size_from_definition(definition_message: DefinitionMessage, field_id: int) -> int:
+ field_definition = definition_message.get_field_definition(field_id)
+ if field_definition:
+ return field_definition.size
+ return 0
+
+ def __init__(self, developer_fields=None, local_id: int = 0,
+ endian: Endian = Endian.LITTLE):
+ """Create a blank message for authoring (growable fields, no definition)."""
+ super().__init__(name=BatteryMessage.NAME,
+ global_id=BatteryMessage.ID,
+ local_id=local_id,
+ endian=endian,
+ definition_message=None,
+ developer_fields=developer_fields,
+ fields=[
+ TimestampField(
+ size=0,
+ growable=True),
+ BatteryCapacityField(
+ size=0,
+ growable=True)
+ ])
+
+ self.growable = True
+
+ @classmethod
+ def from_definition(cls, definition_message: DefinitionMessage,
+ developer_fields: list[DeveloperField] = None):
+ """Project a wire definition onto this message type (decode path).
+
+ Field sizes come from the definition; fields are not growable. Prefer this
+ over passing a definition into ``__init__``.
+ """
+ message = cls.__new__(cls)
+ DataMessage.__init__(
+ message,
+ name=cls.NAME,
+ global_id=cls.ID,
+ local_id=definition_message.local_id,
+ endian=definition_message.endian,
+ definition_message=definition_message,
+ developer_fields=developer_fields,
+ fields=[
+ TimestampField(
+ size=cls._field_size_from_definition(
+ definition_message, TimestampField.ID),
+ growable=False),
+ BatteryCapacityField(
+ size=cls._field_size_from_definition(
+ definition_message, BatteryCapacityField.ID),
+ growable=False)
+ ])
+ message.growable = False
+ # Keep definition field ids not present in the Profile schema (Stage 2 E).
+ message.retain_unknown_fields()
+ return message
+
+ @classmethod
+ def from_bytes(cls, definition_message: DefinitionMessage, developer_fields: list[DeveloperField],
+ bytes_buffer: bytes, offset: int = 0):
+ message = cls.from_definition(definition_message, developer_fields=developer_fields)
+ message.read_from_bytes(bytes_buffer, offset)
+ return message
+
+
+
+# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
+
+ @property
+ def timestamp(self) -> Optional[int]:
+ field = self.get_field(TimestampField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+ # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
+
+ @timestamp.setter
+ def timestamp(self, value: int):
+ field = self.get_field(TimestampField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def capacity(self) -> Optional[int]:
+ field = self.get_field(BatteryCapacityField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @capacity.setter
+ def capacity(self, value: int):
+ field = self.get_field(BatteryCapacityField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+
+
+
+class BatteryCapacityField(Field):
+ ID = 2
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='capacity',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = '%',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
\ No newline at end of file
diff --git a/fit_tool/profile/messages/beat_intervals_message.py b/fit_tool/profile/messages/beat_intervals_message.py
index 50990cd..50309aa 100644
--- a/fit_tool/profile/messages/beat_intervals_message.py
+++ b/fit_tool/profile/messages/beat_intervals_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/bike_profile_message.py b/fit_tool/profile/messages/bike_profile_message.py
index dee5fce..ae419e5 100644
--- a/fit_tool/profile/messages/bike_profile_message.py
+++ b/fit_tool/profile/messages/bike_profile_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/blood_pressure_message.py b/fit_tool/profile/messages/blood_pressure_message.py
index 6b5d007..eecc319 100644
--- a/fit_tool/profile/messages/blood_pressure_message.py
+++ b/fit_tool/profile/messages/blood_pressure_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/cadence_zone_message.py b/fit_tool/profile/messages/cadence_zone_message.py
index 21dee87..6f2bb3c 100644
--- a/fit_tool/profile/messages/cadence_zone_message.py
+++ b/fit_tool/profile/messages/cadence_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/camera_event_message.py b/fit_tool/profile/messages/camera_event_message.py
index 008ff1c..ed7d70e 100644
--- a/fit_tool/profile/messages/camera_event_message.py
+++ b/fit_tool/profile/messages/camera_event_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/capabilities_message.py b/fit_tool/profile/messages/capabilities_message.py
index 7f4268c..f5ea8b3 100644
--- a/fit_tool/profile/messages/capabilities_message.py
+++ b/fit_tool/profile/messages/capabilities_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/chrono_shot_data_message.py b/fit_tool/profile/messages/chrono_shot_data_message.py
index 45cbd61..1a7dabb 100644
--- a/fit_tool/profile/messages/chrono_shot_data_message.py
+++ b/fit_tool/profile/messages/chrono_shot_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/chrono_shot_session_message.py b/fit_tool/profile/messages/chrono_shot_session_message.py
index 848ebd4..60ee191 100644
--- a/fit_tool/profile/messages/chrono_shot_session_message.py
+++ b/fit_tool/profile/messages/chrono_shot_session_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/climb_pro_message.py b/fit_tool/profile/messages/climb_pro_message.py
index 754629a..4c48a3b 100644
--- a/fit_tool/profile/messages/climb_pro_message.py
+++ b/fit_tool/profile/messages/climb_pro_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/common_fields.py b/fit_tool/profile/messages/common_fields.py
index d9eb79c..05fc6e2 100644
--- a/fit_tool/profile/messages/common_fields.py
+++ b/fit_tool/profile/messages/common_fields.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from fit_tool.base_type import BaseType
from fit_tool.field import Field
diff --git a/fit_tool/profile/messages/connectivity_message.py b/fit_tool/profile/messages/connectivity_message.py
index 7cb5ff8..294be3f 100644
--- a/fit_tool/profile/messages/connectivity_message.py
+++ b/fit_tool/profile/messages/connectivity_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/course_message.py b/fit_tool/profile/messages/course_message.py
index def8828..80856e7 100644
--- a/fit_tool/profile/messages/course_message.py
+++ b/fit_tool/profile/messages/course_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/course_point_message.py b/fit_tool/profile/messages/course_point_message.py
index ad9f4ee..761b836 100644
--- a/fit_tool/profile/messages/course_point_message.py
+++ b/fit_tool/profile/messages/course_point_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/developer_data_id_message.py b/fit_tool/profile/messages/developer_data_id_message.py
index 1a5199f..26614a0 100644
--- a/fit_tool/profile/messages/developer_data_id_message.py
+++ b/fit_tool/profile/messages/developer_data_id_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/device_aux_battery_info_message.py b/fit_tool/profile/messages/device_aux_battery_info_message.py
index 8da2b45..3fa5a3b 100644
--- a/fit_tool/profile/messages/device_aux_battery_info_message.py
+++ b/fit_tool/profile/messages/device_aux_battery_info_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/device_info_message.py b/fit_tool/profile/messages/device_info_message.py
index cd97298..eca5075 100644
--- a/fit_tool/profile/messages/device_info_message.py
+++ b/fit_tool/profile/messages/device_info_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/device_settings_message.py b/fit_tool/profile/messages/device_settings_message.py
index 6267d56..2a8917c 100644
--- a/fit_tool/profile/messages/device_settings_message.py
+++ b/fit_tool/profile/messages/device_settings_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/dive_alarm_message.py b/fit_tool/profile/messages/dive_alarm_message.py
index 1632b52..f487c82 100644
--- a/fit_tool/profile/messages/dive_alarm_message.py
+++ b/fit_tool/profile/messages/dive_alarm_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/dive_apnea_alarm_message.py b/fit_tool/profile/messages/dive_apnea_alarm_message.py
index 35bc261..33c9f59 100644
--- a/fit_tool/profile/messages/dive_apnea_alarm_message.py
+++ b/fit_tool/profile/messages/dive_apnea_alarm_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/dive_gas_message.py b/fit_tool/profile/messages/dive_gas_message.py
index 6b9b433..bade433 100644
--- a/fit_tool/profile/messages/dive_gas_message.py
+++ b/fit_tool/profile/messages/dive_gas_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/dive_settings_message.py b/fit_tool/profile/messages/dive_settings_message.py
index 00ff9f3..999d59d 100644
--- a/fit_tool/profile/messages/dive_settings_message.py
+++ b/fit_tool/profile/messages/dive_settings_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/dive_summary_message.py b/fit_tool/profile/messages/dive_summary_message.py
index ec9c48e..b784213 100644
--- a/fit_tool/profile/messages/dive_summary_message.py
+++ b/fit_tool/profile/messages/dive_summary_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/event_message.py b/fit_tool/profile/messages/event_message.py
index 42cea2f..0648fea 100644
--- a/fit_tool/profile/messages/event_message.py
+++ b/fit_tool/profile/messages/event_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/exd_data_concept_configuration_message.py b/fit_tool/profile/messages/exd_data_concept_configuration_message.py
index e2f14b8..503ae1a 100644
--- a/fit_tool/profile/messages/exd_data_concept_configuration_message.py
+++ b/fit_tool/profile/messages/exd_data_concept_configuration_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/exd_data_field_configuration_message.py b/fit_tool/profile/messages/exd_data_field_configuration_message.py
index 654c201..acd2bc8 100644
--- a/fit_tool/profile/messages/exd_data_field_configuration_message.py
+++ b/fit_tool/profile/messages/exd_data_field_configuration_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/exd_screen_configuration_message.py b/fit_tool/profile/messages/exd_screen_configuration_message.py
index c949bfb..d8c618b 100644
--- a/fit_tool/profile/messages/exd_screen_configuration_message.py
+++ b/fit_tool/profile/messages/exd_screen_configuration_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/exercise_title_message.py b/fit_tool/profile/messages/exercise_title_message.py
index 073b592..ca4fdd9 100644
--- a/fit_tool/profile/messages/exercise_title_message.py
+++ b/fit_tool/profile/messages/exercise_title_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/field_capabilities_message.py b/fit_tool/profile/messages/field_capabilities_message.py
index 6cde4d8..b6aa6d4 100644
--- a/fit_tool/profile/messages/field_capabilities_message.py
+++ b/fit_tool/profile/messages/field_capabilities_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/field_description_message.py b/fit_tool/profile/messages/field_description_message.py
index b5f9dbd..70031c0 100644
--- a/fit_tool/profile/messages/field_description_message.py
+++ b/fit_tool/profile/messages/field_description_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/file_capabilities_message.py b/fit_tool/profile/messages/file_capabilities_message.py
index c3a30bf..7b8118f 100644
--- a/fit_tool/profile/messages/file_capabilities_message.py
+++ b/fit_tool/profile/messages/file_capabilities_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/file_creator_message.py b/fit_tool/profile/messages/file_creator_message.py
index b0b558b..796b3d1 100644
--- a/fit_tool/profile/messages/file_creator_message.py
+++ b/fit_tool/profile/messages/file_creator_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/file_id_message.py b/fit_tool/profile/messages/file_id_message.py
index 2c1cc38..8c35a69 100644
--- a/fit_tool/profile/messages/file_id_message.py
+++ b/fit_tool/profile/messages/file_id_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/goal_message.py b/fit_tool/profile/messages/goal_message.py
index 65034b2..a4756a4 100644
--- a/fit_tool/profile/messages/goal_message.py
+++ b/fit_tool/profile/messages/goal_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/gps_metadata_message.py b/fit_tool/profile/messages/gps_metadata_message.py
index 4e7aacd..ee1ad75 100644
--- a/fit_tool/profile/messages/gps_metadata_message.py
+++ b/fit_tool/profile/messages/gps_metadata_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/gyroscope_data_message.py b/fit_tool/profile/messages/gyroscope_data_message.py
index 834f923..f56b4a3 100644
--- a/fit_tool/profile/messages/gyroscope_data_message.py
+++ b/fit_tool/profile/messages/gyroscope_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hr_message.py b/fit_tool/profile/messages/hr_message.py
index be040cb..4e6b0f4 100644
--- a/fit_tool/profile/messages/hr_message.py
+++ b/fit_tool/profile/messages/hr_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hr_zone_message.py b/fit_tool/profile/messages/hr_zone_message.py
index 29c502c..670e01b 100644
--- a/fit_tool/profile/messages/hr_zone_message.py
+++ b/fit_tool/profile/messages/hr_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hrm_profile_message.py b/fit_tool/profile/messages/hrm_profile_message.py
index dc97f52..949d7ee 100644
--- a/fit_tool/profile/messages/hrm_profile_message.py
+++ b/fit_tool/profile/messages/hrm_profile_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hrv_message.py b/fit_tool/profile/messages/hrv_message.py
index 92d65b7..351563c 100644
--- a/fit_tool/profile/messages/hrv_message.py
+++ b/fit_tool/profile/messages/hrv_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hrv_status_summary_message.py b/fit_tool/profile/messages/hrv_status_summary_message.py
index ebd9159..053dca7 100644
--- a/fit_tool/profile/messages/hrv_status_summary_message.py
+++ b/fit_tool/profile/messages/hrv_status_summary_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hrv_value_message.py b/fit_tool/profile/messages/hrv_value_message.py
index 220698b..352a31c 100644
--- a/fit_tool/profile/messages/hrv_value_message.py
+++ b/fit_tool/profile/messages/hrv_value_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_accelerometer_data_message.py b/fit_tool/profile/messages/hsa_accelerometer_data_message.py
index d29cd53..f6e6987 100644
--- a/fit_tool/profile/messages/hsa_accelerometer_data_message.py
+++ b/fit_tool/profile/messages/hsa_accelerometer_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_body_battery_data_message.py b/fit_tool/profile/messages/hsa_body_battery_data_message.py
index a24f646..61c249b 100644
--- a/fit_tool/profile/messages/hsa_body_battery_data_message.py
+++ b/fit_tool/profile/messages/hsa_body_battery_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_configuration_data_message.py b/fit_tool/profile/messages/hsa_configuration_data_message.py
index e413cd0..4529f9f 100644
--- a/fit_tool/profile/messages/hsa_configuration_data_message.py
+++ b/fit_tool/profile/messages/hsa_configuration_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_event_message.py b/fit_tool/profile/messages/hsa_event_message.py
index a52c8a9..b8339e2 100644
--- a/fit_tool/profile/messages/hsa_event_message.py
+++ b/fit_tool/profile/messages/hsa_event_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_gyroscope_data_message.py b/fit_tool/profile/messages/hsa_gyroscope_data_message.py
index 5682a30..4a4d176 100644
--- a/fit_tool/profile/messages/hsa_gyroscope_data_message.py
+++ b/fit_tool/profile/messages/hsa_gyroscope_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_heart_rate_data_message.py b/fit_tool/profile/messages/hsa_heart_rate_data_message.py
index e6795f4..c8ada2a 100644
--- a/fit_tool/profile/messages/hsa_heart_rate_data_message.py
+++ b/fit_tool/profile/messages/hsa_heart_rate_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_respiration_data_message.py b/fit_tool/profile/messages/hsa_respiration_data_message.py
index ee8f6f5..f6aeb19 100644
--- a/fit_tool/profile/messages/hsa_respiration_data_message.py
+++ b/fit_tool/profile/messages/hsa_respiration_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_spo2_data_message.py b/fit_tool/profile/messages/hsa_spo2_data_message.py
index d2bdb6e..452a1db 100644
--- a/fit_tool/profile/messages/hsa_spo2_data_message.py
+++ b/fit_tool/profile/messages/hsa_spo2_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_step_data_message.py b/fit_tool/profile/messages/hsa_step_data_message.py
index bfbf222..ceacdd5 100644
--- a/fit_tool/profile/messages/hsa_step_data_message.py
+++ b/fit_tool/profile/messages/hsa_step_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_stress_data_message.py b/fit_tool/profile/messages/hsa_stress_data_message.py
index df92140..90600dc 100644
--- a/fit_tool/profile/messages/hsa_stress_data_message.py
+++ b/fit_tool/profile/messages/hsa_stress_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/hsa_wrist_temperature_data_message.py b/fit_tool/profile/messages/hsa_wrist_temperature_data_message.py
index eb152ed..530ea92 100644
--- a/fit_tool/profile/messages/hsa_wrist_temperature_data_message.py
+++ b/fit_tool/profile/messages/hsa_wrist_temperature_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/jump_message.py b/fit_tool/profile/messages/jump_message.py
index e73c6ee..bd4342b 100644
--- a/fit_tool/profile/messages/jump_message.py
+++ b/fit_tool/profile/messages/jump_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/lap_message.py b/fit_tool/profile/messages/lap_message.py
index 13927d9..604b792 100644
--- a/fit_tool/profile/messages/lap_message.py
+++ b/fit_tool/profile/messages/lap_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -131,6 +131,18 @@ def __init__(self, developer_fields=None, local_id: int = 0,
LapEventGroupField(
size=0,
growable=True),
+ LapNecLatField(
+ size=0,
+ growable=True),
+ LapNecLongField(
+ size=0,
+ growable=True),
+ LapSwcLatField(
+ size=0,
+ growable=True),
+ LapSwcLongField(
+ size=0,
+ growable=True),
LapNumLengthsField(
size=0,
growable=True),
@@ -230,6 +242,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
LapWorkoutStepIndexField(
size=0,
growable=True),
+ LapAvgSwolfField(
+ size=0,
+ growable=True),
LapOpponentScoreField(
size=0,
growable=True),
@@ -278,6 +293,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
LapMaxSaturatedHemoglobinPercentField(
size=0,
growable=True),
+ LapAvgStrokesPerLengthField(
+ size=0,
+ growable=True),
LapAvgLeftTorqueEffectivenessField(
size=0,
growable=True),
@@ -293,6 +311,12 @@ def __init__(self, developer_fields=None, local_id: int = 0,
LapAvgCombinedPedalSmoothnessField(
size=0,
growable=True),
+ LapFrontGearShiftCountField(
+ size=0,
+ growable=True),
+ LapRearGearShiftCountField(
+ size=0,
+ growable=True),
LapTimeStandingField(
size=0,
growable=True),
@@ -401,6 +425,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
LapAvgFlowField(
size=0,
growable=True),
+ LapMetabolicCaloriesField(
+ size=0,
+ growable=True),
LapTotalFractionalAscentField(
size=0,
growable=True),
@@ -414,6 +441,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
size=0,
growable=True),
LapMaxCoreTemperatureField(
+ size=0,
+ growable=True),
+ LapAvgGradeAdjustedSpeedField(
size=0,
growable=True)
])
@@ -554,6 +584,22 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, LapEventGroupField.ID),
growable=False),
+ LapNecLatField(
+ size=cls._field_size_from_definition(
+ definition_message, LapNecLatField.ID),
+ growable=False),
+ LapNecLongField(
+ size=cls._field_size_from_definition(
+ definition_message, LapNecLongField.ID),
+ growable=False),
+ LapSwcLatField(
+ size=cls._field_size_from_definition(
+ definition_message, LapSwcLatField.ID),
+ growable=False),
+ LapSwcLongField(
+ size=cls._field_size_from_definition(
+ definition_message, LapSwcLongField.ID),
+ growable=False),
LapNumLengthsField(
size=cls._field_size_from_definition(
definition_message, LapNumLengthsField.ID),
@@ -686,6 +732,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, LapWorkoutStepIndexField.ID),
growable=False),
+ LapAvgSwolfField(
+ size=cls._field_size_from_definition(
+ definition_message, LapAvgSwolfField.ID),
+ growable=False),
LapOpponentScoreField(
size=cls._field_size_from_definition(
definition_message, LapOpponentScoreField.ID),
@@ -750,6 +800,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, LapMaxSaturatedHemoglobinPercentField.ID),
growable=False),
+ LapAvgStrokesPerLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, LapAvgStrokesPerLengthField.ID),
+ growable=False),
LapAvgLeftTorqueEffectivenessField(
size=cls._field_size_from_definition(
definition_message, LapAvgLeftTorqueEffectivenessField.ID),
@@ -770,6 +824,14 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, LapAvgCombinedPedalSmoothnessField.ID),
growable=False),
+ LapFrontGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, LapFrontGearShiftCountField.ID),
+ growable=False),
+ LapRearGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, LapRearGearShiftCountField.ID),
+ growable=False),
LapTimeStandingField(
size=cls._field_size_from_definition(
definition_message, LapTimeStandingField.ID),
@@ -914,6 +976,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, LapAvgFlowField.ID),
growable=False),
+ LapMetabolicCaloriesField(
+ size=cls._field_size_from_definition(
+ definition_message, LapMetabolicCaloriesField.ID),
+ growable=False),
LapTotalFractionalAscentField(
size=cls._field_size_from_definition(
definition_message, LapTotalFractionalAscentField.ID),
@@ -933,6 +999,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
LapMaxCoreTemperatureField(
size=cls._field_size_from_definition(
definition_message, LapMaxCoreTemperatureField.ID),
+ growable=False),
+ LapAvgGradeAdjustedSpeedField(
+ size=cls._field_size_from_definition(
+ definition_message, LapAvgGradeAdjustedSpeedField.ID),
growable=False)
])
message.growable = False
@@ -1312,6 +1382,29 @@ def total_strokes(self, value: int):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
+
+ @property
+ def total_pushes(self) -> Optional[int]:
+ field = self.get_field(LapTotalCyclesField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_pushes.setter
+ def total_pushes(self, value: int):
+ field = self.get_field(LapTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
@property
def total_calories(self) -> Optional[int]:
field = self.get_field(LapTotalCaloriesField.ID)
@@ -1503,6 +1596,75 @@ def avg_running_cadence(self, value: int):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
+
+ @property
+ def avg_swimming_cadence(self) -> Optional[int]:
+ field = self.get_field(LapAvgCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_swimming_cadence.setter
+ def avg_swimming_cadence(self, value: int):
+ field = self.get_field(LapAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_paddlesport_cadence(self) -> Optional[int]:
+ field = self.get_field(LapAvgCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_paddlesport_cadence.setter
+ def avg_paddlesport_cadence(self, value: int):
+ field = self.get_field(LapAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_push_cadence(self) -> Optional[int]:
+ field = self.get_field(LapAvgCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_push_cadence.setter
+ def avg_push_cadence(self, value: int):
+ field = self.get_field(LapAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
@property
def max_cadence(self) -> Optional[int]:
field = self.get_field(LapMaxCadenceField.ID)
@@ -1550,6 +1712,75 @@ def max_running_cadence(self, value: int):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
+
+ @property
+ def max_swimming_cadence(self) -> Optional[int]:
+ field = self.get_field(LapMaxCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_swimming_cadence.setter
+ def max_swimming_cadence(self, value: int):
+ field = self.get_field(LapMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_paddlesport_cadence(self) -> Optional[int]:
+ field = self.get_field(LapMaxCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_paddlesport_cadence.setter
+ def max_paddlesport_cadence(self, value: int):
+ field = self.get_field(LapMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_push_cadence(self) -> Optional[int]:
+ field = self.get_field(LapMaxCadenceField.ID)
+ type_field = self.get_field(LapSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_push_cadence.setter
+ def max_push_cadence(self, value: int):
+ field = self.get_field(LapMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
@property
def avg_power(self) -> Optional[int]:
field = self.get_field(LapAvgPowerField.ID)
@@ -1742,6 +1973,102 @@ def event_group(self, value: int):
+ @property
+ def nec_lat(self) -> Optional[float]:
+ field = self.get_field(LapNecLatField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @nec_lat.setter
+ def nec_lat(self, value: float):
+ field = self.get_field(LapNecLatField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def nec_long(self) -> Optional[float]:
+ field = self.get_field(LapNecLongField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @nec_long.setter
+ def nec_long(self, value: float):
+ field = self.get_field(LapNecLongField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swc_lat(self) -> Optional[float]:
+ field = self.get_field(LapSwcLatField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swc_lat.setter
+ def swc_lat(self, value: float):
+ field = self.get_field(LapSwcLatField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swc_long(self) -> Optional[float]:
+ field = self.get_field(LapSwcLongField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swc_long.setter
+ def swc_long(self, value: float):
+ field = self.get_field(LapSwcLongField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def num_lengths(self) -> Optional[int]:
field = self.get_field(LapNumLengthsField.ID)
@@ -2526,6 +2853,30 @@ def workout_step_index(self, value: int):
+ @property
+ def avg_swolf(self) -> Optional[int]:
+ field = self.get_field(LapAvgSwolfField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_swolf.setter
+ def avg_swolf(self, value: int):
+ field = self.get_field(LapAvgSwolfField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def opponent_score(self) -> Optional[int]:
field = self.get_field(LapOpponentScoreField.ID)
@@ -2894,6 +3245,30 @@ def max_saturated_hemoglobin_percent(self, value: list[float]):
+ @property
+ def avg_strokes_per_length(self) -> Optional[float]:
+ field = self.get_field(LapAvgStrokesPerLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_strokes_per_length.setter
+ def avg_strokes_per_length(self, value: float):
+ field = self.get_field(LapAvgStrokesPerLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def avg_left_torque_effectiveness(self) -> Optional[float]:
field = self.get_field(LapAvgLeftTorqueEffectivenessField.ID)
@@ -2943,8 +3318,56 @@ def avg_right_torque_effectiveness(self, value: float):
@property
- def avg_left_pedal_smoothness(self) -> Optional[float]:
- field = self.get_field(LapAvgLeftPedalSmoothnessField.ID)
+ def avg_left_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(LapAvgLeftPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_pedal_smoothness.setter
+ def avg_left_pedal_smoothness(self, value: float):
+ field = self.get_field(LapAvgLeftPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(LapAvgRightPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_pedal_smoothness.setter
+ def avg_right_pedal_smoothness(self, value: float):
+ field = self.get_field(LapAvgRightPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_combined_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(LapAvgCombinedPedalSmoothnessField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -2953,9 +3376,9 @@ def avg_left_pedal_smoothness(self) -> Optional[float]:
- @avg_left_pedal_smoothness.setter
- def avg_left_pedal_smoothness(self, value: float):
- field = self.get_field(LapAvgLeftPedalSmoothnessField.ID)
+ @avg_combined_pedal_smoothness.setter
+ def avg_combined_pedal_smoothness(self, value: float):
+ field = self.get_field(LapAvgCombinedPedalSmoothnessField.ID)
if field:
if value is None:
@@ -2967,8 +3390,8 @@ def avg_left_pedal_smoothness(self, value: float):
@property
- def avg_right_pedal_smoothness(self) -> Optional[float]:
- field = self.get_field(LapAvgRightPedalSmoothnessField.ID)
+ def front_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(LapFrontGearShiftCountField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -2977,9 +3400,9 @@ def avg_right_pedal_smoothness(self) -> Optional[float]:
- @avg_right_pedal_smoothness.setter
- def avg_right_pedal_smoothness(self, value: float):
- field = self.get_field(LapAvgRightPedalSmoothnessField.ID)
+ @front_gear_shift_count.setter
+ def front_gear_shift_count(self, value: int):
+ field = self.get_field(LapFrontGearShiftCountField.ID)
if field:
if value is None:
@@ -2991,8 +3414,8 @@ def avg_right_pedal_smoothness(self, value: float):
@property
- def avg_combined_pedal_smoothness(self) -> Optional[float]:
- field = self.get_field(LapAvgCombinedPedalSmoothnessField.ID)
+ def rear_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(LapRearGearShiftCountField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -3001,9 +3424,9 @@ def avg_combined_pedal_smoothness(self) -> Optional[float]:
- @avg_combined_pedal_smoothness.setter
- def avg_combined_pedal_smoothness(self, value: float):
- field = self.get_field(LapAvgCombinedPedalSmoothnessField.ID)
+ @rear_gear_shift_count.setter
+ def rear_gear_shift_count(self, value: int):
+ field = self.get_field(LapRearGearShiftCountField.ID)
if field:
if value is None:
@@ -3862,6 +4285,30 @@ def avg_flow(self, value: float):
+ @property
+ def metabolic_calories(self) -> Optional[int]:
+ field = self.get_field(LapMetabolicCaloriesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @metabolic_calories.setter
+ def metabolic_calories(self, value: int):
+ field = self.get_field(LapMetabolicCaloriesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def total_fractional_ascent(self) -> Optional[float]:
field = self.get_field(LapTotalFractionalAscentField.ID)
@@ -3982,6 +4429,30 @@ def max_core_temperature(self, value: float):
+ @property
+ def avg_grade_adjusted_speed(self) -> Optional[float]:
+ field = self.get_field(LapAvgGradeAdjustedSpeedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_grade_adjusted_speed.setter
+ def avg_grade_adjusted_speed(self, value: float):
+ field = self.get_field(LapAvgGradeAdjustedSpeedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@@ -4206,6 +4677,15 @@ def __init__(self, size: int = 0, growable: bool = True):
units = 'strokes',
reference_map = {
LapSportField.ID: [2, 5, 15, 37]
+ }),
+ SubField(
+ name='total_pushes',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'pushes',
+ reference_map = {
+ LapSportField.ID: [66, 65]
})
]
)
@@ -4348,6 +4828,33 @@ def __init__(self, size: int = 0, growable: bool = True):
units = 'strides/min',
reference_map = {
LapSportField.ID: [1]
+ }),
+ SubField(
+ name='avg_swimming_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ LapSportField.ID: [5]
+ }),
+ SubField(
+ name='avg_paddlesport_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ LapSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='avg_push_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ LapSportField.ID: [66, 65]
})
]
)
@@ -4376,6 +4883,33 @@ def __init__(self, size: int = 0, growable: bool = True):
units = 'strides/min',
reference_map = {
LapSportField.ID: [1]
+ }),
+ SubField(
+ name='max_swimming_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ LapSportField.ID: [5]
+ }),
+ SubField(
+ name='max_paddlesport_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ LapSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='max_push_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ LapSportField.ID: [66, 65]
})
]
)
@@ -4529,6 +5063,82 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class LapNecLatField(Field):
+ ID = 27
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='nec_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class LapNecLongField(Field):
+ ID = 28
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='nec_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class LapSwcLatField(Field):
+ ID = 29
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swc_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class LapSwcLongField(Field):
+ ID = 30
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swc_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class LapNumLengthsField(Field):
ID = 32
@@ -5150,6 +5760,24 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class LapAvgSwolfField(Field):
+ ID = 73
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_swolf',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class LapOpponentScoreField(Field):
ID = 74
@@ -5452,6 +6080,25 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class LapAvgStrokesPerLengthField(Field):
+ ID = 90
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_strokes_per_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'strokes / length',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class LapAvgLeftTorqueEffectivenessField(Field):
ID = 91
@@ -5547,6 +6194,42 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class LapFrontGearShiftCountField(Field):
+ ID = 96
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='front_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class LapRearGearShiftCountField(Field):
+ ID = 97
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='rear_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class LapTimeStandingField(Field):
ID = 98
@@ -6227,6 +6910,25 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class LapMetabolicCaloriesField(Field):
+ ID = 155
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='metabolic_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class LapTotalFractionalAscentField(Field):
ID = 156
@@ -6319,4 +7021,23 @@ def __init__(self, size: int = 0, growable: bool = True):
growable = growable,
sub_fields = [
]
+ )
+
+
+class LapAvgGradeAdjustedSpeedField(Field):
+ ID = 161
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_grade_adjusted_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
)
\ No newline at end of file
diff --git a/fit_tool/profile/messages/length_message.py b/fit_tool/profile/messages/length_message.py
index b5d1196..f78f29f 100644
--- a/fit_tool/profile/messages/length_message.py
+++ b/fit_tool/profile/messages/length_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -108,6 +108,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
size=0,
growable=True),
LengthMaxRespirationRateField(
+ size=0,
+ growable=True),
+ LengthMetabolicCaloriesField(
size=0,
growable=True)
])
@@ -219,6 +222,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
LengthMaxRespirationRateField(
size=cls._field_size_from_definition(
definition_message, LengthMaxRespirationRateField.ID),
+ growable=False),
+ LengthMetabolicCaloriesField(
+ size=cls._field_size_from_definition(
+ definition_message, LengthMetabolicCaloriesField.ID),
growable=False)
])
message.growable = False
@@ -764,6 +771,30 @@ def max_respiration_rate(self, value: int):
+ @property
+ def metabolic_calories(self) -> Optional[int]:
+ field = self.get_field(LengthMetabolicCaloriesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @metabolic_calories.setter
+ def metabolic_calories(self, value: int):
+ field = self.get_field(LengthMetabolicCaloriesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@@ -1137,4 +1168,23 @@ def __init__(self, size: int = 0, growable: bool = True):
growable = growable,
sub_fields = [
]
+ )
+
+
+class LengthMetabolicCaloriesField(Field):
+ ID = 26
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='metabolic_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
)
\ No newline at end of file
diff --git a/fit_tool/profile/messages/magnetometer_data_message.py b/fit_tool/profile/messages/magnetometer_data_message.py
index 39a53d8..efc1fc7 100644
--- a/fit_tool/profile/messages/magnetometer_data_message.py
+++ b/fit_tool/profile/messages/magnetometer_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/max_met_data_message.py b/fit_tool/profile/messages/max_met_data_message.py
index ace67d9..4584d4f 100644
--- a/fit_tool/profile/messages/max_met_data_message.py
+++ b/fit_tool/profile/messages/max_met_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/memo_glob_message.py b/fit_tool/profile/messages/memo_glob_message.py
index 4544fbc..e177f16 100644
--- a/fit_tool/profile/messages/memo_glob_message.py
+++ b/fit_tool/profile/messages/memo_glob_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/mesg_capabilities_message.py b/fit_tool/profile/messages/mesg_capabilities_message.py
index 3013cab..d7fbeda 100644
--- a/fit_tool/profile/messages/mesg_capabilities_message.py
+++ b/fit_tool/profile/messages/mesg_capabilities_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/message_factory.py b/fit_tool/profile/messages/message_factory.py
index 7fcc423..10eda67 100644
--- a/fit_tool/profile/messages/message_factory.py
+++ b/fit_tool/profile/messages/message_factory.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from functools import lru_cache
from importlib import import_module
from typing import List, Optional, Type
@@ -52,6 +52,7 @@
23: ('fit_tool.profile.messages.device_info_message', 'DeviceInfoMessage'),
375: ('fit_tool.profile.messages.device_aux_battery_info_message', 'DeviceAuxBatteryInfoMessage'),
72: ('fit_tool.profile.messages.training_file_message', 'TrainingFileMessage'),
+ 104: ('fit_tool.profile.messages.battery_message', 'BatteryMessage'),
128: ('fit_tool.profile.messages.weather_conditions_message', 'WeatherConditionsMessage'),
129: ('fit_tool.profile.messages.weather_alert_message', 'WeatherAlertMessage'),
160: ('fit_tool.profile.messages.gps_metadata_message', 'GpsMetadataMessage'),
diff --git a/fit_tool/profile/messages/met_zone_message.py b/fit_tool/profile/messages/met_zone_message.py
index 18c26b7..c945bca 100644
--- a/fit_tool/profile/messages/met_zone_message.py
+++ b/fit_tool/profile/messages/met_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/monitoring_hr_data_message.py b/fit_tool/profile/messages/monitoring_hr_data_message.py
index d734c04..207ad76 100644
--- a/fit_tool/profile/messages/monitoring_hr_data_message.py
+++ b/fit_tool/profile/messages/monitoring_hr_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/monitoring_info_message.py b/fit_tool/profile/messages/monitoring_info_message.py
index 0842654..3c4421e 100644
--- a/fit_tool/profile/messages/monitoring_info_message.py
+++ b/fit_tool/profile/messages/monitoring_info_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/monitoring_message.py b/fit_tool/profile/messages/monitoring_message.py
index 726b7ff..b1f8411 100644
--- a/fit_tool/profile/messages/monitoring_message.py
+++ b/fit_tool/profile/messages/monitoring_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/nap_event_message.py b/fit_tool/profile/messages/nap_event_message.py
index 961a977..a0d6c56 100644
--- a/fit_tool/profile/messages/nap_event_message.py
+++ b/fit_tool/profile/messages/nap_event_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/nmea_sentence_message.py b/fit_tool/profile/messages/nmea_sentence_message.py
index 4d8624b..875bac4 100644
--- a/fit_tool/profile/messages/nmea_sentence_message.py
+++ b/fit_tool/profile/messages/nmea_sentence_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/obdii_data_message.py b/fit_tool/profile/messages/obdii_data_message.py
index 4662285..607bd82 100644
--- a/fit_tool/profile/messages/obdii_data_message.py
+++ b/fit_tool/profile/messages/obdii_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/ohr_settings_message.py b/fit_tool/profile/messages/ohr_settings_message.py
index fcf0c0c..4ff7989 100644
--- a/fit_tool/profile/messages/ohr_settings_message.py
+++ b/fit_tool/profile/messages/ohr_settings_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/one_d_sensor_calibration_message.py b/fit_tool/profile/messages/one_d_sensor_calibration_message.py
index f11272b..0ca89f4 100644
--- a/fit_tool/profile/messages/one_d_sensor_calibration_message.py
+++ b/fit_tool/profile/messages/one_d_sensor_calibration_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/power_zone_message.py b/fit_tool/profile/messages/power_zone_message.py
index 0276612..115539a 100644
--- a/fit_tool/profile/messages/power_zone_message.py
+++ b/fit_tool/profile/messages/power_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/raw_bbi_message.py b/fit_tool/profile/messages/raw_bbi_message.py
index 49ec8e7..e86becc 100644
--- a/fit_tool/profile/messages/raw_bbi_message.py
+++ b/fit_tool/profile/messages/raw_bbi_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/record_message.py b/fit_tool/profile/messages/record_message.py
index bf4adae..e639283 100644
--- a/fit_tool/profile/messages/record_message.py
+++ b/fit_tool/profile/messages/record_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/respiration_rate_message.py b/fit_tool/profile/messages/respiration_rate_message.py
index a05e4d3..07008d6 100644
--- a/fit_tool/profile/messages/respiration_rate_message.py
+++ b/fit_tool/profile/messages/respiration_rate_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/schedule_message.py b/fit_tool/profile/messages/schedule_message.py
index 0c63113..56fad03 100644
--- a/fit_tool/profile/messages/schedule_message.py
+++ b/fit_tool/profile/messages/schedule_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sdm_profile_message.py b/fit_tool/profile/messages/sdm_profile_message.py
index a354fd3..fab111e 100644
--- a/fit_tool/profile/messages/sdm_profile_message.py
+++ b/fit_tool/profile/messages/sdm_profile_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/segment_file_message.py b/fit_tool/profile/messages/segment_file_message.py
index b15e752..95eefc2 100644
--- a/fit_tool/profile/messages/segment_file_message.py
+++ b/fit_tool/profile/messages/segment_file_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/segment_id_message.py b/fit_tool/profile/messages/segment_id_message.py
index 4a4073b..0760a20 100644
--- a/fit_tool/profile/messages/segment_id_message.py
+++ b/fit_tool/profile/messages/segment_id_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/segment_lap_message.py b/fit_tool/profile/messages/segment_lap_message.py
index f41928a..f2b943d 100644
--- a/fit_tool/profile/messages/segment_lap_message.py
+++ b/fit_tool/profile/messages/segment_lap_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -314,6 +314,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SegmentLapAvgFlowField(
size=0,
growable=True),
+ SegmentLapMetabolicCaloriesField(
+ size=0,
+ growable=True),
SegmentLapTotalFractionalAscentField(
size=0,
growable=True),
@@ -711,6 +714,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SegmentLapAvgFlowField.ID),
growable=False),
+ SegmentLapMetabolicCaloriesField(
+ size=cls._field_size_from_definition(
+ definition_message, SegmentLapMetabolicCaloriesField.ID),
+ growable=False),
SegmentLapTotalFractionalAscentField(
size=cls._field_size_from_definition(
definition_message, SegmentLapTotalFractionalAscentField.ID),
@@ -2910,6 +2917,30 @@ def avg_flow(self, value: float):
+ @property
+ def metabolic_calories(self) -> Optional[int]:
+ field = self.get_field(SegmentLapMetabolicCaloriesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @metabolic_calories.setter
+ def metabolic_calories(self, value: int):
+ field = self.get_field(SegmentLapMetabolicCaloriesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def total_fractional_ascent(self) -> Optional[float]:
field = self.get_field(SegmentLapTotalFractionalAscentField.ID)
@@ -4699,6 +4730,25 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class SegmentLapMetabolicCaloriesField(Field):
+ ID = 88
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='metabolic_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class SegmentLapTotalFractionalAscentField(Field):
ID = 89
diff --git a/fit_tool/profile/messages/segment_leaderboard_entry_message.py b/fit_tool/profile/messages/segment_leaderboard_entry_message.py
index 9745ac4..67bbb13 100644
--- a/fit_tool/profile/messages/segment_leaderboard_entry_message.py
+++ b/fit_tool/profile/messages/segment_leaderboard_entry_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/segment_point_message.py b/fit_tool/profile/messages/segment_point_message.py
index d5ddce8..f7d1eb8 100644
--- a/fit_tool/profile/messages/segment_point_message.py
+++ b/fit_tool/profile/messages/segment_point_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/session_message.py b/fit_tool/profile/messages/session_message.py
index 046597c..d040641 100644
--- a/fit_tool/profile/messages/session_message.py
+++ b/fit_tool/profile/messages/session_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -263,6 +263,12 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SessionActiveTimeField(
size=0,
growable=True),
+ SessionAvgStrokesPerLengthField(
+ size=0,
+ growable=True),
+ SessionAvgSwolfField(
+ size=0,
+ growable=True),
SessionPlayerScoreField(
size=0,
growable=True),
@@ -335,6 +341,15 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SessionAvgCombinedPedalSmoothnessField(
size=0,
growable=True),
+ SessionNumSegmentLapsField(
+ size=0,
+ growable=True),
+ SessionFrontGearShiftCountField(
+ size=0,
+ growable=True),
+ SessionRearGearShiftCountField(
+ size=0,
+ growable=True),
SessionSportProfileNameField(
size=0,
growable=True),
@@ -516,6 +531,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
size=0,
growable=True),
SessionMaxCoreTemperatureField(
+ size=0,
+ growable=True),
+ SessionAvgGradeAdjustedSpeedField(
size=0,
growable=True)
])
@@ -832,6 +850,14 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SessionActiveTimeField.ID),
growable=False),
+ SessionAvgStrokesPerLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionAvgStrokesPerLengthField.ID),
+ growable=False),
+ SessionAvgSwolfField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionAvgSwolfField.ID),
+ growable=False),
SessionPlayerScoreField(
size=cls._field_size_from_definition(
definition_message, SessionPlayerScoreField.ID),
@@ -928,6 +954,18 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SessionAvgCombinedPedalSmoothnessField.ID),
growable=False),
+ SessionNumSegmentLapsField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionNumSegmentLapsField.ID),
+ growable=False),
+ SessionFrontGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionFrontGearShiftCountField.ID),
+ growable=False),
+ SessionRearGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionRearGearShiftCountField.ID),
+ growable=False),
SessionSportProfileNameField(
size=cls._field_size_from_definition(
definition_message, SessionSportProfileNameField.ID),
@@ -1171,6 +1209,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
SessionMaxCoreTemperatureField(
size=cls._field_size_from_definition(
definition_message, SessionMaxCoreTemperatureField.ID),
+ growable=False),
+ SessionAvgGradeAdjustedSpeedField(
+ size=cls._field_size_from_definition(
+ definition_message, SessionAvgGradeAdjustedSpeedField.ID),
growable=False)
])
message.growable = False
@@ -1787,6 +1829,75 @@ def avg_running_cadence(self, value: int):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
+
+ @property
+ def avg_swimming_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionAvgCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_swimming_cadence.setter
+ def avg_swimming_cadence(self, value: int):
+ field = self.get_field(SessionAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_paddlesport_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionAvgCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_paddlesport_cadence.setter
+ def avg_paddlesport_cadence(self, value: int):
+ field = self.get_field(SessionAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionAvgCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_push_cadence.setter
+ def avg_push_cadence(self, value: int):
+ field = self.get_field(SessionAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
@property
def max_cadence(self) -> Optional[int]:
field = self.get_field(SessionMaxCadenceField.ID)
@@ -1834,6 +1945,75 @@ def max_running_cadence(self, value: int):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
+
+ @property
+ def max_swimming_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionMaxCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_swimming_cadence.setter
+ def max_swimming_cadence(self, value: int):
+ field = self.get_field(SessionMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_paddlesport_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionMaxCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_paddlesport_cadence.setter
+ def max_paddlesport_cadence(self, value: int):
+ field = self.get_field(SessionMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SessionMaxCadenceField.ID)
+ type_field = self.get_field(SessionSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_push_cadence.setter
+ def max_push_cadence(self, value: int):
+ field = self.get_field(SessionMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
@property
def avg_power(self) -> Optional[int]:
field = self.get_field(SessionAvgPowerField.ID)
@@ -3074,6 +3254,54 @@ def active_time(self, value: float):
+ @property
+ def avg_strokes_per_length(self) -> Optional[float]:
+ field = self.get_field(SessionAvgStrokesPerLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_strokes_per_length.setter
+ def avg_strokes_per_length(self, value: float):
+ field = self.get_field(SessionAvgStrokesPerLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_swolf(self) -> Optional[int]:
+ field = self.get_field(SessionAvgSwolfField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_swolf.setter
+ def avg_swolf(self, value: int):
+ field = self.get_field(SessionAvgSwolfField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def player_score(self) -> Optional[int]:
field = self.get_field(SessionPlayerScoreField.ID)
@@ -3634,6 +3862,78 @@ def avg_combined_pedal_smoothness(self, value: float):
+ @property
+ def num_segment_laps(self) -> Optional[int]:
+ field = self.get_field(SessionNumSegmentLapsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_segment_laps.setter
+ def num_segment_laps(self, value: int):
+ field = self.get_field(SessionNumSegmentLapsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def front_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(SessionFrontGearShiftCountField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @front_gear_shift_count.setter
+ def front_gear_shift_count(self, value: int):
+ field = self.get_field(SessionFrontGearShiftCountField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def rear_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(SessionRearGearShiftCountField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @rear_gear_shift_count.setter
+ def rear_gear_shift_count(self, value: int):
+ field = self.get_field(SessionRearGearShiftCountField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@property
def sport_profile_name(self) -> Optional[str]:
field = self.get_field(SessionSportProfileNameField.ID)
@@ -5082,6 +5382,30 @@ def max_core_temperature(self, value: float):
+ @property
+ def avg_grade_adjusted_speed(self) -> Optional[float]:
+ field = self.get_field(SessionAvgGradeAdjustedSpeedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_grade_adjusted_speed.setter
+ def avg_grade_adjusted_speed(self, value: float):
+ field = self.get_field(SessionAvgGradeAdjustedSpeedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
@@ -5465,6 +5789,33 @@ def __init__(self, size: int = 0, growable: bool = True):
units = 'strides/min',
reference_map = {
SessionSportField.ID: [1]
+ }),
+ SubField(
+ name='avg_swimming_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SessionSportField.ID: [5]
+ }),
+ SubField(
+ name='avg_paddlesport_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SessionSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='avg_push_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SessionSportField.ID: [66, 65]
})
]
)
@@ -5493,6 +5844,33 @@ def __init__(self, size: int = 0, growable: bool = True):
units = 'strides/min',
reference_map = {
SessionSportField.ID: [1]
+ }),
+ SubField(
+ name='max_swimming_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SessionSportField.ID: [5]
+ }),
+ SubField(
+ name='max_paddlesport_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SessionSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='max_push_cadence',
+ base_type=BaseType.UINT8,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SessionSportField.ID: [66, 65]
})
]
)
@@ -6478,6 +6856,43 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class SessionAvgStrokesPerLengthField(Field):
+ ID = 79
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_strokes_per_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'strokes/length',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SessionAvgSwolfField(Field):
+ ID = 80
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_swolf',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class SessionPlayerScoreField(Field):
ID = 82
@@ -6931,6 +7346,60 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class SessionNumSegmentLapsField(Field):
+ ID = 106
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_segment_laps',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SessionFrontGearShiftCountField(Field):
+ ID = 107
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='front_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SessionRearGearShiftCountField(Field):
+ ID = 108
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='rear_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class SessionSportProfileNameField(Field):
ID = 110
@@ -8074,4 +8543,23 @@ def __init__(self, size: int = 0, growable: bool = True):
growable = growable,
sub_fields = [
]
+ )
+
+
+class SessionAvgGradeAdjustedSpeedField(Field):
+ ID = 211
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_grade_adjusted_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
)
\ No newline at end of file
diff --git a/fit_tool/profile/messages/set_message.py b/fit_tool/profile/messages/set_message.py
index 8e7e440..eb8b838 100644
--- a/fit_tool/profile/messages/set_message.py
+++ b/fit_tool/profile/messages/set_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/skin_temp_overnight_message.py b/fit_tool/profile/messages/skin_temp_overnight_message.py
index 26c1250..51b05cb 100644
--- a/fit_tool/profile/messages/skin_temp_overnight_message.py
+++ b/fit_tool/profile/messages/skin_temp_overnight_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/slave_device_message.py b/fit_tool/profile/messages/slave_device_message.py
index dbd73ed..7f0295d 100644
--- a/fit_tool/profile/messages/slave_device_message.py
+++ b/fit_tool/profile/messages/slave_device_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sleep_assessment_message.py b/fit_tool/profile/messages/sleep_assessment_message.py
index 69b5024..8e1fc7a 100644
--- a/fit_tool/profile/messages/sleep_assessment_message.py
+++ b/fit_tool/profile/messages/sleep_assessment_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sleep_disruption_overnight_severity_message.py b/fit_tool/profile/messages/sleep_disruption_overnight_severity_message.py
index 46f62ab..a9e5a2f 100644
--- a/fit_tool/profile/messages/sleep_disruption_overnight_severity_message.py
+++ b/fit_tool/profile/messages/sleep_disruption_overnight_severity_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sleep_disruption_severity_period_message.py b/fit_tool/profile/messages/sleep_disruption_severity_period_message.py
index 0dd25d9..76cad7c 100644
--- a/fit_tool/profile/messages/sleep_disruption_severity_period_message.py
+++ b/fit_tool/profile/messages/sleep_disruption_severity_period_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sleep_level_message.py b/fit_tool/profile/messages/sleep_level_message.py
index 9f3a447..530d91a 100644
--- a/fit_tool/profile/messages/sleep_level_message.py
+++ b/fit_tool/profile/messages/sleep_level_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/software_message.py b/fit_tool/profile/messages/software_message.py
index 5730c46..66ed359 100644
--- a/fit_tool/profile/messages/software_message.py
+++ b/fit_tool/profile/messages/software_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/speed_zone_message.py b/fit_tool/profile/messages/speed_zone_message.py
index 5c39c00..0b433b6 100644
--- a/fit_tool/profile/messages/speed_zone_message.py
+++ b/fit_tool/profile/messages/speed_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/split_message.py b/fit_tool/profile/messages/split_message.py
index 1bb3ad7..1c424d2 100644
--- a/fit_tool/profile/messages/split_message.py
+++ b/fit_tool/profile/messages/split_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -47,6 +47,9 @@ def __init__(self, developer_fields=None, local_id: int = 0,
MessageIndexField(
size=0,
growable=True),
+ TimestampField(
+ size=0,
+ growable=True),
SplitSplitTypeField(
size=0,
growable=True),
@@ -65,12 +68,36 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SplitStartTimeField(
size=0,
growable=True),
+ SplitSportField(
+ size=0,
+ growable=True),
+ SplitSubSportField(
+ size=0,
+ growable=True),
SplitTotalAscentField(
size=0,
growable=True),
SplitTotalDescentField(
size=0,
growable=True),
+ SplitAvgHeartRateField(
+ size=0,
+ growable=True),
+ SplitMaxHeartRateField(
+ size=0,
+ growable=True),
+ SplitNecLatField(
+ size=0,
+ growable=True),
+ SplitNecLongField(
+ size=0,
+ growable=True),
+ SplitSwcLatField(
+ size=0,
+ growable=True),
+ SplitSwcLongField(
+ size=0,
+ growable=True),
SplitStartPositionLatField(
size=0,
growable=True),
@@ -95,13 +122,226 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SplitTotalCaloriesField(
size=0,
growable=True),
+ SplitAvgCadenceField(
+ size=0,
+ growable=True),
+ SplitMaxCadenceField(
+ size=0,
+ growable=True),
+ SplitTotalCyclesField(
+ size=0,
+ growable=True),
+ SplitAvgTemperatureField(
+ size=0,
+ growable=True),
+ SplitMaxTemperatureField(
+ size=0,
+ growable=True),
+ SplitMinTemperatureField(
+ size=0,
+ growable=True),
+ SplitAvgVerticalOscillationField(
+ size=0,
+ growable=True),
+ SplitAvgVerticalRatioField(
+ size=0,
+ growable=True),
+ SplitAvgStanceTimeField(
+ size=0,
+ growable=True),
+ SplitAvgStanceTimeBalanceField(
+ size=0,
+ growable=True),
+ SplitAvgStepLengthField(
+ size=0,
+ growable=True),
+ SplitAvgPowerField(
+ size=0,
+ growable=True),
+ SplitMaxPowerField(
+ size=0,
+ growable=True),
+ SplitNormalizedPowerField(
+ size=0,
+ growable=True),
+ SplitLeftRightBalanceField(
+ size=0,
+ growable=True),
+ SplitTimeStandingField(
+ size=0,
+ growable=True),
+ SplitAvgLeftPcoField(
+ size=0,
+ growable=True),
+ SplitAvgRightPcoField(
+ size=0,
+ growable=True),
+ SplitAvgLeftPowerPhaseField(
+ size=0,
+ growable=True),
+ SplitAvgLeftPowerPhasePeakField(
+ size=0,
+ growable=True),
+ SplitAvgRightPowerPhaseField(
+ size=0,
+ growable=True),
+ SplitAvgRightPowerPhasePeakField(
+ size=0,
+ growable=True),
+ SplitAvgPowerPositionField(
+ size=0,
+ growable=True),
+ SplitMaxPowerPositionField(
+ size=0,
+ growable=True),
+ SplitAvgLeftTorqueEffectivenessField(
+ size=0,
+ growable=True),
+ SplitAvgRightTorqueEffectivenessField(
+ size=0,
+ growable=True),
+ SplitAvgLeftPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitAvgRightPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitAvgCombinedPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitAvgFlowField(
+ size=0,
+ growable=True),
+ SplitTotalGritField(
+ size=0,
+ growable=True),
+ SplitSwimStrokeField(
+ size=0,
+ growable=True),
+ SplitNumActiveLengthsField(
+ size=0,
+ growable=True),
+ SplitAvgSwolfField(
+ size=0,
+ growable=True),
+ SplitAvgStrokeDistanceField(
+ size=0,
+ growable=True),
+ SplitAvgStrokesPerLengthField(
+ size=0,
+ growable=True),
+ SplitFirstLapIndexField(
+ size=0,
+ growable=True),
+ SplitNumLapsField(
+ size=0,
+ growable=True),
+ SplitClimbGradingScaleField(
+ size=0,
+ growable=True),
+ SplitClimbGradeValueField(
+ size=0,
+ growable=True),
+ SplitStatusField(
+ size=0,
+ growable=True),
+ SplitNumFallsField(
+ size=0,
+ growable=True),
+ SplitClimbSendField(
+ size=0,
+ growable=True),
SplitStartElevationField(
size=0,
growable=True),
SplitActiveTimeField(
size=0,
growable=True),
+ SplitMetabolicCaloriesField(
+ size=0,
+ growable=True),
+ SplitTotalFractionalAscentField(
+ size=0,
+ growable=True),
+ SplitTotalFractionalDescentField(
+ size=0,
+ growable=True),
+ SplitAvgGradeField(
+ size=0,
+ growable=True),
+ SplitMaxGradeField(
+ size=0,
+ growable=True),
+ SplitMinCadenceField(
+ size=0,
+ growable=True),
+ SplitAvgGradeAdjustedSpeedField(
+ size=0,
+ growable=True),
+ SplitAvgStressField(
+ size=0,
+ growable=True),
+ SplitAvgVamField(
+ size=0,
+ growable=True),
+ SplitJumpCountField(
+ size=0,
+ growable=True),
SplitTotalMovingTimeField(
+ size=0,
+ growable=True),
+ SplitDiveSectionTypeField(
+ size=0,
+ growable=True),
+ SplitAvgAscentRateField(
+ size=0,
+ growable=True),
+ SplitMaxAscentRateField(
+ size=0,
+ growable=True),
+ SplitAvgDescentRateField(
+ size=0,
+ growable=True),
+ SplitMaxDescentRateField(
+ size=0,
+ growable=True),
+ SplitTotalAscentTimeField(
+ size=0,
+ growable=True),
+ SplitTotalDescentTimeField(
+ size=0,
+ growable=True),
+ SplitTotalHangTimeField(
+ size=0,
+ growable=True),
+ SplitApneaDisciplineField(
+ size=0,
+ growable=True),
+ SplitAvgDepthField(
+ size=0,
+ growable=True),
+ SplitMaxDepthField(
+ size=0,
+ growable=True),
+ SplitMinHeartRateField(
+ size=0,
+ growable=True),
+ SplitSurfaceIntervalField(
+ size=0,
+ growable=True),
+ SplitTotalFractionalCyclesField(
+ size=0,
+ growable=True),
+ SplitAvgStanceTimePercentField(
+ size=0,
+ growable=True),
+ SplitTotalAnaerobicTrainingEffectField(
+ size=0,
+ growable=True),
+ SplitFrontGearShiftCountField(
+ size=0,
+ growable=True),
+ SplitRearGearShiftCountField(
size=0,
growable=True)
])
@@ -130,6 +370,10 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, MessageIndexField.ID),
growable=False),
+ TimestampField(
+ size=cls._field_size_from_definition(
+ definition_message, TimestampField.ID),
+ growable=False),
SplitSplitTypeField(
size=cls._field_size_from_definition(
definition_message, SplitSplitTypeField.ID),
@@ -154,6 +398,14 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SplitStartTimeField.ID),
growable=False),
+ SplitSportField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSportField.ID),
+ growable=False),
+ SplitSubSportField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSubSportField.ID),
+ growable=False),
SplitTotalAscentField(
size=cls._field_size_from_definition(
definition_message, SplitTotalAscentField.ID),
@@ -162,6 +414,30 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SplitTotalDescentField.ID),
growable=False),
+ SplitAvgHeartRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgHeartRateField.ID),
+ growable=False),
+ SplitMaxHeartRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxHeartRateField.ID),
+ growable=False),
+ SplitNecLatField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNecLatField.ID),
+ growable=False),
+ SplitNecLongField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNecLongField.ID),
+ growable=False),
+ SplitSwcLatField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSwcLatField.ID),
+ growable=False),
+ SplitSwcLongField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSwcLongField.ID),
+ growable=False),
SplitStartPositionLatField(
size=cls._field_size_from_definition(
definition_message, SplitStartPositionLatField.ID),
@@ -194,96 +470,332 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SplitTotalCaloriesField.ID),
growable=False),
- SplitStartElevationField(
+ SplitAvgCadenceField(
size=cls._field_size_from_definition(
- definition_message, SplitStartElevationField.ID),
+ definition_message, SplitAvgCadenceField.ID),
growable=False),
- SplitActiveTimeField(
+ SplitMaxCadenceField(
size=cls._field_size_from_definition(
- definition_message, SplitActiveTimeField.ID),
+ definition_message, SplitMaxCadenceField.ID),
growable=False),
- SplitTotalMovingTimeField(
+ SplitTotalCyclesField(
size=cls._field_size_from_definition(
- definition_message, SplitTotalMovingTimeField.ID),
- growable=False)
- ])
- message.growable = False
- # Keep definition field ids not present in the Profile schema (Stage 2 E).
- message.retain_unknown_fields()
- return message
-
- @classmethod
- def from_bytes(cls, definition_message: DefinitionMessage, developer_fields: list[DeveloperField],
- bytes_buffer: bytes, offset: int = 0):
- message = cls.from_definition(definition_message, developer_fields=developer_fields)
- message.read_from_bytes(bytes_buffer, offset)
- return message
-
-
-
-
- @property
- def message_index(self) -> Optional[int]:
- field = self.get_field(MessageIndexField.ID)
- if field and field.is_valid():
- sub_field = field.get_valid_sub_field(self.fields)
- return field.get_value(sub_field=sub_field)
- else:
- return None
-
-
-
- @message_index.setter
- def message_index(self, value: int):
- field = self.get_field(MessageIndexField.ID)
-
- if field:
- if value is None:
- field.clear()
- else:
- sub_field = field.get_valid_sub_field(self.fields)
- field.set_value(0, value, sub_field)
-
-
-
- @property
- def split_type(self) -> Optional[SplitType]:
- field = self.get_field(SplitSplitTypeField.ID)
- if field and field.is_valid():
- sub_field = field.get_valid_sub_field(self.fields)
- return field.get_value(sub_field=sub_field)
- else:
- return None
-
-
-
- @split_type.setter
- def split_type(self, value: SplitType):
- field = self.get_field(SplitSplitTypeField.ID)
-
- if field:
- if value is None:
- field.clear()
- else:
- sub_field = field.get_valid_sub_field(self.fields)
- field.set_value(0, value, sub_field)
-
-
-
- @property
- def total_elapsed_time(self) -> Optional[float]:
- field = self.get_field(SplitTotalElapsedTimeField.ID)
- if field and field.is_valid():
- sub_field = field.get_valid_sub_field(self.fields)
- return field.get_value(sub_field=sub_field)
- else:
+ definition_message, SplitTotalCyclesField.ID),
+ growable=False),
+ SplitAvgTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgTemperatureField.ID),
+ growable=False),
+ SplitMaxTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxTemperatureField.ID),
+ growable=False),
+ SplitMinTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMinTemperatureField.ID),
+ growable=False),
+ SplitAvgVerticalOscillationField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgVerticalOscillationField.ID),
+ growable=False),
+ SplitAvgVerticalRatioField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgVerticalRatioField.ID),
+ growable=False),
+ SplitAvgStanceTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStanceTimeField.ID),
+ growable=False),
+ SplitAvgStanceTimeBalanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStanceTimeBalanceField.ID),
+ growable=False),
+ SplitAvgStepLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStepLengthField.ID),
+ growable=False),
+ SplitAvgPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgPowerField.ID),
+ growable=False),
+ SplitMaxPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxPowerField.ID),
+ growable=False),
+ SplitNormalizedPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNormalizedPowerField.ID),
+ growable=False),
+ SplitLeftRightBalanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitLeftRightBalanceField.ID),
+ growable=False),
+ SplitTimeStandingField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTimeStandingField.ID),
+ growable=False),
+ SplitAvgLeftPcoField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgLeftPcoField.ID),
+ growable=False),
+ SplitAvgRightPcoField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgRightPcoField.ID),
+ growable=False),
+ SplitAvgLeftPowerPhaseField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgLeftPowerPhaseField.ID),
+ growable=False),
+ SplitAvgLeftPowerPhasePeakField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgLeftPowerPhasePeakField.ID),
+ growable=False),
+ SplitAvgRightPowerPhaseField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgRightPowerPhaseField.ID),
+ growable=False),
+ SplitAvgRightPowerPhasePeakField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgRightPowerPhasePeakField.ID),
+ growable=False),
+ SplitAvgPowerPositionField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgPowerPositionField.ID),
+ growable=False),
+ SplitMaxPowerPositionField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxPowerPositionField.ID),
+ growable=False),
+ SplitAvgLeftTorqueEffectivenessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgLeftTorqueEffectivenessField.ID),
+ growable=False),
+ SplitAvgRightTorqueEffectivenessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgRightTorqueEffectivenessField.ID),
+ growable=False),
+ SplitAvgLeftPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgLeftPedalSmoothnessField.ID),
+ growable=False),
+ SplitAvgRightPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgRightPedalSmoothnessField.ID),
+ growable=False),
+ SplitAvgCombinedPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgCombinedPedalSmoothnessField.ID),
+ growable=False),
+ SplitAvgFlowField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgFlowField.ID),
+ growable=False),
+ SplitTotalGritField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalGritField.ID),
+ growable=False),
+ SplitSwimStrokeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSwimStrokeField.ID),
+ growable=False),
+ SplitNumActiveLengthsField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNumActiveLengthsField.ID),
+ growable=False),
+ SplitAvgSwolfField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgSwolfField.ID),
+ growable=False),
+ SplitAvgStrokeDistanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStrokeDistanceField.ID),
+ growable=False),
+ SplitAvgStrokesPerLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStrokesPerLengthField.ID),
+ growable=False),
+ SplitFirstLapIndexField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitFirstLapIndexField.ID),
+ growable=False),
+ SplitNumLapsField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNumLapsField.ID),
+ growable=False),
+ SplitClimbGradingScaleField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitClimbGradingScaleField.ID),
+ growable=False),
+ SplitClimbGradeValueField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitClimbGradeValueField.ID),
+ growable=False),
+ SplitStatusField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitStatusField.ID),
+ growable=False),
+ SplitNumFallsField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitNumFallsField.ID),
+ growable=False),
+ SplitClimbSendField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitClimbSendField.ID),
+ growable=False),
+ SplitStartElevationField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitStartElevationField.ID),
+ growable=False),
+ SplitActiveTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitActiveTimeField.ID),
+ growable=False),
+ SplitMetabolicCaloriesField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMetabolicCaloriesField.ID),
+ growable=False),
+ SplitTotalFractionalAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalFractionalAscentField.ID),
+ growable=False),
+ SplitTotalFractionalDescentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalFractionalDescentField.ID),
+ growable=False),
+ SplitAvgGradeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgGradeField.ID),
+ growable=False),
+ SplitMaxGradeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxGradeField.ID),
+ growable=False),
+ SplitMinCadenceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMinCadenceField.ID),
+ growable=False),
+ SplitAvgGradeAdjustedSpeedField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgGradeAdjustedSpeedField.ID),
+ growable=False),
+ SplitAvgStressField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStressField.ID),
+ growable=False),
+ SplitAvgVamField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgVamField.ID),
+ growable=False),
+ SplitJumpCountField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitJumpCountField.ID),
+ growable=False),
+ SplitTotalMovingTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalMovingTimeField.ID),
+ growable=False),
+ SplitDiveSectionTypeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitDiveSectionTypeField.ID),
+ growable=False),
+ SplitAvgAscentRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgAscentRateField.ID),
+ growable=False),
+ SplitMaxAscentRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxAscentRateField.ID),
+ growable=False),
+ SplitAvgDescentRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgDescentRateField.ID),
+ growable=False),
+ SplitMaxDescentRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxDescentRateField.ID),
+ growable=False),
+ SplitTotalAscentTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalAscentTimeField.ID),
+ growable=False),
+ SplitTotalDescentTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalDescentTimeField.ID),
+ growable=False),
+ SplitTotalHangTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalHangTimeField.ID),
+ growable=False),
+ SplitApneaDisciplineField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitApneaDisciplineField.ID),
+ growable=False),
+ SplitAvgDepthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgDepthField.ID),
+ growable=False),
+ SplitMaxDepthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMaxDepthField.ID),
+ growable=False),
+ SplitMinHeartRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitMinHeartRateField.ID),
+ growable=False),
+ SplitSurfaceIntervalField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSurfaceIntervalField.ID),
+ growable=False),
+ SplitTotalFractionalCyclesField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalFractionalCyclesField.ID),
+ growable=False),
+ SplitAvgStanceTimePercentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitAvgStanceTimePercentField.ID),
+ growable=False),
+ SplitTotalAnaerobicTrainingEffectField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitTotalAnaerobicTrainingEffectField.ID),
+ growable=False),
+ SplitFrontGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitFrontGearShiftCountField.ID),
+ growable=False),
+ SplitRearGearShiftCountField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitRearGearShiftCountField.ID),
+ growable=False)
+ ])
+ message.growable = False
+ # Keep definition field ids not present in the Profile schema (Stage 2 E).
+ message.retain_unknown_fields()
+ return message
+
+ @classmethod
+ def from_bytes(cls, definition_message: DefinitionMessage, developer_fields: list[DeveloperField],
+ bytes_buffer: bytes, offset: int = 0):
+ message = cls.from_definition(definition_message, developer_fields=developer_fields)
+ message.read_from_bytes(bytes_buffer, offset)
+ return message
+
+
+
+
+ @property
+ def message_index(self) -> Optional[int]:
+ field = self.get_field(MessageIndexField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
return None
- @total_elapsed_time.setter
- def total_elapsed_time(self, value: float):
- field = self.get_field(SplitTotalElapsedTimeField.ID)
+ @message_index.setter
+ def message_index(self, value: int):
+ field = self.get_field(MessageIndexField.ID)
if field:
if value is None:
@@ -293,10 +805,11 @@ def total_elapsed_time(self, value: float):
field.set_value(0, value, sub_field)
+# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
@property
- def total_timer_time(self) -> Optional[float]:
- field = self.get_field(SplitTotalTimerTimeField.ID)
+ def timestamp(self) -> Optional[int]:
+ field = self.get_field(TimestampField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -304,10 +817,11 @@ def total_timer_time(self) -> Optional[float]:
return None
+ # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
- @total_timer_time.setter
- def total_timer_time(self, value: float):
- field = self.get_field(SplitTotalTimerTimeField.ID)
+ @timestamp.setter
+ def timestamp(self, value: int):
+ field = self.get_field(TimestampField.ID)
if field:
if value is None:
@@ -319,8 +833,8 @@ def total_timer_time(self, value: float):
@property
- def total_distance(self) -> Optional[float]:
- field = self.get_field(SplitTotalDistanceField.ID)
+ def split_type(self) -> Optional[SplitType]:
+ field = self.get_field(SplitSplitTypeField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -329,9 +843,9 @@ def total_distance(self) -> Optional[float]:
- @total_distance.setter
- def total_distance(self, value: float):
- field = self.get_field(SplitTotalDistanceField.ID)
+ @split_type.setter
+ def split_type(self, value: SplitType):
+ field = self.get_field(SplitSplitTypeField.ID)
if field:
if value is None:
@@ -343,8 +857,8 @@ def total_distance(self, value: float):
@property
- def avg_speed(self) -> Optional[float]:
- field = self.get_field(SplitAvgSpeedField.ID)
+ def total_elapsed_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalElapsedTimeField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -353,9 +867,9 @@ def avg_speed(self) -> Optional[float]:
- @avg_speed.setter
- def avg_speed(self, value: float):
- field = self.get_field(SplitAvgSpeedField.ID)
+ @total_elapsed_time.setter
+ def total_elapsed_time(self, value: float):
+ field = self.get_field(SplitTotalElapsedTimeField.ID)
if field:
if value is None:
@@ -365,11 +879,10 @@ def avg_speed(self, value: float):
field.set_value(0, value, sub_field)
-# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
@property
- def start_time(self) -> Optional[int]:
- field = self.get_field(SplitStartTimeField.ID)
+ def total_timer_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalTimerTimeField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -377,11 +890,10 @@ def start_time(self) -> Optional[int]:
return None
- # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
- @start_time.setter
- def start_time(self, value: int):
- field = self.get_field(SplitStartTimeField.ID)
+ @total_timer_time.setter
+ def total_timer_time(self, value: float):
+ field = self.get_field(SplitTotalTimerTimeField.ID)
if field:
if value is None:
@@ -393,8 +905,8 @@ def start_time(self, value: int):
@property
- def total_ascent(self) -> Optional[int]:
- field = self.get_field(SplitTotalAscentField.ID)
+ def total_distance(self) -> Optional[float]:
+ field = self.get_field(SplitTotalDistanceField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -403,9 +915,9 @@ def total_ascent(self) -> Optional[int]:
- @total_ascent.setter
- def total_ascent(self, value: int):
- field = self.get_field(SplitTotalAscentField.ID)
+ @total_distance.setter
+ def total_distance(self, value: float):
+ field = self.get_field(SplitTotalDistanceField.ID)
if field:
if value is None:
@@ -417,8 +929,8 @@ def total_ascent(self, value: int):
@property
- def total_descent(self) -> Optional[int]:
- field = self.get_field(SplitTotalDescentField.ID)
+ def avg_speed(self) -> Optional[float]:
+ field = self.get_field(SplitAvgSpeedField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -427,9 +939,9 @@ def total_descent(self) -> Optional[int]:
- @total_descent.setter
- def total_descent(self, value: int):
- field = self.get_field(SplitTotalDescentField.ID)
+ @avg_speed.setter
+ def avg_speed(self, value: float):
+ field = self.get_field(SplitAvgSpeedField.ID)
if field:
if value is None:
@@ -439,10 +951,11 @@ def total_descent(self, value: int):
field.set_value(0, value, sub_field)
+# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
@property
- def start_position_lat(self) -> Optional[float]:
- field = self.get_field(SplitStartPositionLatField.ID)
+ def start_time(self) -> Optional[int]:
+ field = self.get_field(SplitStartTimeField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -450,10 +963,11 @@ def start_position_lat(self) -> Optional[float]:
return None
+ # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
- @start_position_lat.setter
- def start_position_lat(self, value: float):
- field = self.get_field(SplitStartPositionLatField.ID)
+ @start_time.setter
+ def start_time(self, value: int):
+ field = self.get_field(SplitStartTimeField.ID)
if field:
if value is None:
@@ -465,8 +979,8 @@ def start_position_lat(self, value: float):
@property
- def start_position_long(self) -> Optional[float]:
- field = self.get_field(SplitStartPositionLongField.ID)
+ def sport(self) -> Optional[Sport]:
+ field = self.get_field(SplitSportField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -475,9 +989,9 @@ def start_position_long(self) -> Optional[float]:
- @start_position_long.setter
- def start_position_long(self, value: float):
- field = self.get_field(SplitStartPositionLongField.ID)
+ @sport.setter
+ def sport(self, value: Sport):
+ field = self.get_field(SplitSportField.ID)
if field:
if value is None:
@@ -489,8 +1003,272 @@ def start_position_long(self, value: float):
@property
- def end_position_lat(self) -> Optional[float]:
- field = self.get_field(SplitEndPositionLatField.ID)
+ def sub_sport(self) -> Optional[SubSport]:
+ field = self.get_field(SplitSubSportField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @sub_sport.setter
+ def sub_sport(self, value: SubSport):
+ field = self.get_field(SplitSubSportField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_ascent(self) -> Optional[int]:
+ field = self.get_field(SplitTotalAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_ascent.setter
+ def total_ascent(self, value: int):
+ field = self.get_field(SplitTotalAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_descent(self) -> Optional[int]:
+ field = self.get_field(SplitTotalDescentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_descent.setter
+ def total_descent(self, value: int):
+ field = self.get_field(SplitTotalDescentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_heart_rate(self) -> Optional[int]:
+ field = self.get_field(SplitAvgHeartRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_heart_rate.setter
+ def avg_heart_rate(self, value: int):
+ field = self.get_field(SplitAvgHeartRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_heart_rate(self) -> Optional[int]:
+ field = self.get_field(SplitMaxHeartRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_heart_rate.setter
+ def max_heart_rate(self, value: int):
+ field = self.get_field(SplitMaxHeartRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def nec_lat(self) -> Optional[float]:
+ field = self.get_field(SplitNecLatField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @nec_lat.setter
+ def nec_lat(self, value: float):
+ field = self.get_field(SplitNecLatField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def nec_long(self) -> Optional[float]:
+ field = self.get_field(SplitNecLongField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @nec_long.setter
+ def nec_long(self, value: float):
+ field = self.get_field(SplitNecLongField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swc_lat(self) -> Optional[float]:
+ field = self.get_field(SplitSwcLatField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swc_lat.setter
+ def swc_lat(self, value: float):
+ field = self.get_field(SplitSwcLatField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swc_long(self) -> Optional[float]:
+ field = self.get_field(SplitSwcLongField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swc_long.setter
+ def swc_long(self, value: float):
+ field = self.get_field(SplitSwcLongField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def start_position_lat(self) -> Optional[float]:
+ field = self.get_field(SplitStartPositionLatField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @start_position_lat.setter
+ def start_position_lat(self, value: float):
+ field = self.get_field(SplitStartPositionLatField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def start_position_long(self) -> Optional[float]:
+ field = self.get_field(SplitStartPositionLongField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @start_position_long.setter
+ def start_position_long(self, value: float):
+ field = self.get_field(SplitStartPositionLongField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def end_position_lat(self) -> Optional[float]:
+ field = self.get_field(SplitEndPositionLatField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -635,8 +1413,8 @@ def total_calories(self, value: int):
@property
- def start_elevation(self) -> Optional[float]:
- field = self.get_field(SplitStartElevationField.ID)
+ def avg_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitAvgCadenceField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -645,9 +1423,9 @@ def start_elevation(self) -> Optional[float]:
- @start_elevation.setter
- def start_elevation(self, value: float):
- field = self.get_field(SplitStartElevationField.ID)
+ @avg_cadence.setter
+ def avg_cadence(self, value: float):
+ field = self.get_field(SplitAvgCadenceField.ID)
if field:
if value is None:
@@ -658,21 +1436,22 @@ def start_elevation(self, value: float):
+
@property
- def active_time(self) -> Optional[float]:
- field = self.get_field(SplitActiveTimeField.ID)
- if field and field.is_valid():
+ def avg_running_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitAvgCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
else:
return None
-
-
- @active_time.setter
- def active_time(self, value: float):
- field = self.get_field(SplitActiveTimeField.ID)
-
+ @avg_running_cadence.setter
+ def avg_running_cadence(self, value: float):
+ field = self.get_field(SplitAvgCadenceField.ID)
if field:
if value is None:
field.clear()
@@ -680,79 +1459,4072 @@ def active_time(self, value: float):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
-
@property
- def total_moving_time(self) -> Optional[float]:
- field = self.get_field(SplitTotalMovingTimeField.ID)
- if field and field.is_valid():
+ def avg_swimming_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitAvgCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
else:
return None
+ @avg_swimming_cadence.setter
+ def avg_swimming_cadence(self, value: float):
+ field = self.get_field(SplitAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_paddlesport_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitAvgCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_paddlesport_cadence.setter
+ def avg_paddlesport_cadence(self, value: float):
+ field = self.get_field(SplitAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def avg_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SplitAvgCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @avg_push_cadence.setter
+ def avg_push_cadence(self, value: int):
+ field = self.get_field(SplitAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def max_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMaxCadenceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_cadence.setter
+ def max_cadence(self, value: float):
+ field = self.get_field(SplitMaxCadenceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def max_running_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMaxCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_running_cadence.setter
+ def max_running_cadence(self, value: float):
+ field = self.get_field(SplitMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_swimming_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMaxCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_swimming_cadence.setter
+ def max_swimming_cadence(self, value: float):
+ field = self.get_field(SplitMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_paddlesport_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMaxCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_paddlesport_cadence.setter
+ def max_paddlesport_cadence(self, value: float):
+ field = self.get_field(SplitMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SplitMaxCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_push_cadence.setter
+ def max_push_cadence(self, value: int):
+ field = self.get_field(SplitMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def total_cycles(self) -> Optional[int]:
+ field = self.get_field(SplitTotalCyclesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_cycles.setter
+ def total_cycles(self, value: int):
+ field = self.get_field(SplitTotalCyclesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def total_strides(self) -> Optional[int]:
+ field = self.get_field(SplitTotalCyclesField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1, 11]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_strides.setter
+ def total_strides(self, value: int):
+ field = self.get_field(SplitTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_strokes(self) -> Optional[int]:
+ field = self.get_field(SplitTotalCyclesField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [2, 5, 15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_strokes.setter
+ def total_strokes(self, value: int):
+ field = self.get_field(SplitTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_reps(self) -> Optional[int]:
+ field = self.get_field(SplitTotalCyclesField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [62]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_reps.setter
+ def total_reps(self, value: int):
+ field = self.get_field(SplitTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_pushes(self) -> Optional[int]:
+ field = self.get_field(SplitTotalCyclesField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_pushes.setter
+ def total_pushes(self, value: int):
+ field = self.get_field(SplitTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def avg_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitAvgTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_temperature.setter
+ def avg_temperature(self, value: int):
+ field = self.get_field(SplitAvgTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitMaxTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_temperature.setter
+ def max_temperature(self, value: int):
+ field = self.get_field(SplitMaxTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def min_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitMinTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @min_temperature.setter
+ def min_temperature(self, value: int):
+ field = self.get_field(SplitMinTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_vertical_oscillation(self) -> Optional[float]:
+ field = self.get_field(SplitAvgVerticalOscillationField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_vertical_oscillation.setter
+ def avg_vertical_oscillation(self, value: float):
+ field = self.get_field(SplitAvgVerticalOscillationField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_vertical_ratio(self) -> Optional[float]:
+ field = self.get_field(SplitAvgVerticalRatioField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_vertical_ratio.setter
+ def avg_vertical_ratio(self, value: float):
+ field = self.get_field(SplitAvgVerticalRatioField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStanceTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time.setter
+ def avg_stance_time(self, value: float):
+ field = self.get_field(SplitAvgStanceTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time_balance(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStanceTimeBalanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time_balance.setter
+ def avg_stance_time_balance(self, value: float):
+ field = self.get_field(SplitAvgStanceTimeBalanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_step_length(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStepLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_step_length.setter
+ def avg_step_length(self, value: float):
+ field = self.get_field(SplitAvgStepLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_power(self) -> Optional[int]:
+ field = self.get_field(SplitAvgPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_power.setter
+ def avg_power(self, value: int):
+ field = self.get_field(SplitAvgPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_power(self) -> Optional[int]:
+ field = self.get_field(SplitMaxPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_power.setter
+ def max_power(self, value: int):
+ field = self.get_field(SplitMaxPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def normalized_power(self) -> Optional[int]:
+ field = self.get_field(SplitNormalizedPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @normalized_power.setter
+ def normalized_power(self, value: int):
+ field = self.get_field(SplitNormalizedPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def left_right_balance(self) -> Optional[int]:
+ field = self.get_field(SplitLeftRightBalanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @left_right_balance.setter
+ def left_right_balance(self, value: int):
+ field = self.get_field(SplitLeftRightBalanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def time_standing(self) -> Optional[float]:
+ field = self.get_field(SplitTimeStandingField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @time_standing.setter
+ def time_standing(self, value: float):
+ field = self.get_field(SplitTimeStandingField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_pco(self) -> Optional[int]:
+ field = self.get_field(SplitAvgLeftPcoField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_pco.setter
+ def avg_left_pco(self, value: int):
+ field = self.get_field(SplitAvgLeftPcoField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_pco(self) -> Optional[int]:
+ field = self.get_field(SplitAvgRightPcoField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_pco.setter
+ def avg_right_pco(self, value: int):
+ field = self.get_field(SplitAvgRightPcoField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_power_phase(self) -> Optional[list[float]]:
+ field = self.get_field(SplitAvgLeftPowerPhaseField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_left_power_phase.setter
+ def avg_left_power_phase(self, value: list[float]):
+ field = self.get_field(SplitAvgLeftPowerPhaseField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_left_power_phase_peak(self) -> Optional[list[float]]:
+ field = self.get_field(SplitAvgLeftPowerPhasePeakField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_left_power_phase_peak.setter
+ def avg_left_power_phase_peak(self, value: list[float]):
+ field = self.get_field(SplitAvgLeftPowerPhasePeakField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_right_power_phase(self) -> Optional[list[float]]:
+ field = self.get_field(SplitAvgRightPowerPhaseField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_right_power_phase.setter
+ def avg_right_power_phase(self, value: list[float]):
+ field = self.get_field(SplitAvgRightPowerPhaseField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_right_power_phase_peak(self) -> Optional[list[float]]:
+ field = self.get_field(SplitAvgRightPowerPhasePeakField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_right_power_phase_peak.setter
+ def avg_right_power_phase_peak(self, value: list[float]):
+ field = self.get_field(SplitAvgRightPowerPhasePeakField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_power_position(self) -> Optional[list[int]]:
+ field = self.get_field(SplitAvgPowerPositionField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_power_position.setter
+ def avg_power_position(self, value: list[int]):
+ field = self.get_field(SplitAvgPowerPositionField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def max_power_position(self) -> Optional[list[int]]:
+ field = self.get_field(SplitMaxPowerPositionField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @max_power_position.setter
+ def max_power_position(self, value: list[int]):
+ field = self.get_field(SplitMaxPowerPositionField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_left_torque_effectiveness(self) -> Optional[float]:
+ field = self.get_field(SplitAvgLeftTorqueEffectivenessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_torque_effectiveness.setter
+ def avg_left_torque_effectiveness(self, value: float):
+ field = self.get_field(SplitAvgLeftTorqueEffectivenessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_torque_effectiveness(self) -> Optional[float]:
+ field = self.get_field(SplitAvgRightTorqueEffectivenessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_torque_effectiveness.setter
+ def avg_right_torque_effectiveness(self, value: float):
+ field = self.get_field(SplitAvgRightTorqueEffectivenessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitAvgLeftPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_pedal_smoothness.setter
+ def avg_left_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitAvgLeftPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitAvgRightPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_pedal_smoothness.setter
+ def avg_right_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitAvgRightPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_combined_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitAvgCombinedPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_combined_pedal_smoothness.setter
+ def avg_combined_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitAvgCombinedPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_flow(self) -> Optional[float]:
+ field = self.get_field(SplitAvgFlowField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_flow.setter
+ def avg_flow(self, value: float):
+ field = self.get_field(SplitAvgFlowField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_grit(self) -> Optional[float]:
+ field = self.get_field(SplitTotalGritField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_grit.setter
+ def total_grit(self, value: float):
+ field = self.get_field(SplitTotalGritField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swim_stroke(self) -> Optional[SwimStroke]:
+ field = self.get_field(SplitSwimStrokeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swim_stroke.setter
+ def swim_stroke(self, value: SwimStroke):
+ field = self.get_field(SplitSwimStrokeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_active_lengths(self) -> Optional[int]:
+ field = self.get_field(SplitNumActiveLengthsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_active_lengths.setter
+ def num_active_lengths(self, value: int):
+ field = self.get_field(SplitNumActiveLengthsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_swolf(self) -> Optional[int]:
+ field = self.get_field(SplitAvgSwolfField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_swolf.setter
+ def avg_swolf(self, value: int):
+ field = self.get_field(SplitAvgSwolfField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stroke_distance(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStrokeDistanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stroke_distance.setter
+ def avg_stroke_distance(self, value: float):
+ field = self.get_field(SplitAvgStrokeDistanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_strokes_per_length(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStrokesPerLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_strokes_per_length.setter
+ def avg_strokes_per_length(self, value: float):
+ field = self.get_field(SplitAvgStrokesPerLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def first_lap_index(self) -> Optional[int]:
+ field = self.get_field(SplitFirstLapIndexField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @first_lap_index.setter
+ def first_lap_index(self, value: int):
+ field = self.get_field(SplitFirstLapIndexField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_laps(self) -> Optional[int]:
+ field = self.get_field(SplitNumLapsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_laps.setter
+ def num_laps(self, value: int):
+ field = self.get_field(SplitNumLapsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def climb_grading_scale(self) -> Optional[ClimbGradingScale]:
+ field = self.get_field(SplitClimbGradingScaleField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @climb_grading_scale.setter
+ def climb_grading_scale(self, value: ClimbGradingScale):
+ field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def climb_grade_value(self) -> Optional[int]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @climb_grade_value.setter
+ def climb_grade_value(self, value: int):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def climb_grade_yds(self) -> Optional[YdsGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [0]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_yds.setter
+ def climb_grade_yds(self, value: YdsGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_uiaa(self) -> Optional[UiaaGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_uiaa.setter
+ def climb_grade_uiaa(self, value: UiaaGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_french(self) -> Optional[FrenchGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [2]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_french.setter
+ def climb_grade_french(self, value: FrenchGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_british_adjectival(self) -> Optional[BritishAdjectivalGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [3]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_british_adjectival.setter
+ def climb_grade_british_adjectival(self, value: BritishAdjectivalGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_british_technical(self) -> Optional[BritishTechnicalGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [4]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_british_technical.setter
+ def climb_grade_british_technical(self, value: BritishTechnicalGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_ewbank(self) -> Optional[EwbankGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_ewbank.setter
+ def climb_grade_ewbank(self, value: EwbankGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_brazilian(self) -> Optional[BrazilianGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [6]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_brazilian.setter
+ def climb_grade_brazilian(self, value: BrazilianGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_saxon(self) -> Optional[SaxonGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [7]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_saxon.setter
+ def climb_grade_saxon(self, value: SaxonGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_vermin(self) -> Optional[VerminGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [8]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_vermin.setter
+ def climb_grade_vermin(self, value: VerminGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_font(self) -> Optional[FontGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [9]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_font.setter
+ def climb_grade_font(self, value: FontGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_grade_dankyu(self) -> Optional[DankyuGradingScale]:
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ type_field = self.get_field(SplitClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [10]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_grade_dankyu.setter
+ def climb_grade_dankyu(self, value: DankyuGradingScale):
+ field = self.get_field(SplitClimbGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def status(self) -> Optional[SplitStatus]:
+ field = self.get_field(SplitStatusField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @status.setter
+ def status(self, value: SplitStatus):
+ field = self.get_field(SplitStatusField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_falls(self) -> Optional[int]:
+ field = self.get_field(SplitNumFallsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_falls.setter
+ def num_falls(self, value: int):
+ field = self.get_field(SplitNumFallsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def climb_send(self) -> Optional[bool]:
+ field = self.get_field(SplitClimbSendField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @climb_send.setter
+ def climb_send(self, value: bool):
+ field = self.get_field(SplitClimbSendField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def start_elevation(self) -> Optional[float]:
+ field = self.get_field(SplitStartElevationField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @start_elevation.setter
+ def start_elevation(self, value: float):
+ field = self.get_field(SplitStartElevationField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def active_time(self) -> Optional[float]:
+ field = self.get_field(SplitActiveTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @active_time.setter
+ def active_time(self, value: float):
+ field = self.get_field(SplitActiveTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def metabolic_calories(self) -> Optional[int]:
+ field = self.get_field(SplitMetabolicCaloriesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @metabolic_calories.setter
+ def metabolic_calories(self, value: int):
+ field = self.get_field(SplitMetabolicCaloriesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_fractional_ascent(self) -> Optional[float]:
+ field = self.get_field(SplitTotalFractionalAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_fractional_ascent.setter
+ def total_fractional_ascent(self, value: float):
+ field = self.get_field(SplitTotalFractionalAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_fractional_descent(self) -> Optional[float]:
+ field = self.get_field(SplitTotalFractionalDescentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_fractional_descent.setter
+ def total_fractional_descent(self, value: float):
+ field = self.get_field(SplitTotalFractionalDescentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_grade(self) -> Optional[float]:
+ field = self.get_field(SplitAvgGradeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_grade.setter
+ def avg_grade(self, value: float):
+ field = self.get_field(SplitAvgGradeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_grade(self) -> Optional[float]:
+ field = self.get_field(SplitMaxGradeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_grade.setter
+ def max_grade(self, value: float):
+ field = self.get_field(SplitMaxGradeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def min_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMinCadenceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @min_cadence.setter
+ def min_cadence(self, value: float):
+ field = self.get_field(SplitMinCadenceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def min_running_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMinCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @min_running_cadence.setter
+ def min_running_cadence(self, value: float):
+ field = self.get_field(SplitMinCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def min_swimming_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMinCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @min_swimming_cadence.setter
+ def min_swimming_cadence(self, value: float):
+ field = self.get_field(SplitMinCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def min_paddlesport_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitMinCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @min_paddlesport_cadence.setter
+ def min_paddlesport_cadence(self, value: float):
+ field = self.get_field(SplitMinCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def min_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SplitMinCadenceField.ID)
+ type_field = self.get_field(SplitSportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @min_push_cadence.setter
+ def min_push_cadence(self, value: int):
+ field = self.get_field(SplitMinCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def avg_grade_adjusted_speed(self) -> Optional[float]:
+ field = self.get_field(SplitAvgGradeAdjustedSpeedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_grade_adjusted_speed.setter
+ def avg_grade_adjusted_speed(self, value: float):
+ field = self.get_field(SplitAvgGradeAdjustedSpeedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stress(self) -> Optional[int]:
+ field = self.get_field(SplitAvgStressField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stress.setter
+ def avg_stress(self, value: int):
+ field = self.get_field(SplitAvgStressField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_vam(self) -> Optional[float]:
+ field = self.get_field(SplitAvgVamField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_vam.setter
+ def avg_vam(self, value: float):
+ field = self.get_field(SplitAvgVamField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def jump_count(self) -> Optional[int]:
+ field = self.get_field(SplitJumpCountField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @jump_count.setter
+ def jump_count(self, value: int):
+ field = self.get_field(SplitJumpCountField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_moving_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalMovingTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_moving_time.setter
+ def total_moving_time(self, value: float):
+ field = self.get_field(SplitTotalMovingTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def dive_section_type(self) -> Optional[DiveSectionType]:
+ field = self.get_field(SplitDiveSectionTypeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @dive_section_type.setter
+ def dive_section_type(self, value: DiveSectionType):
+ field = self.get_field(SplitDiveSectionTypeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_ascent_rate(self) -> Optional[float]:
+ field = self.get_field(SplitAvgAscentRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_ascent_rate.setter
+ def avg_ascent_rate(self, value: float):
+ field = self.get_field(SplitAvgAscentRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_ascent_rate(self) -> Optional[float]:
+ field = self.get_field(SplitMaxAscentRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_ascent_rate.setter
+ def max_ascent_rate(self, value: float):
+ field = self.get_field(SplitMaxAscentRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_descent_rate(self) -> Optional[float]:
+ field = self.get_field(SplitAvgDescentRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_descent_rate.setter
+ def avg_descent_rate(self, value: float):
+ field = self.get_field(SplitAvgDescentRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_descent_rate(self) -> Optional[float]:
+ field = self.get_field(SplitMaxDescentRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_descent_rate.setter
+ def max_descent_rate(self, value: float):
+ field = self.get_field(SplitMaxDescentRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_ascent_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalAscentTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_ascent_time.setter
+ def total_ascent_time(self, value: float):
+ field = self.get_field(SplitTotalAscentTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_descent_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalDescentTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_descent_time.setter
+ def total_descent_time(self, value: float):
+ field = self.get_field(SplitTotalDescentTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_hang_time(self) -> Optional[float]:
+ field = self.get_field(SplitTotalHangTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_hang_time.setter
+ def total_hang_time(self, value: float):
+ field = self.get_field(SplitTotalHangTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def apnea_discipline(self) -> Optional[ApneaDiscipline]:
+ field = self.get_field(SplitApneaDisciplineField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @apnea_discipline.setter
+ def apnea_discipline(self, value: ApneaDiscipline):
+ field = self.get_field(SplitApneaDisciplineField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_depth(self) -> Optional[float]:
+ field = self.get_field(SplitAvgDepthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_depth.setter
+ def avg_depth(self, value: float):
+ field = self.get_field(SplitAvgDepthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_depth(self) -> Optional[float]:
+ field = self.get_field(SplitMaxDepthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_depth.setter
+ def max_depth(self, value: float):
+ field = self.get_field(SplitMaxDepthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def min_heart_rate(self) -> Optional[int]:
+ field = self.get_field(SplitMinHeartRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @min_heart_rate.setter
+ def min_heart_rate(self, value: int):
+ field = self.get_field(SplitMinHeartRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def surface_interval(self) -> Optional[int]:
+ field = self.get_field(SplitSurfaceIntervalField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @surface_interval.setter
+ def surface_interval(self, value: int):
+ field = self.get_field(SplitSurfaceIntervalField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_fractional_cycles(self) -> Optional[float]:
+ field = self.get_field(SplitTotalFractionalCyclesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_fractional_cycles.setter
+ def total_fractional_cycles(self, value: float):
+ field = self.get_field(SplitTotalFractionalCyclesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time_percent(self) -> Optional[float]:
+ field = self.get_field(SplitAvgStanceTimePercentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time_percent.setter
+ def avg_stance_time_percent(self, value: float):
+ field = self.get_field(SplitAvgStanceTimePercentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_anaerobic_training_effect(self) -> Optional[float]:
+ field = self.get_field(SplitTotalAnaerobicTrainingEffectField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_anaerobic_training_effect.setter
+ def total_anaerobic_training_effect(self, value: float):
+ field = self.get_field(SplitTotalAnaerobicTrainingEffectField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def front_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(SplitFrontGearShiftCountField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @front_gear_shift_count.setter
+ def front_gear_shift_count(self, value: int):
+ field = self.get_field(SplitFrontGearShiftCountField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def rear_gear_shift_count(self) -> Optional[int]:
+ field = self.get_field(SplitRearGearShiftCountField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @rear_gear_shift_count.setter
+ def rear_gear_shift_count(self, value: int):
+ field = self.get_field(SplitRearGearShiftCountField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+
+
+
+class SplitSplitTypeField(Field):
+ ID = 0
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='split_type',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'split_type',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalElapsedTimeField(Field):
+ ID = 1
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_elapsed_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalTimerTimeField(Field):
+ ID = 2
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_timer_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalDistanceField(Field):
+ ID = 3
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_distance',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgSpeedField(Field):
+ ID = 4
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitStartTimeField(Field):
+ ID = 9
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='start_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = -631065600000,
+ scale = 0.001,
+ size = size,
+ units = 'ms',
+ type_name = 'date_time',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSportField(Field):
+ ID = 11
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='sport',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'sport',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSubSportField(Field):
+ ID = 12
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='sub_sport',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'sub_sport',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalAscentField(Field):
+ ID = 13
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalDescentField(Field):
+ ID = 14
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_descent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgHeartRateField(Field):
+ ID = 15
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_heart_rate',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'bpm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMaxHeartRateField(Field):
+ ID = 16
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_heart_rate',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'bpm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNecLatField(Field):
+ ID = 17
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='nec_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNecLongField(Field):
+ ID = 18
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='nec_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSwcLatField(Field):
+ ID = 19
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swc_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSwcLongField(Field):
+ ID = 20
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swc_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitStartPositionLatField(Field):
+ ID = 21
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='start_position_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitStartPositionLongField(Field):
+ ID = 22
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='start_position_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitEndPositionLatField(Field):
+ ID = 23
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='end_position_lat',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitEndPositionLongField(Field):
+ ID = 24
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='end_position_long',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 11930464.711111112,
+ size = size,
+ units = 'degrees',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMaxSpeedField(Field):
+ ID = 25
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgVertSpeedField(Field):
+ ID = 26
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vert_speed',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitEndTimeField(Field):
+ ID = 27
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='end_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = -631065600000,
+ scale = 0.001,
+ size = size,
+ units = 'ms',
+ type_name = 'date_time',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalCaloriesField(Field):
+ ID = 28
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgCadenceField(Field):
+ ID = 29
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_cadence',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 128,
+ size = size,
+ units = 'rpm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='avg_running_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strides/min',
+ reference_map = {
+ SplitSportField.ID: [1]
+ }),
+ SubField(
+ name='avg_swimming_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [5]
+ }),
+ SubField(
+ name='avg_paddlesport_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='avg_push_cadence',
+ base_type=BaseType.UINT16,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SplitSportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitMaxCadenceField(Field):
+ ID = 30
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_cadence',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 128,
+ size = size,
+ units = 'rpm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='max_running_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strides/min',
+ reference_map = {
+ SplitSportField.ID: [1]
+ }),
+ SubField(
+ name='max_swimming_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [5]
+ }),
+ SubField(
+ name='max_paddlesport_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='max_push_cadence',
+ base_type=BaseType.UINT16,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SplitSportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitTotalCyclesField(Field):
+ ID = 31
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_cycles',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'cycles',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='total_strides',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'strides',
+ reference_map = {
+ SplitSportField.ID: [1, 11]
+ }),
+ SubField(
+ name='total_strokes',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'strokes',
+ reference_map = {
+ SplitSportField.ID: [2, 5, 15, 37]
+ }),
+ SubField(
+ name='total_reps',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'reps',
+ reference_map = {
+ SplitSportField.ID: [62]
+ }),
+ SubField(
+ name='total_pushes',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'pushes',
+ reference_map = {
+ SplitSportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitAvgTemperatureField(Field):
+ ID = 32
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMaxTemperatureField(Field):
+ ID = 33
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMinTemperatureField(Field):
+ ID = 34
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='min_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgVerticalOscillationField(Field):
+ ID = 35
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vertical_oscillation',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'mm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgVerticalRatioField(Field):
+ ID = 36
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vertical_ratio',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'percent',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgStanceTimeField(Field):
+ ID = 37
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stance_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'ms',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgStanceTimeBalanceField(Field):
+ ID = 38
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stance_time_balance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'percent',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgStepLengthField(Field):
+ ID = 39
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_step_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'mm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgPowerField(Field):
+ ID = 40
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMaxPowerField(Field):
+ ID = 41
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNormalizedPowerField(Field):
+ ID = 42
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='normalized_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitLeftRightBalanceField(Field):
+ ID = 43
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='left_right_balance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'left_right_balance_100',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTimeStandingField(Field):
+ ID = 44
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='time_standing',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgLeftPcoField(Field):
+ ID = 45
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_pco',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'mm',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgRightPcoField(Field):
+ ID = 46
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_pco',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'mm',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgLeftPowerPhaseField(Field):
+ ID = 47
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_power_phase',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgLeftPowerPhasePeakField(Field):
+ ID = 48
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_power_phase_peak',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgRightPowerPhaseField(Field):
+ ID = 49
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_power_phase',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgRightPowerPhasePeakField(Field):
+ ID = 50
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_power_phase_peak',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgPowerPositionField(Field):
+ ID = 51
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_power_position',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMaxPowerPositionField(Field):
+ ID = 52
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_power_position',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgLeftTorqueEffectivenessField(Field):
+ ID = 53
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_torque_effectiveness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgRightTorqueEffectivenessField(Field):
+ ID = 54
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_torque_effectiveness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgLeftPedalSmoothnessField(Field):
+ ID = 55
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgRightPedalSmoothnessField(Field):
+ ID = 56
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgCombinedPedalSmoothnessField(Field):
+ ID = 57
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_combined_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgFlowField(Field):
+ ID = 58
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_flow',
+ field_id=self.ID,
+ base_type=BaseType.FLOAT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'Flow',
+ type_name = 'float32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalGritField(Field):
+ ID = 59
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_grit',
+ field_id=self.ID,
+ base_type=BaseType.FLOAT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kGrit',
+ type_name = 'float32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSwimStrokeField(Field):
+ ID = 62
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swim_stroke',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'swim_stroke',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNumActiveLengthsField(Field):
+ ID = 63
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_active_lengths',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'lengths',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgSwolfField(Field):
+ ID = 64
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_swolf',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgStrokeDistanceField(Field):
+ ID = 65
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stroke_distance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgStrokesPerLengthField(Field):
+ ID = 66
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_strokes_per_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'strokes / length',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitFirstLapIndexField(Field):
+ ID = 67
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='first_lap_index',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNumLapsField(Field):
+ ID = 68
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_laps',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitClimbGradingScaleField(Field):
+ ID = 69
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='climb_grading_scale',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'climb_grading_scale',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitClimbGradeValueField(Field):
+ ID = 70
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='climb_grade_value',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='climb_grade_yds',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [0]
+ }),
+ SubField(
+ name='climb_grade_uiaa',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [1]
+ }),
+ SubField(
+ name='climb_grade_french',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [2]
+ }),
+ SubField(
+ name='climb_grade_british_adjectival',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [3]
+ }),
+ SubField(
+ name='climb_grade_british_technical',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [4]
+ }),
+ SubField(
+ name='climb_grade_ewbank',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [5]
+ }),
+ SubField(
+ name='climb_grade_brazilian',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [6]
+ }),
+ SubField(
+ name='climb_grade_saxon',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [7]
+ }),
+ SubField(
+ name='climb_grade_vermin',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [8]
+ }),
+ SubField(
+ name='climb_grade_font',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [9]
+ }),
+ SubField(
+ name='climb_grade_dankyu',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitClimbGradingScaleField.ID: [10]
+ })
+ ]
+ )
+
+
+class SplitStatusField(Field):
+ ID = 71
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='status',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'split_status',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitNumFallsField(Field):
+ ID = 72
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_falls',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitClimbSendField(Field):
+ ID = 73
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='climb_send',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'bool',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitStartElevationField(Field):
+ ID = 74
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='start_elevation',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 500,
+ scale = 5,
+ size = size,
+ units = 'm',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitActiveTimeField(Field):
+ ID = 78
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='active_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitMetabolicCaloriesField(Field):
+ ID = 79
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='metabolic_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalFractionalAscentField(Field):
+ ID = 80
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_fractional_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalFractionalDescentField(Field):
+ ID = 81
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_fractional_descent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitAvgGradeField(Field):
+ ID = 88
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_grade',
+ field_id=self.ID,
+ base_type=BaseType.SINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = '%',
+ type_name = 'sint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+class SplitMaxGradeField(Field):
+ ID = 89
- @total_moving_time.setter
- def total_moving_time(self, value: float):
- field = self.get_field(SplitTotalMovingTimeField.ID)
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_grade',
+ field_id=self.ID,
+ base_type=BaseType.SINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = '%',
+ type_name = 'sint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
- if field:
- if value is None:
- field.clear()
- else:
- sub_field = field.get_valid_sub_field(self.fields)
- field.set_value(0, value, sub_field)
-
+class SplitMinCadenceField(Field):
+ ID = 90
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='min_cadence',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 128,
+ size = size,
+ units = 'rpm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='min_running_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strides/min',
+ reference_map = {
+ SplitSportField.ID: [1]
+ }),
+ SubField(
+ name='min_swimming_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [5]
+ }),
+ SubField(
+ name='min_paddlesport_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSportField.ID: [15, 37]
+ }),
+ SubField(
+ name='min_push_cadence',
+ base_type=BaseType.UINT16,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SplitSportField.ID: [66, 65]
+ })
+ ]
+ )
+class SplitAvgGradeAdjustedSpeedField(Field):
+ ID = 93
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_grade_adjusted_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
-class SplitSplitTypeField(Field):
- ID = 0
+class SplitAvgStressField(Field):
+ ID = 94
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='split_type',
+ name='avg_stress',
field_id=self.ID,
- base_type=BaseType.ENUM,
+ base_type=BaseType.UINT16,
offset = 0,
scale = 1,
size = size,
- type_name = 'split_type',
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
)
-class SplitTotalElapsedTimeField(Field):
- ID = 1
+class SplitAvgVamField(Field):
+ ID = 99
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_elapsed_time',
+ name='avg_vam',
field_id=self.ID,
- base_type=BaseType.UINT32,
+ base_type=BaseType.UINT16,
offset = 0,
scale = 1000,
size = size,
- units = 's',
- type_name = 'uint32',
+ units = 'm/s',
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
)
-class SplitTotalTimerTimeField(Field):
- ID = 2
+class SplitJumpCountField(Field):
+ ID = 104
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_timer_time',
+ name='jump_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitTotalMovingTimeField(Field):
+ ID = 110
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_moving_time',
field_id=self.ID,
base_type=BaseType.UINT32,
offset = 0,
@@ -766,31 +5538,30 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitTotalDistanceField(Field):
- ID = 3
+class SplitDiveSectionTypeField(Field):
+ ID = 112
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_distance',
+ name='dive_section_type',
field_id=self.ID,
- base_type=BaseType.UINT32,
+ base_type=BaseType.ENUM,
offset = 0,
- scale = 100,
+ scale = 1,
size = size,
- units = 'm',
- type_name = 'uint32',
+ type_name = 'dive_section_type',
growable = growable,
sub_fields = [
]
)
-class SplitAvgSpeedField(Field):
- ID = 4
+class SplitAvgAscentRateField(Field):
+ ID = 113
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='avg_speed',
+ name='avg_ascent_rate',
field_id=self.ID,
base_type=BaseType.UINT32,
offset = 0,
@@ -804,151 +5575,150 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitStartTimeField(Field):
- ID = 9
+class SplitMaxAscentRateField(Field):
+ ID = 114
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='start_time',
+ name='max_ascent_rate',
field_id=self.ID,
base_type=BaseType.UINT32,
- offset = -631065600000,
- scale = 0.001,
+ offset = 0,
+ scale = 1000,
size = size,
- units = 'ms',
- type_name = 'date_time',
+ units = 'm/s',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitTotalAscentField(Field):
- ID = 13
+class SplitAvgDescentRateField(Field):
+ ID = 115
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_ascent',
+ name='avg_descent_rate',
field_id=self.ID,
- base_type=BaseType.UINT16,
+ base_type=BaseType.UINT32,
offset = 0,
- scale = 1,
+ scale = 1000,
size = size,
- units = 'm',
- type_name = 'uint16',
+ units = 'm/s',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitTotalDescentField(Field):
- ID = 14
+class SplitMaxDescentRateField(Field):
+ ID = 116
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_descent',
+ name='max_descent_rate',
field_id=self.ID,
- base_type=BaseType.UINT16,
+ base_type=BaseType.UINT32,
offset = 0,
- scale = 1,
+ scale = 1000,
size = size,
- units = 'm',
- type_name = 'uint16',
+ units = 'm/s',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitStartPositionLatField(Field):
- ID = 21
+class SplitTotalAscentTimeField(Field):
+ ID = 117
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='start_position_lat',
+ name='total_ascent_time',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.UINT32,
offset = 0,
- scale = 11930464.711111112,
+ scale = 1000,
size = size,
- units = 'degrees',
- type_name = 'sint32',
+ units = 's',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitStartPositionLongField(Field):
- ID = 22
+class SplitTotalDescentTimeField(Field):
+ ID = 118
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='start_position_long',
+ name='total_descent_time',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.UINT32,
offset = 0,
- scale = 11930464.711111112,
+ scale = 1000,
size = size,
- units = 'degrees',
- type_name = 'sint32',
+ units = 's',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitEndPositionLatField(Field):
- ID = 23
+class SplitTotalHangTimeField(Field):
+ ID = 119
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='end_position_lat',
+ name='total_hang_time',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.UINT32,
offset = 0,
- scale = 11930464.711111112,
+ scale = 1000,
size = size,
- units = 'degrees',
- type_name = 'sint32',
+ units = 's',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitEndPositionLongField(Field):
- ID = 24
+class SplitApneaDisciplineField(Field):
+ ID = 120
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='end_position_long',
+ name='apnea_discipline',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.ENUM,
offset = 0,
- scale = 11930464.711111112,
+ scale = 1,
size = size,
- units = 'degrees',
- type_name = 'sint32',
+ type_name = 'apnea_discipline',
growable = growable,
sub_fields = [
]
)
-class SplitMaxSpeedField(Field):
- ID = 25
+class SplitAvgDepthField(Field):
+ ID = 121
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='max_speed',
+ name='avg_depth',
field_id=self.ID,
base_type=BaseType.UINT32,
offset = 0,
scale = 1000,
size = size,
- units = 'm/s',
+ units = 'm',
type_name = 'uint32',
growable = growable,
sub_fields = [
@@ -956,56 +5726,56 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitAvgVertSpeedField(Field):
- ID = 26
+class SplitMaxDepthField(Field):
+ ID = 122
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='avg_vert_speed',
+ name='max_depth',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.UINT32,
offset = 0,
scale = 1000,
size = size,
- units = 'm/s',
- type_name = 'sint32',
+ units = 'm',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
]
)
-class SplitEndTimeField(Field):
- ID = 27
+class SplitMinHeartRateField(Field):
+ ID = 124
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='end_time',
+ name='min_heart_rate',
field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = -631065600000,
- scale = 0.001,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
size = size,
- units = 'ms',
- type_name = 'date_time',
+ units = 'bpm',
+ type_name = 'uint8',
growable = growable,
sub_fields = [
]
)
-class SplitTotalCaloriesField(Field):
- ID = 28
+class SplitSurfaceIntervalField(Field):
+ ID = 127
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_calories',
+ name='surface_interval',
field_id=self.ID,
base_type=BaseType.UINT32,
offset = 0,
scale = 1,
size = size,
- units = 'kcal',
+ units = 's',
type_name = 'uint32',
growable = growable,
sub_fields = [
@@ -1013,57 +5783,92 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitStartElevationField(Field):
- ID = 74
+class SplitTotalFractionalCyclesField(Field):
+ ID = 142
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='start_elevation',
+ name='total_fractional_cycles',
field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = 500,
- scale = 5,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 128,
size = size,
- units = 'm',
- type_name = 'uint32',
+ units = 'cycles',
+ type_name = 'uint8',
growable = growable,
sub_fields = [
]
)
-class SplitActiveTimeField(Field):
- ID = 78
+class SplitAvgStanceTimePercentField(Field):
+ ID = 144
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='active_time',
+ name='avg_stance_time_percent',
field_id=self.ID,
- base_type=BaseType.UINT32,
+ base_type=BaseType.UINT16,
offset = 0,
- scale = 1000,
+ scale = 100,
size = size,
- units = 's',
- type_name = 'uint32',
+ units = 'percent',
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
)
-class SplitTotalMovingTimeField(Field):
- ID = 110
+class SplitTotalAnaerobicTrainingEffectField(Field):
+ ID = 168
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_moving_time',
+ name='total_anaerobic_training_effect',
field_id=self.ID,
- base_type=BaseType.UINT32,
+ base_type=BaseType.UINT8,
offset = 0,
- scale = 1000,
+ scale = 10,
size = size,
- units = 's',
- type_name = 'uint32',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitFrontGearShiftCountField(Field):
+ ID = 169
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='front_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitRearGearShiftCountField(Field):
+ ID = 170
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='rear_gear_shift_count',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
diff --git a/fit_tool/profile/messages/split_summary_message.py b/fit_tool/profile/messages/split_summary_message.py
index 73e31b0..e20fe48 100644
--- a/fit_tool/profile/messages/split_summary_message.py
+++ b/fit_tool/profile/messages/split_summary_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
@@ -47,9 +47,18 @@ def __init__(self, developer_fields=None, local_id: int = 0,
MessageIndexField(
size=0,
growable=True),
+ TimestampField(
+ size=0,
+ growable=True),
SplitSummarySplitTypeField(
size=0,
growable=True),
+ SplitSummarySportField(
+ size=0,
+ growable=True),
+ SplitSummarySubSportField(
+ size=0,
+ growable=True),
SplitSummaryNumSplitsField(
size=0,
growable=True),
@@ -83,10 +92,175 @@ def __init__(self, developer_fields=None, local_id: int = 0,
SplitSummaryTotalCaloriesField(
size=0,
growable=True),
+ SplitSummaryAvgCadenceField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxCadenceField(
+ size=0,
+ growable=True),
+ SplitSummaryTotalCyclesField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgTemperatureField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxTemperatureField(
+ size=0,
+ growable=True),
+ SplitSummaryMinTemperatureField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgVerticalOscillationField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgVerticalRatioField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStanceTimeField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStanceTimeBalanceField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStepLengthField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgPowerField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxPowerField(
+ size=0,
+ growable=True),
+ SplitSummaryNormalizedPowerField(
+ size=0,
+ growable=True),
+ SplitSummaryLeftRightBalanceField(
+ size=0,
+ growable=True),
+ SplitSummaryTimeStandingField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgLeftPcoField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgRightPcoField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgLeftPowerPhaseField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgLeftPowerPhasePeakField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgRightPowerPhaseField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgRightPowerPhasePeakField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgPowerPositionField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxPowerPositionField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgLeftTorqueEffectivenessField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgRightTorqueEffectivenessField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgLeftPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgRightPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgCombinedPedalSmoothnessField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgFlowField(
+ size=0,
+ growable=True),
+ SplitSummaryTotalGritField(
+ size=0,
+ growable=True),
+ SplitSummarySwimStrokeField(
+ size=0,
+ growable=True),
+ SplitSummaryNumActiveLengthsField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgSwolfField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStrokeDistanceField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStrokesPerLengthField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgAscentField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxAscentField(
+ size=0,
+ growable=True),
+ SplitSummaryClimbGradingScaleField(
+ size=0,
+ growable=True),
+ SplitSummaryClimbMaxGradeValueField(
+ size=0,
+ growable=True),
+ SplitSummaryNumFallsField(
+ size=0,
+ growable=True),
+ SplitSummaryNumClimbsAttemptedField(
+ size=0,
+ growable=True),
+ SplitSummaryNumClimbsCompletedField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxDistanceField(
+ size=0,
+ growable=True),
+ SplitSummaryMetabolicCaloriesField(
+ size=0,
+ growable=True),
SplitSummaryActiveTimeField(
size=0,
growable=True),
+ SplitSummaryTotalFractionalAscentField(
+ size=0,
+ growable=True),
+ SplitSummaryTotalFractionalDescentField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgFractionalAscentField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxFractionalAscentField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgGradeAdjustedSpeedField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStressField(
+ size=0,
+ growable=True),
SplitSummaryTotalMovingTimeField(
+ size=0,
+ growable=True),
+ SplitSummaryStartTimeField(
+ size=0,
+ growable=True),
+ SplitSummaryMinHeartRateField(
+ size=0,
+ growable=True),
+ SplitSummaryAvgStanceTimePercentField(
+ size=0,
+ growable=True),
+ SplitSummaryMaxTotalTimerTimeField(
size=0,
growable=True)
])
@@ -115,10 +289,22 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, MessageIndexField.ID),
growable=False),
+ TimestampField(
+ size=cls._field_size_from_definition(
+ definition_message, TimestampField.ID),
+ growable=False),
SplitSummarySplitTypeField(
size=cls._field_size_from_definition(
definition_message, SplitSummarySplitTypeField.ID),
growable=False),
+ SplitSummarySportField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummarySportField.ID),
+ growable=False),
+ SplitSummarySubSportField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummarySubSportField.ID),
+ growable=False),
SplitSummaryNumSplitsField(
size=cls._field_size_from_definition(
definition_message, SplitSummaryNumSplitsField.ID),
@@ -163,13 +349,233 @@ def from_definition(cls, definition_message: DefinitionMessage,
size=cls._field_size_from_definition(
definition_message, SplitSummaryTotalCaloriesField.ID),
growable=False),
+ SplitSummaryAvgCadenceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgCadenceField.ID),
+ growable=False),
+ SplitSummaryMaxCadenceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxCadenceField.ID),
+ growable=False),
+ SplitSummaryTotalCyclesField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryTotalCyclesField.ID),
+ growable=False),
+ SplitSummaryAvgTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgTemperatureField.ID),
+ growable=False),
+ SplitSummaryMaxTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxTemperatureField.ID),
+ growable=False),
+ SplitSummaryMinTemperatureField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMinTemperatureField.ID),
+ growable=False),
+ SplitSummaryAvgVerticalOscillationField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgVerticalOscillationField.ID),
+ growable=False),
+ SplitSummaryAvgVerticalRatioField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgVerticalRatioField.ID),
+ growable=False),
+ SplitSummaryAvgStanceTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStanceTimeField.ID),
+ growable=False),
+ SplitSummaryAvgStanceTimeBalanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStanceTimeBalanceField.ID),
+ growable=False),
+ SplitSummaryAvgStepLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStepLengthField.ID),
+ growable=False),
+ SplitSummaryAvgPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgPowerField.ID),
+ growable=False),
+ SplitSummaryMaxPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxPowerField.ID),
+ growable=False),
+ SplitSummaryNormalizedPowerField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryNormalizedPowerField.ID),
+ growable=False),
+ SplitSummaryLeftRightBalanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryLeftRightBalanceField.ID),
+ growable=False),
+ SplitSummaryTimeStandingField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryTimeStandingField.ID),
+ growable=False),
+ SplitSummaryAvgLeftPcoField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgLeftPcoField.ID),
+ growable=False),
+ SplitSummaryAvgRightPcoField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgRightPcoField.ID),
+ growable=False),
+ SplitSummaryAvgLeftPowerPhaseField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgLeftPowerPhaseField.ID),
+ growable=False),
+ SplitSummaryAvgLeftPowerPhasePeakField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgLeftPowerPhasePeakField.ID),
+ growable=False),
+ SplitSummaryAvgRightPowerPhaseField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgRightPowerPhaseField.ID),
+ growable=False),
+ SplitSummaryAvgRightPowerPhasePeakField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgRightPowerPhasePeakField.ID),
+ growable=False),
+ SplitSummaryAvgPowerPositionField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgPowerPositionField.ID),
+ growable=False),
+ SplitSummaryMaxPowerPositionField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxPowerPositionField.ID),
+ growable=False),
+ SplitSummaryAvgLeftTorqueEffectivenessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgLeftTorqueEffectivenessField.ID),
+ growable=False),
+ SplitSummaryAvgRightTorqueEffectivenessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgRightTorqueEffectivenessField.ID),
+ growable=False),
+ SplitSummaryAvgLeftPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgLeftPedalSmoothnessField.ID),
+ growable=False),
+ SplitSummaryAvgRightPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgRightPedalSmoothnessField.ID),
+ growable=False),
+ SplitSummaryAvgCombinedPedalSmoothnessField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgCombinedPedalSmoothnessField.ID),
+ growable=False),
+ SplitSummaryAvgFlowField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgFlowField.ID),
+ growable=False),
+ SplitSummaryTotalGritField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryTotalGritField.ID),
+ growable=False),
+ SplitSummarySwimStrokeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummarySwimStrokeField.ID),
+ growable=False),
+ SplitSummaryNumActiveLengthsField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryNumActiveLengthsField.ID),
+ growable=False),
+ SplitSummaryAvgSwolfField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgSwolfField.ID),
+ growable=False),
+ SplitSummaryAvgStrokeDistanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStrokeDistanceField.ID),
+ growable=False),
+ SplitSummaryAvgStrokesPerLengthField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStrokesPerLengthField.ID),
+ growable=False),
+ SplitSummaryAvgAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgAscentField.ID),
+ growable=False),
+ SplitSummaryMaxAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxAscentField.ID),
+ growable=False),
+ SplitSummaryClimbGradingScaleField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryClimbGradingScaleField.ID),
+ growable=False),
+ SplitSummaryClimbMaxGradeValueField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryClimbMaxGradeValueField.ID),
+ growable=False),
+ SplitSummaryNumFallsField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryNumFallsField.ID),
+ growable=False),
+ SplitSummaryNumClimbsAttemptedField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryNumClimbsAttemptedField.ID),
+ growable=False),
+ SplitSummaryNumClimbsCompletedField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryNumClimbsCompletedField.ID),
+ growable=False),
+ SplitSummaryMaxDistanceField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxDistanceField.ID),
+ growable=False),
+ SplitSummaryMetabolicCaloriesField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMetabolicCaloriesField.ID),
+ growable=False),
SplitSummaryActiveTimeField(
size=cls._field_size_from_definition(
definition_message, SplitSummaryActiveTimeField.ID),
growable=False),
+ SplitSummaryTotalFractionalAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryTotalFractionalAscentField.ID),
+ growable=False),
+ SplitSummaryTotalFractionalDescentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryTotalFractionalDescentField.ID),
+ growable=False),
+ SplitSummaryAvgFractionalAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgFractionalAscentField.ID),
+ growable=False),
+ SplitSummaryMaxFractionalAscentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxFractionalAscentField.ID),
+ growable=False),
+ SplitSummaryAvgGradeAdjustedSpeedField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgGradeAdjustedSpeedField.ID),
+ growable=False),
+ SplitSummaryAvgStressField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStressField.ID),
+ growable=False),
SplitSummaryTotalMovingTimeField(
size=cls._field_size_from_definition(
definition_message, SplitSummaryTotalMovingTimeField.ID),
+ growable=False),
+ SplitSummaryStartTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryStartTimeField.ID),
+ growable=False),
+ SplitSummaryMinHeartRateField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMinHeartRateField.ID),
+ growable=False),
+ SplitSummaryAvgStanceTimePercentField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryAvgStanceTimePercentField.ID),
+ growable=False),
+ SplitSummaryMaxTotalTimerTimeField(
+ size=cls._field_size_from_definition(
+ definition_message, SplitSummaryMaxTotalTimerTimeField.ID),
growable=False)
])
message.growable = False
@@ -210,10 +616,11 @@ def message_index(self, value: int):
field.set_value(0, value, sub_field)
+# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
@property
- def split_type(self) -> Optional[SplitType]:
- field = self.get_field(SplitSummarySplitTypeField.ID)
+ def timestamp(self) -> Optional[int]:
+ field = self.get_field(TimestampField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -221,10 +628,11 @@ def split_type(self) -> Optional[SplitType]:
return None
+ # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
- @split_type.setter
- def split_type(self, value: SplitType):
- field = self.get_field(SplitSummarySplitTypeField.ID)
+ @timestamp.setter
+ def timestamp(self, value: int):
+ field = self.get_field(TimestampField.ID)
if field:
if value is None:
@@ -236,8 +644,8 @@ def split_type(self, value: SplitType):
@property
- def num_splits(self) -> Optional[int]:
- field = self.get_field(SplitSummaryNumSplitsField.ID)
+ def split_type(self) -> Optional[SplitType]:
+ field = self.get_field(SplitSummarySplitTypeField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -246,9 +654,9 @@ def num_splits(self) -> Optional[int]:
- @num_splits.setter
- def num_splits(self, value: int):
- field = self.get_field(SplitSummaryNumSplitsField.ID)
+ @split_type.setter
+ def split_type(self, value: SplitType):
+ field = self.get_field(SplitSummarySplitTypeField.ID)
if field:
if value is None:
@@ -260,8 +668,8 @@ def num_splits(self, value: int):
@property
- def total_timer_time(self) -> Optional[float]:
- field = self.get_field(SplitSummaryTotalTimerTimeField.ID)
+ def sport(self) -> Optional[Sport]:
+ field = self.get_field(SplitSummarySportField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -270,9 +678,9 @@ def total_timer_time(self) -> Optional[float]:
- @total_timer_time.setter
- def total_timer_time(self, value: float):
- field = self.get_field(SplitSummaryTotalTimerTimeField.ID)
+ @sport.setter
+ def sport(self, value: Sport):
+ field = self.get_field(SplitSummarySportField.ID)
if field:
if value is None:
@@ -284,8 +692,8 @@ def total_timer_time(self, value: float):
@property
- def total_distance(self) -> Optional[float]:
- field = self.get_field(SplitSummaryTotalDistanceField.ID)
+ def sub_sport(self) -> Optional[SubSport]:
+ field = self.get_field(SplitSummarySubSportField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -294,8 +702,80 @@ def total_distance(self) -> Optional[float]:
- @total_distance.setter
- def total_distance(self, value: float):
+ @sub_sport.setter
+ def sub_sport(self, value: SubSport):
+ field = self.get_field(SplitSummarySubSportField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_splits(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNumSplitsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_splits.setter
+ def num_splits(self, value: int):
+ field = self.get_field(SplitSummaryNumSplitsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_timer_time(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalTimerTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_timer_time.setter
+ def total_timer_time(self, value: float):
+ field = self.get_field(SplitSummaryTotalTimerTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_distance(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalDistanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_distance.setter
+ def total_distance(self, value: float):
field = self.get_field(SplitSummaryTotalDistanceField.ID)
if field:
@@ -500,8 +980,8 @@ def total_calories(self, value: int):
@property
- def active_time(self) -> Optional[float]:
- field = self.get_field(SplitSummaryActiveTimeField.ID)
+ def avg_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
if field and field.is_valid():
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
@@ -510,9 +990,9 @@ def active_time(self) -> Optional[float]:
- @active_time.setter
- def active_time(self, value: float):
- field = self.get_field(SplitSummaryActiveTimeField.ID)
+ @avg_cadence.setter
+ def avg_cadence(self, value: float):
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
if field:
if value is None:
@@ -523,21 +1003,45 @@ def active_time(self, value: float):
+
@property
- def total_moving_time(self) -> Optional[float]:
- field = self.get_field(SplitSummaryTotalMovingTimeField.ID)
- if field and field.is_valid():
+ def avg_running_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
sub_field = field.get_valid_sub_field(self.fields)
return field.get_value(sub_field=sub_field)
else:
return None
+ @avg_running_cadence.setter
+ def avg_running_cadence(self, value: float):
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
- @total_moving_time.setter
- def total_moving_time(self, value: float):
- field = self.get_field(SplitSummaryTotalMovingTimeField.ID)
+ @property
+ def avg_swimming_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+ @avg_swimming_cadence.setter
+ def avg_swimming_cadence(self, value: float):
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
if field:
if value is None:
field.clear()
@@ -545,132 +1049,2886 @@ def total_moving_time(self, value: float):
sub_field = field.get_valid_sub_field(self.fields)
field.set_value(0, value, sub_field)
-
+ @property
+ def avg_paddlesport_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+ @avg_paddlesport_cadence.setter
+ def avg_paddlesport_cadence(self, value: float):
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
-class SplitSummarySplitTypeField(Field):
- ID = 0
+ @property
+ def avg_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='split_type',
- field_id=self.ID,
- base_type=BaseType.ENUM,
- offset = 0,
- scale = 1,
- size = size,
- type_name = 'split_type',
- growable = growable,
- sub_fields = [
- ]
- )
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+ @avg_push_cadence.setter
+ def avg_push_cadence(self, value: int):
+ field = self.get_field(SplitSummaryAvgCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
-class SplitSummaryNumSplitsField(Field):
- ID = 3
+ @property
+ def max_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='num_splits',
- field_id=self.ID,
- base_type=BaseType.UINT16,
- offset = 0,
- scale = 1,
- size = size,
- type_name = 'uint16',
- growable = growable,
- sub_fields = [
- ]
- )
-class SplitSummaryTotalTimerTimeField(Field):
- ID = 4
+ @max_cadence.setter
+ def max_cadence(self, value: float):
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='total_timer_time',
- field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = 0,
- scale = 1000,
- size = size,
- units = 's',
- type_name = 'uint32',
- growable = growable,
- sub_fields = [
- ]
- )
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
-class SplitSummaryTotalDistanceField(Field):
- ID = 5
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='total_distance',
- field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = 0,
- scale = 100,
- size = size,
- units = 'm',
- type_name = 'uint32',
- growable = growable,
- sub_fields = [
- ]
- )
+ @property
+ def max_running_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
-class SplitSummaryAvgSpeedField(Field):
- ID = 6
+ @max_running_cadence.setter
+ def max_running_cadence(self, value: float):
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='avg_speed',
- field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = 0,
- scale = 1000,
- size = size,
- units = 'm/s',
- type_name = 'uint32',
- growable = growable,
- sub_fields = [
- ]
- )
+ @property
+ def max_swimming_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
-class SplitSummaryMaxSpeedField(Field):
- ID = 7
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='max_speed',
- field_id=self.ID,
- base_type=BaseType.UINT32,
- offset = 0,
- scale = 1000,
- size = size,
- units = 'm/s',
- type_name = 'uint32',
- growable = growable,
- sub_fields = [
- ]
- )
+ @max_swimming_cadence.setter
+ def max_swimming_cadence(self, value: float):
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
-class SplitSummaryTotalAscentField(Field):
- ID = 8
+ @property
+ def max_paddlesport_cadence(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
- def __init__(self, size: int = 0, growable: bool = True):
- super().__init__(
- name='total_ascent',
- field_id=self.ID,
- base_type=BaseType.UINT16,
+ is_sub_field_valid = type_field and type_field.get_value() in [15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_paddlesport_cadence.setter
+ def max_paddlesport_cadence(self, value: float):
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def max_push_cadence(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @max_push_cadence.setter
+ def max_push_cadence(self, value: int):
+ field = self.get_field(SplitSummaryMaxCadenceField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def total_cycles(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_cycles.setter
+ def total_cycles(self, value: int):
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def total_strides(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1, 11]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_strides.setter
+ def total_strides(self, value: int):
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_strokes(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [2, 5, 15, 37]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_strokes.setter
+ def total_strokes(self, value: int):
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_reps(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [62]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_reps.setter
+ def total_reps(self, value: int):
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def total_pushes(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ type_field = self.get_field(SplitSummarySportField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [66, 65]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @total_pushes.setter
+ def total_pushes(self, value: int):
+ field = self.get_field(SplitSummaryTotalCyclesField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def avg_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_temperature.setter
+ def avg_temperature(self, value: int):
+ field = self.get_field(SplitSummaryAvgTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMaxTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_temperature.setter
+ def max_temperature(self, value: int):
+ field = self.get_field(SplitSummaryMaxTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def min_temperature(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMinTemperatureField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @min_temperature.setter
+ def min_temperature(self, value: int):
+ field = self.get_field(SplitSummaryMinTemperatureField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_vertical_oscillation(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgVerticalOscillationField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_vertical_oscillation.setter
+ def avg_vertical_oscillation(self, value: float):
+ field = self.get_field(SplitSummaryAvgVerticalOscillationField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_vertical_ratio(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgVerticalRatioField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_vertical_ratio.setter
+ def avg_vertical_ratio(self, value: float):
+ field = self.get_field(SplitSummaryAvgVerticalRatioField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStanceTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time.setter
+ def avg_stance_time(self, value: float):
+ field = self.get_field(SplitSummaryAvgStanceTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time_balance(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStanceTimeBalanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time_balance.setter
+ def avg_stance_time_balance(self, value: float):
+ field = self.get_field(SplitSummaryAvgStanceTimeBalanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_step_length(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStepLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_step_length.setter
+ def avg_step_length(self, value: float):
+ field = self.get_field(SplitSummaryAvgStepLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_power(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_power.setter
+ def avg_power(self, value: int):
+ field = self.get_field(SplitSummaryAvgPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_power(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMaxPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_power.setter
+ def max_power(self, value: int):
+ field = self.get_field(SplitSummaryMaxPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def normalized_power(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNormalizedPowerField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @normalized_power.setter
+ def normalized_power(self, value: int):
+ field = self.get_field(SplitSummaryNormalizedPowerField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def left_right_balance(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryLeftRightBalanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @left_right_balance.setter
+ def left_right_balance(self, value: int):
+ field = self.get_field(SplitSummaryLeftRightBalanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def time_standing(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTimeStandingField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @time_standing.setter
+ def time_standing(self, value: float):
+ field = self.get_field(SplitSummaryTimeStandingField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_pco(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgLeftPcoField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_pco.setter
+ def avg_left_pco(self, value: int):
+ field = self.get_field(SplitSummaryAvgLeftPcoField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_pco(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgRightPcoField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_pco.setter
+ def avg_right_pco(self, value: int):
+ field = self.get_field(SplitSummaryAvgRightPcoField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_power_phase(self) -> Optional[list[float]]:
+ field = self.get_field(SplitSummaryAvgLeftPowerPhaseField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_left_power_phase.setter
+ def avg_left_power_phase(self, value: list[float]):
+ field = self.get_field(SplitSummaryAvgLeftPowerPhaseField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_left_power_phase_peak(self) -> Optional[list[float]]:
+ field = self.get_field(SplitSummaryAvgLeftPowerPhasePeakField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_left_power_phase_peak.setter
+ def avg_left_power_phase_peak(self, value: list[float]):
+ field = self.get_field(SplitSummaryAvgLeftPowerPhasePeakField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_right_power_phase(self) -> Optional[list[float]]:
+ field = self.get_field(SplitSummaryAvgRightPowerPhaseField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_right_power_phase.setter
+ def avg_right_power_phase(self, value: list[float]):
+ field = self.get_field(SplitSummaryAvgRightPowerPhaseField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_right_power_phase_peak(self) -> Optional[list[float]]:
+ field = self.get_field(SplitSummaryAvgRightPowerPhasePeakField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_right_power_phase_peak.setter
+ def avg_right_power_phase_peak(self, value: list[float]):
+ field = self.get_field(SplitSummaryAvgRightPowerPhasePeakField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_power_position(self) -> Optional[list[int]]:
+ field = self.get_field(SplitSummaryAvgPowerPositionField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @avg_power_position.setter
+ def avg_power_position(self, value: list[int]):
+ field = self.get_field(SplitSummaryAvgPowerPositionField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def max_power_position(self) -> Optional[list[int]]:
+ field = self.get_field(SplitSummaryMaxPowerPositionField.ID)
+ if field and field.is_valid():
+ return field.get_values()
+ else:
+ return None
+
+
+
+ @max_power_position.setter
+ def max_power_position(self, value: list[int]):
+ field = self.get_field(SplitSummaryMaxPowerPositionField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ field.set_values(value)
+
+
+
+ @property
+ def avg_left_torque_effectiveness(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgLeftTorqueEffectivenessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_torque_effectiveness.setter
+ def avg_left_torque_effectiveness(self, value: float):
+ field = self.get_field(SplitSummaryAvgLeftTorqueEffectivenessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_torque_effectiveness(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgRightTorqueEffectivenessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_torque_effectiveness.setter
+ def avg_right_torque_effectiveness(self, value: float):
+ field = self.get_field(SplitSummaryAvgRightTorqueEffectivenessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_left_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgLeftPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_left_pedal_smoothness.setter
+ def avg_left_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitSummaryAvgLeftPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_right_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgRightPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_right_pedal_smoothness.setter
+ def avg_right_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitSummaryAvgRightPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_combined_pedal_smoothness(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgCombinedPedalSmoothnessField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_combined_pedal_smoothness.setter
+ def avg_combined_pedal_smoothness(self, value: float):
+ field = self.get_field(SplitSummaryAvgCombinedPedalSmoothnessField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_flow(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgFlowField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_flow.setter
+ def avg_flow(self, value: float):
+ field = self.get_field(SplitSummaryAvgFlowField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_grit(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalGritField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_grit.setter
+ def total_grit(self, value: float):
+ field = self.get_field(SplitSummaryTotalGritField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def swim_stroke(self) -> Optional[SwimStroke]:
+ field = self.get_field(SplitSummarySwimStrokeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @swim_stroke.setter
+ def swim_stroke(self, value: SwimStroke):
+ field = self.get_field(SplitSummarySwimStrokeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_active_lengths(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNumActiveLengthsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_active_lengths.setter
+ def num_active_lengths(self, value: int):
+ field = self.get_field(SplitSummaryNumActiveLengthsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_swolf(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgSwolfField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_swolf.setter
+ def avg_swolf(self, value: int):
+ field = self.get_field(SplitSummaryAvgSwolfField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stroke_distance(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStrokeDistanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stroke_distance.setter
+ def avg_stroke_distance(self, value: float):
+ field = self.get_field(SplitSummaryAvgStrokeDistanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_strokes_per_length(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStrokesPerLengthField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_strokes_per_length.setter
+ def avg_strokes_per_length(self, value: float):
+ field = self.get_field(SplitSummaryAvgStrokesPerLengthField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_ascent(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_ascent.setter
+ def avg_ascent(self, value: int):
+ field = self.get_field(SplitSummaryAvgAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_ascent(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMaxAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_ascent.setter
+ def max_ascent(self, value: int):
+ field = self.get_field(SplitSummaryMaxAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def climb_grading_scale(self) -> Optional[ClimbGradingScale]:
+ field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @climb_grading_scale.setter
+ def climb_grading_scale(self, value: ClimbGradingScale):
+ field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def climb_max_grade_value(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @climb_max_grade_value.setter
+ def climb_max_grade_value(self, value: int):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+ @property
+ def climb_max_grade_yds(self) -> Optional[YdsGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [0]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_yds.setter
+ def climb_max_grade_yds(self, value: YdsGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_uiaa(self) -> Optional[UiaaGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [1]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_uiaa.setter
+ def climb_max_grade_uiaa(self, value: UiaaGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_french(self) -> Optional[FrenchGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [2]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_french.setter
+ def climb_max_grade_french(self, value: FrenchGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_british_adjectival(self) -> Optional[BritishAdjectivalGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [3]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_british_adjectival.setter
+ def climb_max_grade_british_adjectival(self, value: BritishAdjectivalGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_british_technical(self) -> Optional[BritishTechnicalGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [4]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_british_technical.setter
+ def climb_max_grade_british_technical(self, value: BritishTechnicalGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_ewbank(self) -> Optional[EwbankGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [5]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_ewbank.setter
+ def climb_max_grade_ewbank(self, value: EwbankGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_brazilian(self) -> Optional[BrazilianGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [6]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_brazilian.setter
+ def climb_max_grade_brazilian(self, value: BrazilianGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_saxon(self) -> Optional[SaxonGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [7]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_saxon.setter
+ def climb_max_grade_saxon(self, value: SaxonGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_vermin(self) -> Optional[VerminGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [8]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_vermin.setter
+ def climb_max_grade_vermin(self, value: VerminGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_font(self) -> Optional[FontGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [9]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_font.setter
+ def climb_max_grade_font(self, value: FontGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+ @property
+ def climb_max_grade_dankyu(self) -> Optional[DankyuGradingScale]:
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ type_field = self.get_field(SplitSummaryClimbGradingScaleField.ID)
+
+ is_sub_field_valid = type_field and type_field.get_value() in [10]
+ if field and field.is_valid() and is_sub_field_valid:
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+ @climb_max_grade_dankyu.setter
+ def climb_max_grade_dankyu(self, value: DankyuGradingScale):
+ field = self.get_field(SplitSummaryClimbMaxGradeValueField.ID)
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+ @property
+ def num_falls(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNumFallsField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_falls.setter
+ def num_falls(self, value: int):
+ field = self.get_field(SplitSummaryNumFallsField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_climbs_attempted(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNumClimbsAttemptedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_climbs_attempted.setter
+ def num_climbs_attempted(self, value: int):
+ field = self.get_field(SplitSummaryNumClimbsAttemptedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def num_climbs_completed(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryNumClimbsCompletedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @num_climbs_completed.setter
+ def num_climbs_completed(self, value: int):
+ field = self.get_field(SplitSummaryNumClimbsCompletedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_distance(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxDistanceField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_distance.setter
+ def max_distance(self, value: float):
+ field = self.get_field(SplitSummaryMaxDistanceField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def metabolic_calories(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMetabolicCaloriesField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @metabolic_calories.setter
+ def metabolic_calories(self, value: int):
+ field = self.get_field(SplitSummaryMetabolicCaloriesField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def active_time(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryActiveTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @active_time.setter
+ def active_time(self, value: float):
+ field = self.get_field(SplitSummaryActiveTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_fractional_ascent(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalFractionalAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_fractional_ascent.setter
+ def total_fractional_ascent(self, value: float):
+ field = self.get_field(SplitSummaryTotalFractionalAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_fractional_descent(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalFractionalDescentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_fractional_descent.setter
+ def total_fractional_descent(self, value: float):
+ field = self.get_field(SplitSummaryTotalFractionalDescentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_fractional_ascent(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgFractionalAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_fractional_ascent.setter
+ def avg_fractional_ascent(self, value: float):
+ field = self.get_field(SplitSummaryAvgFractionalAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_fractional_ascent(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxFractionalAscentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_fractional_ascent.setter
+ def max_fractional_ascent(self, value: float):
+ field = self.get_field(SplitSummaryMaxFractionalAscentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_grade_adjusted_speed(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgGradeAdjustedSpeedField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_grade_adjusted_speed.setter
+ def avg_grade_adjusted_speed(self, value: float):
+ field = self.get_field(SplitSummaryAvgGradeAdjustedSpeedField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stress(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryAvgStressField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stress.setter
+ def avg_stress(self, value: int):
+ field = self.get_field(SplitSummaryAvgStressField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def total_moving_time(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryTotalMovingTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @total_moving_time.setter
+ def total_moving_time(self, value: float):
+ field = self.get_field(SplitSummaryTotalMovingTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+# timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
+
+ @property
+ def start_time(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryStartTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+ # timestamp : milliseconds from January 1st, 1970 at 00:00:00 UTC
+
+ @start_time.setter
+ def start_time(self, value: int):
+ field = self.get_field(SplitSummaryStartTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def min_heart_rate(self) -> Optional[int]:
+ field = self.get_field(SplitSummaryMinHeartRateField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @min_heart_rate.setter
+ def min_heart_rate(self, value: int):
+ field = self.get_field(SplitSummaryMinHeartRateField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def avg_stance_time_percent(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryAvgStanceTimePercentField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @avg_stance_time_percent.setter
+ def avg_stance_time_percent(self, value: float):
+ field = self.get_field(SplitSummaryAvgStanceTimePercentField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+ @property
+ def max_total_timer_time(self) -> Optional[float]:
+ field = self.get_field(SplitSummaryMaxTotalTimerTimeField.ID)
+ if field and field.is_valid():
+ sub_field = field.get_valid_sub_field(self.fields)
+ return field.get_value(sub_field=sub_field)
+ else:
+ return None
+
+
+
+ @max_total_timer_time.setter
+ def max_total_timer_time(self, value: float):
+ field = self.get_field(SplitSummaryMaxTotalTimerTimeField.ID)
+
+ if field:
+ if value is None:
+ field.clear()
+ else:
+ sub_field = field.get_valid_sub_field(self.fields)
+ field.set_value(0, value, sub_field)
+
+
+
+
+
+
+
+class SplitSummarySplitTypeField(Field):
+ ID = 0
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='split_type',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'split_type',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummarySportField(Field):
+ ID = 1
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='sport',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'sport',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummarySubSportField(Field):
+ ID = 2
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='sub_sport',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'sub_sport',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryNumSplitsField(Field):
+ ID = 3
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_splits',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalTimerTimeField(Field):
+ ID = 4
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_timer_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalDistanceField(Field):
+ ID = 5
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_distance',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgSpeedField(Field):
+ ID = 6
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxSpeedField(Field):
+ ID = 7
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalAscentField(Field):
+ ID = 8
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalDescentField(Field):
+ ID = 9
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_descent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgHeartRateField(Field):
+ ID = 10
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_heart_rate',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'bpm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxHeartRateField(Field):
+ ID = 11
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_heart_rate',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'bpm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgVertSpeedField(Field):
+ ID = 12
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vert_speed',
+ field_id=self.ID,
+ base_type=BaseType.SINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'sint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalCaloriesField(Field):
+ ID = 13
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kcal',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgCadenceField(Field):
+ ID = 14
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_cadence',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 128,
+ size = size,
+ units = 'rpm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='avg_running_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strides/min',
+ reference_map = {
+ SplitSummarySportField.ID: [1]
+ }),
+ SubField(
+ name='avg_swimming_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [5]
+ }),
+ SubField(
+ name='avg_paddlesport_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [15, 37]
+ }),
+ SubField(
+ name='avg_push_cadence',
+ base_type=BaseType.UINT16,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitSummaryMaxCadenceField(Field):
+ ID = 15
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_cadence',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 128,
+ size = size,
+ units = 'rpm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='max_running_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strides/min',
+ reference_map = {
+ SplitSummarySportField.ID: [1]
+ }),
+ SubField(
+ name='max_swimming_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [5]
+ }),
+ SubField(
+ name='max_paddlesport_cadence',
+ base_type=BaseType.UINT16,
+ scale = 128,
+ offset = 0,
+ units = 'strokes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [15, 37]
+ }),
+ SubField(
+ name='max_push_cadence',
+ base_type=BaseType.UINT16,
+ scale = 1,
+ offset = 0,
+ units = 'pushes/min',
+ reference_map = {
+ SplitSummarySportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitSummaryTotalCyclesField(Field):
+ ID = 16
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_cycles',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'cycles',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ SubField(
+ name='total_strides',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'strides',
+ reference_map = {
+ SplitSummarySportField.ID: [1, 11]
+ }),
+ SubField(
+ name='total_strokes',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'strokes',
+ reference_map = {
+ SplitSummarySportField.ID: [2, 5, 15, 37]
+ }),
+ SubField(
+ name='total_reps',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'reps',
+ reference_map = {
+ SplitSummarySportField.ID: [62]
+ }),
+ SubField(
+ name='total_pushes',
+ base_type=BaseType.UINT32,
+ scale = 1,
+ offset = 0,
+ units = 'pushes',
+ reference_map = {
+ SplitSummarySportField.ID: [66, 65]
+ })
+ ]
+ )
+
+
+class SplitSummaryAvgTemperatureField(Field):
+ ID = 17
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxTemperatureField(Field):
+ ID = 18
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMinTemperatureField(Field):
+ ID = 19
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='min_temperature',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'C',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgVerticalOscillationField(Field):
+ ID = 20
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vertical_oscillation',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'mm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgVerticalRatioField(Field):
+ ID = 21
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_vertical_ratio',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'percent',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStanceTimeField(Field):
+ ID = 22
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stance_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'ms',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStanceTimeBalanceField(Field):
+ ID = 23
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stance_time_balance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'percent',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStepLengthField(Field):
+ ID = 24
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_step_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'mm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgPowerField(Field):
+ ID = 25
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxPowerField(Field):
+ ID = 26
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryNormalizedPowerField(Field):
+ ID = 27
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='normalized_power',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryLeftRightBalanceField(Field):
+ ID = 28
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='left_right_balance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'left_right_balance_100',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTimeStandingField(Field):
+ ID = 29
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='time_standing',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgLeftPcoField(Field):
+ ID = 30
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_pco',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'mm',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgRightPcoField(Field):
+ ID = 31
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_pco',
+ field_id=self.ID,
+ base_type=BaseType.SINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'mm',
+ type_name = 'sint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgLeftPowerPhaseField(Field):
+ ID = 32
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_power_phase',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgLeftPowerPhasePeakField(Field):
+ ID = 33
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_power_phase_peak',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgRightPowerPhaseField(Field):
+ ID = 34
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_power_phase',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgRightPowerPhasePeakField(Field):
+ ID = 35
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_power_phase_peak',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 0.7111111,
+ size = size,
+ units = 'degrees',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgPowerPositionField(Field):
+ ID = 36
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_power_position',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxPowerPositionField(Field):
+ ID = 37
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_power_position',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'watts',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgLeftTorqueEffectivenessField(Field):
+ ID = 38
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_torque_effectiveness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgRightTorqueEffectivenessField(Field):
+ ID = 39
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_torque_effectiveness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgLeftPedalSmoothnessField(Field):
+ ID = 40
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_left_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgRightPedalSmoothnessField(Field):
+ ID = 41
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_right_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgCombinedPedalSmoothnessField(Field):
+ ID = 42
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_combined_pedal_smoothness',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 2,
+ size = size,
+ units = 'percent',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgFlowField(Field):
+ ID = 43
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_flow',
+ field_id=self.ID,
+ base_type=BaseType.FLOAT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'Flow',
+ type_name = 'float32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalGritField(Field):
+ ID = 44
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_grit',
+ field_id=self.ID,
+ base_type=BaseType.FLOAT32,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'kGrit',
+ type_name = 'float32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummarySwimStrokeField(Field):
+ ID = 47
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='swim_stroke',
+ field_id=self.ID,
+ base_type=BaseType.ENUM,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'swim_stroke',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryNumActiveLengthsField(Field):
+ ID = 48
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_active_lengths',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'lengths',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgSwolfField(Field):
+ ID = 49
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_swolf',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStrokeDistanceField(Field):
+ ID = 50
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stroke_distance',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStrokesPerLengthField(Field):
+ ID = 51
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_strokes_per_length',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 10,
+ size = size,
+ units = 'strokes / length',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgAscentField(Field):
+ ID = 52
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
offset = 0,
scale = 1,
size = size,
@@ -682,12 +3940,12 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitSummaryTotalDescentField(Field):
- ID = 9
+class SplitSummaryMaxAscentField(Field):
+ ID = 53
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_descent',
+ name='max_ascent',
field_id=self.ID,
base_type=BaseType.UINT16,
offset = 0,
@@ -701,76 +3959,216 @@ def __init__(self, size: int = 0, growable: bool = True):
)
-class SplitSummaryAvgHeartRateField(Field):
- ID = 10
+class SplitSummaryClimbGradingScaleField(Field):
+ ID = 54
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='avg_heart_rate',
+ name='climb_grading_scale',
field_id=self.ID,
- base_type=BaseType.UINT8,
+ base_type=BaseType.ENUM,
offset = 0,
scale = 1,
size = size,
- units = 'bpm',
- type_name = 'uint8',
+ type_name = 'climb_grading_scale',
growable = growable,
sub_fields = [
]
)
-class SplitSummaryMaxHeartRateField(Field):
- ID = 11
+class SplitSummaryClimbMaxGradeValueField(Field):
+ ID = 55
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='max_heart_rate',
+ name='climb_max_grade_value',
field_id=self.ID,
- base_type=BaseType.UINT8,
+ base_type=BaseType.UINT32,
offset = 0,
scale = 1,
size = size,
- units = 'bpm',
- type_name = 'uint8',
+ type_name = 'uint32',
growable = growable,
sub_fields = [
+ SubField(
+ name='climb_max_grade_yds',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [0]
+ }),
+ SubField(
+ name='climb_max_grade_uiaa',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [1]
+ }),
+ SubField(
+ name='climb_max_grade_french',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [2]
+ }),
+ SubField(
+ name='climb_max_grade_british_adjectival',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [3]
+ }),
+ SubField(
+ name='climb_max_grade_british_technical',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [4]
+ }),
+ SubField(
+ name='climb_max_grade_ewbank',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [5]
+ }),
+ SubField(
+ name='climb_max_grade_brazilian',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [6]
+ }),
+ SubField(
+ name='climb_max_grade_saxon',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [7]
+ }),
+ SubField(
+ name='climb_max_grade_vermin',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [8]
+ }),
+ SubField(
+ name='climb_max_grade_font',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [9]
+ }),
+ SubField(
+ name='climb_max_grade_dankyu',
+ base_type=BaseType.ENUM,
+ scale = 1,
+ offset = 0,
+ reference_map = {
+ SplitSummaryClimbGradingScaleField.ID: [10]
+ })
]
)
-class SplitSummaryAvgVertSpeedField(Field):
- ID = 12
+class SplitSummaryNumFallsField(Field):
+ ID = 56
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='avg_vert_speed',
+ name='num_falls',
field_id=self.ID,
- base_type=BaseType.SINT32,
+ base_type=BaseType.UINT16,
offset = 0,
- scale = 1000,
+ scale = 1,
size = size,
- units = 'm/s',
- type_name = 'sint32',
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
)
-class SplitSummaryTotalCaloriesField(Field):
- ID = 13
+class SplitSummaryNumClimbsAttemptedField(Field):
+ ID = 58
def __init__(self, size: int = 0, growable: bool = True):
super().__init__(
- name='total_calories',
+ name='num_climbs_attempted',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryNumClimbsCompletedField(Field):
+ ID = 59
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='num_climbs_completed',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxDistanceField(Field):
+ ID = 60
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_distance',
field_id=self.ID,
base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMetabolicCaloriesField(Field):
+ ID = 64
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='metabolic_calories',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
offset = 0,
scale = 1,
size = size,
units = 'kcal',
- type_name = 'uint32',
+ type_name = 'uint16',
growable = growable,
sub_fields = [
]
@@ -796,6 +4194,119 @@ def __init__(self, size: int = 0, growable: bool = True):
)
+class SplitSummaryTotalFractionalAscentField(Field):
+ ID = 66
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_fractional_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryTotalFractionalDescentField(Field):
+ ID = 67
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='total_fractional_descent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgFractionalAscentField(Field):
+ ID = 68
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_fractional_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxFractionalAscentField(Field):
+ ID = 69
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_fractional_ascent',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgGradeAdjustedSpeedField(Field):
+ ID = 71
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_grade_adjusted_speed',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 'm/s',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStressField(Field):
+ ID = 72
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stress',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 1,
+ size = size,
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
class SplitSummaryTotalMovingTimeField(Field):
ID = 77
@@ -812,4 +4323,80 @@ def __init__(self, size: int = 0, growable: bool = True):
growable = growable,
sub_fields = [
]
+ )
+
+
+class SplitSummaryStartTimeField(Field):
+ ID = 79
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='start_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = -631065600000,
+ scale = 0.001,
+ size = size,
+ units = 'ms',
+ type_name = 'date_time',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMinHeartRateField(Field):
+ ID = 87
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='min_heart_rate',
+ field_id=self.ID,
+ base_type=BaseType.UINT8,
+ offset = 0,
+ scale = 1,
+ size = size,
+ units = 'bpm',
+ type_name = 'uint8',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryAvgStanceTimePercentField(Field):
+ ID = 91
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='avg_stance_time_percent',
+ field_id=self.ID,
+ base_type=BaseType.UINT16,
+ offset = 0,
+ scale = 100,
+ size = size,
+ units = 'percent',
+ type_name = 'uint16',
+ growable = growable,
+ sub_fields = [
+ ]
+ )
+
+
+class SplitSummaryMaxTotalTimerTimeField(Field):
+ ID = 101
+
+ def __init__(self, size: int = 0, growable: bool = True):
+ super().__init__(
+ name='max_total_timer_time',
+ field_id=self.ID,
+ base_type=BaseType.UINT32,
+ offset = 0,
+ scale = 1000,
+ size = size,
+ units = 's',
+ type_name = 'uint32',
+ growable = growable,
+ sub_fields = [
+ ]
)
\ No newline at end of file
diff --git a/fit_tool/profile/messages/spo2_data_message.py b/fit_tool/profile/messages/spo2_data_message.py
index b585678..524c686 100644
--- a/fit_tool/profile/messages/spo2_data_message.py
+++ b/fit_tool/profile/messages/spo2_data_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/sport_message.py b/fit_tool/profile/messages/sport_message.py
index 19865ee..449f456 100644
--- a/fit_tool/profile/messages/sport_message.py
+++ b/fit_tool/profile/messages/sport_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/stress_level_message.py b/fit_tool/profile/messages/stress_level_message.py
index 9014a8b..afde619 100644
--- a/fit_tool/profile/messages/stress_level_message.py
+++ b/fit_tool/profile/messages/stress_level_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/tank_summary_message.py b/fit_tool/profile/messages/tank_summary_message.py
index 831c4ff..56de9ff 100644
--- a/fit_tool/profile/messages/tank_summary_message.py
+++ b/fit_tool/profile/messages/tank_summary_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/tank_update_message.py b/fit_tool/profile/messages/tank_update_message.py
index ed14526..06d9d66 100644
--- a/fit_tool/profile/messages/tank_update_message.py
+++ b/fit_tool/profile/messages/tank_update_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/three_d_sensor_calibration_message.py b/fit_tool/profile/messages/three_d_sensor_calibration_message.py
index 090c48e..d073963 100644
--- a/fit_tool/profile/messages/three_d_sensor_calibration_message.py
+++ b/fit_tool/profile/messages/three_d_sensor_calibration_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/time_in_zone_message.py b/fit_tool/profile/messages/time_in_zone_message.py
index dfefed4..6e29a99 100644
--- a/fit_tool/profile/messages/time_in_zone_message.py
+++ b/fit_tool/profile/messages/time_in_zone_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/timestamp_correlation_message.py b/fit_tool/profile/messages/timestamp_correlation_message.py
index 9cf2e77..3eed5e2 100644
--- a/fit_tool/profile/messages/timestamp_correlation_message.py
+++ b/fit_tool/profile/messages/timestamp_correlation_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/totals_message.py b/fit_tool/profile/messages/totals_message.py
index 4353f05..d671c34 100644
--- a/fit_tool/profile/messages/totals_message.py
+++ b/fit_tool/profile/messages/totals_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/training_file_message.py b/fit_tool/profile/messages/training_file_message.py
index 841bca3..a592b48 100644
--- a/fit_tool/profile/messages/training_file_message.py
+++ b/fit_tool/profile/messages/training_file_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/training_settings_message.py b/fit_tool/profile/messages/training_settings_message.py
index a46b471..bf061c7 100644
--- a/fit_tool/profile/messages/training_settings_message.py
+++ b/fit_tool/profile/messages/training_settings_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/user_profile_message.py b/fit_tool/profile/messages/user_profile_message.py
index c7ea639..58cb027 100644
--- a/fit_tool/profile/messages/user_profile_message.py
+++ b/fit_tool/profile/messages/user_profile_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/video_clip_message.py b/fit_tool/profile/messages/video_clip_message.py
index f2915d5..fb6dbe1 100644
--- a/fit_tool/profile/messages/video_clip_message.py
+++ b/fit_tool/profile/messages/video_clip_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/video_description_message.py b/fit_tool/profile/messages/video_description_message.py
index 56bbc3e..c513526 100644
--- a/fit_tool/profile/messages/video_description_message.py
+++ b/fit_tool/profile/messages/video_description_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/video_frame_message.py b/fit_tool/profile/messages/video_frame_message.py
index b80a10c..6f9ae6a 100644
--- a/fit_tool/profile/messages/video_frame_message.py
+++ b/fit_tool/profile/messages/video_frame_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/video_message.py b/fit_tool/profile/messages/video_message.py
index dda4a4f..3945a5a 100644
--- a/fit_tool/profile/messages/video_message.py
+++ b/fit_tool/profile/messages/video_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/video_title_message.py b/fit_tool/profile/messages/video_title_message.py
index de49cf6..3286d47 100644
--- a/fit_tool/profile/messages/video_title_message.py
+++ b/fit_tool/profile/messages/video_title_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/watchface_settings_message.py b/fit_tool/profile/messages/watchface_settings_message.py
index 4e41d87..87c462a 100644
--- a/fit_tool/profile/messages/watchface_settings_message.py
+++ b/fit_tool/profile/messages/watchface_settings_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/weather_alert_message.py b/fit_tool/profile/messages/weather_alert_message.py
index 3b34c1e..1ae344b 100644
--- a/fit_tool/profile/messages/weather_alert_message.py
+++ b/fit_tool/profile/messages/weather_alert_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/weather_conditions_message.py b/fit_tool/profile/messages/weather_conditions_message.py
index f10525f..beb7718 100644
--- a/fit_tool/profile/messages/weather_conditions_message.py
+++ b/fit_tool/profile/messages/weather_conditions_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/weight_scale_message.py b/fit_tool/profile/messages/weight_scale_message.py
index 57e752e..ddaca37 100644
--- a/fit_tool/profile/messages/weight_scale_message.py
+++ b/fit_tool/profile/messages/weight_scale_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/workout_message.py b/fit_tool/profile/messages/workout_message.py
index 2c57331..1a04108 100644
--- a/fit_tool/profile/messages/workout_message.py
+++ b/fit_tool/profile/messages/workout_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/workout_session_message.py b/fit_tool/profile/messages/workout_session_message.py
index a6aac31..a8038cb 100644
--- a/fit_tool/profile/messages/workout_session_message.py
+++ b/fit_tool/profile/messages/workout_session_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/workout_step_message.py b/fit_tool/profile/messages/workout_step_message.py
index bb5f194..c6a513b 100644
--- a/fit_tool/profile/messages/workout_step_message.py
+++ b/fit_tool/profile/messages/workout_step_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/messages/zones_target_message.py b/fit_tool/profile/messages/zones_target_message.py
index 2e9f5b5..926747a 100644
--- a/fit_tool/profile/messages/zones_target_message.py
+++ b/fit_tool/profile/messages/zones_target_message.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from typing import Optional
from fit_tool.base_type import BaseType
diff --git a/fit_tool/profile/profile_type.py b/fit_tool/profile/profile_type.py
index 6605e41..0edd48d 100644
--- a/fit_tool/profile/profile_type.py
+++ b/fit_tool/profile/profile_type.py
@@ -1,6 +1,6 @@
# Autogenerated. Do not modify.
#
-# Profile: 21.213.0
+# Profile: 21.218.0
from enum import Enum
@@ -14,196 +14,211 @@ class ProfileType(Enum):
ANTPLUS_DEVICE_TYPE = 6
ANT_CHANNEL_ID = 7
ANT_NETWORK = 8
- ATTITUDE_STAGE = 9
- ATTITUDE_VALIDITY = 10
- AUTOLAP_TRIGGER = 11
- AUTOSCROLL = 12
- AUTO_ACTIVITY_DETECT = 13
- AUTO_SYNC_FREQUENCY = 14
- BACKLIGHT_MODE = 15
- BACKLIGHT_TIMEOUT = 16
- BANDED_EXERCISES_EXERCISE_NAME = 17
- BATTERY_STATUS = 18
- BATTLE_ROPE_EXERCISE_NAME = 19
- BENCH_PRESS_EXERCISE_NAME = 20
- BIKE_EXERCISE_NAME = 21
- BIKE_LIGHT_BEAM_ANGLE_MODE = 22
- BIKE_LIGHT_NETWORK_CONFIG_TYPE = 23
- BIKE_OUTDOOR_EXERCISE_NAME = 24
- BLE_DEVICE_TYPE = 25
- BODY_LOCATION = 26
- BP_STATUS = 27
- CALF_RAISE_EXERCISE_NAME = 28
- CAMERA_EVENT_TYPE = 29
- CAMERA_ORIENTATION_TYPE = 30
- CARDIO_EXERCISE_NAME = 31
- CARRY_EXERCISE_NAME = 32
- CCR_SETPOINT_SWITCH_MODE = 33
- CHECKSUM = 34
- CHOP_EXERCISE_NAME = 35
- CLIMB_PRO_EVENT = 36
- COMM_TIMEOUT_TYPE = 37
- CONNECTIVITY_CAPABILITIES = 38
- CORE_EXERCISE_NAME = 39
- COURSE_CAPABILITIES = 40
- COURSE_POINT = 41
- CRUNCH_EXERCISE_NAME = 42
- CURL_EXERCISE_NAME = 43
- DATE_MODE = 44
- DATE_TIME = 45
- DAY_OF_WEEK = 46
- DEADLIFT_EXERCISE_NAME = 47
- DEVICE_INDEX = 48
- DIGITAL_WATCHFACE_LAYOUT = 49
- DISPLAY_HEART = 50
- DISPLAY_MEASURE = 51
- DISPLAY_ORIENTATION = 52
- DISPLAY_POSITION = 53
- DISPLAY_POWER = 54
- DIVE_ALARM_TYPE = 55
- DIVE_ALERT = 56
- DIVE_BACKLIGHT_MODE = 57
- DIVE_GAS_MODE = 58
- DIVE_GAS_STATUS = 59
- ELLIPTICAL_EXERCISE_NAME = 60
- EVENT = 61
- EVENT_TYPE = 62
- EXD_DATA_UNITS = 63
- EXD_DESCRIPTORS = 64
- EXD_DISPLAY_TYPE = 65
- EXD_LAYOUT = 66
- EXD_QUALIFIERS = 67
- EXERCISE_CATEGORY = 68
- FAVERO_PRODUCT = 69
- FILE = 70
- FILE_FLAGS = 71
- FITNESS_EQUIPMENT_STATE = 72
- FIT_BASE_UNIT = 73
- FLOOR_CLIMB_EXERCISE_NAME = 74
- FLYE_EXERCISE_NAME = 75
- GARMIN_PRODUCT = 76
- GAS_CONSUMPTION_RATE_TYPE = 77
- GENDER = 78
- GOAL = 79
- GOAL_RECURRENCE = 80
- GOAL_SOURCE = 81
- HIP_RAISE_EXERCISE_NAME = 82
- HIP_STABILITY_EXERCISE_NAME = 83
- HIP_SWING_EXERCISE_NAME = 84
- HRV_STATUS = 85
- HR_TYPE = 86
- HR_ZONE_CALC = 87
- HYPEREXTENSION_EXERCISE_NAME = 88
- INDOOR_BIKE_EXERCISE_NAME = 89
- INDOOR_ROW_EXERCISE_NAME = 90
- INTENSITY = 91
- LADDER_EXERCISE_NAME = 92
- LANGUAGE = 93
- LANGUAGE_BITS_0 = 94
- LANGUAGE_BITS_1 = 95
- LANGUAGE_BITS_2 = 96
- LANGUAGE_BITS_3 = 97
- LANGUAGE_BITS_4 = 98
- LAP_TRIGGER = 99
- LATERAL_RAISE_EXERCISE_NAME = 100
- LEFT_RIGHT_BALANCE = 101
- LEFT_RIGHT_BALANCE_100 = 102
- LEG_CURL_EXERCISE_NAME = 103
- LEG_RAISE_EXERCISE_NAME = 104
- LENGTH_TYPE = 105
- LOCALTIME_INTO_DAY = 106
- LOCAL_DATE_TIME = 107
- LOCAL_DEVICE_TYPE = 108
- LUNGE_EXERCISE_NAME = 109
- MANUFACTURER = 110
- MAX_MET_CATEGORY = 111
- MAX_MET_HEART_RATE_SOURCE = 112
- MAX_MET_SPEED_SOURCE = 113
- MESG_COUNT = 114
- MESG_NUM = 115
- MESSAGE_INDEX = 116
- MOVE_EXERCISE_NAME = 117
- NAP_PERIOD_FEEDBACK = 118
- NAP_SOURCE = 119
- NO_FLY_TIME_MODE = 120
- OLYMPIC_LIFT_EXERCISE_NAME = 121
- PLANK_EXERCISE_NAME = 122
- PLYO_EXERCISE_NAME = 123
- POSE_EXERCISE_NAME = 124
- POWER_PHASE_TYPE = 125
- PROJECTILE_TYPE = 126
- PULL_UP_EXERCISE_NAME = 127
- PUSH_UP_EXERCISE_NAME = 128
- PWR_ZONE_CALC = 129
- RADAR_THREAT_LEVEL_TYPE = 130
- RIDER_POSITION_TYPE = 131
- ROW_EXERCISE_NAME = 132
- RUN_EXERCISE_NAME = 133
- RUN_INDOOR_EXERCISE_NAME = 134
- SANDBAG_EXERCISE_NAME = 135
- SCHEDULE = 136
- SEGMENT_DELETE_STATUS = 137
- SEGMENT_LAP_STATUS = 138
- SEGMENT_LEADERBOARD_TYPE = 139
- SEGMENT_SELECTION_TYPE = 140
- SENSOR_TYPE = 141
- SESSION_TRIGGER = 142
- SET_TYPE = 143
- SHOULDER_PRESS_EXERCISE_NAME = 144
- SHOULDER_STABILITY_EXERCISE_NAME = 145
- SHRUG_EXERCISE_NAME = 146
- SIDE = 147
- SIT_UP_EXERCISE_NAME = 148
- SLEDGE_HAMMER_EXERCISE_NAME = 149
- SLED_EXERCISE_NAME = 150
- SLEEP_DISRUPTION_SEVERITY = 151
- SLEEP_LEVEL = 152
- SOURCE_TYPE = 153
- SPLIT_TYPE = 154
- SPO2_MEASUREMENT_TYPE = 155
- SPORT = 156
- SPORT_BITS_0 = 157
- SPORT_BITS_1 = 158
- SPORT_BITS_2 = 159
- SPORT_BITS_3 = 160
- SPORT_BITS_4 = 161
- SPORT_BITS_5 = 162
- SPORT_BITS_6 = 163
- SPORT_EVENT = 164
- SQUAT_EXERCISE_NAME = 165
- STAIR_STEPPER_EXERCISE_NAME = 166
- STROKE_TYPE = 167
- SUB_SPORT = 168
- SUPPORTED_EXD_SCREEN_LAYOUTS = 169
- SUSPENSION_EXERCISE_NAME = 170
- SWIM_STROKE = 171
- SWITCH = 172
- TAP_SENSITIVITY = 173
- TIMER_TRIGGER = 174
- TIME_INTO_DAY = 175
- TIME_MODE = 176
- TIME_ZONE = 177
- TIRE_EXERCISE_NAME = 178
- TISSUE_MODEL_TYPE = 179
- TONE = 180
- TOTAL_BODY_EXERCISE_NAME = 181
- TRICEPS_EXTENSION_EXERCISE_NAME = 182
- TURN_TYPE = 183
- USER_LOCAL_ID = 184
- WARM_UP_EXERCISE_NAME = 185
- WATCHFACE_MODE = 186
- WATER_TYPE = 187
- WEATHER_REPORT = 188
- WEATHER_SEVERE_TYPE = 189
- WEATHER_SEVERITY = 190
- WEATHER_STATUS = 191
- WEIGHT = 192
- WORKOUT_CAPABILITIES = 193
- WORKOUT_EQUIPMENT = 194
- WORKOUT_HR = 195
- WORKOUT_POWER = 196
- WORKOUT_STEP_DURATION = 197
- WORKOUT_STEP_TARGET = 198
+ APNEA_DISCIPLINE = 9
+ ATTITUDE_STAGE = 10
+ ATTITUDE_VALIDITY = 11
+ AUTOLAP_TRIGGER = 12
+ AUTOSCROLL = 13
+ AUTO_ACTIVITY_DETECT = 14
+ AUTO_SYNC_FREQUENCY = 15
+ BACKLIGHT_MODE = 16
+ BACKLIGHT_TIMEOUT = 17
+ BANDED_EXERCISES_EXERCISE_NAME = 18
+ BATTERY_STATUS = 19
+ BATTLE_ROPE_EXERCISE_NAME = 20
+ BENCH_PRESS_EXERCISE_NAME = 21
+ BIKE_EXERCISE_NAME = 22
+ BIKE_LIGHT_BEAM_ANGLE_MODE = 23
+ BIKE_LIGHT_NETWORK_CONFIG_TYPE = 24
+ BIKE_OUTDOOR_EXERCISE_NAME = 25
+ BLE_DEVICE_TYPE = 26
+ BODY_LOCATION = 27
+ BP_STATUS = 28
+ BRAZILIAN_GRADING_SCALE = 29
+ BRITISH_ADJECTIVAL_GRADING_SCALE = 30
+ BRITISH_TECHNICAL_GRADING_SCALE = 31
+ CALF_RAISE_EXERCISE_NAME = 32
+ CAMERA_EVENT_TYPE = 33
+ CAMERA_ORIENTATION_TYPE = 34
+ CARDIO_EXERCISE_NAME = 35
+ CARRY_EXERCISE_NAME = 36
+ CCR_SETPOINT_SWITCH_MODE = 37
+ CHECKSUM = 38
+ CHOP_EXERCISE_NAME = 39
+ CLIMB_GRADING_SCALE = 40
+ CLIMB_PRO_EVENT = 41
+ COMM_TIMEOUT_TYPE = 42
+ CONNECTIVITY_CAPABILITIES = 43
+ CORE_EXERCISE_NAME = 44
+ COURSE_CAPABILITIES = 45
+ COURSE_POINT = 46
+ CRUNCH_EXERCISE_NAME = 47
+ CURL_EXERCISE_NAME = 48
+ DANKYU_GRADING_SCALE = 49
+ DATE_MODE = 50
+ DATE_TIME = 51
+ DAY_OF_WEEK = 52
+ DEADLIFT_EXERCISE_NAME = 53
+ DEVICE_INDEX = 54
+ DIGITAL_WATCHFACE_LAYOUT = 55
+ DISPLAY_HEART = 56
+ DISPLAY_MEASURE = 57
+ DISPLAY_ORIENTATION = 58
+ DISPLAY_POSITION = 59
+ DISPLAY_POWER = 60
+ DIVE_ALARM_TYPE = 61
+ DIVE_ALERT = 62
+ DIVE_BACKLIGHT_MODE = 63
+ DIVE_GAS_MODE = 64
+ DIVE_GAS_STATUS = 65
+ DIVE_SECTION_TYPE = 66
+ ELLIPTICAL_EXERCISE_NAME = 67
+ EVENT = 68
+ EVENT_TYPE = 69
+ EWBANK_GRADING_SCALE = 70
+ EXD_DATA_UNITS = 71
+ EXD_DESCRIPTORS = 72
+ EXD_DISPLAY_TYPE = 73
+ EXD_LAYOUT = 74
+ EXD_QUALIFIERS = 75
+ EXERCISE_CATEGORY = 76
+ FAVERO_PRODUCT = 77
+ FILE = 78
+ FILE_FLAGS = 79
+ FITNESS_EQUIPMENT_STATE = 80
+ FIT_BASE_UNIT = 81
+ FLOOR_CLIMB_EXERCISE_NAME = 82
+ FLYE_EXERCISE_NAME = 83
+ FONT_GRADING_SCALE = 84
+ FRENCH_GRADING_SCALE = 85
+ GARMIN_PRODUCT = 86
+ GAS_CONSUMPTION_RATE_TYPE = 87
+ GENDER = 88
+ GOAL = 89
+ GOAL_RECURRENCE = 90
+ GOAL_SOURCE = 91
+ HIP_RAISE_EXERCISE_NAME = 92
+ HIP_STABILITY_EXERCISE_NAME = 93
+ HIP_SWING_EXERCISE_NAME = 94
+ HRV_STATUS = 95
+ HR_TYPE = 96
+ HR_ZONE_CALC = 97
+ HYPEREXTENSION_EXERCISE_NAME = 98
+ INDOOR_BIKE_EXERCISE_NAME = 99
+ INDOOR_ROW_EXERCISE_NAME = 100
+ INTENSITY = 101
+ LADDER_EXERCISE_NAME = 102
+ LANGUAGE = 103
+ LANGUAGE_BITS_0 = 104
+ LANGUAGE_BITS_1 = 105
+ LANGUAGE_BITS_2 = 106
+ LANGUAGE_BITS_3 = 107
+ LANGUAGE_BITS_4 = 108
+ LAP_TRIGGER = 109
+ LATERAL_RAISE_EXERCISE_NAME = 110
+ LEFT_RIGHT_BALANCE = 111
+ LEFT_RIGHT_BALANCE_100 = 112
+ LEG_CURL_EXERCISE_NAME = 113
+ LEG_RAISE_EXERCISE_NAME = 114
+ LENGTH_TYPE = 115
+ LOCALTIME_INTO_DAY = 116
+ LOCAL_DATE_TIME = 117
+ LOCAL_DEVICE_TYPE = 118
+ LUNGE_EXERCISE_NAME = 119
+ MANUFACTURER = 120
+ MAX_MET_CATEGORY = 121
+ MAX_MET_HEART_RATE_SOURCE = 122
+ MAX_MET_SPEED_SOURCE = 123
+ MESG_COUNT = 124
+ MESG_NUM = 125
+ MESSAGE_INDEX = 126
+ MOVE_EXERCISE_NAME = 127
+ NAP_PERIOD_FEEDBACK = 128
+ NAP_SOURCE = 129
+ NO_FLY_TIME_MODE = 130
+ OLYMPIC_LIFT_EXERCISE_NAME = 131
+ PLANK_EXERCISE_NAME = 132
+ PLYO_EXERCISE_NAME = 133
+ POSE_EXERCISE_NAME = 134
+ POWER_PHASE_TYPE = 135
+ PROJECTILE_TYPE = 136
+ PULL_UP_EXERCISE_NAME = 137
+ PUSH_UP_EXERCISE_NAME = 138
+ PWR_ZONE_CALC = 139
+ RADAR_THREAT_LEVEL_TYPE = 140
+ RIDER_POSITION_TYPE = 141
+ ROW_EXERCISE_NAME = 142
+ RUN_EXERCISE_NAME = 143
+ RUN_INDOOR_EXERCISE_NAME = 144
+ SANDBAG_EXERCISE_NAME = 145
+ SAXON_GRADING_SCALE = 146
+ SCHEDULE = 147
+ SEGMENT_DELETE_STATUS = 148
+ SEGMENT_LAP_STATUS = 149
+ SEGMENT_LEADERBOARD_TYPE = 150
+ SEGMENT_SELECTION_TYPE = 151
+ SENSOR_TYPE = 152
+ SESSION_TRIGGER = 153
+ SET_TYPE = 154
+ SHOULDER_PRESS_EXERCISE_NAME = 155
+ SHOULDER_STABILITY_EXERCISE_NAME = 156
+ SHRUG_EXERCISE_NAME = 157
+ SIDE = 158
+ SIT_UP_EXERCISE_NAME = 159
+ SLEDGE_HAMMER_EXERCISE_NAME = 160
+ SLED_EXERCISE_NAME = 161
+ SLEEP_DISRUPTION_SEVERITY = 162
+ SLEEP_LEVEL = 163
+ SOURCE_TYPE = 164
+ SPLIT_STATUS = 165
+ SPLIT_TYPE = 166
+ SPO2_MEASUREMENT_TYPE = 167
+ SPORT = 168
+ SPORT_BITS_0 = 169
+ SPORT_BITS_1 = 170
+ SPORT_BITS_2 = 171
+ SPORT_BITS_3 = 172
+ SPORT_BITS_4 = 173
+ SPORT_BITS_5 = 174
+ SPORT_BITS_6 = 175
+ SPORT_EVENT = 176
+ SQUAT_EXERCISE_NAME = 177
+ STAIR_STEPPER_EXERCISE_NAME = 178
+ STROKE_TYPE = 179
+ SUB_SPORT = 180
+ SUPPORTED_EXD_SCREEN_LAYOUTS = 181
+ SUSPENSION_EXERCISE_NAME = 182
+ SWIM_STROKE = 183
+ SWITCH = 184
+ TAP_SENSITIVITY = 185
+ TIMER_TRIGGER = 186
+ TIME_INTO_DAY = 187
+ TIME_MODE = 188
+ TIME_ZONE = 189
+ TIRE_EXERCISE_NAME = 190
+ TISSUE_MODEL_TYPE = 191
+ TONE = 192
+ TOTAL_BODY_EXERCISE_NAME = 193
+ TRICEPS_EXTENSION_EXERCISE_NAME = 194
+ TURN_TYPE = 195
+ UIAA_GRADING_SCALE = 196
+ USER_LOCAL_ID = 197
+ VERMIN_GRADING_SCALE = 198
+ WARM_UP_EXERCISE_NAME = 199
+ WATCHFACE_MODE = 200
+ WATER_TYPE = 201
+ WEATHER_REPORT = 202
+ WEATHER_SEVERE_TYPE = 203
+ WEATHER_SEVERITY = 204
+ WEATHER_STATUS = 205
+ WEIGHT = 206
+ WORKOUT_CAPABILITIES = 207
+ WORKOUT_EQUIPMENT = 208
+ WORKOUT_HR = 209
+ WORKOUT_POWER = 210
+ WORKOUT_STEP_DURATION = 211
+ WORKOUT_STEP_TARGET = 212
+ YDS_GRADING_SCALE = 213
@@ -273,6 +288,7 @@ class MesgNum(Enum):
ANT_CHANNEL_ID = 82
LENGTH = 101
MONITORING_INFO = 103
+ BATTERY = 104
PAD = 105
SLAVE_DEVICE = 106
CONNECTIVITY = 127
@@ -1510,6 +1526,9 @@ class Manufacturer(Enum):
GOTOES = 349
CADENCE_APP = 350
UNA_WATCH = 351
+ TYMEWEAR = 352
+ EXPOSURE_LIGHTS = 353
+ FORTO_CYCLING = 354
ACTIGRAPHCORP = 5759
@@ -1980,12 +1999,22 @@ class GarminProduct(Enum):
FR170_MUSIC = 4814
FR170 = 4815
APPROACH_J1 = 4825
+ APPROACH_S72_43MM = 4874
+ APPROACH_S72_47MM = 4875
D2_MACH2 = 4879
FR70_2026 = 4916
+ FENIX9_PRO_43MM = 4952
+ FENIX9_PRO_47MM = 4953
+ FENIX9_PRO_51MM = 4954
+ FENIX9_PRO_SOLAR_47MM = 4955
+ FENIX9_PRO_SOLAR_51MM = 4956
+ FENIX9_43MM = 5133
+ FENIX9 = 5134
INSTINCT_CROSSOVER_AMOLED = 4678
D2_AIR_X15 = 4944
CIRQA_SMART_BAND = 5019
D2_MACH2_PRO = 5056
+ ENDURO4 = 5169
SDM4 = 10007
EDGE_REMOTE = 10014
TACX_TRAINING_APP_WIN = 20533
@@ -1995,6 +2024,11 @@ class GarminProduct(Enum):
TACX_TRAINING_APP_ANDROID = 30045
TACX_TRAINING_APP_IOS = 30046
TACX_TRAINING_APP_LEGACY = 30047
+ TRAINING_PEAKS_VIRTUAL_IOS = 30059
+ TRAINING_PEAKS_VIRTUAL_ANDROID = 30060
+ TRAINING_PEAKS_VIRTUAL_WINDOWS = 30061
+ TRAINING_PEAKS_VIRTUAL_MAC_OS = 30062
+ TRAINING_PEAKS_VIRTUAL_APPLE_TV = 30063
CONNECTIQ_SIMULATOR = 65531
ANDROID_ANTPLUS_PLUGIN = 65532
CONNECT = 65534
@@ -5117,6 +5151,367 @@ class GasConsumptionRateType(Enum):
RMV = 2
+class ClimbGradingScale(Enum):
+ YDS = 0
+ UIAA = 1
+ FRENCH = 2
+ BRITISH_ADJECTIVAL = 3
+ BRITISH_TECHNICAL = 4
+ EWBANK = 5
+ BRAZILIAN = 6
+ SAXON = 7
+ VERMIN = 8
+ FONT = 9
+ DANKYU = 10
+ YDS_PM = 11
+
+
+class YdsGradingScale(Enum):
+ N5_1 = 0
+ N5_2 = 1
+ N5_3 = 2
+ N5_4 = 3
+ N5_5 = 4
+ N5_6 = 5
+ N5_7 = 6
+ N5_8 = 7
+ N5_9 = 8
+ N5_10 = 9
+ N5_10A = 10
+ N5_10B = 11
+ N5_10C = 12
+ N5_10D = 13
+ N5_11 = 14
+ N5_11A = 15
+ N5_11B = 16
+ N5_11C = 17
+ N5_11D = 18
+ N5_12 = 19
+ N5_12A = 20
+ N5_12B = 21
+ N5_12C = 22
+ N5_12D = 23
+ N5_13 = 24
+ N5_13A = 25
+ N5_13B = 26
+ N5_13C = 27
+ N5_13D = 28
+ N5_14 = 29
+ N5_14A = 30
+ N5_14B = 31
+ N5_14C = 32
+ N5_14D = 33
+ N5_15 = 34
+ N5_15A = 35
+ N5_15B = 36
+ N5_15C = 37
+ N5_15D = 38
+ N5_1_MINUS = 39
+ N5_1_PLUS = 40
+ N5_2_MINUS = 41
+ N5_2_PLUS = 42
+ N5_3_MINUS = 43
+ N5_3_PLUS = 44
+ N5_4_MINUS = 45
+ N5_4_PLUS = 46
+ N5_5_MINUS = 47
+ N5_5_PLUS = 48
+ N5_6_MINUS = 49
+ N5_6_PLUS = 50
+ N5_7_MINUS = 51
+ N5_7_PLUS = 52
+ N5_8_MINUS = 53
+ N5_8_PLUS = 54
+ N5_9_MINUS = 55
+ N5_9_PLUS = 56
+ N5_10_MINUS = 57
+ N5_10_PLUS = 58
+ N5_11_MINUS = 59
+ N5_11_PLUS = 60
+ N5_12_MINUS = 61
+ N5_12_PLUS = 62
+ N5_13_MINUS = 63
+ N5_13_PLUS = 64
+ N5_14_MINUS = 65
+ N5_14_PLUS = 66
+ N5_15_MINUS = 67
+ N5_15_PLUS = 68
+
+
+class UiaaGradingScale(Enum):
+ I = 0
+ II = 1
+ III = 2
+ IV_MINUS = 3
+ IV = 4
+ IV_PLUS = 5
+ V_MINUS = 6
+ V = 7
+ V_PLUS = 8
+ VI_MINUS = 9
+ VI = 10
+ VI_PLUS = 11
+ VII_MINUS = 12
+ VII = 13
+ VII_PLUS = 14
+ VIII_MINUS = 15
+ VIII = 16
+ VIII_PLUS = 17
+ IX_MINUS = 18
+ IX = 19
+ IX_PLUS = 20
+ X_MINUS = 21
+ X = 22
+ X_PLUS = 23
+ XI_MINUS = 24
+ XI = 25
+ XI_PLUS = 26
+ XII_MINUS = 27
+
+
+class FrenchGradingScale(Enum):
+ N1 = 0
+ N2 = 1
+ N3 = 2
+ N4A = 3
+ N4B = 4
+ N4C = 5
+ N5A = 6
+ N5B = 7
+ N5C = 8
+ N6A = 9
+ N6A_PLUS = 10
+ N6B = 11
+ N6B_PLUS = 12
+ N6C = 13
+ N6C_PLUS = 14
+ N7A = 15
+ N7A_PLUS = 16
+ N7B = 17
+ N7B_PLUS = 18
+ N7C = 19
+ N7C_PLUS = 20
+ N8A = 21
+ N8A_PLUS = 22
+ N8B = 23
+ N8B_PLUS = 24
+ N8C = 25
+ N8C_PLUS = 26
+ N9A = 27
+ N9A_PLUS = 28
+ N9B = 29
+
+
+class BritishAdjectivalGradingScale(Enum):
+ M = 0
+ D = 1
+ HD = 2
+ VD = 3
+ MS = 4
+ S = 5
+ HS = 6
+ MVS = 7
+ VS = 8
+ HVS = 9
+ E1 = 10
+ E2 = 11
+ E3 = 12
+ E4 = 13
+ E5 = 14
+ E6 = 15
+ E7 = 16
+ E8 = 17
+ E9 = 18
+ E10 = 19
+ E11 = 20
+
+
+class BritishTechnicalGradingScale(Enum):
+ N1 = 0
+ N2 = 1
+ N3 = 2
+ N4A = 3
+ N4B = 4
+ N4C = 5
+ N5A = 6
+ N5B = 7
+ N5C = 8
+ N6A = 9
+ N6B = 10
+ N6C = 11
+ N7A = 12
+ N7B = 13
+ N7C = 14
+
+
+class EwbankGradingScale(Enum):
+ N4 = 0
+ N5 = 1
+ N6 = 2
+ N7 = 3
+ N8 = 4
+ N9 = 5
+ N10 = 6
+ N11 = 7
+ N12 = 8
+ N13 = 9
+ N14 = 10
+ N15 = 11
+ N16 = 12
+ N17 = 13
+ N18 = 14
+ N19 = 15
+ N20 = 16
+ N21 = 17
+ N22 = 18
+ N23 = 19
+ N24 = 20
+ N25 = 21
+ N26 = 22
+ N27 = 23
+ N28 = 24
+ N29 = 25
+ N30 = 26
+ N31 = 27
+ N32 = 28
+ N33 = 29
+ N34 = 30
+ N35 = 31
+ N36 = 32
+ N37 = 33
+ N38 = 34
+
+
+class BrazilianGradingScale(Enum):
+ N2 = 0
+ N3 = 1
+ N3C = 2
+ N4 = 3
+ N5A = 4
+ N5B = 5
+ N5C = 6
+ N6A = 7
+ N6B = 8
+ N6C = 9
+ N7A = 10
+ N7B = 11
+ N7C = 12
+ N8A = 13
+ N8B = 14
+ N8C = 15
+ N9A = 16
+ N9B = 17
+ N9C = 18
+ N10A = 19
+ N10B = 20
+ N10C = 21
+ N11A = 22
+ N11B = 23
+ N11C = 24
+ N12A = 25
+ N12B = 26
+
+
+class SaxonGradingScale(Enum):
+ I = 0
+ II = 1
+ III = 2
+ IV = 3
+ V = 4
+ VI = 5
+ VII_A = 6
+ VII_B = 7
+ VII_C = 8
+ VIII_A = 9
+ VIII_B = 10
+ VIII_C = 11
+ IX_A = 12
+ IX_B = 13
+ IX_C = 14
+ X_A = 15
+ X_B = 16
+ X_C = 17
+ XI_A = 18
+ XI_B = 19
+ XI_C = 20
+ XII_A = 21
+ XII_B = 22
+ XII_C = 23
+
+
+class VerminGradingScale(Enum):
+ VB = 0
+ V0 = 1
+ V1 = 2
+ V2 = 3
+ V3 = 4
+ V4 = 5
+ V5 = 6
+ V6 = 7
+ V7 = 8
+ V8 = 9
+ V9 = 10
+ V10 = 11
+ V11 = 12
+ V12 = 13
+ V13 = 14
+ V14 = 15
+ V15 = 16
+ V16 = 17
+ V17 = 18
+
+
+class FontGradingScale(Enum):
+ N1 = 0
+ N2 = 1
+ N3 = 2
+ N4 = 3
+ N4_PLUS = 4
+ N5 = 5
+ N5_PLUS = 6
+ N6A = 7
+ N6A_PLUS = 8
+ N6B = 9
+ N6B_PLUS = 10
+ N6C = 11
+ N6C_PLUS = 12
+ N7A = 13
+ N7A_PLUS = 14
+ N7B = 15
+ N7B_PLUS = 16
+ N7C = 17
+ N7C_PLUS = 18
+ N8A = 19
+ N8A_PLUS = 20
+ N8B = 21
+ N8B_PLUS = 22
+ N8C = 23
+ N8C_PLUS = 24
+ N9A = 25
+
+
+class DankyuGradingScale(Enum):
+ N7_KYUU = 0
+ N6_KYUU = 1
+ N5_KYUU = 2
+ N4_KYUU = 3
+ N3_KYUU = 4
+ N2_KYUU = 5
+ N1_KYUU = 6
+ N1_DAN = 7
+ N2_DAN = 8
+ N3_DAN = 9
+ N4_DAN = 10
+ N5_DAN = 11
+
+
+class SplitStatus(Enum):
+ FAILURE = 0
+ SUCCESS = 1
+ CLIMB_ATTEMPTED = 2
+ CLIMB_COMPLETED = 3
+
+
class TapSensitivity(Enum):
HIGH = 0
MEDIUM = 1
@@ -5186,3 +5581,23 @@ class HrvStatus(Enum):
class NoFlyTimeMode(Enum):
STANDARD = 0
FLAT_24_HOURS = 1
+
+
+class DiveSectionType(Enum):
+ ASCENT = 0
+ DESCENT = 1
+ HANG = 2
+
+
+class ApneaDiscipline(Enum):
+ CONSTANT_WEIGHT_WITH_FINS = 0
+ CONSTANT_WEIGHT_WITH_BIFINS = 1
+ CONSTANT_WEIGHT_WITHOUT_FINS = 2
+ DYNAMIC_WITH_FINS = 3
+ DYNAMIC_WITH_BIFINS = 4
+ DYNAMIC_WITHOUT_FINS = 5
+ FREE_IMMERSION = 6
+ NO_LIMIT = 7
+ SPEED_ENDURANCE_APNEA = 8
+ STATIC_APNEA = 9
+ VARIABLE_WEIGHT = 10
diff --git a/fit_tool/tests/data/README.md b/fit_tool/tests/data/README.md
index 1a72371..a3332b1 100644
--- a/fit_tool/tests/data/README.md
+++ b/fit_tool/tests/data/README.md
@@ -23,7 +23,7 @@ Garmin publishes sample FIT files and tools under their FIT SDK license.
- Site:
- Also: and language SDKs such as
(tag must match
- `fit_tool.SDK_VERSION`, currently Profile **21.213.0**).
+ `fit_tool.SDK_VERSION`, currently Profile **21.218.0**).
2. **What you may commit**
- Only small, redistributable SDK examples that Garmin ships as samples.
- Do **not** commit proprietary device dumps, Connect exports with PII, or
@@ -33,7 +33,7 @@ Garmin publishes sample FIT files and tools under their FIT SDK license.
- This repository already vendors a minimal subset under `sdk/` for CI; do
not bulk-replace it with a full SDK tree.
4. **Profile spreadsheet**
- - Bundled at `fit_tool/gen/Profile_21.213.0.xlsx` for codegen only; not a
+ - Bundled at `fit_tool/gen/Profile_21.218.0.xlsx` for codegen only; not a
runtime fixture.
## Live interop (optional)
diff --git a/fit_tool/tests/test_fit_file_header.py b/fit_tool/tests/test_fit_file_header.py
index 9b05964..a567aca 100755
--- a/fit_tool/tests/test_fit_file_header.py
+++ b/fit_tool/tests/test_fit_file_header.py
@@ -47,7 +47,7 @@ def test_profile_versions_after_scale_transition_use_current_scale(self):
def test_default_profile_version_matches_sdk_version(self):
header = FitFileHeader(records_size=0)
- self.assertEqual('21.213', str(header.profile_version))
+ self.assertEqual('21.218', str(header.profile_version))
def test_generate_crc(self):
protocol_version = ProtocolVersion(2, 3)
diff --git a/fit_tool/tests/test_garmin_sdk_interop.py b/fit_tool/tests/test_garmin_sdk_interop.py
index 2e85709..9050033 100644
--- a/fit_tool/tests/test_garmin_sdk_interop.py
+++ b/fit_tool/tests/test_garmin_sdk_interop.py
@@ -220,7 +220,7 @@ def test_builder_declares_the_generated_profile_version(self):
builder.add(message)
fit_file = FitFile.from_bytes(builder.build_bytes())
- self.assertEqual('21.213', str(fit_file.header.profile_version))
+ self.assertEqual('21.218', str(fit_file.header.profile_version))
@unittest.skipUnless(
diff --git a/fit_tool/tests/test_profile_scope.py b/fit_tool/tests/test_profile_scope.py
index 39ce93a..178b6ba 100644
--- a/fit_tool/tests/test_profile_scope.py
+++ b/fit_tool/tests/test_profile_scope.py
@@ -84,10 +84,10 @@ def test_catalog_matches_sdk_version_and_counts(self):
from fit_tool import SDK_VERSION
self.assertEqual(PROFILE_SDK_VERSION, SDK_VERSION)
- self.assertEqual(PROFILE_MESSAGE_COUNT, 123)
- self.assertEqual(PROFILE_FIELD_COUNT, 1407)
- self.assertEqual(PROFILE_ENUM_TYPE_COUNT, 100)
- self.assertEqual(PROFILE_ENUM_FIELD_COUNT, 153)
+ self.assertEqual(PROFILE_MESSAGE_COUNT, 124)
+ self.assertEqual(PROFILE_FIELD_COUNT, 1566)
+ self.assertEqual(PROFILE_ENUM_TYPE_COUNT, 115)
+ self.assertEqual(PROFILE_ENUM_FIELD_COUNT, 164)
self.assertEqual(len(PROFILE_FIELDS), PROFILE_FIELD_COUNT)
def test_file_id_type_in_catalog(self):
diff --git a/fit_tool/tests/test_public_api.py b/fit_tool/tests/test_public_api.py
index ace1bbd..8eecc62 100644
--- a/fit_tool/tests/test_public_api.py
+++ b/fit_tool/tests/test_public_api.py
@@ -31,7 +31,7 @@ def test_core_symbols_importable_from_package_root(self) -> None:
validate_fit_file,
)
- self.assertEqual(SDK_VERSION, '21.213.0')
+ self.assertEqual(SDK_VERSION, '21.218.0')
self.assertEqual(PROTOCOL_VERSION, '2.4')
self.assertEqual(FIT_DATA_TYPE, b'.FIT')
self.assertTrue(issubclass(FitCRCError, FitParseError))
diff --git a/news/65.dep b/news/65.dep
deleted file mode 100644
index 0cc6e0f..0000000
--- a/news/65.dep
+++ /dev/null
@@ -1 +0,0 @@
-Upgrade the bundled Garmin FIT SDK Profile to 21.213.0.
diff --git a/news/68.dep b/news/68.dep
new file mode 100644
index 0000000..90cfe3d
--- /dev/null
+++ b/news/68.dep
@@ -0,0 +1 @@
+Upgrade the bundled Garmin FIT SDK Profile to 21.218.0.