eagletree-log 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,8 +18,14 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_development_dependency 'awesome_print'
21
22
  spec.add_development_dependency 'bundler', '~> 1.3'
22
23
  spec.add_development_dependency 'ci_reporter', '= 1.8.4'
23
24
  spec.add_development_dependency 'rake', '~> 0.8'
24
25
  spec.add_development_dependency 'rspec', '~> 2.12'
26
+ spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency 'simplecov-gem-adapter'
28
+ spec.add_development_dependency 'simplecov-rcov'
29
+
30
+ spec.add_dependency 'ruby_kml', '~> 0.1'
25
31
  end
@@ -23,11 +23,11 @@ module EagleTree
23
23
  @sessions = []
24
24
 
25
25
  open(uri, 'rb') do |file|
26
- @name = file.gets.chomp
27
- @meta = file.gets.chomp.split
26
+ @name = file.gets.strip
27
+ @meta = file.gets.strip.split
28
28
  session_count = @meta[27].to_i
29
29
 
30
- if 'All Sessions' != file.gets.chomp
30
+ if 'All Sessions' != file.gets.strip
31
31
  raise RuntimeError, "No 'All Sessions' marker found"
32
32
  end
33
33
 
@@ -37,7 +37,7 @@ module EagleTree
37
37
  end
38
38
 
39
39
  # read off the full file range
40
- all_sessions_range = file.gets.chomp.split.map(&:to_i)
40
+ all_sessions_range = file.gets.strip.split.map(&:to_i)
41
41
 
42
42
  session_count.times do |expected|
43
43
  num = /Session (?<num>\d)/.match(file.gets)[:num].to_i
@@ -45,7 +45,7 @@ module EagleTree
45
45
  raise RuntimeError, "Unexpected session marker encountered"
46
46
  end
47
47
 
48
- range = file.gets.chomp.split.map(&:to_i).map { |v| v * @meta[22].to_i }
48
+ range = file.gets.strip.split.map(&:to_i).map { |v| v * @meta[22].to_i }
49
49
  @sessions << Session.new(num, range)
50
50
  end
51
51
 
@@ -1,3 +1,5 @@
1
+ require 'ruby_kml'
2
+
1
3
  module EagleTree
2
4
  module Log
3
5
 
@@ -46,7 +48,7 @@ module EagleTree
46
48
  end
47
49
 
48
50
  def servo_currents
49
- @servo_currents ||= float_fields('ServoCurrent*100', 100.0)
51
+ @servo_currents ||= float_fields('ServoCurrent*100').map { |val| val / 100.0 }
50
52
  end
51
53
 
52
54
  def servo_currents?
@@ -62,7 +64,7 @@ module EagleTree
62
64
  end
63
65
 
64
66
  def pack_voltages
65
- @pack_voltages ||= float_fields('PackVolt*100', 100.0)
67
+ @pack_voltages ||= float_fields('PackVolt*100').map { |val| val / 100.0 }
66
68
  end
67
69
 
68
70
  def pack_voltages?
@@ -70,7 +72,7 @@ module EagleTree
70
72
  end
71
73
 
72
74
  def amps
73
- @amps ||= float_fields('Amps*100', 100.0)
75
+ @amps ||= float_fields('Amps*100').map { |val| val / 100.0 }
74
76
  end
75
77
 
76
78
  def amps?
@@ -78,7 +80,7 @@ module EagleTree
78
80
  end
79
81
 
80
82
  def temps1
81
- @temps1 ||= float_fields('Temp1*10', 10.0)
83
+ @temps1 ||= float_fields('Temp1*10').map { |val| val / 10.0 }
82
84
  end
83
85
 
84
86
  def temps1?
@@ -86,7 +88,7 @@ module EagleTree
86
88
  end
87
89
 
88
90
  def temps2
89
- @temps2 ||= float_fields('Temp2*10', 10.0)
91
+ @temps2 ||= float_fields('Temp2*10').map { |val| val / 10.0 }
90
92
  end
91
93
 
92
94
  def temps2?
@@ -94,7 +96,7 @@ module EagleTree
94
96
  end
95
97
 
96
98
  def temps3
