rfbeam 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a612ea7d8038a09e50462eca0c5acaeb6358992df63d0929e26024dbff5004a9
4
- data.tar.gz: e3bbc877194756cd958d3616623fb46bc384ae7e73430a3e096a950efe6ae3c9
3
+ metadata.gz: 641d32533a354fa54db2906e234d7243899286dd85ab72a51d8a477b27f327cd
4
+ data.tar.gz: a1d94a25fee763ada51a4dc5fd6687f7bb4e1bc67a56adae257dd67efa6ded79
5
5
  SHA512:
6
- metadata.gz: 4663603c15bb5423ee29710e0a743f9f979b7fd57185495062972189533e3c72f07712abb45ba77ea84dff55a6c2bcf72ef4142833195ca6d68f55632249c4a4
7
- data.tar.gz: 4af5abb75a3fe9475ab0a4afd988b8fecc2323afc95d3f64f530f359b08ab0f390012a97272545d69d46da9e8051887a24a345b59434afcf90bc18b0312de2de
6
+ metadata.gz: 66d1d5f9e22d1adce03395cb153cebbc5eff4336b3cf3ade2a73d77548a7ff233ebe7d45b9ce09a23479c9c60382b0e81052c7da20f584792c8eb642b758a317
7
+ data.tar.gz: '094f688f3e86604632a1fa5fd05c3ff377e9b848deb6ed56eb024991e7ad8288641d3d29dc16f538cd4b1d564e5ac6f6b6dcaf77862048f3ffa9de351eab7932'
data/.streerc ADDED
@@ -0,0 +1 @@
1
+ /Users/rob/.streerc
@@ -0,0 +1,2 @@
1
+ --print-width=120
2
+ --plugins=plugin/single_quotes
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 3.1.2
1
+ ruby 3.1.3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ - - -
2
+ ## [v0.5.1](https://github.com/robcarruthers/rfbeam/compare/v0.5.0..v0.5.1) - 2023-05-09
3
+ #### Documentation
4
+ - **(cog)** Setup changelog generator - ([23dd6d8](https://github.com/robcarruthers/rfbeam/commit/23dd6d8407edaf6d4c29472fa60775a5aea87daa)) - [@robcarruthers](https://github.com/robcarruthers)
5
+ - **(readme)** Updated - ([14bb58e](https://github.com/robcarruthers/rfbeam/commit/14bb58ecaa6f55166532151425fa24269b515937)) - [@robcarruthers](https://github.com/robcarruthers)
6
+
7
+ - - -
8
+
1
9
  ## [0.5.0] - 2023-11-4
2
10
 
3
11
  - Refactored CLI, refined help and options
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- rfbeam (0.5.0)
12
+ rfbeam (0.5.1)
13
13
  activesupport (~> 6.1.0)
14
14
  rubyserial (~> 0.6.0)
15
15
  thor (~> 1.2.1)
@@ -89,6 +89,7 @@ GEM
89
89
  PLATFORMS
90
90
  aarch64-linux
91
91
  arm64-darwin-21
92
+ arm64-darwin-22
92
93
 
93
94
  DEPENDENCIES
94
95
  minitest (~> 5.0)
data/Rakefile CHANGED
@@ -2,14 +2,19 @@
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rake/testtask'
5
+ require 'rubocop/rake_task'
5
6
 
6
- Rake::TestTask.new(:test) do |t|
7
+ Rake::TestTask.new(:local_test) do |t|
7
8
  t.libs << 'test'
8
9
  t.libs << 'lib'
9
- t.test_files = FileList['test/**/test_*.rb']
10
+ t.test_files = FileList['test/local_tests/test_*.rb']
10
11
  end
11
12
 
12
- require 'rubocop/rake_task'
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'test'
15
+ t.libs << 'lib'
16
+ t.test_files = FileList['test/**/test_*.rb'].exclude('test/local_tests/**/*')
17
+ end
13
18
 
14
19
  RuboCop::RakeTask.new
15
20
 
data/cog.toml ADDED
@@ -0,0 +1,24 @@
1
+ from_latest_tag = false
2
+ ignore_merge_commits = false
3
+ branch_whitelist = []
4
+ pre_bump_hooks = [ "bump set {{version}} -p 'chore(version):' -m 'v{{version}}'" ]
5
+ post_bump_hooks = [ "rake release" ]
6
+ pre_package_bump_hooks = []
7
+ post_package_bump_hooks = []
8
+ tag_prefix = "v"
9
+
10
+ [commit_types]
11
+
12
+ [changelog]
13
+ path = "CHANGELOG.md"
14
+ template = "remote"
15
+ remote = "github.com"
16
+ repository = "rfbeam"
17
+ owner = "robcarruthers"
18
+ authors = [
19
+ { signature = "Rob Carruthers", username = "robcarruthers" }
20
+ ]
21
+
22
+ [bump_profiles]
23
+
24
+ [packages]
data/lib/rfbeam/cli.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'thor'
4
- require 'rfbeam'
5
4
  require 'tty-table'
6
5
  require 'tty-logger'
7
6
  require 'tty-spinner'
@@ -10,7 +9,7 @@ require 'unicode_plot'
10
9
 
11
10
  module RfBeam
12
11
  class CLI < Thor
13
- attr_accessor :logger
12
+ attr_accessor :radar, :logger
14
13
 
15
14
  desc 'list', 'List available radar modules'
16
15
  def list
@@ -43,12 +42,25 @@ module RfBeam
43
42
  @logger.success r.formatted_parameter(param.to_sym)
44
43
  end
45
44
 
46
- desc 'ddat [RADAR_ID]', 'stream any valid detections, stop stream with q and enter'
47
- option :stream, type: :boolean, aliases: '-s', desc: 'Stream the data from the device, press q to stop'
48
- option :raw, type: :boolean, aliases: '-r', desc: 'Display raw data'
45
+ desc 'ddat <radar_id>', 'stream any valid detections, stop stream with q and enter'
46
+ option :stream, type: :boolean, aliases: '-s', desc: 'Stream the data from the device'
49
47
  def ddat(radar_id)
50
- cli = RfBeam::Kld7::CliOutput.new(radar_id)
51
- cli.display(:ddat, options)
48
+ init_radar radar_id
49
+
50
+ if options[:stream]
51
+ Thread.new { monitor_keypress }
52
+ spinner = TTY::Spinner.new('[:spinner] :title ', format: :bouncing_ball)
53
+ loop do
54
+ break if @stop_streaming
55
+ spinner.spin
56
+ data = @radar.ddat
57
+ spinner.update title: "Searching... #{data[:detection_str]}"
58
+ @logger.success "#{@radar.tdat}" if data[:detection]
59
+ end
60
+ puts "\nTask Quit."
61
+ else
62
+ puts "\n#{@radar.ddat}"
63
+ end
52
64
  end
53
65
 
54
66
  desc 'tdat [RADAR_ID]', 'Display tracked target data'
@@ -64,7 +76,7 @@ module RfBeam
64
76
  cli.display(:pdat, options)
65
77
  end
66
78
 
67
- desc 'rfft [RADAR_ID]', 'Display the dopplar radar data as a plot'
79
+ desc 'rfft <radar_id>', 'Display the dopplar radar data as a plot'
68
80
  option :stream, type: :boolean, aliases: '-s', desc: 'Stream the data from the device'
69
81
  option :raw, type: :boolean, aliases: '-r', desc: 'Display raw data'
70
82
  def rfft(radar_id)
@@ -83,7 +95,44 @@ module RfBeam
83
95
  @logger = TTY::Logger.new
84
96
  return @logger.warning 'No Radar modules found.' unless devices.count.positive?
85
97
 
86
- RfBeam::KLD7.new(devices[id.to_i])
98
+ @radar = RfBeam::K_ld7.new(devices[id.to_i])
99
+ end
100
+
101
+ def plot_data(data)
102
+ { x: Array(-128...128), series1: data.shift(256).map { |value| value / 100 }, series2: data.shift(256).map { |value| value.to_i / 100 } }
103
+ end
104
+
105
+ def monitor_keypress
106
+ @stop_streaming = false
107
+ loop do
108
+ key = STDIN.getch
109
+ if key.downcase == 'q'
110
+ @stop_streaming = true
111
+ break
112
+ end
113
+ end
114
+ end
115
+
116
+ def rfft_plot(radar)
117
+ speed = radar.max_speed
118
+ speed_label = radar.formatted_parameter(:max_speed)
119
+ xlim = [speed - speed * 2, speed]
120
+ data = plot_data(radar.rfft)
121
+ plot =
122
+ UnicodePlot.lineplot(
123
+ data[:x],
124
+ data[:series1],
125
+ name: 'IF1/2 Averaged',
126
+ title: 'Raw FFT',
127
+ height: 25,
128
+ width: 120,
129
+ xlabel: "Speed (km/h), #{speed_label}",
130
+ ylabel: 'Signal (db)',
131
+ xlim: [-128, 128],
132
+ ylim: [0, 100]
133
+ )
134
+ UnicodePlot.lineplot!(plot, data[:x], data[:series2], name: 'Threshold')
135
+ plot
87
136
  end
88
137
  end
89
138
  end
@@ -111,7 +111,7 @@ module RfBeam
111
111
  end
112
112
  end
113
113
 
114
- def display_pdat(options)
114
+ def display_pdat(*)
115
115
  table = RfBeam::Kld7::CliFormatter.new.pdat_table(@radar.pdat)
116
116
  puts "\n Detected Raw Targets"
117
117
  puts table.render(:unicode, alignment: :center)
@@ -33,231 +33,158 @@ module RfBeam
33
33
  speed: %w[Low High]
34
34
  }.freeze
35
35
 
36
- class Param
37
- attr_accessor :name, :grps_index, :description, :default, :units, :str_values
38
-
39
- def initialize(name:, grps_index:, options: {})
40
- @name = name
41
- @grps_index = grps_index
42
- @description = options.fetch(:description, nil)
43
- @default = options.fetch(:default, nil)
44
- @units = options.fetch(:units, nil)
45
- @str_values = options.fetch(:str_values, [])
36
+ Param =
37
+ Data.define(:name, :grps_index, :description, :default, :units, :values) do |_param|
38
+ def initialize(name:, grps_index:, description: nil, default: nil, units: nil, values: [])
39
+ super(name:, grps_index:, description:, default:, units:, values:)
40
+ end
46
41
  end
47
- end
48
42
 
49
43
  RADAR_PARAMETERS = {
50
- sw_version: Param.new(name: 'Software Version', grps_index: 2, options: { default: 'K-LD7_APP-RFB-XXXX' }),
44
+ sw_version: Param.new(name: 'Software Version', grps_index: 2, default: 'K-LD7_APP-RFB-XXXX'),
51
45
  base_frequency:
52
46
  Param.new(
53
47
  name: 'Base Frequency',
54
48
  grps_index: 3,
55
- options: {
56
- description: '0 = Low, 1 = Middle, 2 = High',
57
- default: 1,
58
- str_values: %w[Low Middle High]
59
- }
49
+ description: '0 = Low, 1 = Middle, 2 = High',
50
+ default: 1,
51
+ values: %w[Low Middle High]
60
52
  ),
61
53
  max_speed:
62
54
  Param.new(
63
55
  name: 'Maximum Speed',
64
56
  grps_index: 4,
65
- options: {
66
- description: '0 = 12km/h, 1 = 25km/h, 2 = 50km/h, 3 = 100km/h',
67
- default: 1,
68
- units: 'km/h',
69
- str_values: %w[12.5 25 50 100]
70
- }
57
+ description: '0 = 12km/h, 1 = 25km/h, 2 = 50km/h, 3 = 100km/h',
58
+ default: 1,
59
+ units: 'km/h',
60
+ values: %w[12.5 25 50 100]
71
61
  ),
72
62
  max_range:
73
63
  Param.new(
74
64
  name: 'Maximum Range',
75
65
  grps_index: 5,
76
- options: {
77
- description: '0 = 5m, 1 = 10m, 2 = 30m, 3 = 100m',
78
- default: 1,
79
- str_values: %w[5m 10m 30m 100m]
80
- }
66
+ description: '0 = 5m, 1 = 10m, 2 = 30m, 3 = 100m',
67
+ default: 1,
68
+ values: %w[5m 10m 30m 100m]
81
69
  ),
82
70
  threshold_offset:
83
- Param.new(
84
- name: 'Threshold Offset',
85
- grps_index: 6,
86
- options: {
87
- description: '10db - 60db',
88
- default: 30,
89
- units: 'db'
90
- }
91
- ),
71
+ Param.new(name: 'Threshold Offset', grps_index: 6, description: '10db - 60db', default: 30, units: 'db'),
92
72
  tracking_filter:
93
73
  Param.new(
94
74
  name: 'Tracking Filter Type',
95
75
  grps_index: 7,
96
- options: {
97
- description: '0 = Standard, 2 = Fast Detection, 3 = Long Visibility',
98
- default: 0,
99
- str_values: ['standard', 'Fast Detection', 'Long Visibility']
100
- }
76
+ description: '0 = Standard, 2 = Fast Detection, 3 = Long Visibility',
77
+ default: 0,
78
+ values: ['standard', 'Fast Detection', 'Long Visibility']
101
79
  ),
102
80
  vibration_suppression:
103
81
  Param.new(
104
82
  name: 'Vibration Suppression',
105
83
  grps_index: 8,
106
- options: {
107
- description: '0-16, 0 = No Suppression, 16 = High Suppression',
108
- default: 2
109
- }
84
+ description: '0-16, 0 = No Suppression, 16 = High Suppression',
85
+ default: 2
110
86
  ),
111
87
  min_detection_distance:
112
88
  Param.new(
113
89
  name: 'Minimum Detection Distance',
114
90
  grps_index: 9,
115
- options: {
116
- description: '0 - 100% of range setting',
117
- default: 0,
118
- units: '%'
119
- }
91
+ description: '0 - 100% of range setting',
92
+ default: 0,
93
+ units: '%'
120
94
  ),
121
95
  max_detection_distance:
122
96
  Param.new(
123
97
  name: 'Maximum Detection Distance',
124
98
  grps_index: 10,
125
- options: {
126
- description: '0 - 100% of range setting',
127
- default: 50,
128
- units: '%'
129
- }
99
+ description: '0 - 100% of range setting',
100
+ default: 50,
101
+ units: '%'
130
102
  ),
131
103
  min_detection_angle:
132
- Param.new(
133
- name: 'Minimum Detection Angle',
134
- grps_index: 11,
135
- options: {
136
- description: '-90° - 90°',
137
- default: -90,
138
- units: '°'
139
- }
140
- ),
104
+ Param.new(name: 'Minimum Detection Angle', grps_index: 11, description: '-90° - 90°', default: -90, units: '°'),
141
105
  max_detection_angle:
142
- Param.new(
143
- name: 'Maximum Detection Angle',
144
- grps_index: 12,
145
- options: {
146
- description: '-90° - 90°',
147
- default: 90,
148
- units: '°'
149
- }
150
- ),
106
+ Param.new(name: 'Maximum Detection Angle', grps_index: 12, description: '-90° - 90°', default: 90, units: '°'),
151
107
  min_detection_speed:
152
108
  Param.new(
153
109
  name: 'Minimum Detection Speed',
154
110
  grps_index: 13,
155
- options: {
156
- description: '0 - 100% of speed setting',
157
- default: 0,
158
- units: '%'
159
- }
111
+ description: '0 - 100% of speed setting',
112
+ default: 0,
113
+ units: '%'
160
114
  ),
161
115
  max_detection_speed:
162
116
  Param.new(
163
117
  name: 'Maximum Detection Speed',
164
118
  grps_index: 14,
165
- options: {
166
- description: '0 - 100% of speed setting',
167
- default: 100,
168
- units: '%'
169
- }
119
+ description: '0 - 100% of speed setting',
120
+ default: 100,
121
+ units: '%'
170
122
  ),
171
123
  detection_direction:
172
124
  Param.new(
173
125
  name: 'Detection Direction',
174
126
  grps_index: 15,
175
- options: {
176
- description: '0 = Receding, 1 = Approaching, 2 = Both',
177
- default: 2,
178
- str_values: %w[Receding Approaching Both]
179
- }
127
+ description: '0 = Receding, 1 = Approaching, 2 = Both',
128
+ default: 2,
129
+ values: %w[Receding Approaching Both]
180
130
  ),
181
131
  range_threshold:
182
132
  Param.new(
183
133
  name: 'Range Threshold',
184
134
  grps_index: 16,
185
- options: {
186
- description: '0 - 100% of range setting',
187
- default: 10,
188
- units: '%'
189
- }
135
+ description: '0 - 100% of range setting',
136
+ default: 10,
137
+ units: '%'
190
138
  ),
191
139
  angle_threshold:
192
- Param.new(
193
- name: 'Angle Threshold',
194
- grps_index: 17,
195
- options: {
196
- description: '-90° - 90°',
197
- default: 0,
198
- units: '°'
199
- }
200
- ),
140
+ Param.new(name: 'Angle Threshold', grps_index: 17, description: '-90° - 90°', default: 0, units: '°'),
201
141
  speed_threshold:
202
142
  Param.new(
203
143
  name: 'Speed Threshold',
204
144
  grps_index: 18,
205
- options: {
206
- description: '0 - 100% of speed setting',
207
- default: 50,
208
- units: '%'
209
- }
145
+ description: '0 - 100% of speed setting',
146
+ default: 50,
147
+ units: '%'
210
148
  ),
211
149
  digital_output1:
212
150
  Param.new(
213
151
  name: 'Digital Output 1',
214
152
  grps_index: 19,
215
- options: {
216
- description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
217
- default: 0,
218
- str_values: %w[Direction Angle Range Speed Micro]
219
- }
153
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
154
+ default: 0,
155
+ values: %w[Direction Angle Range Speed Micro]
220
156
  ),
221
157
  digital_output2:
222
158
  Param.new(
223
159
  name: 'Digital Output 2',
224
160
  grps_index: 20,
225
- options: {
226
- description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
227
- default: 1,
228
- str_values: %w[Direction Angle Range Speed Micro]
229
- }
161
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
162
+ default: 1,
163
+ values: %w[Direction Angle Range Speed Micro]
230
164
  ),
231
165
  digital_output3:
232
166
  Param.new(
233
167
  name: 'Digital Output 3',
234
168
  grps_index: 21,
235
- options: {
236
- description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
237
- default: 2,
238
- str_values: %w[Direction Angle Range Speed Micro]
239
- }
169
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
170
+ default: 2,
171
+ values: %w[Direction Angle Range Speed Micro]
240
172
  ),
241
- hold_time:
242
- Param.new(name: 'Hold Time', grps_index: 22, options: { description: '1 - 7200s', default: 1, units: 's' }),
173
+ hold_time: Param.new(name: 'Hold Time', grps_index: 22, description: '1 - 7200s', default: 1, units: 's'),
243
174
  micro_detection_retrigger:
244
175
  Param.new(
245
176
  name: 'Micro Detection Trigger',
246
177
  grps_index: 23,
247
- options: {
248
- description: '0 = Off, 1 = Retrigger',
249
- default: 0,
250
- str_values: %w[Off Retrigger]
251
- }
178
+ description: '0 = Off, 1 = Retrigger',
179
+ default: 0,
180
+ values: %w[Off Retrigger]
252
181
  ),
253
182
  micro_detection_sensativity:
254
183
  Param.new(
255
184
  name: 'Micro Detection Sensativity',
256
185
  grps_index: 24,
257
- options: {
258
- description: '0 - 9, 0 = Min, 9 = Max',
259
- default: 4
260
- }
186
+ description: '0 - 9, 0 = Min, 9 = Max',
187
+ default: 4
261
188
  )
262
189
  }.freeze
263
190
  end
@@ -1,6 +1,4 @@
1
- # frozen_string_literal: true
2
-
3
- require 'csv'
1
+ require "csv"
4
2
 
5
3
  module RfBeam
6
4
  module Kld7
@@ -12,26 +10,26 @@ module RfBeam
12
10
  def rfft
13
11
  request_frame_data(:rfft)
14
12
  sleep MEASUREMENT_DELAY
15
- data = read(1032).unpack('a4LS256S256')
13
+ data = read(1032).unpack("a4LS256S256")
16
14
  header, length = data.shift(2)
17
- raise Error, "RFFT header response, header=#{header}" unless header == 'RFFT'
15
+ unless header == "RFFT"
16
+ raise Error, "RFFT header response, header=#{header}"
17
+ end
18
18
  raise Error, "RFFT payload length, length=#{length}" unless length == 1024
19
19
 
20
20
  data
21
21
  end
22
22
 
23
23
  def reset
24
- command = ['RFSE', 0]
25
- write command.pack('a4L')
24
+ command = ["RFSE", 0]
25
+ write command.pack("a4L")
26
26
  check_response
27
27
  end
28
28
  alias rfse reset
29
29
 
30
30
  def pdat(formatted: false)
31
31
  request_frame_data(:pdat)
32
- resp = read(102).unpack('a4LSssSSssSSssSSssSSssSSssSSssSSssSSssSSssS')
33
- raise Error, "PDAT response = #{resp[0]}" unless resp[0] == 'PDAT'
34
-
32
+ resp = read(102).unpack("a4LSssSSssSSssSSssSSssSSssSSssSSssSSssSSssS")
35
33
  return resp unless formatted
36
34
 
37
35
  target_count = resp[1].to_i / 8
@@ -40,7 +38,9 @@ module RfBeam
40
38
  resp.shift 2
41
39
  resp.compact
42
40
  detected_raw_targets = []
43
- target_count.times { detected_raw_targets << format_raw_target_data(resp.shift(4)) }
41
+ target_count.times do
42
+ detected_raw_targets << format_raw_target_data(resp.shift(4))
43
+ end
44
44
  detected_raw_targets
45
45
  end
46
46
 
@@ -48,34 +48,46 @@ module RfBeam
48
48
  request_frame_data(:tdat)
49
49
  sleep MEASUREMENT_DELAY
50
50
 
51
- resp = read(16).unpack('a4LSssS')
52
- raise Error, "TDAT response = #{resp[0]}" unless resp[0] == 'TDAT'
53
-
54
- resp
51
+ sleep 0.1
52
+ resp = read(16).unpack("a4LSssS")
53
+ unless resp[1].zero?
54
+ return { dist: resp[2], speed: resp[3], angle: resp[4], mag: resp[5] }
55
+ end
55
56
  end
56
57
 
57
58
  def ddat
58
59
  request_frame_data(:ddat)
59
- sleep MEASUREMENT_DELAY
60
-
61
- resp = read(14).unpack('a4LC6')
62
- raise Error, "DDAT response = #{resp[0]}" unless resp[0] == 'DDAT'
63
-
64
- resp
60
+ flags = %w[Low High]
61
+ array = read(14).unpack("a4LC6")
62
+ {
63
+ label: array[0],
64
+ detection: array[2] == 1,
65
+ detection_str: DETECTION_FLAGS[:detection][array[2]],
66
+ micro_detection: DETECTION_FLAGS[:micro_detection][array[3]],
67
+ angle: DETECTION_FLAGS[:angle][array[4]],
68
+ direction: DETECTION_FLAGS[:direction][array[5]],
69
+ range: DETECTION_FLAGS[:range][array[6]],
70
+ speed: DETECTION_FLAGS[:speed][array[7]]
71
+ }
65
72
  end
66
73
 
67
74
  # Get the radar parameter structure
68
75
  def grps
69
- command = ['GRPS', 0]
70
- write command.pack('a4L')
76
+ command = ["GRPS", 0]
77
+ write command.pack("a4L")
71
78
  check_response
72
- read(50).unpack('a4LA19C8c2C4cCCCCSCC')
79
+ read(50).unpack("a4LA19C8c2C4cCCCCSCC")
73
80
  end
74
81
 
75
82
  def config
76
83
  data = grps
77
- output = []
78
- RADAR_PARAMETERS.each_key { |key| output << formatted_parameter(key, data[RADAR_PARAMETERS[key].grps_index]) }
84
+ output = "\n"
85
+ RADAR_PARAMETERS.keys.each do |key|
86
+ output << formatted_parameter(
87
+ key,
88
+ data[RADAR_PARAMETERS[key].grps_index]
89
+ )
90
+ end
79
91
  output
80
92
  end
81
93
 
@@ -92,12 +104,17 @@ module RfBeam
92
104
  private
93
105
 
94
106
  def format_raw_target_data(array)
95
- { dist: array.shift, speed: array.shift, angle: array.shift, mag: array.shift }
107
+ {
108
+ dist: array.shift,
109
+ speed: array.shift,
110
+ angle: array.shift,
111
+ mag: array.shift
112
+ }
96
113
  end
97
114
 
98
115
  def request_frame_data(type)
99
- command = ['GNFD', 4, FRAME_DATA_TYPES[type]]
100
- write command.pack('a4LL')
116
+ command = ["GNFD", 4, FRAME_DATA_TYPES[type]]
117
+ write command.pack("a4LL")
101
118
  check_response
102
119
  end
103
120
  end
@@ -1,7 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
1
  module RfBeam
4
- module Kld7
2
+ module KLD7
5
3
  # -----------------
6
4
  # Software Version, 'K-LD7_APP-RFB-XXXX'
7
5
  # -----------------
@@ -20,11 +18,11 @@ module RfBeam
20
18
  def base_frequency=(frequency = 1)
21
19
  value =
22
20
  case frequency
23
- when 0, :low, 'low'
21
+ when 0, :low, "low"
24
22
  0
25
- when 1, :middle, 'middle'
23
+ when 1, :middle, "middle"
26
24
  1
27
- when 2, :high, 'high'
25
+ when 2, :high, "high"
28
26
  2
29
27
  else
30
28
  raise ArgumentError, "Invalid arg: '#{frequency}'"
@@ -43,8 +41,10 @@ module RfBeam
43
41
  end
44
42
 
45
43
  def max_speed=(speed = 1)
46
- raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..3).include?(speed)
47
- raise ArgumentError, 'Expected an Integer' unless speed.is_a?(Integer)
44
+ unless (0..3).include?(speed)
45
+ raise ArgumentError, "Invalid arg: '#{speed}'"
46
+ end
47
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
48
48
 
49
49
  set_parameter :rspi, speed, :uint32
50
50
  end
@@ -60,8 +60,10 @@ module RfBeam
60
60
  end
61
61
 
62
62
  def max_range=(range = 1)
63
- raise ArgumentError, "Invalid arg: '#{range}'" unless (0..3).include?(range)
64
- raise ArgumentError, 'Expected an Integer' unless range.is_a?(Integer)
63
+ unless (0..3).include?(range)
64
+ raise ArgumentError, "Invalid arg: '#{range}'"
65
+ end
66
+ raise ArgumentError, "Expected an Integer" unless range.is_a?(Integer)
65
67
 
66
68
  set_parameter :rrai, range, :uint32
67
69
  end
@@ -77,8 +79,10 @@ module RfBeam
77
79
  end
78
80
 
79
81
  def threshold_offset=(offset = 30)
80
- raise ArgumentError, "Invalid arg: '#{offset}'" unless (10..60).include?(offset)
81
- raise ArgumentError, 'Expected an Integer' unless offset.is_a?(Integer)
82
+ unless (10..60).include?(offset)
83
+ raise ArgumentError, "Invalid arg: '#{offset}'"
84
+ end
85
+ raise ArgumentError, "Expected an Integer" unless offset.is_a?(Integer)
82
86
 
83
87
  set_parameter :thof, offset, :uint32
84
88
  end
@@ -95,7 +99,7 @@ module RfBeam
95
99
 
96
100
  def tracking_filter=(type = 0)
97
101
  raise ArgumentError, "Invalid arg: '#{type}'" unless (0..2).include?(type)
98
- raise ArgumentError, 'Expected an Integer' unless type.is_a?(Integer)
102
+ raise ArgumentError, "Expected an Integer" unless type.is_a?(Integer)
99
103
 
100
104
  set_parameter :trft, type, :uint32
101
105
  end
@@ -110,8 +114,10 @@ module RfBeam
110
114
  end
111
115
 
112
116
  def vibration_suppression=(value = 2)
113
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..16).include?(value)
114
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
117
+ unless (0..16).include?(value)
118
+ raise ArgumentError, "Invalid arg: '#{value}'"
119
+ end
120
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
115
121
 
116
122
  set_parameter :visu, value, :uint32
117
123
  end
@@ -126,8 +132,10 @@ module RfBeam
126
132
  end
127
133
 
128
134
  def min_detection_distance=(value = 0)
129
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
130
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
135
+ unless (0..100).include?(value)
136
+ raise ArgumentError, "Invalid arg: '#{value}'"
137
+ end
138
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
131
139
 
132
140
  set_parameter :mira, value, :uint32
133
141
  end
@@ -142,8 +150,10 @@ module RfBeam
142
150
  end
143
151
 
144
152
  def max_detection_distance=(value = 50)
145
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
146
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
153
+ unless (0..100).include?(value)
154
+ raise ArgumentError, "Invalid arg: '#{value}'"
155
+ end
156
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
147
157
 
148
158
  set_parameter :mara, value, :uint32
149
159
  end
@@ -158,8 +168,10 @@ module RfBeam
158
168
  end
159
169
 
160
170
  def min_detection_angle=(angle = -90)
161
- raise ArgumentError, "Invalid arg: '#{angle}'" unless (-90..90).include?(angle)
162
- raise ArgumentError, 'Expected an Integer' unless angle.is_a?(Integer)
171
+ unless (-90..90).include?(angle)
172
+ raise ArgumentError, "Invalid arg: '#{angle}'"
173
+ end
174
+ raise ArgumentError, "Expected an Integer" unless angle.is_a?(Integer)
163
175
 
164
176
  set_parameter :mian, angle, :int32
165
177
  end
@@ -174,8 +186,10 @@ module RfBeam
174
186
  end
175
187
 
176
188
  def max_detection_angle=(angle = 90)
177
- raise ArgumentError, "Invalid arg: '#{angle}'" unless (-90..90).include?(angle)
178
- raise ArgumentError, 'Expected an Integer' unless angle.is_a?(Integer)
189
+ unless (-90..90).include?(angle)
190
+ raise ArgumentError, "Invalid arg: '#{angle}'"
191
+ end
192
+ raise ArgumentError, "Expected an Integer" unless angle.is_a?(Integer)
179
193
 
180
194
  set_parameter :maan, angle, :int32
181
195
  end
@@ -190,8 +204,10 @@ module RfBeam
190
204
  end
191
205
 
192
206
  def min_detection_speed=(speed = 0)
193
- raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..100).include?(speed)
194
- raise ArgumentError, 'Expected an Integer' unless speed.is_a?(Integer)
207
+ unless (0..100).include?(speed)
208
+ raise ArgumentError, "Invalid arg: '#{speed}'"
209
+ end
210
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
195
211
 
