Coverage for src / bluetooth_sig / gatt / services / user_data.py: 100%
6 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +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.DATABASE_CHANGE_INCREMENT: True,
58 CharacteristicName.USER_INDEX: True,
59 CharacteristicName.USER_CONTROL_POINT: True,
60 CharacteristicName.REGISTERED_USER: False,
61 # UDS permitted characteristics (at least one required if service is present)
62 CharacteristicName.FIRST_NAME: False,
63 CharacteristicName.LAST_NAME: False,
64 CharacteristicName.EMAIL_ADDRESS: False,
65 CharacteristicName.AGE: False,
66 CharacteristicName.DATE_OF_BIRTH: False,
67 CharacteristicName.GENDER: False,
68 CharacteristicName.WEIGHT: False,
69 CharacteristicName.HEIGHT: False,
70 CharacteristicName.VO2_MAX: False,
71 CharacteristicName.HEART_RATE_MAX: False,
72 CharacteristicName.RESTING_HEART_RATE: False,
73 CharacteristicName.MAXIMUM_RECOMMENDED_HEART_RATE: False,
74 CharacteristicName.AEROBIC_THRESHOLD: False,
75 CharacteristicName.ANAEROBIC_THRESHOLD: False,
76 CharacteristicName.SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS: False,
77 CharacteristicName.DATE_OF_THRESHOLD_ASSESSMENT: False,
78 CharacteristicName.WAIST_CIRCUMFERENCE: False,
79 CharacteristicName.HIP_CIRCUMFERENCE: False,
80 CharacteristicName.FAT_BURN_HEART_RATE_LOWER_LIMIT: False,
81 CharacteristicName.FAT_BURN_HEART_RATE_UPPER_LIMIT: False,
82 CharacteristicName.AEROBIC_HEART_RATE_LOWER_LIMIT: False,
83 CharacteristicName.AEROBIC_HEART_RATE_UPPER_LIMIT: False,
84 CharacteristicName.ANAEROBIC_HEART_RATE_LOWER_LIMIT: False,
85 CharacteristicName.ANAEROBIC_HEART_RATE_UPPER_LIMIT: False,
86 CharacteristicName.TWO_ZONE_HEART_RATE_LIMITS: False,
87 CharacteristicName.THREE_ZONE_HEART_RATE_LIMITS: False,
88 CharacteristicName.FOUR_ZONE_HEART_RATE_LIMITS: False,
89 CharacteristicName.FIVE_ZONE_HEART_RATE_LIMITS: False,
90 CharacteristicName.HIGH_INTENSITY_EXERCISE_THRESHOLD: False,
91 CharacteristicName.ACTIVITY_GOAL: False,
92 CharacteristicName.SEDENTARY_INTERVAL_NOTIFICATION: False,
93 CharacteristicName.CALORIC_INTAKE: False,
94 CharacteristicName.STRIDE_LENGTH: False,
95 CharacteristicName.PREFERRED_UNITS: False,
96 CharacteristicName.LANGUAGE: False,
97 CharacteristicName.HANDEDNESS: False,
98 CharacteristicName.DEVICE_WEARING_POSITION: False,
99 CharacteristicName.MIDDLE_NAME: False,
100 CharacteristicName.HIGH_RESOLUTION_HEIGHT: False,
101 }