97
- @temps3 ||= float_fields('Temp3*10', 10.0)
99
+ @temps3 ||= float_fields('Temp3*10').map { |val| val / 10.0 }
98
100
  end
99
101
 
100
102
  def temps3?
@@ -117,6 +119,71 @@ module EagleTree
117
119
  nonzero?(self.rpms2)
118
120
  end
119
121
 
122
+ def latitudes
123
+ @latitudes ||= float_fields('GPSLat')
124
+ end
125
+
126
+ def latitudes?
127
+ nonzero?(self.latitudes)
128
+ end
129
+
130
+ def longitudes
131
+ @longitudes ||= float_fields('GPSLon')
132
+ end
133
+
134
+ def longitudes?
135
+ nonzero?(self.longitudes)
136
+ end
137
+
138
+ def gps_altitudes
139
+ @gps_altitudes ||= float_fields('GPSAlt')
140
+ end
141
+
142
+ def gps_altitudes?
143
+ nonzero?(self.gps_altitudes)
144
+ end
145
+
146
+ def coords
147
+ @coords ||= longitudes.zip(latitudes, gps_altitudes)
148
+ end
149
+
150
+ def coords?
151
+ self.longitudes? || self.latitudes? || self.gps_altitudes?
152
+ end
153
+
154
+ def to_kml
155
+ unless coords?
156
+ raise RuntimeError, 'No coordinates available for KML path generation'
157
+ end
158
+
159
+ kml = KMLFile.new
160
+ kml.objects << KML::Document.new(
161
+ :name => 'NAME HERE',
162
+ :description => 'DESCRIPTION HERE',
163
+ :styles => [
164
+ KML::Style.new(
165
+ :id => 'yellowLineGreenPoly',
166
+ :line_style => KML::LineStyle.new(:color => '7f00ffff', :width => 4),
167
+ :poly_style => KML::PolyStyle.new(:color => '7f00ff00')
168
+ )
169
+ ],
170
+ :features => [
171
+ KML::Placemark.new(
172
+ :name => 'Absolute Extruded',
173
+ :description => 'Transparent green wall with yellow outlines',
174
+ :style_url => '#yellowLineGreenPoly',
175
+ :geometry => KML::LineString.new(
176
+ :extrude => true,
177
+ :tessellate => true,
178
+ :altitude_mode => 'absolute',
179
+ :coordinates => coords.map { |c| c.join(',') }.join(' ')
180
+ )
181
+ )
182
+ ]
183
+ )
184
+ kml.render
185
+ end
186
+
120
187
  private
121
188
 
122
189
  def nonzero? array
@@ -127,8 +194,8 @@ module EagleTree
127
194
  fields(name).map(&:to_i)
128
195
  end
129
196
 
130
- def float_fields name, divisor
131
- fields(name).map(&:to_f).map { |val| val / divisor }
197
+ def float_fields name
198
+ fields(name).map(&:to_f)
132
199
  end
133
200
 
134
201
  def fields name
@@ -1,5 +1,5 @@
1
1
  module EagleTree
2
2
  module Log
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -2,6 +2,72 @@ require 'spec_helper'
2
2
 
3
3
  describe EagleTree::Log::Session do
4
4
 
