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
|
# File 'lib/rubyfit/writer.rb', line 4
def write(stream, opts = {})
raise "Can't start write mode from #{@state}" if @state
@state = :write
@local_nums = []
@stream = stream
%i(start_time end_time course_point_count track_point_count name
total_distance time_created start_x start_y end_x end_y).each do |key|
raise ArgumentError.new("Missing required option #{key}") unless opts[key]
end
start_time = opts[:start_time].to_i
end_time = opts[:end_time].to_i
@data_crc = 0
definition_sizes = %i(file_id course lap course_point record)
.map{|type| RubyFit::MessageWriter.definition_message_size(type) }
.reduce(&:+)
data_sizes = {
file_id: 1,
course: 1,
lap: 1,
course_point: opts[:course_point_count],
record: opts[:track_point_count]
}
.map{|type, count| RubyFit::MessageWriter.data_message_size(type) * count }
.reduce(&:+)
data_size = definition_sizes + data_sizes
write_data(RubyFit::MessageWriter.(data_size))
write_definition_message(:file_id)
write_data_message(:file_id, {
time_created: opts[:time_created],
type: 6, manufacturer: 1, product: 0,
serial_number: 0,
})
write_definition_message(:course)
write_data_message(:course, { name: opts[:name] })
write_definition_message(:lap)
write_data_message(:lap, {
start_time: start_time,
timestamp: end_time,
start_x: opts[:start_x],
start_y: opts[:start_y],
end_x: opts[:end_x],
end_y: opts[:end_y],
total_distance: opts[:total_distance]
})
yield
write_data(RubyFit::MessageWriter.crc(@data_crc))
@state = nil
end
|