From 3dd48341a5661858ec6fde045ed0d09bb7f500cb Mon Sep 17 00:00:00 2001 From: shaonianche <16186646+shaonianche@users.noreply.github.com> Date: Wed, 28 Oct 2026 11:26:40 +0800 Subject: [PATCH] chore: upgrade garmin fit sdk profile version 21.218.0 Replace the bundled Garmin Profile spreadsheet with 21.218.0 from garmin/fit-sdk-tools, bump SDK_VERSION, and regenerate typed profile code. The profile delta adds the battery message (global id 104), 157 new fields across session, lap, length, segment_lap, barometer_data, split, and split_summary, 15 new types, and 19 new enum values (fenix9 family, Approach S72, new manufacturers). Catalog counts move to 124 messages / 1566 fields / 115 enum types; the change is purely additive. Update hardcoded profile version and count snapshots in tests, and drop the superseded 21.213.0 news fragment, which never shipped. Closes #68 Amp-Thread-ID: https://ampcode.com/threads/T-01a1807e-ff92-7664-9b45-5f950bfc7564 Co-authored-by: Amp --- README.md | 2 +- docs/CAPABILITY_BOUNDARY.md | 4 +- docs/EPIC_SHA12_RELEASE_NOTES.md | 2 +- docs/FIT_CONFORMANCE_DESIGN.md | 6 +- fit_tool/__init__.py | 2 +- fit_tool/gen/Profile_21.213.0.xlsx | Bin 251090 -> 0 bytes fit_tool/gen/Profile_21.218.0.xlsx | Bin 0 -> 274501 bytes fit_tool/profile/component_registry.py | 2 +- fit_tool/profile/field_catalog.py | 186 +- .../messages/aad_accel_features_message.py | 2 +- .../messages/accelerometer_data_message.py | 2 +- fit_tool/profile/messages/activity_message.py | 2 +- .../messages/ant_channel_id_message.py | 2 +- fit_tool/profile/messages/ant_rx_message.py | 2 +- fit_tool/profile/messages/ant_tx_message.py | 2 +- .../messages/aviation_attitude_message.py | 2 +- .../messages/barometer_data_message.py | 50 +- fit_tool/profile/messages/battery_message.py | 169 + .../messages/beat_intervals_message.py | 2 +- .../profile/messages/bike_profile_message.py | 2 +- .../messages/blood_pressure_message.py | 2 +- .../profile/messages/cadence_zone_message.py | 2 +- .../profile/messages/camera_event_message.py | 2 +- .../profile/messages/capabilities_message.py | 2 +- .../messages/chrono_shot_data_message.py | 2 +- .../messages/chrono_shot_session_message.py | 2 +- .../profile/messages/climb_pro_message.py | 2 +- fit_tool/profile/messages/common_fields.py | 2 +- .../profile/messages/connectivity_message.py | 2 +- fit_tool/profile/messages/course_message.py | 2 +- .../profile/messages/course_point_message.py | 2 +- .../messages/developer_data_id_message.py | 2 +- .../device_aux_battery_info_message.py | 2 +- .../profile/messages/device_info_message.py | 2 +- .../messages/device_settings_message.py | 2 +- .../profile/messages/dive_alarm_message.py | 2 +- .../messages/dive_apnea_alarm_message.py | 2 +- fit_tool/profile/messages/dive_gas_message.py | 2 +- .../profile/messages/dive_settings_message.py | 2 +- .../profile/messages/dive_summary_message.py | 2 +- fit_tool/profile/messages/event_message.py | 2 +- .../exd_data_concept_configuration_message.py | 2 +- .../exd_data_field_configuration_message.py | 2 +- .../exd_screen_configuration_message.py | 2 +- .../messages/exercise_title_message.py | 2 +- .../messages/field_capabilities_message.py | 2 +- .../messages/field_description_message.py | 2 +- .../messages/file_capabilities_message.py | 2 +- .../profile/messages/file_creator_message.py | 2 +- fit_tool/profile/messages/file_id_message.py | 2 +- fit_tool/profile/messages/goal_message.py | 2 +- .../profile/messages/gps_metadata_message.py | 2 +- .../messages/gyroscope_data_message.py | 2 +- fit_tool/profile/messages/hr_message.py | 2 +- fit_tool/profile/messages/hr_zone_message.py | 2 +- .../profile/messages/hrm_profile_message.py | 2 +- fit_tool/profile/messages/hrv_message.py | 2 +- .../messages/hrv_status_summary_message.py | 2 +- .../profile/messages/hrv_value_message.py | 2 +- .../hsa_accelerometer_data_message.py | 2 +- .../messages/hsa_body_battery_data_message.py | 2 +- .../hsa_configuration_data_message.py | 2 +- .../profile/messages/hsa_event_message.py | 2 +- .../messages/hsa_gyroscope_data_message.py | 2 +- .../messages/hsa_heart_rate_data_message.py | 2 +- .../messages/hsa_respiration_data_message.py | 2 +- .../profile/messages/hsa_spo2_data_message.py | 2 +- .../profile/messages/hsa_step_data_message.py | 2 +- .../messages/hsa_stress_data_message.py | 2 +- .../hsa_wrist_temperature_data_message.py | 2 +- fit_tool/profile/messages/jump_message.py | 2 +- fit_tool/profile/messages/lap_message.py | 753 ++- fit_tool/profile/messages/length_message.py | 52 +- .../messages/magnetometer_data_message.py | 2 +- .../profile/messages/max_met_data_message.py | 2 +- .../profile/messages/memo_glob_message.py | 2 +- .../messages/mesg_capabilities_message.py | 2 +- fit_tool/profile/messages/message_factory.py | 3 +- fit_tool/profile/messages/met_zone_message.py | 2 +- .../messages/monitoring_hr_data_message.py | 2 +- .../messages/monitoring_info_message.py | 2 +- .../profile/messages/monitoring_message.py | 2 +- .../profile/messages/nap_event_message.py | 2 +- .../profile/messages/nmea_sentence_message.py | 2 +- .../profile/messages/obdii_data_message.py | 2 +- .../profile/messages/ohr_settings_message.py | 2 +- .../one_d_sensor_calibration_message.py | 2 +- .../profile/messages/power_zone_message.py | 2 +- fit_tool/profile/messages/raw_bbi_message.py | 2 +- fit_tool/profile/messages/record_message.py | 2 +- .../messages/respiration_rate_message.py | 2 +- fit_tool/profile/messages/schedule_message.py | 2 +- .../profile/messages/sdm_profile_message.py | 2 +- .../profile/messages/segment_file_message.py | 2 +- .../profile/messages/segment_id_message.py | 2 +- .../profile/messages/segment_lap_message.py | 52 +- .../segment_leaderboard_entry_message.py | 2 +- .../profile/messages/segment_point_message.py | 2 +- fit_tool/profile/messages/session_message.py | 490 +- fit_tool/profile/messages/set_message.py | 2 +- .../messages/skin_temp_overnight_message.py | 2 +- .../profile/messages/slave_device_message.py | 2 +- .../messages/sleep_assessment_message.py | 2 +- ...p_disruption_overnight_severity_message.py | 2 +- ...leep_disruption_severity_period_message.py | 2 +- .../profile/messages/sleep_level_message.py | 2 +- fit_tool/profile/messages/software_message.py | 2 +- .../profile/messages/speed_zone_message.py | 2 +- fit_tool/profile/messages/split_message.py | 5347 ++++++++++++++++- .../profile/messages/split_summary_message.py | 3905 +++++++++++- .../profile/messages/spo2_data_message.py | 2 +- fit_tool/profile/messages/sport_message.py | 2 +- .../profile/messages/stress_level_message.py | 2 +- .../profile/messages/tank_summary_message.py | 2 +- .../profile/messages/tank_update_message.py | 2 +- .../three_d_sensor_calibration_message.py | 2 +- .../profile/messages/time_in_zone_message.py | 2 +- .../messages/timestamp_correlation_message.py | 2 +- fit_tool/profile/messages/totals_message.py | 2 +- .../profile/messages/training_file_message.py | 2 +- .../messages/training_settings_message.py | 2 +- .../profile/messages/user_profile_message.py | 2 +- .../profile/messages/video_clip_message.py | 2 +- .../messages/video_description_message.py | 2 +- .../profile/messages/video_frame_message.py | 2 +- fit_tool/profile/messages/video_message.py | 2 +- .../profile/messages/video_title_message.py | 2 +- .../messages/watchface_settings_message.py | 2 +- .../profile/messages/weather_alert_message.py | 2 +- .../messages/weather_conditions_message.py | 2 +- .../profile/messages/weight_scale_message.py | 2 +- fit_tool/profile/messages/workout_message.py | 2 +- .../messages/workout_session_message.py | 2 +- .../profile/messages/workout_step_message.py | 2 +- .../profile/messages/zones_target_message.py | 2 +- fit_tool/profile/profile_type.py | 797 ++- fit_tool/tests/data/README.md | 4 +- fit_tool/tests/test_fit_file_header.py | 2 +- fit_tool/tests/test_garmin_sdk_interop.py | 2 +- fit_tool/tests/test_profile_scope.py | 8 +- fit_tool/tests/test_public_api.py | 2 +- news/65.dep | 1 - news/68.dep | 1 + 143 files changed, 11292 insertions(+), 784 deletions(-) delete mode 100644 fit_tool/gen/Profile_21.213.0.xlsx create mode 100644 fit_tool/gen/Profile_21.218.0.xlsx create mode 100644 fit_tool/profile/messages/battery_message.py delete mode 100644 news/65.dep create mode 100644 news/68.dep 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 dd579cc5dbec117d80abd6debcd4ff0843781da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251090 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 G0{K5F?9O8V 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 0000000000000000000000000000000000000000..63c131053f9a2c0a38d6e228f7d0ebf717c824b2 GIT binary patch literal 274501 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

*pa! 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≈w@JS{v`@PB+Nt(pZhqF##b`bhd4V^Jp5qbyE6 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�ay7H0}t?lrAgB33Xpf0J?#6Bc}#L!+ae2x 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 z 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 JF5-e${|7sa*_QwS literal 0 HcmV?d00001 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.