rfbeam 0.4.10 → 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: 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