px4_log_reader 0.0.5
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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/README.md +43 -0
- data/Rakefile +124 -0
- data/lib/px4_log_reader/invalid_descriptor_error.rb +25 -0
- data/lib/px4_log_reader/log_buffer.rb +153 -0
- data/lib/px4_log_reader/log_file.rb +125 -0
- data/lib/px4_log_reader/log_message.rb +30 -0
- data/lib/px4_log_reader/message_descriptor.rb +185 -0
- data/lib/px4_log_reader/message_descriptor_cache.rb +56 -0
- data/lib/px4_log_reader/reader.rb +160 -0
- data/lib/px4_log_reader/version.rb +3 -0
- data/lib/px4_log_reader.rb +8 -0
- data/lib/px4log_parser.rb +228 -0
- data/px4_log_reader.gemspec +17 -0
- data/test/test.rb +33 -0
- data/test/test_files/pixhawk_descriptor_cache.px4mc +0 -0
- data/test/test_files/test_log.px4log +0 -0
- data/test/test_log_buffer.rb +173 -0
- data/test/test_log_file.rb +44 -0
- data/test/test_message_descriptor.rb +56 -0
- data/test/test_message_descriptor_cache.rb +70 -0
- data/test/test_reader.rb +127 -0
- metadata +81 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'px4_log_reader'
|
3
|
+
|
4
|
+
class TestLogFile < MiniTest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_read_descriptors
|
13
|
+
|
14
|
+
# log_file = open_log_file
|
15
|
+
# descriptors = Px4LogReader::LogFile.read_descriptors( log_file )
|
16
|
+
|
17
|
+
# puts "Found #{descriptors.count} descriptors"
|
18
|
+
# descriptors.each do |type,descriptor|
|
19
|
+
# puts " #{descriptor.name}"
|
20
|
+
# end
|
21
|
+
|
22
|
+
# log_file.close
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_read_message
|
27
|
+
|
28
|
+
# log_file = open_log_file
|
29
|
+
# descriptors = Px4LogReader::LogFile.read_descriptors( log_file )
|
30
|
+
|
31
|
+
# log_file.rewind
|
32
|
+
# message = Px4LogReader::LogFile.read_message( log_file, descriptors )
|
33
|
+
|
34
|
+
# puts message.descriptor
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def open_log_file
|
40
|
+
log_file = File.open( File.join( '/Volumes/rvaughan_share/Development/px4_log_reader_test_data', '2016-07-24', '17_18_36.px4log' ), 'r' )
|
41
|
+
log_file
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'px4_log_reader'
|
3
|
+
|
4
|
+
class TestMessageDescriptor < MiniTest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_build_format_specifier
|
13
|
+
|
14
|
+
px4_format_specifier = 'BBnNZ'
|
15
|
+
ruby_format_specifier =
|
16
|
+
Px4LogReader::MessageDescriptor.build_format_specifier( px4_format_specifier )
|
17
|
+
|
18
|
+
assert_equal 'CCA4A16A64', ruby_format_specifier
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_unpack_message
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_descriptor_from_message
|
26
|
+
|
27
|
+
fields = [ 0x24, 32, 'test', 'IIbMh', 'id,counts,flag,length,ord' ]
|
28
|
+
|
29
|
+
message = Px4LogReader::LogMessage.new(
|
30
|
+
Px4LogReader::FORMAT_MESSAGE,
|
31
|
+
fields )
|
32
|
+
|
33
|
+
descriptor = Px4LogReader::MessageDescriptor.new
|
34
|
+
assert_equal nil, descriptor.type
|
35
|
+
assert_equal nil, descriptor.name
|
36
|
+
assert_equal nil, descriptor.length
|
37
|
+
assert_equal nil, descriptor.format
|
38
|
+
assert_equal nil, descriptor.format_specifier
|
39
|
+
assert_equal true, descriptor.field_list.empty?
|
40
|
+
|
41
|
+
descriptor.from_message( message )
|
42
|
+
assert_equal 0x24, descriptor.type
|
43
|
+
assert_equal 'test', descriptor.name
|
44
|
+
assert_equal 32, descriptor.length
|
45
|
+
assert_equal 'IIbMh', descriptor.format
|
46
|
+
assert_equal 'LLcCs', descriptor.format_specifier
|
47
|
+
assert_equal false, descriptor.field_list.empty?
|
48
|
+
assert_equal 0, descriptor.field_list['id']
|
49
|
+
assert_equal 1, descriptor.field_list['counts']
|
50
|
+
assert_equal 2, descriptor.field_list['flag']
|
51
|
+
assert_equal 3, descriptor.field_list['length']
|
52
|
+
assert_equal 4, descriptor.field_list['ord']
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'px4_log_reader'
|
3
|
+
|
4
|
+
class TestMessageDescriptorCache < MiniTest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_write_read_descriptors
|
13
|
+
|
14
|
+
cache_filename = File.join( 'test', 'test_files', 'test_cache.px4mc' )
|
15
|
+
|
16
|
+
FileUtils.rm( cache_filename ) if File.exist? cache_filename
|
17
|
+
|
18
|
+
# Create a couple of descriptors
|
19
|
+
w_descriptors = {}
|
20
|
+
descriptor = Px4LogReader::MessageDescriptor.new({
|
21
|
+
name: 'FMT',
|
22
|
+
type: 0x80,
|
23
|
+
length: 89,
|
24
|
+
format: 'BBnNZ',
|
25
|
+
fields: [ "Type", "Length", "Name", "Format", "Labels" ] })
|
26
|
+
w_descriptors[ descriptor.type ] = descriptor.dup
|
27
|
+
|
28
|
+
descriptor = Px4LogReader::MessageDescriptor.new({
|
29
|
+
name: 'ATT',
|
30
|
+
type: 0x23,
|
31
|
+
length: 18,
|
32
|
+
format: 'LLBbff',
|
33
|
+
fields: [ "sec", "usec", "valid", "offset", "latitude", "longitude" ] })
|
34
|
+
w_descriptors[ descriptor.type ] = descriptor.dup
|
35
|
+
|
36
|
+
|
37
|
+
cache = Px4LogReader::MessageDescriptorCache.new( cache_filename )
|
38
|
+
assert_equal false, cache.exist?
|
39
|
+
|
40
|
+
cache.write_descriptors( w_descriptors )
|
41
|
+
assert_equal true, cache.exist?
|
42
|
+
|
43
|
+
r_descriptors = cache.read_descriptors
|
44
|
+
|
45
|
+
# assert_equal 2, r_descriptors.size
|
46
|
+
# assert_equal [ 0x23, 0x80 ], r_descriptors.keys.sort
|
47
|
+
|
48
|
+
w_descriptors.each do |type,w_descriptor|
|
49
|
+
|
50
|
+
assert_equal true, r_descriptors.keys.include?( type )
|
51
|
+
|
52
|
+
if r_descriptors.keys.include? type
|
53
|
+
|
54
|
+
r_descriptor = r_descriptors[ type ]
|
55
|
+
|
56
|
+
assert_equal w_descriptor.name, r_descriptor.name
|
57
|
+
assert_equal w_descriptor.type, r_descriptor.type
|
58
|
+
assert_equal w_descriptor.length, r_descriptor.length
|
59
|
+
assert_equal w_descriptor.format, r_descriptor.format
|
60
|
+
assert_equal w_descriptor.field_list.keys, r_descriptor.field_list.keys
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
FileUtils.rm( cache_filename )
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/test/test_reader.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'px4_log_reader'
|
3
|
+
|
4
|
+
class TestReader < MiniTest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_non_existent_log_file
|
10
|
+
|
11
|
+
nonexistent_filename = 'nonexistent_logfile.px4log'
|
12
|
+
|
13
|
+
exception = assert_raises Px4LogReader::FileNotFoundError do
|
14
|
+
reader = Px4LogReader.open!( nonexistent_filename )
|
15
|
+
end
|
16
|
+
|
17
|
+
exception = assert_raises Px4LogReader::FileNotFoundError do
|
18
|
+
Px4LogReader.open!( nonexistent_filename ) do |reader|
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_non_existent_log_file_no_except
|
25
|
+
|
26
|
+
nonexistent_filename = 'nonexistent_logfile.px4log'
|
27
|
+
|
28
|
+
assert_nil Px4LogReader.open( nonexistent_filename )
|
29
|
+
|
30
|
+
Px4LogReader.open( nonexistent_filename ) do |reader|
|
31
|
+
assert_nil reader
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_reader
|
36
|
+
|
37
|
+
log_file_opened = false
|
38
|
+
log_filename = File.join( 'test', 'test_files', 'test_log.px4log' )
|
39
|
+
|
40
|
+
Px4LogReader.open( log_filename ) do |reader|
|
41
|
+
|
42
|
+
log_file_opened = true
|
43
|
+
|
44
|
+
# Verify that all expected descriptors are read.
|
45
|
+
descriptors = reader.descriptors
|
46
|
+
assert_equal Hash, descriptors.class
|
47
|
+
assert_equal false, descriptors.empty?
|
48
|
+
|
49
|
+
assert_equal true, all_descriptors_found( descriptors )
|
50
|
+
|
51
|
+
|
52
|
+
# The log file associated with this test case contains the following
|
53
|
+
# messages in the specified order. Validate the order and context.
|
54
|
+
#
|
55
|
+
# 1) TIME
|
56
|
+
# 2) STAT
|
57
|
+
# 3) IMU
|
58
|
+
# 4) SENS
|
59
|
+
# 5) IMU1
|
60
|
+
# 6) VTOL
|
61
|
+
# 7) GPS
|
62
|
+
#
|
63
|
+
index = 0
|
64
|
+
expected_message_names = ['TIME','STAT','IMU','SENS','IMU1','VTOL','GPS']
|
65
|
+
expected_message_types = [0x81,0x0A,0x04,0x05,0x16,0x2B,0x08]
|
66
|
+
|
67
|
+
reader.each_message do |message,context|
|
68
|
+
|
69
|
+
expected_name = expected_message_names[ index ]
|
70
|
+
expected_type = expected_message_types[ index ]
|
71
|
+
|
72
|
+
assert_equal expected_name, message.descriptor.name
|
73
|
+
assert_equal expected_type, message.descriptor.type
|
74
|
+
|
75
|
+
context_message = context.find_by_name( expected_name )
|
76
|
+
refute_nil context_message
|
77
|
+
assert_equal expected_name, context_message.descriptor.name
|
78
|
+
|
79
|
+
context_message = context.find_by_type( expected_type )
|
80
|
+
refute_nil context_message
|
81
|
+
assert_equal expected_type, context_message.descriptor.type
|
82
|
+
|
83
|
+
index += 1
|
84
|
+
assert_equal index, context.messages.size
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
index = 0
|
90
|
+
expected_message_names = ['TIME','IMU','SENS','VTOL','GPS']
|
91
|
+
expected_message_types = [0x81,0x04,0x05,0x2B,0x08]
|
92
|
+
|
93
|
+
reader.each_message( { without: ['STAT','IMU1'] } ) do |message,context|
|
94
|
+
|
95
|
+
expected_name = expected_message_names[ index ]
|
96
|
+
expected_type = expected_message_types[ index ]
|
97
|
+
|
98
|
+
assert_equal expected_name, message.descriptor.name
|
99
|
+
assert_equal expected_type, message.descriptor.type
|
100
|
+
|
101
|
+
context_message = context.find_by_name( expected_name )
|
102
|
+
refute_nil context_message
|
103
|
+
assert_equal expected_name, context_message.descriptor.name
|
104
|
+
|
105
|
+
context_message = context.find_by_type( expected_type )
|
106
|
+
refute_nil context_message
|
107
|
+
assert_equal expected_type, context_message.descriptor.type
|
108
|
+
|
109
|
+
index += 1
|
110
|
+
assert_equal index, context.messages.size
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
assert_equal true, log_file_opened
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
def all_descriptors_found( descriptors )
|
123
|
+
# TODO: Validate all descriptors?
|
124
|
+
return true
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: px4_log_reader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robert Glissmann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
27
|
+
description: Px4LogReader is a gem for parsing PX4-format flight logs generated by
|
28
|
+
the Pixhawk.
|
29
|
+
email: Robert.Glissmann@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".gitignore"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- lib/px4_log_reader.rb
|
38
|
+
- lib/px4_log_reader/invalid_descriptor_error.rb
|
39
|
+
- lib/px4_log_reader/log_buffer.rb
|
40
|
+
- lib/px4_log_reader/log_file.rb
|
41
|
+
- lib/px4_log_reader/log_message.rb
|
42
|
+
- lib/px4_log_reader/message_descriptor.rb
|
43
|
+
- lib/px4_log_reader/message_descriptor_cache.rb
|
44
|
+
- lib/px4_log_reader/reader.rb
|
45
|
+
- lib/px4_log_reader/version.rb
|
46
|
+
- lib/px4log_parser.rb
|
47
|
+
- px4_log_reader.gemspec
|
48
|
+
- test/test.rb
|
49
|
+
- test/test_files/pixhawk_descriptor_cache.px4mc
|
50
|
+
- test/test_files/test_log.px4log
|
51
|
+
- test/test_log_buffer.rb
|
52
|
+
- test/test_log_file.rb
|
53
|
+
- test/test_message_descriptor.rb
|
54
|
+
- test/test_message_descriptor_cache.rb
|
55
|
+
- test/test_reader.rb
|
56
|
+
homepage: https://github.com/rgmann/px4_log_reader
|
57
|
+
licenses:
|
58
|
+
- BSD
|
59
|
+
metadata: {}
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 2.4.5.1
|
77
|
+
signing_key:
|
78
|
+
specification_version: 4
|
79
|
+
summary: PX4 flight log reader
|
80
|
+
test_files: []
|
81
|
+
has_rdoc:
|