Coverage for src / bluetooth_sig / gatt / services / user_data.py: 100%
6 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""User Data Service implementation."""
3from __future__ import annotations
5from typing import ClassVar
7from ..characteristics.registry import CharacteristicName
8from .base import BaseGattService
11class UserDataService(BaseGattService):
12 """User Data Service implementation.
14 Contains characteristics related to user profile and fitness data:
15 - First Name - Optional
16 - Last Name - Optional
17 - Email Address - Optional
18 - Age - Optional
19 - Date of Birth - Optional
20 - Gender - Optional
21 - Weight - Optional
22 - Height - Optional
23 - VO2 Max - Optional
24 - Heart Rate Max - Optional
25 - Resting Heart Rate - Optional
26 - Maximum Recommended Heart Rate - Optional
27 - Aerobic Threshold - Optional
28 - Anaerobic Threshold - Optional
29 - Sport Type for Aerobic and Anaerobic Thresholds - Optional
30 - Date of Threshold Assessment - Optional
31 - Waist Circumference - Optional
32 - Hip Circumference - Optional
33 - Fat Burn Heart Rate Lower Limit - Optional
34 - Fat Burn Heart Rate Upper Limit - Optional
35 - Aerobic Heart Rate Lower Limit - Optional
36 - Aerobic Heart Rate Upper Limit - Optional
37 - Anaerobic Heart Rate Lower Limit - Optional
38 - Anaerobic Heart Rate Upper Limit - Optional
39 - Two Zone Heart Rate Limits - Optional
40 - Three Zone Heart Rate Limits - Optional
41 - Four Zone Heart Rate Limits - Optional
42 - Five Zone Heart Rate Limits - Optional
43 - High Intensity Exercise Threshold - Optional
44 - Activity Goal - Optional
45 - Sedentary Interval Notification - Optional
46 - Caloric Intake - Optional
47 - Stride Length - Optional
48 - Preferred Units - Optional
49 - Language - Optional
50 - Handedness - Optional
51 - Device Wearing Position - Optional
52 - Middle Name - Optional
53 - High Resolution Height - Optional
54 """
56 service_characteristics: ClassVar[dict[CharacteristicName, bool]] = {
57 CharacteristicName.FIRST_NAME: False, # optional
58 CharacteristicName.LAST_NAME: False, # optional
59 CharacteristicName.EMAIL_ADDRESS: False, # optional
60 CharacteristicName.AGE: False, # optional
61 CharacteristicName.DATE_OF_BIRTH: False, # optional
62 CharacteristicName.GENDER: False, # optional
63 CharacteristicName.WEIGHT: False, # optional
64 CharacteristicName.HEIGHT: False, # optional
65 CharacteristicName.VO2_MAX: False, # optional
66 CharacteristicName.HEART_RATE_MAX: False, # optional
67 CharacteristicName.RESTING_HEART_RATE: False, # optional
68 CharacteristicName.MAXIMUM_RECOMMENDED_HEART_RATE: False, # optional
69 CharacteristicName.AEROBIC_THRESHOLD: False, # optional
70 CharacteristicName.ANAEROBIC_THRESHOLD: False, # optional
71 CharacteristicName.SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS: False, # optional
72 CharacteristicName.DATE_OF_THRESHOLD_ASSESSMENT: False, # optional
73 CharacteristicName.WAIST_CIRCUMFERENCE: False, # optional
74 CharacteristicName.HIP_CIRCUMFERENCE: False, # optional
75 CharacteristicName.FAT_BURN_HEART_RATE_LOWER_LIMIT: False, # optional
76 CharacteristicName.FAT_BURN_HEART_RATE_UPPER_LIMIT: False, # optional
77 CharacteristicName.AEROBIC_HEART_RATE_LOWER_LIMIT: False, # optional
78 CharacteristicName.AEROBIC_HEART_RATE_UPPER_LIMIT: False, # optional
79 CharacteristicName.ANAEROBIC_HEART_RATE_LOWER_LIMIT: False, # optional
80 CharacteristicName.ANAEROBIC_HEART_RATE_UPPER_LIMIT: False, # optional
81 CharacteristicName.TWO_ZONE_HEART_RATE_LIMITS: False, # optional
82 CharacteristicName.THREE_ZONE_HEART_RATE_LIMITS: False, # optional
83 CharacteristicName.FOUR_ZONE_HEART_RATE_LIMITS: False, # optional
84 CharacteristicName.FIVE_ZONE_HEART_RATE_LIMITS: False, # optional
85 CharacteristicName.HIGH_INTENSITY_EXERCISE_THRESHOLD: False, # optional
86 CharacteristicName.ACTIVITY_GOAL: False, # optional
87 CharacteristicName.SEDENTARY_INTERVAL_NOTIFICATION: False, # optional
88 CharacteristicName.CALORIC_INTAKE: False, # optional
89 CharacteristicName.STRIDE_LENGTH: False, # optional
90 CharacteristicName.PREFERRED_UNITS: False, # optional
91 CharacteristicName.LANGUAGE: False, # optional
92 CharacteristicName.HANDEDNESS: False, # optional
93 CharacteristicName.DEVICE_WEARING_POSITION: False, # optional
94 CharacteristicName.MIDDLE_NAME: False, # optional
95 CharacteristicName.HIGH_RESOLUTION_HEIGHT: False, # optional
96 }