ts-watches 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +358 -0
- package/dist/analysis/index.d.ts +5 -0
- package/dist/analysis/personal-records.d.ts +58 -0
- package/dist/analysis/race-predictor.d.ts +53 -0
- package/dist/analysis/running-dynamics.d.ts +66 -0
- package/dist/analysis/training-load.d.ts +40 -0
- package/dist/analysis/zones.d.ts +69 -0
- package/dist/bin/cli.js +52 -0
- package/dist/chunk-gsgt8r0z.js +2 -0
- package/dist/cloud/garmin-activity-api.d.ts +129 -0
- package/dist/cloud/garmin-connect.d.ts +67 -0
- package/dist/cloud/index.d.ts +4 -0
- package/dist/cloud/strava.d.ts +88 -0
- package/dist/cloud/trainingpeaks.d.ts +48 -0
- package/dist/config.d.ts +4 -0
- package/dist/drivers/apple.d.ts +17 -0
- package/dist/drivers/coros.d.ts +13 -0
- package/dist/drivers/garmin.d.ts +12 -0
- package/dist/drivers/index.d.ts +6 -0
- package/dist/drivers/polar.d.ts +14 -0
- package/dist/drivers/suunto.d.ts +13 -0
- package/dist/drivers/wahoo.d.ts +13 -0
- package/dist/export/csv.d.ts +15 -0
- package/dist/export/geojson.d.ts +23 -0
- package/dist/export/gpx.d.ts +10 -0
- package/dist/export/index.d.ts +4 -0
- package/dist/export/tcx.d.ts +10 -0
- package/dist/fit/constants.d.ts +606 -0
- package/dist/fit/decoder.d.ts +16 -0
- package/dist/fit/index.d.ts +3 -0
- package/dist/fit/parser.d.ts +21 -0
- package/dist/index.d.ts +40 -0
- package/dist/realtime/ant-plus.d.ts +201 -0
- package/dist/realtime/bluetooth.d.ts +153 -0
- package/dist/realtime/index.d.ts +3 -0
- package/dist/realtime/live-tracking.d.ts +70 -0
- package/dist/src/index.js +324 -0
- package/dist/types.d.ts +307 -0
- package/dist/workouts/builder.d.ts +184 -0
- package/dist/workouts/course.d.ts +74 -0
- package/dist/workouts/index.d.ts +3 -0
- package/dist/workouts/training-plan.d.ts +77 -0
- package/package.json +92 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FitFileHeader } from '../types';
|
|
2
|
+
// Utility functions for converting FIT values
|
|
3
|
+
export declare function fitTimestampToDate(timestamp: number): Date;
|
|
4
|
+
export declare function semicirclesToDegrees(semicircles: number): number;
|
|
5
|
+
export declare function degreesToSemicircles(degrees: number): number;
|
|
6
|
+
export declare interface FitMessage {
|
|
7
|
+
globalMsgNum: number
|
|
8
|
+
fields: Record<number, unknown>
|
|
9
|
+
}
|
|
10
|
+
export declare interface FitParseResult {
|
|
11
|
+
header: FitFileHeader
|
|
12
|
+
messages: FitMessage[]
|
|
13
|
+
}
|
|
14
|
+
export declare class FitParseError extends Error {
|
|
15
|
+
public offset?: number;
|
|
16
|
+
constructor(message: string, offset?: number);
|
|
17
|
+
}
|
|
18
|
+
export declare class FitParser {
|
|
19
|
+
constructor(data: Buffer | ArrayBuffer | Uint8Array);
|
|
20
|
+
parse(): FitParseResult;
|
|
21
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Re-export commonly used types for convenience
|
|
2
|
+
export type {
|
|
3
|
+
Activity,
|
|
4
|
+
ActivityLap,
|
|
5
|
+
ActivityRecord,
|
|
6
|
+
MonitoringData,
|
|
7
|
+
WatchDevice,
|
|
8
|
+
GarminDevice,
|
|
9
|
+
DownloadResult,
|
|
10
|
+
DownloadOptions,
|
|
11
|
+
WatchDriver,
|
|
12
|
+
SleepData,
|
|
13
|
+
StressData,
|
|
14
|
+
HRVData,
|
|
15
|
+
SpO2Data,
|
|
16
|
+
DailyHeartRate,
|
|
17
|
+
BodyBattery,
|
|
18
|
+
DailySteps,
|
|
19
|
+
WeightData,
|
|
20
|
+
GeoPosition,
|
|
21
|
+
SportType,
|
|
22
|
+
SubSportType,
|
|
23
|
+
} from './types';
|
|
24
|
+
// Core exports
|
|
25
|
+
export * from './config';
|
|
26
|
+
export * from './types';
|
|
27
|
+
// FIT file parsing
|
|
28
|
+
export * from './fit/index';
|
|
29
|
+
// Device drivers
|
|
30
|
+
export * from './drivers/index';
|
|
31
|
+
// Data export
|
|
32
|
+
export * from './export/index';
|
|
33
|
+
// Cloud integrations
|
|
34
|
+
export * from './cloud/index';
|
|
35
|
+
// Analysis tools
|
|
36
|
+
export * from './analysis/index';
|
|
37
|
+
// Workout tools
|
|
38
|
+
export * from './workouts/index';
|
|
39
|
+
// Real-time data
|
|
40
|
+
export * from './realtime/index';
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an ANT+ scanner
|
|
3
|
+
* Returns a mock scanner - integrate with ant-plus package for real hardware
|
|
4
|
+
*/
|
|
5
|
+
export declare function createAntPlusScanner(): AntPlusScanner;
|
|
6
|
+
/**
|
|
7
|
+
* Calculate wheel speed from ANT+ speed sensor data
|
|
8
|
+
*/
|
|
9
|
+
export declare function calculateWheelSpeed(currentRevolutions: number, currentEventTime: number, previousRevolutions: number, previousEventTime: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Calculate cadence from ANT+ cadence sensor data
|
|
12
|
+
*/
|
|
13
|
+
export declare function calculateCadence(currentRevolutions: number, currentEventTime: number, previousRevolutions: number, previousEventTime: number): number;
|
|
14
|
+
// ANT+ Device Profile Constants
|
|
15
|
+
export declare const ANT_PLUS_PROFILES: {
|
|
16
|
+
HEART_RATE: {
|
|
17
|
+
deviceType: 120;
|
|
18
|
+
frequency: 57;
|
|
19
|
+
period: 8070;
|
|
20
|
+
searchTimeout: 30
|
|
21
|
+
};
|
|
22
|
+
SPEED_CADENCE: {
|
|
23
|
+
deviceType: 121;
|
|
24
|
+
frequency: 57;
|
|
25
|
+
period: 8086;
|
|
26
|
+
searchTimeout: 30
|
|
27
|
+
};
|
|
28
|
+
BIKE_SPEED: {
|
|
29
|
+
deviceType: 123;
|
|
30
|
+
frequency: 57;
|
|
31
|
+
period: 8118;
|
|
32
|
+
searchTimeout: 30
|
|
33
|
+
};
|
|
34
|
+
BIKE_CADENCE: {
|
|
35
|
+
deviceType: 122;
|
|
36
|
+
frequency: 57;
|
|
37
|
+
period: 8102;
|
|
38
|
+
searchTimeout: 30
|
|
39
|
+
};
|
|
40
|
+
POWER: {
|
|
41
|
+
deviceType: 11;
|
|
42
|
+
frequency: 57;
|
|
43
|
+
period: 8182;
|
|
44
|
+
searchTimeout: 30
|
|
45
|
+
};
|
|
46
|
+
RUNNING_DYNAMICS: {
|
|
47
|
+
deviceType: 26;
|
|
48
|
+
frequency: 57;
|
|
49
|
+
period: 8134;
|
|
50
|
+
searchTimeout: 30
|
|
51
|
+
};
|
|
52
|
+
FITNESS_EQUIPMENT: {
|
|
53
|
+
deviceType: 17;
|
|
54
|
+
frequency: 57;
|
|
55
|
+
period: 8192;
|
|
56
|
+
searchTimeout: 30
|
|
57
|
+
};
|
|
58
|
+
ENVIRONMENT: {
|
|
59
|
+
deviceType: 25;
|
|
60
|
+
frequency: 57;
|
|
61
|
+
period: 8070;
|
|
62
|
+
searchTimeout: 30
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
export declare interface AntPlusDevice {
|
|
66
|
+
deviceId: number
|
|
67
|
+
deviceType: AntPlusDeviceType
|
|
68
|
+
transmissionType: number
|
|
69
|
+
name?: string
|
|
70
|
+
batteryStatus?: 'new' | 'good' | 'ok' | 'low' | 'critical'
|
|
71
|
+
}
|
|
72
|
+
export declare interface HeartRateData {
|
|
73
|
+
heartRate: number
|
|
74
|
+
beatCount: number
|
|
75
|
+
beatTime: number
|
|
76
|
+
rrIntervals?: number[]
|
|
77
|
+
operatingTime?: number
|
|
78
|
+
}
|
|
79
|
+
export declare interface SpeedCadenceData {
|
|
80
|
+
speed?: number
|
|
81
|
+
cadence?: number
|
|
82
|
+
wheelRevolutions?: number
|
|
83
|
+
crankRevolutions?: number
|
|
84
|
+
wheelEventTime?: number
|
|
85
|
+
crankEventTime?: number
|
|
86
|
+
}
|
|
87
|
+
export declare interface PowerData {
|
|
88
|
+
instantPower: number
|
|
89
|
+
cadence?: number
|
|
90
|
+
accumulatedPower?: number
|
|
91
|
+
pedalPowerBalance?: number
|
|
92
|
+
torqueEffectiveness?: {
|
|
93
|
+
left: number
|
|
94
|
+
right: number
|
|
95
|
+
}
|
|
96
|
+
pedalSmoothness?: {
|
|
97
|
+
left: number
|
|
98
|
+
right: number
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export declare interface RunningDynamicsData {
|
|
102
|
+
cadence: number
|
|
103
|
+
groundContactTime?: number
|
|
104
|
+
groundContactBalance?: number
|
|
105
|
+
strideLength?: number
|
|
106
|
+
verticalOscillation?: number
|
|
107
|
+
verticalRatio?: number
|
|
108
|
+
stanceTime?: number
|
|
109
|
+
}
|
|
110
|
+
export declare interface FitnessEquipmentData {
|
|
111
|
+
elapsedTime: number
|
|
112
|
+
distance: number
|
|
113
|
+
speed: number
|
|
114
|
+
heartRate?: number
|
|
115
|
+
cadence?: number
|
|
116
|
+
power?: number
|
|
117
|
+
resistance?: number
|
|
118
|
+
incline?: number
|
|
119
|
+
state: 'ready' | 'in_use' | 'finished' | 'paused'
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* ANT+ Channel configuration
|
|
123
|
+
*/
|
|
124
|
+
export declare interface AntPlusChannelConfig {
|
|
125
|
+
deviceType: AntPlusDeviceType
|
|
126
|
+
deviceId?: number
|
|
127
|
+
transmissionType?: number
|
|
128
|
+
frequency?: number
|
|
129
|
+
period?: number
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* ANT+ Scanner interface
|
|
133
|
+
*
|
|
134
|
+
* Provides an interface for scanning and connecting to ANT+ devices.
|
|
135
|
+
* Actual implementation requires native USB access via ant-plus package or similar.
|
|
136
|
+
*/
|
|
137
|
+
export declare interface AntPlusScanner {
|
|
138
|
+
startScanning(deviceTypes?: AntPlusDeviceType[]): Promise<void>
|
|
139
|
+
stopScanning(): Promise<void>
|
|
140
|
+
getDevices(): AntPlusDevice[]
|
|
141
|
+
connect(deviceId: number): Promise<void>
|
|
142
|
+
disconnect(deviceId: number): Promise<void>
|
|
143
|
+
on(event: 'data', handler: AntPlusEventHandler): void
|
|
144
|
+
on(event: 'device_found', handler: (_device: AntPlusDevice) => void): void
|
|
145
|
+
on(event: 'device_lost', handler: (_device: AntPlusDevice) => void): void
|
|
146
|
+
on(event: 'error', handler: (error: Error) => void): void
|
|
147
|
+
off(event: string, handler: (...args: any[]) => void): void
|
|
148
|
+
isAvailable(): boolean
|
|
149
|
+
close(): Promise<void>
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* ANT+ Protocol Implementation
|
|
153
|
+
*
|
|
154
|
+
* ANT+ is a wireless protocol used by fitness devices for real-time data transmission.
|
|
155
|
+
* This module provides interfaces and utilities for ANT+ communication.
|
|
156
|
+
*
|
|
157
|
+
* Note: Actual ANT+ communication requires native USB access to an ANT+ stick.
|
|
158
|
+
* This module provides the protocol layer - integration with ant-plus npm package
|
|
159
|
+
* or native bindings is required for full functionality.
|
|
160
|
+
*/
|
|
161
|
+
export type AntPlusDeviceType = | 'heart_rate'
|
|
162
|
+
| 'speed_cadence'
|
|
163
|
+
| 'power_meter'
|
|
164
|
+
| 'fitness_equipment'
|
|
165
|
+
| 'running_dynamics'
|
|
166
|
+
| 'environment';
|
|
167
|
+
export type AntPlusData = | {
|
|
168
|
+
type: 'heart_rate'
|
|
169
|
+
data: HeartRateData
|
|
170
|
+
}
|
|
171
|
+
| {
|
|
172
|
+
type: 'speed_cadence'
|
|
173
|
+
data: SpeedCadenceData
|
|
174
|
+
}
|
|
175
|
+
| {
|
|
176
|
+
type: 'power_meter'
|
|
177
|
+
data: PowerData
|
|
178
|
+
}
|
|
179
|
+
| {
|
|
180
|
+
type: 'running_dynamics'
|
|
181
|
+
data: RunningDynamicsData
|
|
182
|
+
}
|
|
183
|
+
| {
|
|
184
|
+
type: 'fitness_equipment'
|
|
185
|
+
data: FitnessEquipmentData
|
|
186
|
+
}
|
|
187
|
+
export type AntPlusEventHandler = (_device: AntPlusDevice, _data: AntPlusData) => void;
|
|
188
|
+
/**
|
|
189
|
+
* Mock ANT+ Scanner for testing
|
|
190
|
+
*/
|
|
191
|
+
export declare class MockAntPlusScanner implements AntPlusScanner {
|
|
192
|
+
startScanning(_deviceTypes?: AntPlusDeviceType[]): Promise<void>;
|
|
193
|
+
stopScanning(): Promise<void>;
|
|
194
|
+
getDevices(): AntPlusDevice[];
|
|
195
|
+
connect(_deviceId: number): Promise<void>;
|
|
196
|
+
disconnect(_deviceId: number): Promise<void>;
|
|
197
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
198
|
+
off(event: string, handler: (...args: any[]) => void): void;
|
|
199
|
+
isAvailable(): boolean;
|
|
200
|
+
close(): Promise<void>;
|
|
201
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse heart rate measurement characteristic value
|
|
3
|
+
*/
|
|
4
|
+
export declare function parseHeartRateMeasurement(data: DataView): BleHeartRateData;
|
|
5
|
+
/**
|
|
6
|
+
* Parse cycling speed and cadence measurement
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseCscMeasurement(data: DataView, prevWheelRevs?: number, prevWheelTime?: number, prevCrankRevs?: number, prevCrankTime?: number): BleCyclingData;
|
|
9
|
+
/**
|
|
10
|
+
* Parse cycling power measurement
|
|
11
|
+
*/
|
|
12
|
+
export declare function parsePowerMeasurement(data: DataView): BlePowerData;
|
|
13
|
+
/**
|
|
14
|
+
* Create a BLE scanner
|
|
15
|
+
*/
|
|
16
|
+
export declare function createBleScanner(): BleScanner;
|
|
17
|
+
// BLE GATT Service UUIDs
|
|
18
|
+
export declare const BLE_SERVICES: {
|
|
19
|
+
HEART_RATE: '0000180d-0000-1000-8000-00805f9b34fb';
|
|
20
|
+
CYCLING_SPEED_CADENCE: '00001816-0000-1000-8000-00805f9b34fb';
|
|
21
|
+
CYCLING_POWER: '00001818-0000-1000-8000-00805f9b34fb';
|
|
22
|
+
RUNNING_SPEED_CADENCE: '00001814-0000-1000-8000-00805f9b34fb';
|
|
23
|
+
FITNESS_MACHINE: '00001826-0000-1000-8000-00805f9b34fb';
|
|
24
|
+
DEVICE_INFORMATION: '0000180a-0000-1000-8000-00805f9b34fb';
|
|
25
|
+
BATTERY: '0000180f-0000-1000-8000-00805f9b34fb'
|
|
26
|
+
};
|
|
27
|
+
// BLE GATT Characteristic UUIDs
|
|
28
|
+
export declare const BLE_CHARACTERISTICS: {
|
|
29
|
+
HEART_RATE_MEASUREMENT: '00002a37-0000-1000-8000-00805f9b34fb';
|
|
30
|
+
BODY_SENSOR_LOCATION: '00002a38-0000-1000-8000-00805f9b34fb';
|
|
31
|
+
CSC_MEASUREMENT: '00002a5b-0000-1000-8000-00805f9b34fb';
|
|
32
|
+
CSC_FEATURE: '00002a5c-0000-1000-8000-00805f9b34fb';
|
|
33
|
+
CYCLING_POWER_MEASUREMENT: '00002a63-0000-1000-8000-00805f9b34fb';
|
|
34
|
+
CYCLING_POWER_FEATURE: '00002a65-0000-1000-8000-00805f9b34fb';
|
|
35
|
+
RSC_MEASUREMENT: '00002a53-0000-1000-8000-00805f9b34fb';
|
|
36
|
+
RSC_FEATURE: '00002a54-0000-1000-8000-00805f9b34fb';
|
|
37
|
+
FITNESS_MACHINE_FEATURE: '00002acc-0000-1000-8000-00805f9b34fb';
|
|
38
|
+
TREADMILL_DATA: '00002acd-0000-1000-8000-00805f9b34fb';
|
|
39
|
+
INDOOR_BIKE_DATA: '00002ad2-0000-1000-8000-00805f9b34fb';
|
|
40
|
+
BATTERY_LEVEL: '00002a19-0000-1000-8000-00805f9b34fb'
|
|
41
|
+
};
|
|
42
|
+
export declare interface BleDevice {
|
|
43
|
+
id: string
|
|
44
|
+
name: string
|
|
45
|
+
type: BleDeviceType
|
|
46
|
+
rssi?: number
|
|
47
|
+
connected: boolean
|
|
48
|
+
}
|
|
49
|
+
export declare interface BleHeartRateData {
|
|
50
|
+
heartRate: number
|
|
51
|
+
contactDetected?: boolean
|
|
52
|
+
energyExpended?: number
|
|
53
|
+
rrIntervals?: number[]
|
|
54
|
+
}
|
|
55
|
+
export declare interface BleCyclingData {
|
|
56
|
+
speed?: number
|
|
57
|
+
cadence?: number
|
|
58
|
+
wheelRevolutions?: number
|
|
59
|
+
crankRevolutions?: number
|
|
60
|
+
}
|
|
61
|
+
export declare interface BlePowerData {
|
|
62
|
+
instantPower: number
|
|
63
|
+
pedalPowerBalance?: number
|
|
64
|
+
accumulatedTorque?: number
|
|
65
|
+
wheelRevolutions?: number
|
|
66
|
+
crankRevolutions?: number
|
|
67
|
+
cadence?: number
|
|
68
|
+
}
|
|
69
|
+
export declare interface BleRunningData {
|
|
70
|
+
speed: number
|
|
71
|
+
cadence: number
|
|
72
|
+
strideLength?: number
|
|
73
|
+
totalDistance?: number
|
|
74
|
+
}
|
|
75
|
+
export declare interface BleFitnessMachineData {
|
|
76
|
+
speed?: number
|
|
77
|
+
cadence?: number
|
|
78
|
+
power?: number
|
|
79
|
+
heartRate?: number
|
|
80
|
+
distance?: number
|
|
81
|
+
elapsedTime?: number
|
|
82
|
+
resistance?: number
|
|
83
|
+
incline?: number
|
|
84
|
+
status: 'idle' | 'warmup' | 'workout' | 'cooldown' | 'paused'
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* BLE Scanner interface
|
|
88
|
+
*/
|
|
89
|
+
export declare interface BleScanner {
|
|
90
|
+
startScanning(services?: string[]): Promise<void>
|
|
91
|
+
stopScanning(): Promise<void>
|
|
92
|
+
getDevices(): BleDevice[]
|
|
93
|
+
connect(deviceId: string): Promise<void>
|
|
94
|
+
disconnect(deviceId: string): Promise<void>
|
|
95
|
+
subscribe(deviceId: string, characteristic: string): Promise<void>
|
|
96
|
+
on(event: 'data', handler: BleEventHandler): void
|
|
97
|
+
on(event: 'device_found', handler: (_device: BleDevice) => void): void
|
|
98
|
+
on(event: 'device_lost', handler: (_device: BleDevice) => void): void
|
|
99
|
+
on(event: 'connected', handler: (_device: BleDevice) => void): void
|
|
100
|
+
on(event: 'disconnected', handler: (_device: BleDevice) => void): void
|
|
101
|
+
on(event: 'error', handler: (error: Error) => void): void
|
|
102
|
+
off(event: string, handler: (...args: any[]) => void): void
|
|
103
|
+
isAvailable(): Promise<boolean>
|
|
104
|
+
close(): Promise<void>
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Bluetooth Low Energy (BLE) Heart Rate and Fitness Device Support
|
|
108
|
+
*
|
|
109
|
+
* This module provides interfaces for connecting to BLE fitness devices.
|
|
110
|
+
* Uses Web Bluetooth API when available, or can be integrated with noble/bleno
|
|
111
|
+
* for Node.js native Bluetooth access.
|
|
112
|
+
*/
|
|
113
|
+
export type BleDeviceType = | 'heart_rate'
|
|
114
|
+
| 'cycling_speed_cadence'
|
|
115
|
+
| 'cycling_power'
|
|
116
|
+
| 'running_speed_cadence'
|
|
117
|
+
| 'fitness_machine';
|
|
118
|
+
export type BleData = | {
|
|
119
|
+
type: 'heart_rate'
|
|
120
|
+
data: BleHeartRateData
|
|
121
|
+
}
|
|
122
|
+
| {
|
|
123
|
+
type: 'cycling'
|
|
124
|
+
data: BleCyclingData
|
|
125
|
+
}
|
|
126
|
+
| {
|
|
127
|
+
type: 'power'
|
|
128
|
+
data: BlePowerData
|
|
129
|
+
}
|
|
130
|
+
| {
|
|
131
|
+
type: 'running'
|
|
132
|
+
data: BleRunningData
|
|
133
|
+
}
|
|
134
|
+
| {
|
|
135
|
+
type: 'fitness_machine'
|
|
136
|
+
data: BleFitnessMachineData
|
|
137
|
+
}
|
|
138
|
+
export type BleEventHandler = (_device: BleDevice, _data: BleData) => void;
|
|
139
|
+
/**
|
|
140
|
+
* Mock BLE Scanner for testing
|
|
141
|
+
*/
|
|
142
|
+
export declare class MockBleScanner implements BleScanner {
|
|
143
|
+
startScanning(_services?: string[]): Promise<void>;
|
|
144
|
+
stopScanning(): Promise<void>;
|
|
145
|
+
getDevices(): BleDevice[];
|
|
146
|
+
connect(deviceId: string): Promise<void>;
|
|
147
|
+
disconnect(deviceId: string): Promise<void>;
|
|
148
|
+
subscribe(_deviceId: string, _characteristic: string): Promise<void>;
|
|
149
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
150
|
+
off(event: string, handler: (...args: any[]) => void): void;
|
|
151
|
+
isAvailable(): Promise<boolean>;
|
|
152
|
+
close(): Promise<void>;
|
|
153
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { GeoPosition, ActivityRecord } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Create a live tracking manager
|
|
4
|
+
*/
|
|
5
|
+
export declare function createLiveTracking(config?: LiveTrackingConfig): LiveTrackingManager;
|
|
6
|
+
/**
|
|
7
|
+
* Convert live tracking session to activity records
|
|
8
|
+
*/
|
|
9
|
+
export declare function sessionToRecords(session: LiveTrackingSession): ActivityRecord[];
|
|
10
|
+
/**
|
|
11
|
+
* Format live tracking stats for display
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatLiveStats(session: LiveTrackingSession): {
|
|
14
|
+
distance: string
|
|
15
|
+
duration: string
|
|
16
|
+
pace: string
|
|
17
|
+
speed: string
|
|
18
|
+
heartRate: string
|
|
19
|
+
power: string
|
|
20
|
+
};
|
|
21
|
+
export declare interface LiveTrackingSession {
|
|
22
|
+
id: string
|
|
23
|
+
name?: string
|
|
24
|
+
startTime: Date
|
|
25
|
+
lastUpdate: Date
|
|
26
|
+
currentPosition?: GeoPosition
|
|
27
|
+
totalDistance: number
|
|
28
|
+
elapsedTime: number
|
|
29
|
+
currentSpeed?: number
|
|
30
|
+
currentHeartRate?: number
|
|
31
|
+
currentCadence?: number
|
|
32
|
+
currentPower?: number
|
|
33
|
+
status: 'active' | 'paused' | 'stopped'
|
|
34
|
+
trackPoints: GeoPosition[]
|
|
35
|
+
}
|
|
36
|
+
export declare interface LiveTrackingConfig {
|
|
37
|
+
updateInterval?: number
|
|
38
|
+
shareUrl?: string
|
|
39
|
+
enableHeartRate?: boolean
|
|
40
|
+
enablePower?: boolean
|
|
41
|
+
onUpdate?: (session: LiveTrackingSession) => void
|
|
42
|
+
onError?: (error: Error) => void
|
|
43
|
+
}
|
|
44
|
+
export type LiveTrackingEventHandler = {
|
|
45
|
+
'position': (position: GeoPosition) => void
|
|
46
|
+
'update': (session: LiveTrackingSession) => void
|
|
47
|
+
'start': (session: LiveTrackingSession) => void
|
|
48
|
+
'stop': (session: LiveTrackingSession) => void
|
|
49
|
+
'pause': (session: LiveTrackingSession) => void
|
|
50
|
+
'resume': (session: LiveTrackingSession) => void
|
|
51
|
+
'error': (error: Error) => void
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Live tracking manager for real-time activity sharing
|
|
55
|
+
*/
|
|
56
|
+
export declare class LiveTrackingManager {
|
|
57
|
+
constructor(config?: LiveTrackingConfig);
|
|
58
|
+
start(name?: string): LiveTrackingSession;
|
|
59
|
+
stop(): LiveTrackingSession | null;
|
|
60
|
+
pause(): void;
|
|
61
|
+
resume(): void;
|
|
62
|
+
updatePosition(position: GeoPosition): void;
|
|
63
|
+
updateHeartRate(heartRate: number): void;
|
|
64
|
+
updatePower(power: number): void;
|
|
65
|
+
updateCadence(cadence: number): void;
|
|
66
|
+
getSession(): LiveTrackingSession | null;
|
|
67
|
+
getShareUrl(): string | null;
|
|
68
|
+
on<K extends keyof LiveTrackingEventHandler>(event: K, handler: LiveTrackingEventHandler[K]): void;
|
|
69
|
+
off<K extends keyof LiveTrackingEventHandler>(event: K, handler: LiveTrackingEventHandler[K]): void;
|
|
70
|
+
}
|