5
+ context 'data file funjet-gps.fdr' do
6
+
7
+ let(:file) { EagleTree::Log::File.new(data_file('funjet-gps.fdr')) }
8
+
9
+ subject { file }
10
+
11
+ it { should have(1).sessions }
12
+
13
+ context 'session 1' do
14
+
15
+ subject { file.sessions[0] }
16
+
17
+ it { should have(2929).rows }
18
+
19
+ its(:duration) { should be_within(0.1).of(732.3) }
20
+
21
+ its(:latitudes?) { should be_true }
22
+
23
+ it 'should have a few select latitudes' do
24
+ subject.latitudes[0].should be_within(0.0001).of(49.0775)
25
+ subject.latitudes[1242].should be_within(0.0001).of(49.0793)
26
+ subject.latitudes[1666].should be_within(0.0001).of(49.0750)
27
+ subject.latitudes[2077].should be_within(0.0001).of(49.0771)
28
+ end
29
+
30
+ its(:longitudes?) { should be_true }
31
+
32
+ it 'should have a few select longitudes' do
33
+ subject.longitudes[0].should be_within(0.0001).of(2.1545)
34
+ subject.longitudes[1356].should be_within(0.0001).of(2.1530)
35
+ subject.longitudes[1727].should be_within(0.0001).of(2.1560)
36
+ subject.longitudes[2317].should be_within(0.0001).of(2.1519)
37
+ end
38
+
39
+ its(:gps_altitudes?) { should be_true }
40
+
41
+ it 'should have a few select gps_altitudes' do
42
+ subject.gps_altitudes[864].should be_within(0.1).of(75.0)
43
+ subject.gps_altitudes[1566].should be_within(0.1).of(208.0)
44
+ subject.gps_altitudes[1879].should be_within(0.1).of(99.0)
45
+ subject.gps_altitudes[2317].should be_within(0.1).of(168.0)
46
+ end
47
+
48
+ its(:coords) { should be_true }
49
+
50
+ it 'should have a few select coords' do
51
+ subject.coords[0][0].should be_within(0.0001).of(2.1545)
52
+ subject.coords[0][1].should be_within(0.0001).of(49.0775)
53
+ subject.coords[0][2].should be_within(0.1).of(102.0)
54
+ subject.coords[500][0].should be_within(0.0001).of(2.1545)
55
+ subject.coords[500][1].should be_within(0.0001).of(49.0775)
56
+ subject.coords[500][2].should be_within(0.1).of(75.0)
57
+ subject.coords[1500][0].should be_within(0.0001).of(2.1531)
58
+ subject.coords[1500][1].should be_within(0.0001).of(49.0780)
59
+ subject.coords[1500][2].should be_within(0.1).of(121.0)
60
+ subject.coords[2500][0].should be_within(0.0001).of(2.1542)
61
+ subject.coords[2500][1].should be_within(0.0001).of(49.0778)
62
+ subject.coords[2500][2].should be_within(0.1).of(89.0)
63
+ end
64
+
65
+ its(:to_kml) { should_not be_nil }
66
+
67
+ end
68
+
69
+ end
70
+
5
71
  context 'data file multi-session-1.fdr' do
6
72
 
7
73
  let(:file) { EagleTree::Log::File.new(data_file('multi-session-1.fdr')) }
@@ -18,6 +84,14 @@ describe EagleTree::Log::Session do
18
84
 
19
85
  its(:duration) { should be_within(0.1).of(355.5) }
20
86
 
87
+ its(:latitudes?) { should be_false }
88
+
89
+ its(:longitudes?) { should be_false }
90
+
91
+ its(:gps_altitudes?) { should be_false }
92
+
93
+ specify { expect { subject.to_kml }.to raise_error(RuntimeError) }
94
+
21
95
  end
22
96
 
23
97
  context 'session 2' do
@@ -58,6 +132,12 @@ describe EagleTree::Log::Session do
58
132
 
59
133
  its(:duration) { should be_within(0.1).of(22.6) }
60
134
 
135
+ its(:latitudes?) { should be_false }
136
+
137
+ its(:longitudes?) { should be_false }
138
+
139
+ its(:gps_altitudes?) { should be_false }
140
+
61
141
  end
62
142
 
63
143
  context 'session 2' do
@@ -126,6 +206,12 @@ describe EagleTree::Log::Session do
126
206
 
127
207
  its(:rpms2?) { should be_false }
128
208
 
209
+ its(:latitudes?) { should be_false }
210
+
211
+ its(:longitudes?) { should be_false }
212
+
213
+ its(:gps_altitudes?) { should be_false }
214
+
129
215
  end
130
216
 
131
217
  context 'data file t600-2.fdr' do
@@ -172,6 +258,14 @@ describe EagleTree::Log::Session do
172
258
 
173
259
  its(:rpms2?) { should be_false }
174
260
 
261
+ its(:latitudes?) { should be_false }
262
+
263
+ its(:longitudes?) { should be_false }
264
+
265
+ its(:gps_altitudes?) { should be_false }
266
+
267
+ specify { expect { subject.to_kml }.to raise_error(RuntimeError) }
268
+
175
269
  end
