wangzhibo
4 天以前 ae6f40460dcd56af6c5f60ba52c883854c3bac55
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
syntax = "proto3";
 
option java_package = "nodomain.freeyourgadget.gadgetbridge.proto";
option java_outer_classname = "HuamiProtos";
 
message WorkoutSummary {
    string version = 1;
    Location location = 2;
    Type type = 3;
    Distance distance = 4;
    Steps steps = 11;
    Time time = 7;
    SwimmingData swimmingData = 9;
    Pace pace = 10;
    Altitude altitude = 13;
    HeartRate heartRate = 19;
    Calories calories = 16;
    TrainingEffect trainingEffect = 21;
    HeartRateZones heartRateZones = 22;
    Elevation elevation = 23;
}
 
message Location {
    // TODO 2, 3
    uint32 startTimestamp = 1; // unix epoch, seconds
    int32 baseLatitude = 5; // /6000000 -> coords
    int32 baseLongitude = 6; // /-6000000 -> coords
    int32 baseAltitude = 7; // /2 -> meters
    int32 maxLatitude = 8; // /3000000 -> coords
    int32 minLatitude = 9; // /3000000 -> coords
    int32 maxLongitude = 10; // /3000000 -> coords
    int32 minLongitude = 11; // /3000000 -> coords
}
 
message HeartRate {
    int32 avg = 1; // bpm
    int32 max = 2; // bpm
    int32 min = 3; // bpm
}
 
message Steps {
    float avgCadence = 1; // steps/sec
    float maxCadence = 2; // steps/sec
    int32 avgStride = 3; // cm
    int32 steps = 4; // count
}
 
message Type {
    int32 type = 1; // 1 = running, 4 = bike, 3 = walk
    int32 ai = 2; // 0 = normal, 1 = ai/automatic
}
 
message Distance {
    float distance = 1; // meters
}
 
message Time {
    int32 totalDuration = 1; // seconds
    int32 workoutDuration = 2; // seconds
    int32 pauseDuration = 3; // seconds
}
 
message Pace {
    float avg = 1; // val * 1000 / 60 -> min/km
    float best = 2; // val * 1000 / 60 -> min/km
}
 
message Altitude {
    int32 maxAltitude = 1; // /200 -> meters
    int32 minAltitude = 2; // /200 -> meters
    int32 avgAltitude = 3; // /200 -> meters
    int32 totalClimbing = 4; // cm
    int32 elevationGain = 5; // cm
    int32 elevationLoss = 6; // cm
}
 
message Calories {
    int32 calories = 1; // kcal
}
 
message HeartRateZones {
    // TODO 1, is always = 1?
    // Zones: N/A, Warm-up, Fat-burn time, Aerobic, Anaerobic, Extreme
    repeated int32 zoneMax = 2; // bpm
    repeated int32 zoneTime = 3; // seconds
}
 
message Elevation {
    // TODO 1, 2?
    uint32 uphillTime = 3; // sec
    uint32 downhillTime = 4; // sec
}
 
message TrainingEffect {
    float aerobicTrainingEffect = 4;
    float anaerobicTrainingEffect = 5;
    int32 currentWorkoutLoad = 6;
    int32 maximumOxygenUptake = 7; // ml/kg/min
}
 
message SwimmingData {
    uint32 style = 1; // 1: breaststroke, 2: freestyle
    uint32 laps = 2;
    uint32 strokes = 3;
    uint32 avgDps = 4; // cm
    uint32 swolf = 5;
    uint32 avgStrokeRate = 6;  // stroke/min
    uint32 maxStrokeRate = 7;  // stroke/min
    uint32 laneLength = 8;
    uint32 laneLengthUnit = 9; // 0: meter, 1: yard
}