mavlink-log 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/mavlink/log.rb +5 -1
- data/lib/mavlink/log/entry.rb +34 -0
- data/lib/mavlink/log/file.rb +16 -41
- data/lib/mavlink/log/header.rb +20 -0
- data/lib/mavlink/log/message.rb +83 -0
- data/lib/mavlink/log/messages/attitude.rb +37 -0
- data/lib/mavlink/log/messages/factory.rb +37 -0
- data/lib/mavlink/log/messages/global_position_int.rb +47 -0
- data/lib/mavlink/log/messages/gps_raw_int.rb +51 -0
- data/lib/mavlink/log/messages/heart_beat.rb +31 -0
- data/lib/mavlink/log/messages/messages.rb +15 -0
- data/lib/mavlink/log/messages/mission_current.rb +11 -0
- data/lib/mavlink/log/messages/nav_controller_output.rb +39 -0
- data/lib/mavlink/log/messages/param_request_list.rb +15 -0
- data/lib/mavlink/log/messages/param_value.rb +27 -0
- data/lib/mavlink/log/messages/raw_imu.rb +43 -0
- data/lib/mavlink/log/messages/rc_channels_raw.rb +47 -0
- data/lib/mavlink/log/messages/request_data_stream.rb +27 -0
- data/lib/mavlink/log/messages/scaled_pressure.rb +19 -0
- data/lib/mavlink/log/messages/servo_output_raw.rb +43 -0
- data/lib/mavlink/log/messages/sys_status.rb +64 -0
- data/lib/mavlink/log/messages/vfr_hud.rb +37 -0
- data/lib/mavlink/log/version.rb +1 -1
- data/spec/file_spec.rb +11 -1
- data/spec/messages/attitude_spec.rb +34 -0
- data/spec/messages/global_position_int_spec.rb +38 -0
- data/spec/messages/gps_raw_int_spec.rb +40 -0
- data/spec/messages/heart_beat_spec.rb +32 -0
- data/spec/messages/param_value_spec.rb +30 -0
- data/spec/messages/raw_imu_spec.rb +40 -0
- data/spec/messages/rc_channels_raw_spec.rb +42 -0
- data/spec/messages/sys_status_spec.rb +46 -0
- data/spec/messages/vfr_hud_spec.rb +32 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/shared_examples_for_message.rb +13 -0
- data/spec/support/shared_examples_for_timed_message_micro.rb +9 -0
- data/spec/support/shared_examples_for_timed_message_milli.rb +9 -0
- data/spec/sys_status_spec.rb +0 -0
- metadata +48 -3
- data/lib/mavlink/log/messages.rb +0 -138
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::Attitude do
|
4
|
+
|
5
|
+
let(:time) { ["0004E87DD12586BD"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE1CEB01011E"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["6533010081A986BB0EB69CBB2311D93F3CE3933AC0BB36BA80C911B9"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["4D46"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::Attitude.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
it_behaves_like 'a timed message (ms)', 78693
|
21
|
+
|
22
|
+
its(:roll) { should be_within(0.01).of(0.0) }
|
23
|
+
|
24
|
+
its(:pitch) { should be_within(0.01).of(0.0) }
|
25
|
+
|
26
|
+
its(:yaw) { should be_within(0.01).of(0.0) }
|
27
|
+
|
28
|
+
its(:rollspeed) { should be_within(0.01).of(1.695) }
|
29
|
+
|
30
|
+
its(:pitchspeed) { should be_within(0.01).of(0.0) }
|
31
|
+
|
32
|
+
its(:yawspeed) { should be_within(0.01).of(0.0) }
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::GlobalPositionInt do
|
4
|
+
|
5
|
+
let(:time) { ["0004D9EE608DF2D4"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE1CA7370121"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["0C260A00E065B117B3535BC140D31900C0E0FFFFF2FF0F00EEFF3C8C"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["FD73"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::GlobalPositionInt.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
it_behaves_like 'a timed message (ms)', 665100
|
21
|
+
|
22
|
+
its(:lat) { should be_within(0.0001).of(39.7501) }
|
23
|
+
|
24
|
+
its(:lon) { should be_within(0.0001).of(-105.0979) }
|
25
|
+
|
26
|
+
its(:alt) { should be_within(0.01).of(1692.48) }
|
27
|
+
|
28
|
+
its(:relative_alt) { should be_within(0.01).of(-8.0) }
|
29
|
+
|
30
|
+
its(:vx) { should be_within(0.01).of(-0.14) }
|
31
|
+
|
32
|
+
its(:vy) { should be_within(0.01).of(0.15) }
|
33
|
+
|
34
|
+
its(:vz) { should be_within(0.01).of(-0.18) }
|
35
|
+
|
36
|
+
its(:hdg) { should be_within(0.1).of(359.0) }
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::GpsRawInt do
|
4
|
+
|
5
|
+
let(:time) { ["0004d9ee608d5a08"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE1E9C370118"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["a091a127000000003066b11751535bc1959402000800ffff0500232d0305"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["c13a"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::GpsRawInt.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
it_behaves_like 'a timed message (us)', 664900000
|
21
|
+
|
22
|
+
its(:fix_type) { should eql(3) }
|
23
|
+
|
24
|
+
its(:lat) { should be_within(0.0001).of(39.7502) }
|
25
|
+
|
26
|
+
its(:lon) { should be_within(0.0001).of(-105.0979) }
|
27
|
+
|
28
|
+
its(:alt) { should be_within(0.01).of(169.11) }
|
29
|
+
|
30
|
+
its(:eph) { should be_within(0.01).of(0.08) }
|
31
|
+
|
32
|
+
its(:epv) { should be_within(0.01).of(655.35) }
|
33
|
+
|
34
|
+
its(:vel) { should be_within(0.01).of(0.05) }
|
35
|
+
|
36
|
+
its(:cog) { should be_within(0.01).of(115.55) }
|
37
|
+
|
38
|
+
its(:satellites_visible) { should eql(5) }
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::HeartBeat do
|
4
|
+
|
5
|
+
let(:time) { ["0004D9EE608AD128"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE09F7370100"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["01000000010AC10403"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["F8CE"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::HeartBeat.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
its(:type) { should eql(1) }
|
21
|
+
|
22
|
+
its(:autopilot) { should eql(0) }
|
23
|
+
|
24
|
+
its(:base_mode) { should eql(0) }
|
25
|
+
|
26
|
+
its(:custom_mode) { should eql(0xC10A0100) }
|
27
|
+
|
28
|
+
its(:system_status) { should eql(4) }
|
29
|
+
|
30
|
+
its(:mavlink_version) { should eql(3) }
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::ParamValue do
|
4
|
+
|
5
|
+
let(:time) { ["0004E87DCDB548F1"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE192D010116"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["0000BA4210010F014D4F545F544352565F4D41585043540002"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["6982"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::ParamValue.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
its(:param_value) { should be_within(0.01).of(93.0) }
|
21
|
+
|
22
|
+
its(:param_count) { should eql(272) }
|
23
|
+
|
24
|
+
its(:param_index) { should eql(271) }
|
25
|
+
|
26
|
+
its(:param_id) { should eql('MOT_TCRV_MAXPCT') }
|
27
|
+
|
28
|
+
its(:param_type) { should eql(2) }
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::RawImu do
|
4
|
+
|
5
|
+
let(:time) { ["0004D9EE608DA5E4"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE1AA237011B"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["4018A32700000000C6027F0155F4EE17F017B418000000000000"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["DD85"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::RawImu.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
it_behaves_like 'a timed message (us)', 665000000
|
21
|
+
|
22
|
+
its(:xacc) { should eql(710) }
|
23
|
+
|
24
|
+
its(:yacc) { should eql(383) }
|
25
|
+
|
26
|
+
its(:zacc) { should eql(-2987) }
|
27
|
+
|
28
|
+
its(:xgyro) { should eql(6126) }
|
29
|
+
|
30
|
+
its(:ygyro) { should eql(6128) }
|
31
|
+
|
32
|
+
its(:zgyro) { should eql(6324) }
|
33
|
+
|
34
|
+
its(:xmag) { should eql(0) }
|
35
|
+
|
36
|
+
its(:ymag) { should eql(0) }
|
37
|
+
|
38
|
+
its(:zmag) { should eql(0) }
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::RcChannelsRaw do
|
4
|
+
|
5
|
+
let(:time) { ["0004E87DD1249299"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE16E5010123"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["BA320100EE05F5054A04FA058207D905d905d9050000"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["71CD"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::RcChannelsRaw.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
it_behaves_like 'a timed message (ms)', 78522
|
21
|
+
|
22
|
+
its(:port) { should eql(0) }
|
23
|
+
|
24
|
+
its(:chan1_raw) { should eql(1518) }
|
25
|
+
|
26
|
+
its(:chan2_raw) { should eql(1525) }
|
27
|
+
|
28
|
+
its(:chan3_raw) { should eql(1098) }
|
29
|
+
|
30
|
+
its(:chan4_raw) { should eql(1530) }
|
31
|
+
|
32
|
+
its(:chan5_raw) { should eql(1922) }
|
33
|
+
|
34
|
+
its(:chan6_raw) { should eql(1497) }
|
35
|
+
|
36
|
+
its(:chan7_raw) { should eql(1497) }
|
37
|
+
|
38
|
+
its(:chan8_raw) { should eql(1497) }
|
39
|
+
|
40
|
+
its(:rssi) { should eql(0) }
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::SysStatus do
|
4
|
+
|
5
|
+
let(:time) { ["0004D9EE5A9C7690"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE09F7370100"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["2FFCFFFF2FACFFFF2FFCFFFF0000112BFFFF000000000000000000000000FF"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["E3E0"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::SysStatus.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
its(:onboard_control_sensors_present) { should eql(0xFFFFFC2F) }
|
21
|
+
|
22
|
+
its(:onboard_control_sensors_enabled) { should eql(0xFFFFAC2F) }
|
23
|
+
|
24
|
+
its(:onboard_control_sensors_health) { should eql(0xFFFFFC2F) }
|
25
|
+
|
26
|
+
its(:load) { should be_within(0.001).of(0.0) }
|
27
|
+
|
28
|
+
its(:voltage_battery) { should be_within(0.01).of(11.025) }
|
29
|
+
|
30
|
+
its(:current_battery) { should be_within(0.01).of(-0.01) }
|
31
|
+
|
32
|
+
its(:battery_remaining) { should eql(0) }
|
33
|
+
|
34
|
+
its(:drop_rate_comm) { should eql(0) }
|
35
|
+
|
36
|
+
its(:errors_comm) { should eql(0) }
|
37
|
+
|
38
|
+
its(:errors_count1) { should eql(0) }
|
39
|
+
|
40
|
+
its(:errors_count2) { should eql(0) }
|
41
|
+
|
42
|
+
its(:errors_count3) { should eql(0) }
|
43
|
+
|
44
|
+
its(:errors_count4) { should eql(65280) }
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MAVLink::Log::Messages::VfrHud do
|
4
|
+
|
5
|
+
let(:time) { ["0004d9ee608dc804"].pack('H*') }
|
6
|
+
|
7
|
+
let(:header) { MAVLink::Log::Header.new(["FE14A437014A"].pack('H*')) }
|
8
|
+
|
9
|
+
let(:payload) { ["713d8a3e8fc2753d5c8fd344000090c167010000"].pack('H*') }
|
10
|
+
|
11
|
+
let(:crc) { ["8C40"].pack('H*') }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
entry = MAVLink::Log::Entry.new(time, header, payload, crc)
|
15
|
+
MAVLink::Log::Messages::VfrHud.new(entry)
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like 'a message'
|
19
|
+
|
20
|
+
its(:airspeed) { should be_within(0.01).of(0.27) }
|
21
|
+
|
22
|
+
its(:groundspeed) { should be_within(0.01).of(0.06) }
|
23
|
+
|
24
|
+
its(:heading) { should eql(-28836) }
|
25
|
+
|
26
|
+
its(:throttle) { should eql(17619) }
|
27
|
+
|
28
|
+
its(:alt) { should be_within(0.1).of(-18.0) }
|
29
|
+
|
30
|
+
its(:climb) { should be_within(0.1).of(0.0) }
|
31
|
+
|
32
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,8 @@ require 'awesome_print'
|
|
8
8
|
require 'pathname'
|
9
9
|
require 'mavlink/log'
|
10
10
|
|
11
|
+
Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each { |f| require f }
|
12
|
+
|
11
13
|
RSpec.configure do |config|
|
12
14
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
15
|
config.run_all_when_everything_filtered = true
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mavlink-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Veys
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -150,8 +150,27 @@ files:
|
|
150
150
|
- README.md
|
151
151
|
- Rakefile
|
152
152
|
- lib/mavlink/log.rb
|
153
|
+
- lib/mavlink/log/entry.rb
|
153
154
|
- lib/mavlink/log/file.rb
|
154
|
-
- lib/mavlink/log/
|
155
|
+
- lib/mavlink/log/header.rb
|
156
|
+
- lib/mavlink/log/message.rb
|
157
|
+
- lib/mavlink/log/messages/attitude.rb
|
158
|
+
- lib/mavlink/log/messages/factory.rb
|
159
|
+
- lib/mavlink/log/messages/global_position_int.rb
|
160
|
+
- lib/mavlink/log/messages/gps_raw_int.rb
|
161
|
+
- lib/mavlink/log/messages/heart_beat.rb
|
162
|
+
- lib/mavlink/log/messages/messages.rb
|
163
|
+
- lib/mavlink/log/messages/mission_current.rb
|
164
|
+
- lib/mavlink/log/messages/nav_controller_output.rb
|
165
|
+
- lib/mavlink/log/messages/param_request_list.rb
|
166
|
+
- lib/mavlink/log/messages/param_value.rb
|
167
|
+
- lib/mavlink/log/messages/raw_imu.rb
|
168
|
+
- lib/mavlink/log/messages/rc_channels_raw.rb
|
169
|
+
- lib/mavlink/log/messages/request_data_stream.rb
|
170
|
+
- lib/mavlink/log/messages/scaled_pressure.rb
|
171
|
+
- lib/mavlink/log/messages/servo_output_raw.rb
|
172
|
+
- lib/mavlink/log/messages/sys_status.rb
|
173
|
+
- lib/mavlink/log/messages/vfr_hud.rb
|
155
174
|
- lib/mavlink/log/version.rb
|
156
175
|
- mavlink-log.gemspec
|
157
176
|
- spec/data/delete-me-soon.tlog
|
@@ -160,7 +179,20 @@ files:
|
|
160
179
|
- spec/data/invalid/empty.file
|
161
180
|
- spec/data/invalid/spektrum/1.TLM
|
162
181
|
- spec/file_spec.rb
|
182
|
+
- spec/messages/attitude_spec.rb
|
183
|
+
- spec/messages/global_position_int_spec.rb
|
184
|
+
- spec/messages/gps_raw_int_spec.rb
|
185
|
+
- spec/messages/heart_beat_spec.rb
|
186
|
+
- spec/messages/param_value_spec.rb
|
187
|
+
- spec/messages/raw_imu_spec.rb
|
188
|
+
- spec/messages/rc_channels_raw_spec.rb
|
189
|
+
- spec/messages/sys_status_spec.rb
|
190
|
+
- spec/messages/vfr_hud_spec.rb
|
163
191
|
- spec/spec_helper.rb
|
192
|
+
- spec/support/shared_examples_for_message.rb
|
193
|
+
- spec/support/shared_examples_for_timed_message_micro.rb
|
194
|
+
- spec/support/shared_examples_for_timed_message_milli.rb
|
195
|
+
- spec/sys_status_spec.rb
|
164
196
|
homepage: http://github.com/code-lever/mavlink-log
|
165
197
|
licenses:
|
166
198
|
- MIT
|
@@ -192,4 +224,17 @@ test_files:
|
|
192
224
|
- spec/data/invalid/empty.file
|
193
225
|
- spec/data/invalid/spektrum/1.TLM
|
194
226
|
- spec/file_spec.rb
|
227
|
+
- spec/messages/attitude_spec.rb
|
228
|
+
- spec/messages/global_position_int_spec.rb
|
229
|
+
- spec/messages/gps_raw_int_spec.rb
|
230
|
+
- spec/messages/heart_beat_spec.rb
|
231
|
+
- spec/messages/param_value_spec.rb
|
232
|
+
- spec/messages/raw_imu_spec.rb
|
233
|
+
- spec/messages/rc_channels_raw_spec.rb
|
234
|
+
- spec/messages/sys_status_spec.rb
|
235
|
+
- spec/messages/vfr_hud_spec.rb
|
195
236
|
- spec/spec_helper.rb
|
237
|
+
- spec/support/shared_examples_for_message.rb
|
238
|
+
- spec/support/shared_examples_for_timed_message_micro.rb
|
239
|
+
- spec/support/shared_examples_for_timed_message_milli.rb
|
240
|
+
- spec/sys_status_spec.rb
|