196
212
  set_parameter :misp, speed, :uint32
197
213
  end
@@ -206,8 +222,10 @@ module RfBeam
206
222
  end
207
223
 
208
224
  def max_detection_speed=(speed = 100)
209
- raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..100).include?(speed)
210
- raise ArgumentError, 'Expected an Integer' unless speed.is_a?(Integer)
225
+ unless (0..100).include?(speed)
226
+ raise ArgumentError, "Invalid arg: '#{speed}'"
227
+ end
228
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
211
229
 
212
230
  set_parameter :masp, speed, :uint32
213
231
  end
@@ -222,8 +240,10 @@ module RfBeam
222
240
  end
223
241
 
224
242
  def detection_direction=(direction = 2)
225
- raise ArgumentError, "Invalid arg: '#{direction}'" unless (0..2).include?(direction)
226
- raise ArgumentError, 'Expected an Integer' unless direction.is_a?(Integer)
243
+ unless (0..2).include?(direction)
244
+ raise ArgumentError, "Invalid arg: '#{direction}'"
245
+ end
246
+ raise ArgumentError, "Expected an Integer" unless direction.is_a?(Integer)
227
247
 
228
248
  set_parameter :dedi, direction, :uint32
229
249
  end
@@ -238,8 +258,10 @@ module RfBeam
238
258
  end
239
259
 
240
260
  def range_threshold=(value = 10)
241
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
242
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
261
+ unless (0..100).include?(value)
262
+ raise ArgumentError, "Invalid arg: '#{value}'"
263
+ end
264
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
243
265
 
244
266
  set_parameter :rath, value, :uint32
245
267
  end
@@ -254,8 +276,10 @@ module RfBeam
254
276
  end
255
277
 
256
278
  def angle_threshold=(value = 0)
257
- raise ArgumentError, "Invalid arg: '#{value}'" unless (-90..90).include?(value)
258
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
279
+ unless (-90..90).include?(value)
280
+ raise ArgumentError, "Invalid arg: '#{value}'"
281
+ end
282
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
259
283
 
260
284
  set_parameter :anth, value, :int32
261
285
  end
@@ -270,8 +294,10 @@ module RfBeam
270
294
  end
271
295
 
272
296
  def speed_threshold=(value = 50)
273
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
274
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
297
+ unless (0..100).include?(value)
298
+ raise ArgumentError, "Invalid arg: '#{value}'"
299
+ end
300
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
275
301
 
276
302
  set_parameter :spth, value, :uint32
277
303
  end
@@ -286,8 +312,10 @@ module RfBeam
286
312
  end
287
313
 
288
314
  def digital_output1=(value = 0)
289
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
290
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
315
+ unless (0..4).include?(value)
316
+ raise ArgumentError, "Invalid arg: '#{value}'"
317
+ end
318
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
291
319
 
292
320
  set_parameter :dig1, value, :uint32
293
321
  end
@@ -302,8 +330,10 @@ module RfBeam
302
330
  end
303
331
 
304
332
  def digital_output2=(value = 1)
305
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
306
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
333
+ unless (0..4).include?(value)
334
+ raise ArgumentError, "Invalid arg: '#{value}'"
335
+ end
336
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
307
337
 
308
338
  set_parameter :dig2, value, :uint32
309
339
  end
@@ -318,8 +348,10 @@ module RfBeam
318
348
  end
319
349
 
320
350
  def digital_output3=(value = 2)
321
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
322
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
351
+ unless (0..4).include?(value)
352
+ raise ArgumentError, "Invalid arg: '#{value}'"
353
+ end
354
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
323
355
 
324
356
  set_parameter :dig3, value, :uint32
325
357
  end
@@ -334,8 +366,10 @@ module RfBeam
334
366
  end
335
367
 
336
368
  def hold_time=(time = 1)
337
- raise ArgumentError, "Invalid arg: '#{time}'" unless (1..7200).include?(time)
338
- raise ArgumentError, 'Expected an Integer' unless time.is_a?(Integer)
369
+ unless (1..7200).include?(time)
370
+ raise ArgumentError, "Invalid arg: '#{time}'"
371
+ end
372
+ raise ArgumentError, "Expected an Integer" unless time.is_a?(Integer)
339
373
 
340
374
  set_parameter :hold, time, :uint32
341
375
  end
@@ -346,12 +380,16 @@ module RfBeam
346
380
  # Micro Detection retrigger, 0 = Off (default), 1 = Retrigger
347
381
  # -----------------
348
382
  def micro_detection_retrigger
349
- query_parameter RADAR_PARAMETERS[:set_micro_detection_retrigger].grps_index
383
+ query_parameter RADAR_PARAMETERS[
384
+ :set_micro_detection_retrigger
385
+ ].grps_index
350
386
  end
351
387
 
352
388
  def micro_detection_retrigger=(value = 0)
353
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..1).include?(value)
354
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
389
+ unless (0..1).include?(value)
390
+ raise ArgumentError, "Invalid arg: '#{value}'"
391
+ end
392
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
355
393
 
356
394
  set_parameter :mide, value, :uint32
357
395
  end
@@ -366,8 +404,10 @@ module RfBeam
366
404
  end
367
405
 
368
406
  def micro_detection_sensitivity=(value = 4)
369
- raise ArgumentError, "Invalid arg: '#{value}'" unless (0..9).include?(value)
370
- raise ArgumentError, 'Expected an Integer' unless value.is_a?(Integer)
407
+ unless (0..9).include?(value)
408
+ raise ArgumentError, "Invalid arg: '#{value}'"
409
+ end
410
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
371
411
 
372
412
  set_parameter :mids, value, :uint32
373
413
  end
@@ -384,10 +424,14 @@ module RfBeam
384
424
  def set_parameter(header, value, return_type = :uint32)
385
425
  return_type =
386
426
  case return_type
427
+ when :uint32
428
+ "L"
387
429
  when :int32
388
- 'l'
430
+ "l"
431
+ when :uint32
432
+ "S"
389
433
  else
390
- 'L'
434
+ "L"
391
435
  end
392
436
  command = [header.upcase.to_s, 4, value]
393
437
  write command.pack("a4L#{return_type}")
@@ -0,0 +1,82 @@
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
+ {
55
+ x: Array(-128...128),
56
+ series1: data.shift(256).map { |value| value / 100 },
57
+ series2: data.shift(256).map { |value| value.to_i / 100 }
58
+ }
59
+ end
60
+
61
+ def rfft_plot(radar)
62
+ width = TTY::Screen.width * 0.65
63
+ data = plot_data(radar.rfft)
64
+ plot =
65
+ UnicodePlot.lineplot(
66
+ data[:x],
67
+ data[:series1],
68
+ name: "IF1/2 Averaged",
69
+ title: "Raw FFT",
70
+ height: 25,
71
+ width: width,
72
+ xlabel: "Speed (km/h)",
73
+ ylabel: "Signal (db)",
74
+ xlim: [-128, 128],
75
+ ylim: [0, 100]
76
+ )
77
+ UnicodePlot.lineplot!(plot, data[:x], data[:series2], name: "Threshold")
78
+ plot
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RfBeam
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.1'
5
5
  end
data/rfbeam.gemspec CHANGED
@@ -10,15 +10,15 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = 'Ruby API and CLI for RFBeam doplar radar modules'
12
12
  spec.description = 'Currently only tested with K-LD7 on MacOS & Raspian (bullseye)'
13
- spec.homepage = 'https://gitlab.com/robcarruthers/rfbeam'
13
+ spec.homepage = 'https://github.com/robcarruthers/rfbeam'
14
14
  spec.license = 'MIT'
15
15
  spec.required_ruby_version = '>= 3.1.2'
16
16
 
17
17
  # spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
18
18
 
19
19
  spec.metadata['homepage_uri'] = spec.homepage
20
- spec.metadata['source_code_uri'] = 'https://gitlab.com/robcarruthers/rfbeam'
21
- spec.metadata['changelog_uri'] = 'https://gitlab.com/robcarruthers/rfbeam/-/blob/master/CHANGELOG.md'
20
+ spec.metadata['source_code_uri'] = 'https://github.com/robcarruthers/rfbeam'
21
+ spec.metadata['changelog_uri'] = 'https://github.com/robcarruthers/rfbeam/CHANGELOG.md'
22
22
 
23
23
  # Specify which files should be added to the gem when it is released.
24
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
data/streamer2.rb ADDED
@@ -0,0 +1,55 @@
1
+ require "unicode_plot"
2
+ require "stringio"
3
+ require "io/console"
4
+
5
+ N = 1000
6
+ M = 50
7
+
8
+ def generate_random_data(n)
9
+ Array.new(n) { rand(-10.0..10.0) }
10
+ end
11
+
12
+ def monitor_keypress
13
+ loop do
14
+ key = STDIN.getch
15
+ if key.downcase == "q"
16
+ @stop_streaming = true
17
+ break
18
+ end
19
+ end
20
+ end
21
+
22
+ out = StringIO.new
23
+ def out.tty?
24
+ true
25
+ end
26
+
27
+ Thread.new { monitor_keypress }
28
+
29
+ loop do
30
+ out.truncate(0)
31
+
32
+ plot =
33
+ UnicodePlot.lineplot(
34
+ generate_random_data(40),
35
+ name: "Series 0",
36
+ width: 120,
37
+ height: 30
38
+ )
39
+ UnicodePlot.lineplot!(
40
+ plot,
41
+ generate_random_data(40),
42
+ name: "Series 1",
43
+ color: :red
44
+ )
45
+ plot.render(out)
46
+
47
+ lines = out.string.lines
48
+ lines.each { |line| $stdout.print "\r#{line}" }
49
+ $stdout.print "\e[0J"
50
+ $stdout.flush
51
+ break if @stop_streaming
52
+
53
+ n = lines.count
54
+ $stdout.print "\e[#{n}F"
55
+ end
data/streaming.rb ADDED
@@ -0,0 +1,71 @@
1
+ # rubocop:disable all
2
+ require "unicode_plot"
3
+ require "io/console"
4
+
5
+ def generate_random_data(n)
6
+ Array.new(n) { rand(-10.0..10.0) }
7
+ end
8
+
9
+ def update_data(plot, series1, series2)
10
+ plot.series_list[0].data.y = series1
11
+ plot.series_list[1].data.y = series2
12
+ plot.auto_calc_ylim
13
+ end
14
+
15
+ def start
16
+ Thread.new { monitor_keypress }
17
+ loop do
18
+ break if @stop_streaming
19
+ display_plot
20
+ sleep period
21
+ end
22
+ end
23
+
24
+ def monitor_keypress
25
+ loop do
26
+ key = STDIN.getch
27
+ if key.downcase == "q"
28
+ @stop_streaming = true
29
+ break
30
+ end
31
+ end
32
+ end
33
+
34
+ def plot_demo
35
+ out = StringIO.new
36
+ out.truncate(0)
37
+ plot =
38
+ UnicodePlot.lineplot(
39
+ generate_random_data(40),
40
+ name: "Series 0",
41
+ width: 40,
42
+ height: 10
43
+ )
44
+
45
+ UnicodePlot.lineplot!(
46
+ plot,
47
+ generate_random_data(40),
48
+ name: "Series 1",
49
+ color: :red
50
+ )
51
+ UnicodePlot.lineplot!(
52
+ plot,
53
+ generate_random_data(40),
54
+ name: "Series 2",
55
+ color: :blue
56
+ )
57
+ puts plot.render(out)
58
+
59
+ Thread.new { monitor_keypress }
60
+
61
+ loop do
62
+ break if @stop_streaming
63
+
64
+ lines = out.string.lines
65
+ lines.each { |line| $stdout.print "\r#{line}" }
66
+ $stdout.print "\e[0J"
67
+ $stdout.flush
68
+ end
69
+ end
70
+
71
+ plot_demo
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.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Carruthers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-11 00:00:00.000000000 Z
11
+ date: 2023-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -133,6 +133,7 @@ files:
133
133
  - ".DS_Store"
134
134
  - ".rubocop.yml"
135
135
  - ".streerc"
136
+ - ".streerc~1f4cd14e3c0a9afdf972aa5f3982d36a89869b72"
136
137
  - ".tool-versions"
137
138
  - CHANGELOG.md
138
139
  - Gemfile
@@ -140,6 +141,7 @@ files:
140
141
  - LICENSE.txt
141
142
  - README.md
142
143
  - Rakefile
144
+ - cog.toml
143
145
  - exe/rfbeam
144
146
  - lib/rfbeam.rb
145
147
  - lib/rfbeam/cli.rb
@@ -149,6 +151,7 @@ files:
149
151
  - lib/rfbeam/kld7/radar_messages.rb
150
152
  - lib/rfbeam/kld7/radar_parameters.rb
151
153
  - lib/rfbeam/kld7/serial_connection.rb
154
+ - lib/rfbeam/kld7/streamer.rb
152
155
  - lib/rfbeam/version.rb
153
156
  - node_modules/.bin/prettier
154
157
  - node_modules/.yarn-integrity
@@ -238,16 +241,18 @@ files:
238
241
  - package.json
239
242
  - rfbeam.gemspec
240
243
  - sig/rfbeam.rbs
244
+ - streamer2.rb
245
+ - streaming.rb
241
246
  - yarn.lock
242
- homepage: https://gitlab.com/robcarruthers/rfbeam
247
+ homepage: https://github.com/robcarruthers/rfbeam
243
248
  licenses:
244
249
  - MIT
245
250
  metadata:
246
- homepage_uri: https://gitlab.com/robcarruthers/rfbeam
247
- source_code_uri: https://gitlab.com/robcarruthers/rfbeam
248
- changelog_uri: https://gitlab.com/robcarruthers/rfbeam/-/blob/master/CHANGELOG.md
251
+ homepage_uri: https://github.com/robcarruthers/rfbeam
252
+ source_code_uri: https://github.com/robcarruthers/rfbeam
253
+ changelog_uri: https://github.com/robcarruthers/rfbeam/CHANGELOG.md
249
254
  rubygems_mfa_required: 'true'
250
- post_install_message:
255
+ post_install_message:
251
256
  rdoc_options: []
252
257
  require_paths:
253
258
  - lib
@@ -262,8 +267,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
262
267
  - !ruby/object:Gem::Version
263
268
  version: '0'
264
269
  requirements: []
265
- rubygems_version: 3.3.7
266
- signing_key:
270
+ rubygems_version: 3.3.26
271
+ signing_key:
267
272
  specification_version: 4
268
273
  summary: Ruby API and CLI for RFBeam doplar radar modules
269
274
  test_files: []
data/.streerc DELETED
@@ -1,2 +0,0 @@
1
- --print-width=120
2
- --plugins=plugin/single_quotes