rfbeam 0.3.5 → 0.4.0
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 +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +28 -1
- data/exe/rfbeam +5 -0
- data/lib/rfbeam/cli.rb +130 -0
- data/lib/rfbeam/kld7/constants.rb +2 -2
- data/lib/rfbeam/kld7/radar_messages.rb +38 -25
- data/lib/rfbeam/kld7/radar_parameters.rb +17 -8
- data/lib/rfbeam/kld7/streamer.rb +75 -0
- data/lib/rfbeam/version.rb +1 -1
- data/lib/rfbeam.rb +4 -1
- data/output.csv +257 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19f39170dee64099fe6806a345393beff434035df70fe525fa31b361468cac9e
|
4
|
+
data.tar.gz: 622aba1c5ab9f85fdb8cadf90f10339344306db39ab9299b2ef8b437d228d82d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57bd136ef560a32dab06e08c841b44e6e1b192525d9d3d44db1a88885c0b30b9b9b28ab28b1f408d628e191195373a012d31405ae24372fa4efd76ecbb3af46c
|
7
|
+
data.tar.gz: 5dc08c9c71c511e210a4c30599248bb5be53f1ccd7373af73edeb1ff35043dc76b90235bf46de93b9b755123af598225d6b96f06f6c0c5ab89bf4d1bc2e81d57
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -10,3 +10,13 @@ gem "rake", "~> 13.0"
|
|
10
10
|
gem "minitest", "~> 5.0"
|
11
11
|
|
12
12
|
gem "rubocop", "~> 1.21"
|
13
|
+
|
14
|
+
gem "tty-table", "~> 0.12.0"
|
15
|
+
|
16
|
+
gem "tty-spinner", "~> 0.9.3"
|
17
|
+
|
18
|
+
gem "unicode_plot", "~> 0.0.5"
|
19
|
+
|
20
|
+
gem "tty-logger", "~> 0.6.0"
|
21
|
+
|
22
|
+
gem "tty-screen", "~> 0.8.1"
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rfbeam (0.
|
4
|
+
rfbeam (0.4.0)
|
5
5
|
activesupport (~> 6.1.0)
|
6
6
|
rubyserial (~> 0.6.0)
|
7
7
|
thor (~> 1.2.1)
|
@@ -17,6 +17,7 @@ GEM
|
|
17
17
|
zeitwerk (~> 2.3)
|
18
18
|
ast (2.4.2)
|
19
19
|
concurrent-ruby (1.1.10)
|
20
|
+
enumerable-statistics (2.0.7)
|
20
21
|
ffi (1.15.5)
|
21
22
|
i18n (1.12.0)
|
22
23
|
concurrent-ruby (~> 1.0)
|
@@ -25,6 +26,8 @@ GEM
|
|
25
26
|
parallel (1.22.1)
|
26
27
|
parser (3.1.3.0)
|
27
28
|
ast (~> 2.4.1)
|
29
|
+
pastel (0.8.0)
|
30
|
+
tty-color (~> 0.5)
|
28
31
|
rainbow (3.1.1)
|
29
32
|
rake (13.0.6)
|
30
33
|
regexp_parser (2.6.1)
|
@@ -44,10 +47,29 @@ GEM
|
|
44
47
|
ruby-progressbar (1.11.0)
|
45
48
|
rubyserial (0.6.0)
|
46
49
|
ffi (~> 1.9, >= 1.9.3)
|
50
|
+
strings (0.2.1)
|
51
|
+
strings-ansi (~> 0.2)
|
52
|
+
unicode-display_width (>= 1.5, < 3.0)
|
53
|
+
unicode_utils (~> 1.4)
|
54
|
+
strings-ansi (0.2.0)
|
47
55
|
thor (1.2.1)
|
56
|
+
tty-color (0.6.0)
|
57
|
+
tty-cursor (0.7.1)
|
58
|
+
tty-logger (0.6.0)
|
59
|
+
pastel (~> 0.8)
|
60
|
+
tty-screen (0.8.1)
|
61
|
+
tty-spinner (0.9.3)
|
62
|
+
tty-cursor (~> 0.7)
|
63
|
+
tty-table (0.12.0)
|
64
|
+
pastel (~> 0.8)
|
65
|
+
strings (~> 0.2.0)
|
66
|
+
tty-screen (~> 0.8)
|
48
67
|
tzinfo (2.0.5)
|
49
68
|
concurrent-ruby (~> 1.0)
|
50
69
|
unicode-display_width (2.3.0)
|
70
|
+
unicode_plot (0.0.5)
|
71
|
+
enumerable-statistics (>= 2.0.1)
|
72
|
+
unicode_utils (1.4.0)
|
51
73
|
zeitwerk (2.6.6)
|
52
74
|
|
53
75
|
PLATFORMS
|
@@ -59,6 +81,11 @@ DEPENDENCIES
|
|
59
81
|
rake (~> 13.0)
|
60
82
|
rfbeam!
|
61
83
|
rubocop (~> 1.21)
|
84
|
+
tty-logger (~> 0.6.0)
|
85
|
+
tty-screen (~> 0.8.1)
|
86
|
+
tty-spinner (~> 0.9.3)
|
87
|
+
tty-table (~> 0.12.0)
|
88
|
+
unicode_plot (~> 0.0.5)
|
62
89
|
|
63
90
|
BUNDLED WITH
|
64
91
|
2.4.10
|
data/exe/rfbeam
ADDED
data/lib/rfbeam/cli.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# rubocop:disable all
|
2
|
+
require 'thor'
|
3
|
+
require 'rfbeam'
|
4
|
+
require 'tty-table'
|
5
|
+
require 'tty-logger'
|
6
|
+
require 'tty-spinner'
|
7
|
+
require 'io/console'
|
8
|
+
require 'unicode_plot'
|
9
|
+
|
10
|
+
module RfBeam
|
11
|
+
class CLI < Thor
|
12
|
+
|
13
|
+
attr_accessor :radar, :logger
|
14
|
+
|
15
|
+
desc 'list', 'List available radar modules'
|
16
|
+
def list
|
17
|
+
devices = RfBeam.connected
|
18
|
+
@logger.warning 'No Radar modules found.' unless devices.count.positive?
|
19
|
+
|
20
|
+
table = TTY::Table.new( header: ['id', 'Path', 'Version'])
|
21
|
+
|
22
|
+
devices.each.with_index do |path, index|
|
23
|
+
table << ["R#{index}", path, @radar.sw_version]
|
24
|
+
end
|
25
|
+
puts table.render(:ascii)
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'config <radar_id>', 'Shows the parameter setting for the Radar module'
|
29
|
+
def config(radar_id)
|
30
|
+
init_radar(radar_id)
|
31
|
+
puts @radar.config
|
32
|
+
end
|
33
|
+
|
34
|
+
desc 'set_param <radar_id> <key> <value>', 'Set radar parameters, see readme for keys'
|
35
|
+
def set_param(radar_id, param, value)
|
36
|
+
return logger.warning("Invalid param: '#{param}'") unless RfBeam::K_ld7::RADAR_PARAMETERS.include?(param.to_sym)
|
37
|
+
|
38
|
+
init_radar radar_id
|
39
|
+
@radar.send("#{param}=", value.to_i)
|
40
|
+
logger.success "Set #{@radar.formatted_parameter(param.to_sym)}"
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'ddat <radar_id>', 'stream any valid detections, stop stream with q and enter'
|
44
|
+
option :stream, type: :boolean, aliases: '-s', desc: "Stream the data from the device"
|
45
|
+
def ddat(radar_id)
|
46
|
+
init_radar radar_id
|
47
|
+
|
48
|
+
if options[:stream]
|
49
|
+
Thread.new { monitor_keypress }
|
50
|
+
spinner = TTY::Spinner.new("[:spinner] :title ", format: :bouncing_ball)
|
51
|
+
loop do
|
52
|
+
break if @stop_streaming
|
53
|
+
spinner.spin
|
54
|
+
data = @radar.ddat
|
55
|
+
spinner.update title: "Searching... #{data}"
|
56
|
+
spinner.success @radar.tdat if data[2] == 1
|
57
|
+
end
|
58
|
+
spinner.stop
|
59
|
+
puts "\nTask Quit."
|
60
|
+
else
|
61
|
+
puts "\n#{@radar.ddat}"
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
desc 'pdat <radar_id>', 'Display Tracked Targets'
|
67
|
+
def pdat(radar_id)
|
68
|
+
init_radar radar_id
|
69
|
+
puts @radar.pdat
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "rfft <radar_id>", "Display the dopplar radar data as a plot"
|
73
|
+
option :stream, type: :boolean, aliases: '-s', desc: "Stream the data from the device"
|
74
|
+
option :period, type: :numeric, aliases: '-p', default: 0.5, desc: "Update period (in seconds) for the streaming data"
|
75
|
+
def rfft(radar_id)
|
76
|
+
init_radar(radar_id)
|
77
|
+
|
78
|
+
if options[:stream]
|
79
|
+
streamer = RfBeam::KLD7::Streamer.new(@radar)
|
80
|
+
streamer.rfft
|
81
|
+
else
|
82
|
+
plot = rfft_plot(@radar)
|
83
|
+
p plot.render
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def init_radar(id)
|
90
|
+
devices = RfBeam.connected
|
91
|
+
@logger = TTY::Logger.new
|
92
|
+
return @logger.warning 'No Radar modules found.' unless devices.count.positive?
|
93
|
+
|
94
|
+
@radar = RfBeam::K_ld7.new(devices[id.to_i])
|
95
|
+
end
|
96
|
+
|
97
|
+
def plot_data(data)
|
98
|
+
{ x: Array(-128...128), series1: data.shift(256).map { |value| value / 100 }, series2: data.shift(256).map { |value| value.to_i / 100 } }
|
99
|
+
end
|
100
|
+
|
101
|
+
def monitor_keypress
|
102
|
+
loop do
|
103
|
+
key = STDIN.getch
|
104
|
+
if key.downcase == 'q'
|
105
|
+
@stop_streaming = true
|
106
|
+
break
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def rfft_plot(radar)
|
112
|
+
speed = radar.max_speed
|
113
|
+
speed_label = radar.formatted_parameter(:max_speed)
|
114
|
+
xlim = [speed - speed * 2, speed]
|
115
|
+
data = plot_data(radar.rfft)
|
116
|
+
plot = UnicodePlot.lineplot(
|
117
|
+
data[:x],
|
118
|
+
data[:series1],
|
119
|
+
name: 'IF1/2 Averaged',
|
120
|
+
title: 'Raw FFT',
|
121
|
+
height: 25,
|
122
|
+
width: 120,
|
123
|
+
xlabel: "Speed (km/h), #{speed_label}",
|
124
|
+
ylabel: 'Signal (db)', xlim: [-128, 128],
|
125
|
+
ylim: [0, 100])
|
126
|
+
UnicodePlot.lineplot!(plot, data[:x], data[:series2], name: "Threshold")
|
127
|
+
plot
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -29,7 +29,7 @@ module RfBeam
|
|
29
29
|
range: %w[Far Near],
|
30
30
|
speed: %w[Low High]
|
31
31
|
}.freeze
|
32
|
-
|
32
|
+
|
33
33
|
Param = Data.define(:name, :grps_index, :description, :default, :units, :values) do |_param|
|
34
34
|
def initialize(name:, grps_index:, description: nil, default: nil, units: nil, values: [])
|
35
35
|
super(name:, grps_index:, description:, default:, units:, values:)
|
@@ -41,7 +41,7 @@ module RfBeam
|
|
41
41
|
base_frequency: Param.new( name: 'Base Frequency', grps_index: 3, description: '0 = Low, 1 = Middle, 2 = High', default: 1, values: ['Low', 'Middle', 'High'] ),
|
42
42
|
max_speed: Param.new( name: 'Maximum Speed', grps_index: 4, description: '0 = 12km/h, 1 = 25km/h, 2 = 50km/h, 3 = 100km/h', default: 1, units: 'km/h', values: ['12.5', '25', '50', '100'] ),
|
43
43
|
max_range: Param.new( name: 'Maximum Range', grps_index: 5, description: '0 = 5m, 1 = 10m, 2 = 30m, 3 = 100m', default: 1, values: %w[5m 10m 30m 100m] ),
|
44
|
-
|
44
|
+
threshold_offset: Param.new( name: 'Threshold Offset', grps_index: 6, description: '10db - 60db', default: 30, units: 'db' ),
|
45
45
|
tracking_filter: Param.new( name: 'Tracking Filter Type', grps_index: 7, description: '0 = Standard, 2 = Fast Detection, 3 = Long Visibility', default: 0, values: ['standard', 'Fast Detection', 'Long Visibility'] ),
|
46
46
|
vibration_suppression: Param.new( name: 'Vibration Suppression', grps_index: 8, description: '0-16, 0 = No Suppression, 16 = High Suppression', default: 2 ),
|
47
47
|
min_detection_distance: Param.new( name: 'Minimum Detection Distance', grps_index: 9, description: '0 - 100% of range setting', default: 0, units: '%' ),
|
@@ -1,9 +1,19 @@
|
|
1
|
+
require 'csv'
|
2
|
+
|
1
3
|
module RfBeam
|
2
4
|
module KLD7
|
3
5
|
def detection?
|
4
6
|
data = ddat
|
5
7
|
(data[2] == 1)
|
6
8
|
end
|
9
|
+
|
10
|
+
def rfft
|
11
|
+
request_frame_data(:rfft)
|
12
|
+
|
13
|
+
resp = read(1032).unpack('a4LS256S256')
|
14
|
+
resp.shift 2
|
15
|
+
resp
|
16
|
+
end
|
7
17
|
|
8
18
|
def pdat(formatted: false)
|
9
19
|
request_frame_data(:pdat)
|
@@ -30,23 +40,18 @@ module RfBeam
|
|
30
40
|
|
31
41
|
def ddat
|
32
42
|
request_frame_data(:ddat)
|
33
|
-
|
34
|
-
read(14).unpack('a4LC6')
|
43
|
+
flags = %w[Low High]
|
44
|
+
array = read(14).unpack('a4LC6')
|
45
|
+
{ label: array[0],
|
46
|
+
detection: DETECTION_FLAGS[:detection][array[2]],
|
47
|
+
micro_detection: DETECTION_FLAGS[:micro_detection][array[3]],
|
48
|
+
angle: DETECTION_FLAGS[:angle][array[4]],
|
49
|
+
direction: DETECTION_FLAGS[:direction][array[5]],
|
50
|
+
range: DETECTION_FLAGS[:range][array[6]],
|
51
|
+
speed: DETECTION_FLAGS[:speed][array[7]]
|
52
|
+
}
|
35
53
|
end
|
36
54
|
|
37
|
-
def config
|
38
|
-
puts formatted_grps(grps)
|
39
|
-
end
|
40
|
-
|
41
|
-
def formatted_parameter(param)
|
42
|
-
return unless PARAMETERS.include? param
|
43
|
-
|
44
|
-
param_data = PARAMETERS[param]
|
45
|
-
grps_data = grps
|
46
|
-
index = grps_data[param_data[:grps_index]]
|
47
|
-
param_data[:values][index]
|
48
|
-
end
|
49
|
-
|
50
55
|
# Get the radar parameter structure
|
51
56
|
def grps
|
52
57
|
command = ['GRPS', 0]
|
@@ -54,7 +59,25 @@ module RfBeam
|
|
54
59
|
check_response
|
55
60
|
read(50).unpack('a4LA19C8c2C4cCCCCSCC')
|
56
61
|
end
|
62
|
+
|
63
|
+
def config
|
64
|
+
data = grps
|
65
|
+
output = "\n"
|
66
|
+
RADAR_PARAMETERS.keys.each do |key|
|
67
|
+
output << formatted_parameter(key, data[RADAR_PARAMETERS[key].grps_index])
|
68
|
+
end
|
69
|
+
output
|
70
|
+
end
|
57
71
|
|
72
|
+
def formatted_parameter(param, value = nil)
|
73
|
+
param = RADAR_PARAMETERS[param]
|
74
|
+
if value.nil?
|
75
|
+
data = grps
|
76
|
+
value = data[param.grps_index]
|
77
|
+
end
|
78
|
+
param_str_value = param.values.empty? ? value.to_s : param.values[value]
|
79
|
+
"#{param.name}: #{param_str_value}#{param.units}\n"
|
80
|
+
end
|
58
81
|
|
59
82
|
private
|
60
83
|
|
@@ -67,15 +90,5 @@ module RfBeam
|
|
67
90
|
write command.pack('a4LL')
|
68
91
|
check_response
|
69
92
|
end
|
70
|
-
|
71
|
-
def formatted_grps(data)
|
72
|
-
output = "\n"
|
73
|
-
RADAR_PARAMETERS.each do |param|
|
74
|
-
param = param[1]
|
75
|
-
value = param.values.empty? ? data[param.grps_index] : param.values[data[param.grps_index].to_i]
|
76
|
-
output << "#{param.name}: #{value}#{param.units}\n"
|
77
|
-
end
|
78
|
-
output
|
79
|
-
end
|
80
93
|
end
|
81
94
|
end
|
@@ -1,6 +1,13 @@
|
|
1
1
|
module RfBeam
|
2
2
|
module KLD7
|
3
3
|
|
4
|
+
# -----------------
|
5
|
+
# Software Version, 'K-LD7_APP-RFB-XXXX'
|
6
|
+
# -----------------
|
7
|
+
def sw_version
|
8
|
+
query_parameter RADAR_PARAMETERS[:sw_version].grps_index
|
9
|
+
end
|
10
|
+
|
4
11
|
# -----------------
|
5
12
|
# Base Frequency, 0 = low, 1 = middle (default), 2 = high
|
6
13
|
# -----------------
|
@@ -52,6 +59,7 @@ module RfBeam
|
|
52
59
|
|
53
60
|
def max_range=(range = 1)
|
54
61
|
raise ArgumentError, "Invalid arg: '#{range}'" unless (0..3).include?(range)
|
62
|
+
raise ArgumentError, "Expected an Integer" unless range.is_a?(Integer)
|
55
63
|
|
56
64
|
set_parameter :rrai, range, :uint32
|
57
65
|
end
|
@@ -68,7 +76,7 @@ module RfBeam
|
|
68
76
|
|
69
77
|
def threshold_offset=(offset = 30)
|
70
78
|
raise ArgumentError, "Invalid arg: '#{offset}'" unless (10..60).include?(offset)
|
71
|
-
raise ArgumentError, "Expected an Integer" unless
|
79
|
+
raise ArgumentError, "Expected an Integer" unless offset.is_a?(Integer)
|
72
80
|
|
73
81
|
set_parameter :thof, offset, :uint32
|
74
82
|
end
|
@@ -83,13 +91,14 @@ module RfBeam
|
|
83
91
|
query_parameter RADAR_PARAMETERS[:tracking_filter].grps_index
|
84
92
|
end
|
85
93
|
|
86
|
-
def
|
94
|
+
def tracking_filter=(type = 0)
|
87
95
|
raise ArgumentError, "Invalid arg: '#{type}'" unless (0..2).include?(type)
|
88
96
|
raise ArgumentError, "Expected an Integer" unless type.is_a?(Integer)
|
89
97
|
|
90
98
|
set_parameter :trft, type, :uint32
|
91
99
|
end
|
92
|
-
alias trtf
|
100
|
+
alias trtf= tracking_filter=
|
101
|
+
alias set_tracking_filter tracking_filter=
|
93
102
|
|
94
103
|
# -----------------
|
95
104
|
# Vibration suppression, 0 - 16, 0 = No Suppression, 16 = High Suppression, default = 2
|
@@ -271,7 +280,7 @@ module RfBeam
|
|
271
280
|
# Digital output 1, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 0
|
272
281
|
# -----------------
|
273
282
|
def digital_output1
|
274
|
-
query_parameter RADAR_PARAMETERS[:digital_output1]grps_index
|
283
|
+
query_parameter RADAR_PARAMETERS[:digital_output1].grps_index
|
275
284
|
end
|
276
285
|
|
277
286
|
def digital_output1=(value = 0)
|
@@ -287,7 +296,7 @@ module RfBeam
|
|
287
296
|
# Digital output 2, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 1
|
288
297
|
# -----------------
|
289
298
|
def digital_output2
|
290
|
-
query_parameter RADAR_PARAMETERS[:digital_output2]grps_index
|
299
|
+
query_parameter RADAR_PARAMETERS[:digital_output2].grps_index
|
291
300
|
end
|
292
301
|
|
293
302
|
def digital_output2=(value = 1)
|
@@ -296,7 +305,7 @@ module RfBeam
|
|
296
305
|
|
297
306
|
set_parameter :dig2, value, :uint32
|
298
307
|
end
|
299
|
-
alias dig2=
|
308
|
+
alias dig2= digital_output2=
|
300
309
|
alias set_digital_output2 digital_output2=
|
301
310
|
|
302
311
|
# -----------------
|
@@ -360,8 +369,8 @@ module RfBeam
|
|
360
369
|
|
361
370
|
set_parameter :mids, value, :uint32
|
362
371
|
end
|
363
|
-
alias mids=
|
364
|
-
alias set_micro_detection_sensitivity
|
372
|
+
alias mids= micro_detection_sensitivity=
|
373
|
+
alias set_micro_detection_sensitivity micro_detection_sensitivity=
|
365
374
|
|
366
375
|
private
|
367
376
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# rubocop:disable all
|
2
|
+
require 'unicode_plot'
|
3
|
+
require 'io/console'
|
4
|
+
require "stringio"
|
5
|
+
require 'tty-screen'
|
6
|
+
|
7
|
+
module RfBeam
|
8
|
+
module KLD7
|
9
|
+
class Streamer
|
10
|
+
attr_accessor :radar
|
11
|
+
|
12
|
+
def initialize(radar)
|
13
|
+
@radar = radar
|
14
|
+
end
|
15
|
+
|
16
|
+
def monitor_keypress
|
17
|
+
loop do
|
18
|
+
key = STDIN.getch
|
19
|
+
if key.downcase == "q"
|
20
|
+
@stop_streaming = true
|
21
|
+
break
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def rfft
|
27
|
+
out = StringIO.new
|
28
|
+
def out.tty?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
Thread.new { monitor_keypress }
|
33
|
+
|
34
|
+
loop do
|
35
|
+
out.truncate(0)
|
36
|
+
|
37
|
+
plot = rfft_plot(@radar)
|
38
|
+
plot.render(out)
|
39
|
+
|
40
|
+
lines = out.string.lines
|
41
|
+
lines.each { |line| $stdout.print "\r#{line}" }
|
42
|
+
$stdout.print "\e[0J"
|
43
|
+
$stdout.flush
|
44
|
+
break if @stop_streaming
|
45
|
+
|
46
|
+
n = lines.count
|
47
|
+
$stdout.print "\e[#{n}F"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def plot_data(data)
|
54
|
+
{ x: Array(-128...128), series1: data.shift(256).map { |value| value / 100 }, series2: data.shift(256).map { |value| value.to_i / 100 } }
|
55
|
+
end
|
56
|
+
|
57
|
+
def rfft_plot(radar)
|
58
|
+
width = TTY::Screen.width * 0.65
|
59
|
+
data = plot_data(radar.rfft)
|
60
|
+
plot = UnicodePlot.lineplot(
|
61
|
+
data[:x],
|
62
|
+
data[:series1],
|
63
|
+
name: 'IF1/2 Averaged',
|
64
|
+
title: 'Raw FFT',
|
65
|
+
height: 25,
|
66
|
+
width: width,
|
67
|
+
xlabel: "Speed (km/h)",
|
68
|
+
ylabel: 'Signal (db)', xlim: [-128, 128],
|
69
|
+
ylim: [0, 100])
|
70
|
+
UnicodePlot.lineplot!(plot, data[:x], data[:series2], name: "Threshold")
|
71
|
+
plot
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/rfbeam/version.rb
CHANGED
data/lib/rfbeam.rb
CHANGED
@@ -4,7 +4,10 @@ require 'rfbeam/kld7/radar_parameters'
|
|
4
4
|
require 'rfbeam/kld7/radar_messages'
|
5
5
|
require 'rfbeam/kld7/serial_connection'
|
6
6
|
require 'rfbeam/kld7/constants'
|
7
|
-
|
7
|
+
require 'rfbeam/kld7/streamer'
|
8
|
+
require 'rfbeam/version'
|
9
|
+
require 'rfbeam/cli'
|
10
|
+
|
8
11
|
|
9
12
|
module RfBeam
|
10
13
|
class Error < StandardError
|
data/output.csv
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
0,2105,2105
|
2
|
+
1,3070,2915
|
3
|
+
2,2915,805
|
4
|
+
3,2325,2830
|
5
|
+
4,805,3420
|
6
|
+
5,1000,1340
|
7
|
+
6,2830,1555
|
8
|
+
7,3810,2645
|
9
|
+
8,3420,1270
|
10
|
+
9,1645,1400
|
11
|
+
10,1340,1130
|
12
|
+
11,1285,1350
|
13
|
+
12,1555,1085
|
14
|
+
13,1500,910
|
15
|
+
14,2645,1400
|
16
|
+
15,2785,1435
|
17
|
+
16,1270,1150
|
18
|
+
17,500,1545
|
19
|
+
18,1400,1270
|
20
|
+
19,615,1285
|
21
|
+
20,1130,1435
|
22
|
+
21,1000,785
|
23
|
+
22,1350,710
|
24
|
+
23,1565,955
|
25
|
+
24,1085,1165
|
26
|
+
25,1420,1645
|
27
|
+
26,910,1595
|
28
|
+
27,1265,455
|
29
|
+
28,1400,805
|
30
|
+
29,1015,1050
|
31
|
+
30,1435,560
|
32
|
+
31,1060,1530
|
33
|
+
32,1150,3275
|
34
|
+
33,305,3510
|
35
|
+
34,1545,650
|
36
|
+
35,765,1415
|
37
|
+
36,1270,1760
|
38
|
+
37,785,650
|
39
|
+
38,1285,830
|
40
|
+
39,980,560
|
41
|
+
40,1435,850
|
42
|
+
41,1085,0
|
43
|
+
42,785,480
|
44
|
+
43,1340,1150
|
45
|
+
44,710,910
|
46
|
+
45,1210,1050
|
47
|
+
46,955,500
|
48
|
+
47,1000,1230
|
49
|
+
48,1165,1040
|
50
|
+
49,1060,955
|
51
|
+
50,1645,910
|
52
|
+
51,2200,150
|
53
|
+
52,1595,455
|
54
|
+
53,1085,150
|
55
|
+
54,455,830
|
56
|
+
55,1400,455
|
57
|
+
56,805,500
|
58
|
+
57,1490,850
|
59
|
+
58,1050,0
|
60
|
+
59,560,980
|
61
|
+
60,560,1040
|
62
|
+
61,800,500
|
63
|
+
62,1530,800
|
64
|
+
63,0,1410
|
65
|
+
64,3275,305
|
66
|
+
65,3990,1570
|
67
|
+
66,3510,1255
|
68
|
+
67,1105,955
|
69
|
+
68,650,150
|
70
|
+
69,700,655
|
71
|
+
70,1415,1245
|
72
|
+
71,1295,455
|
73
|
+
72,1760,710
|
74
|
+
73,1235,560
|
75
|
+
74,650,650
|
76
|
+
75,500,1000
|
77
|
+
76,830,760
|
78
|
+
77,650,760
|
79
|
+
78,560,350
|
80
|
+
79,1240,305
|
81
|
+
80,850,150
|
82
|
+
81,1400,910
|
83
|
+
82,0,650
|
84
|
+
83,805,500
|
85
|
+
84,480,1180
|
86
|
+
85,150,1435
|
87
|
+
86,1150,850
|
88
|
+
87,1360,800
|
89
|
+
88,910,1305
|
90
|
+
89,1190,910
|
91
|
+
90,1050,1260
|
92
|
+
91,1115,455
|
93
|
+
92,500,1000
|
94
|
+
93,800,615
|
95
|
+
94,1230,1265
|
96
|
+
95,980,3955
|
97
|
+
96,1040,3675
|
98
|
+
97,500,615
|
99
|
+
98,955,300
|
100
|
+
99,1285,1825
|
101
|
+
100,910,760
|
102
|
+
101,980,1315
|
103
|
+
102,150,1435
|
104
|
+
103,1200,1260
|
105
|
+
104,455,850
|
106
|
+
105,480,1260
|
107
|
+
106,150,1970
|
108
|
+
107,500,1015
|
109
|
+
108,830,350
|
110
|
+
109,700,735
|
111
|
+
110,455,1680
|
112
|
+
111,150,350
|
113
|
+
112,500,1135
|
114
|
+
113,605,865
|
115
|
+
114,850,1735
|
116
|
+
115,805,850
|
117
|
+
116,0,1165
|
118
|
+
117,710,1965
|
119
|
+
118,980,810
|
120
|
+
119,305,1005
|
121
|
+
120,1040,1200
|
122
|
+
121,150,2885
|
123
|
+
122,500,1095
|
124
|
+
123,710,1060
|
125
|
+
124,800,2455
|
126
|
+
125,1265,2145
|
127
|
+
126,1410,1665
|
128
|
+
127,1175,3230
|
129
|
+
128,305,4328
|
130
|
+
129,1255,4228
|
131
|
+
130,1570,4069
|
132
|
+
131,980,3995
|
133
|
+
132,1255,3946
|
134
|
+
133,1480,3910
|
135
|
+
134,955,3881
|
136
|
+
135,455,3857
|
137
|
+
136,150,3836
|
138
|
+
137,910,3818
|
139
|
+
138,655,3802
|
140
|
+
139,350,3788
|
141
|
+
140,1245,3774
|
142
|
+
141,1150,3762
|
143
|
+
142,455,3751
|
144
|
+
143,560,3741
|
145
|
+
144,710,3731
|
146
|
+
145,150,3722
|
147
|
+
146,560,3714
|
148
|
+
147,830,3706
|
149
|
+
148,650,3698
|
150
|
+
149,655,3691
|
151
|
+
150,1000,3684
|
152
|
+
151,350,3677
|
153
|
+
152,760,3671
|
154
|
+
153,455,3665
|
155
|
+
154,760,3659
|
156
|
+
155,560,3654
|
157
|
+
156,350,3648
|
158
|
+
157,655,3643
|
159
|
+
158,305,3638
|
160
|
+
159,150,3633
|
161
|
+
160,150,3629
|
162
|
+
161,910,3624
|
163
|
+
162,910,3620
|
164
|
+
163,1190,3616
|
165
|
+
164,650,3612
|
166
|
+
165,455,3608
|
167
|
+
166,500,3604
|
168
|
+
167,500,3600
|
169
|
+
168,1180,3596
|
170
|
+
169,1500,3592
|
171
|
+
170,1435,3589
|
172
|
+
171,1265,3586
|
173
|
+
172,850,3582
|
174
|
+
173,650,3579
|
175
|
+
174,800,3576
|
176
|
+
175,1350,3573
|
177
|
+
176,1305,3569
|
178
|
+
177,1260,3566
|
179
|
+
178,910,3563
|
180
|
+
179,805,3561
|
181
|
+
180,1260,3558
|
182
|
+
181,1175,3555
|
183
|
+
182,455,3552
|
184
|
+
183,965,3550
|
185
|
+
184,1000,3547
|
186
|
+
185,755,3544
|
187
|
+
186,615,3542
|
188
|
+
187,350,3539
|
189
|
+
188,1265,3537
|
190
|
+
189,935,3534
|
191
|
+
190,3955,3532
|
192
|
+
191,4445,3530
|
193
|
+
192,3675,3528
|
194
|
+
193,1365,3530
|
195
|
+
194,615,3532
|
196
|
+
195,605,3534
|
197
|
+
196,300,3537
|
198
|
+
197,1135,3539
|
199
|
+
198,1825,3542
|
200
|
+
199,895,3544
|
201
|
+
200,760,3547
|
202
|
+
201,500,3550
|
203
|
+
202,1315,3552
|
204
|
+
203,1330,3555
|
205
|
+
204,1435,3558
|
206
|
+
205,1385,3561
|
207
|
+
206,1260,3563
|
208
|
+
207,920,3566
|
209
|
+
208,850,3569
|
210
|
+
209,615,3573
|
211
|
+
210,1260,3576
|
212
|
+
211,1545,3579
|
213
|
+
212,1970,3582
|
214
|
+
213,1605,3586
|
215
|
+
214,1015,3589
|
216
|
+
215,955,3592
|
217
|
+
216,350,3596
|
218
|
+
217,1270,3600
|
219
|
+
218,735,3604
|
220
|
+
219,1330,3608
|
221
|
+
220,1680,3612
|
222
|
+
221,630,3616
|
223
|
+
222,350,3620
|
224
|
+
223,1200,3624
|
225
|
+
224,1135,3629
|
226
|
+
225,850,3633
|
227
|
+
226,865,3638
|
228
|
+
227,1540,3643
|
229
|
+
228,1735,3648
|
230
|
+
229,500,3654
|
231
|
+
230,850,3659
|
232
|
+
231,150,3665
|
233
|
+
232,1165,3671
|
234
|
+
233,1345,3677
|
235
|
+
234,1965,3684
|
236
|
+
235,1630,3691
|
237
|
+
236,810,3698
|
238
|
+
237,1175,3706
|
239
|
+
238,1005,3714
|
240
|
+
239,500,3722
|
241
|
+
240,1200,3731
|
242
|
+
241,2830,3741
|
243
|
+
242,2885,3751
|
244
|
+
243,1630,3762
|
245
|
+
244,1095,3774
|
246
|
+
245,980,3788
|
247
|
+
246,1060,3802
|
248
|
+
247,1190,3818
|
249
|
+
248,2455,3836
|
250
|
+
249,3045,3857
|
251
|
+
250,2145,3881
|
252
|
+
251,1500,3910
|
253
|
+
252,1665,3946
|
254
|
+
253,1975,3995
|
255
|
+
254,3230,
|
256
|
+
255,3470,
|
257
|
+
256,4328,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfbeam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Carruthers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -55,7 +55,8 @@ dependencies:
|
|
55
55
|
description: Currently only tested with K-LD7 on MacOS & Raspian (bullseye)
|
56
56
|
email:
|
57
57
|
- robc@hey.com
|
58
|
-
executables:
|
58
|
+
executables:
|
59
|
+
- rfbeam
|
59
60
|
extensions: []
|
60
61
|
extra_rdoc_files: []
|
61
62
|
files:
|
@@ -68,11 +69,14 @@ files:
|
|
68
69
|
- LICENSE.txt
|
69
70
|
- README.md
|
70
71
|
- Rakefile
|
72
|
+
- exe/rfbeam
|
71
73
|
- lib/rfbeam.rb
|
74
|
+
- lib/rfbeam/cli.rb
|
72
75
|
- lib/rfbeam/kld7/constants.rb
|
73
76
|
- lib/rfbeam/kld7/radar_messages.rb
|
74
77
|
- lib/rfbeam/kld7/radar_parameters.rb
|
75
78
|
- lib/rfbeam/kld7/serial_connection.rb
|
79
|
+
- lib/rfbeam/kld7/streamer.rb
|
76
80
|
- lib/rfbeam/version.rb
|
77
81
|
- node_modules/.bin/prettier
|
78
82
|
- node_modules/.yarn-integrity
|
@@ -159,6 +163,7 @@ files:
|
|
159
163
|
- node_modules/prettier/parser-yaml.js
|
160
164
|
- node_modules/prettier/standalone.js
|
161
165
|
- node_modules/prettier/third-party.js
|
166
|
+
- output.csv
|
162
167
|
- package.json
|
163
168
|
- rfbeam.gemspec
|
164
169
|
- sig/rfbeam.rbs
|