eagletree-log 0.0.5 → 0.0.6

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.
@@ -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: