forked from cmaion/polar
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpolar_training2test
More file actions
executable file
·97 lines (83 loc) · 4.07 KB
/
polar_training2test
File metadata and controls
executable file
·97 lines (83 loc) · 4.07 KB
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
#!/usr/bin/env ruby
# Parses RAW Polar training session data files and prints some parsed data for testing purposes
require "#{File.dirname(__FILE__)}/lib/polar_data_parser"
def usage
puts "Usage:"
puts " #{__FILE__} <directory>"
end
dir = ARGV[0]
unless dir
usage
exit -2
end
def output_test(parsed)
sport = parsed[:sport]
training_session = parsed[:training_session]
sensors = parsed[:sensors]
samples = parsed[:samples]
route_samples = parsed[:route_samples]
laps = parsed[:exercise_laps]
recording_interval = samples.recording_interval.hours * 3600 + samples.recording_interval.minutes * 60 + samples.recording_interval.seconds + (samples.recording_interval.millis.to_f / 1000)
samples_count = samples.speed_samples.count
route_samples_count = route_samples.latitude.count
laps_count = laps ? laps.laps.count : 0
puts "Sport: #{sport.identifier.value} (#{sport.translation.map { |t| t.text.text if t.id.language == 'en' }.compact.join('/')})"
puts "Training session: #{training_session.sport.value} (#{training_session.session_name.text})"
puts "Duration: #{pb_duration_to_string training_session.duration}"
puts "Distance: #{"%.1f" % training_session.distance}m"
puts "Geo: latitude #{training_session.latitude}/longitude #{training_session.longitude}"
puts "Heart rate: avg #{training_session.heart_rate.average}, max #{training_session.heart_rate.maximum}"
if sensors
sensors.sensors.each do |sensor|
puts "Sensor used: #{sensor.mac.mac.unpack('H*').first.scan(/../).join(':') }"
end
end
puts "Altitude calibration samples:"
altitude_delta = 0
for i in 0..samples.altitude_calibration.count - 1
r = []
r << "start_index=#{samples.altitude_calibration[i].start_index}" if samples.altitude_calibration[i].start_index
r << "value=#{samples.altitude_calibration[i].value}" if samples.altitude_calibration[i].value
r << "operation=#{samples.altitude_calibration[i].operation.to_s}" if samples.altitude_calibration[i].operation
puts r.join(', ')
if samples.altitude_calibration[i].operation == PbOperationType::SUM
altitude_delta = samples.altitude_calibration[i].value
else
STDERR.puts "Warning: Altitude calibration data of unsupported operation type ignored"
end
end
timestamp = Time.at(0).utc
for i in 0..samples_count-1
timestamp += recording_interval
r = []
r << timestamp.strftime("%H:%M:%S")
r << "#{"%7.1f" % samples.distance_samples[i]} m" if samples.distance_samples[i]
r << "#{"%3.2f" % (60.0 / samples.speed_samples[i])} min/km" if samples.speed_samples[i]
r << "FC=#{"%3.0f" % samples.heart_rate_samples[i]} bpm" if samples.heart_rate_samples[i]
r << "alt=#{"%4.1f" % samples.altitude_samples[i]}#{" (corrected=#{"%4.1f" % (samples.altitude_samples[i] + altitude_delta)})" if altitude_delta != 0} m" if samples.altitude_samples[i]
r << "temp=#{"%2.1f" % samples.temperature_samples[i]} °C" if samples.temperature_samples[i]
r << "cadence=#{samples.cadence_samples[i]}" if samples.cadence_samples[i]
puts r.join(', ')
end
if route_samples_count > 0
puts "GPX first fix: #{pb_sysdatetime_to_string route_samples.first_location_time}"
for i in 0..route_samples_count-1
timestamp = Time.at(route_samples.duration[i].to_f / 1000).utc
puts "#{timestamp.strftime("%H:%M:%S")}, latitude=#{route_samples.latitude[i]}, longitude=#{route_samples.longitude[i]}, gps_altitude=#{route_samples.gps_altitude[i]}, satellites=#{route_samples.satellite_amount[i]}"
end
end
if laps_count > 0
puts "Laps: #{laps_count}"
puts "Best lap duration: #{pb_duration_to_string laps.summary.best_lap_duration}"
puts "Average lap duration: #{pb_duration_to_string laps.summary.average_lap_duration}"
laps.laps.each_with_index do |lap, i|
puts "#{pb_duration_to_string lap.header.split_time}, lap #{i + 1}: #{pb_duration_to_string lap.header.duration}, #{lap.header.distance} m"
end
end
end
parsed = PolarDataParser.parse_training_session(dir)
if parsed.key?(:training_session)
output_test(parsed)
else
puts "Error: couldn't find training session"
end