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.