176
270
 
177
271
  end
@@ -1,3 +1,10 @@
1
+ require 'simplecov'
2
+ require 'simplecov-gem-adapter'
3
+ require 'simplecov-rcov'
4
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
5
+ SimpleCov.start 'gem' if ENV['COVERAGE']
6
+
7
+ require 'awesome_print'
1
8
  require 'pathname'
2
9
  require 'eagletree/log'
3
10
 
metadata CHANGED
@@ -1,18 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eagletree-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Nick Veys
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-06-03 00:00:00.000000000 Z
12
+ date: 2013-06-14 00:00:00.000000000 Z
12
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: awesome_print
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
13
30
  - !ruby/object:Gem::Dependency
14
31
  name: bundler
15
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
16
34
  requirements:
17
35
  - - ~>
18
36
  - !ruby/object:Gem::Version
@@ -20,6 +38,7 @@ dependencies:
20
38
  type: :development
21
39
  prerelease: false
22
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
23
42
  requirements:
24
43
  - - ~>
25
44
  - !ruby/object:Gem::Version
@@ -27,6 +46,7 @@ dependencies:
27
46
  - !ruby/object:Gem::Dependency
28
47
  name: ci_reporter
29
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
30
50
  requirements:
31
51
  - - '='
32
52
  - !ruby/object:Gem::Version
@@ -34,6 +54,7 @@ dependencies:
34
54
  type: :development
35
55
  prerelease: false
36
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
37
58
  requirements:
38
59
  - - '='
39
60
  - !ruby/object:Gem::Version
@@ -41,6 +62,7 @@ dependencies:
41
62
  - !ruby/object:Gem::Dependency
42
63
  name: rake
43
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
44
66
  requirements:
45
67
  - - ~>
46
68
  - !ruby/object:Gem::Version
@@ -48,6 +70,7 @@ dependencies:
48
70
  type: :development
49
71
  prerelease: false
50
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
51
74
  requirements:
52
75
  - - ~>
53
76
  - !ruby/object:Gem::Version
@@ -55,6 +78,7 @@ dependencies:
55
78
  - !ruby/object:Gem::Dependency
56
79
  name: rspec
57
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
58
82
  requirements:
59
83
  - - ~>
60
84
  - !ruby/object:Gem::Version
@@ -62,10 +86,75 @@ dependencies:
62
86
  type: :development
63
87
  prerelease: false
64
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
65
90
  requirements:
66
91
  - - ~>
67
92
  - !ruby/object:Gem::Version
68
93
  version: '2.12'
94
+ - !ruby/object:Gem::Dependency
95
+ name: simplecov
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simplecov-gem-adapter
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov-rcov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: ruby_kml
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: '0.1'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: '0.1'
69
158
  description: Read and interpret Eagle Tree telemetry log files.
70
159
  email:
71
160
  - nick@codelever.com
@@ -99,29 +188,29 @@ files:
99
188
  homepage: ''
100
189
  licenses:
101
190
  - MIT
102
- metadata: {}
103
191
  post_install_message:
104
192
  rdoc_options: []
105
193
  require_paths:
106
194
  - lib
107
195
  required_ruby_version: !ruby/object:Gem::Requirement
196
+ none: false
108
197
  requirements:
109
198
  - - ! '>='
110
199
  - !ruby/object:Gem::Version
111
200
  version: '0'
112
201
  required_rubygems_version: !ruby/object:Gem::Requirement
202
+ none: false
113
203
  requirements:
114
204
  - - ! '>='
115
205
  - !ruby/object:Gem::Version
116
206
  version: '0'
117
207
  requirements: []
118
208
  rubyforge_project:
119
- rubygems_version: 2.0.3
209
+ rubygems_version: 1.8.22
120
210
  signing_key:
121
- specification_version: 4
211
+ specification_version: 3
122
212
  summary: Eagle Tree telemetry log file reader
123
213
  test_files:
124
214
  - spec/file_spec.rb
125
215
  - spec/session_spec.rb
126
216
  - spec/spec_helper.rb
127
- has_rdoc: