rfbeam 0.4.10 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d9b598dd013b48a6c19e5755f4af6a687a1fd2b82ac2aaa3d38c3a8b98db2f8
4
- data.tar.gz: d1bf6b228eb6c0cff37ae44a178c7eb9b1e80e033894d2ae2456e2882d6ac180
3
+ metadata.gz: 641d32533a354fa54db2906e234d7243899286dd85ab72a51d8a477b27f327cd
4
+ data.tar.gz: a1d94a25fee763ada51a4dc5fd6687f7bb4e1bc67a56adae257dd67efa6ded79
5
5
  SHA512:
6
- metadata.gz: 277a4e68325e439d64db8ffc1af15b5b1aeae5be8b9f9718100d6fd9cdd7bb228274c51a856960d775f8f3ecf041616e59b039acf22b029b990d4b5488793053
7
- data.tar.gz: 54b6209b877a2304139c8ea615d9fe0437b3393ee75385c00735ffe24279d0940d29b061cf28f6fbe47cdd7c5a2b208aecffe97a49b266f2aa8fad751cf52ae2
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,15 @@
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
+
9
+ ## [0.5.0] - 2023-11-4
10
+
11
+ - Refactored CLI, refined help and options
12
+
1
13
  ## [0.4.2] - 2023-4-4
2
14
 
3
15
  - Changed Data.define to Struct to support ruby 3.1.2
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- rfbeam (0.4.10)
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
@@ -24,17 +23,17 @@ module RfBeam
24
23
  puts table.render(:ascii)
25
24
  end
26
25
 
27
- desc 'config <radar_id>', 'Shows the parameter setting for the Radar module'
26
+ desc 'config [RADAR_ID]', 'Shows the parameter setting for the Radar module'
28
27
  def config(radar_id)
29
28
  puts radar(radar_id).config
30
29
  end
31
30
 
32
- desc 'reset <radar_id>', 'Shows the parameter setting for the Radar module'
31
+ desc 'reset [RADAR_ID]', 'Shows the parameter setting for the Radar module'
33
32
  def reset(radar_id)
34
33
  @logger.success 'Radar reset to factory defaults' if radar(radar_id).reset
35
34
  end
36
35
 
37
- desc 'set_param <radar_id> <key> <value>', 'Set radar parameters, see readme for keys'
36
+ desc 'set_param [RADAR_ID] [KEY] [VALUE]', 'Set radar parameters, see readme for KEYS'
38
37
  def set_param(radar_id, param, value)
39
38
  return @logger.warn("Invalid param: '#{param}'") unless Kld7::RADAR_PARAMETERS.include?(param.to_sym)
40
39
 
@@ -46,14 +45,35 @@ module RfBeam
46
45
  desc 'ddat <radar_id>', 'stream any valid detections, stop stream with q and enter'
47
46
  option :stream, type: :boolean, aliases: '-s', desc: 'Stream the data from the device'
48
47
  def ddat(radar_id)
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
64
+ end
65
+
66
+ desc 'tdat [RADAR_ID]', 'Display tracked target data'
67
+ option :raw, type: :boolean, aliases: '-r', desc: 'Display raw data'
68
+ def tdat(radar_id)
49
69
  cli = RfBeam::Kld7::CliOutput.new(radar_id)
50
- cli.display(:ddat, stream: options[:stream])
70
+ cli.display(:tdat, options)
51
71
  end
52
72
 
53
- desc 'pdat <radar_id>', 'Display Tracked Targets'
73
+ desc 'pdat [RADAR_ID]', 'Display Tracked Targets'
54
74
  def pdat(radar_id)
55
75
  cli = RfBeam::Kld7::CliOutput.new(radar_id)
56
- cli.display(:pdat, stream: options[:stream])
76
+ cli.display(:pdat, options)
57
77
  end
58
78
 
59
79
  desc 'rfft <radar_id>', 'Display the dopplar radar data as a plot'
@@ -68,12 +88,6 @@ module RfBeam
68
88
  end
69
89
  end
70
90
 
71
- desc 'tdat <radar_id>', 'Display tracked target data'
72
- def tdat(radar_id)
73
- cli = RfBeam::Kld7::CliOutput.new(radar_id)
74
- cli.display(:tdat, stream: options[:stream])
75
- end
76
-
77
91
  private
78
92
 
79
93
  def radar(id)
@@ -81,7 +95,44 @@ module RfBeam
81
95
  @logger = TTY::Logger.new
82
96
  return @logger.warning 'No Radar modules found.' unless devices.count.positive?
83
97
 
84
- 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
85
136
  end
86
137
  end
87
138
  end
@@ -5,6 +5,10 @@ require 'tty-table'
5
5
  module RfBeam
6
6
  module Kld7
7
7
  class CliFormatter
8
+ def self.format(type, data)
9
+ new.format(type, data)
10
+ end
11
+
8
12
  def format(type, data)
9
13
  case type
10
14
  when :tdat
@@ -16,10 +20,6 @@ module RfBeam
16
20
  end
17
21
  end
18
22
 
19
- def tdat(data)
20
- { dist: data[2], speed: data[3], angle: data[4], mag: data[5] }
21
- end
22
-
23
23
  def pdat_table(data)
24
24
  table = TTY::Table.new header: ['index', 'dist (M)', 'speed (Km/h)', 'angle (°)', 'mag (db)']
25
25
  count = data[1] / 8
@@ -41,6 +41,17 @@ module RfBeam
41
41
  .join("\n")
42
42
  end
43
43
 
44
+ def tdat(data)
45
+ return 'No target detected' unless data[1].positive?
46
+
47
+ [
48
+ "Distance: #{data[2].to_f / 100.0} m",
49
+ "Speed: #{data[3].to_f / 100.0} km/h",
50
+ "Angle: #{data[4].to_f / 100.0}°",
51
+ "Mag: #{data[5].to_f / 100.0} db"
52
+ ].join("\n")
53
+ end
54
+
44
55
  def to_symbol(string)
45
56
  modified_string = string.gsub(' ', '_').downcase
46
57
  modified_string.to_sym
@@ -20,8 +20,9 @@ module RfBeam
20
20
  end
21
21
  end
22
22
 
23
- def display(type, stream: false)
24
- stream ? send("stream_#{type}") : send("display_#{type}")
23
+ def display(type, options)
24
+ display_method = options[:stream].nil? ? 'display' : 'stream'
25
+ send("#{display_method}_#{type}", options)
25
26
  end
26
27
 
27
28
  def plot(type, stream: false)
@@ -79,8 +80,12 @@ module RfBeam
79
80
  }
80
81
  end
81
82
 
82
- def display_ddat
83
- puts RfBeam::Kld7::CliFormatter.new.format(:ddat, @radar.ddat)
83
+ def display_ddat(options)
84
+ if options[:raw].nil?
85
+ puts RfBeam::Kld7::CliFormatter.format(:ddat, @radar.ddat)
86
+ else
87
+ puts @radar.ddat.inspect
88
+ end
84
89
  end
85
90
 
86
91
  def stream_ddat
@@ -98,11 +103,15 @@ module RfBeam
98
103
  end
99
104
  end
100
105
 
101
- def display_tdat
102
- puts RfBeam::Kld7::CliFormatter.new.tdat(@radar.tdat)
106
+ def display_tdat(options)
107
+ if options[:raw].nil?
108
+ puts RfBeam::Kld7::CliFormatter.format(:tdat, @radar.tdat)
109
+ else
110
+ puts @radar.tdat.inspect
111
+ end
103
112
  end
104
113
 
105
- def display_pdat
114
+ def display_pdat(*)
106
115
  table = RfBeam::Kld7::CliFormatter.new.pdat_table(@radar.pdat)
107
116
  puts "\n Detected Raw Targets"
108
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