rfbeam 0.3.4 → 0.3.5

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: 698385739f70574b698a117af8c749a21ebd75d9c3b0abaa39447ebd869324ef
4
- data.tar.gz: 11f47d264d76f5a5b968c8f7cb49152602359383e8a0cf20a16564a2b2e808f3
3
+ metadata.gz: 139acc0d00964189f2eadbba6ed9c7b0e3f4b6c5104a757b2c1ab335d0e30c22
4
+ data.tar.gz: 86370312525afb17e493aa4b561a68b0f57dc48122f3ecd5f389c421c512cbe8
5
5
  SHA512:
6
- metadata.gz: 58b01ae8497458e6e4f238afcc64a38cd925312e7893b4e65a854407f34694493b002e5721a9980129d586370cc51abfca5e5cd238a51cf33dfb890f40992479
7
- data.tar.gz: 48934f301cb4eb9ac2cdb695d08dfd544cc9e6ea16f130ab6b30b182c35ee1630d5ad2574c4bab081656f51ce4208857c92a2dfd6d2925639c303a3c66c0d1ae
6
+ metadata.gz: 76e49986de83640754506d935a5a46b0c74548fe96ac7fec03bff66efe048937eaf1dd1175ea25658e3cbdc3705f6f4744df56c969f584e9f3763629d37fbe0e
7
+ data.tar.gz: 0d032f953bca0658fb4edec3544925bd1fe675b759b1a9759a8cfbffea0abd76f7e1690bb9ae87df5d700a102d4c713f5bb858ca7a8b855d039c3ea448e94428
data/.rubocop.yml CHANGED
@@ -2,10 +2,16 @@ inherit_from:
2
2
  - node_modules/@prettier/plugin-ruby/rubocop.yml
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.6
5
+ TargetRubyVersion: 3.2
6
6
 
7
7
  Layout/LineLength:
8
8
  Max: 120
9
9
 
10
+ Metrics/ModuleLength:
11
+ Enabled: false
12
+
13
+ Metrics/MethodLength:
14
+ Max: 15
15
+
10
16
  Documentation:
11
17
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
+ ## [0.3.5] - 2023-4-1
2
+
3
+ - Updated Radar parameter accessors
4
+ - Added parameter setter arg validation and errors
5
+
1
6
  ## [0.3.4] - 2023-3-28
2
7
 
3
- - Added a formatted option to pdat
8
+ - Added a formatted option to pdat
4
9
 
5
10
  ## [0.3.2] - 2023-3-28
6
11
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rfbeam (0.3.4)
4
+ rfbeam (0.3.5)
5
5
  activesupport (~> 6.1.0)
6
6
  rubyserial (~> 0.6.0)
7
7
  thor (~> 1.2.1)
data/README.md CHANGED
@@ -1,7 +1,11 @@
1
1
  # Rfbeam
2
2
 
3
- RfBeam is a simple, high-level interface to the RFBeam radar modules.
4
- The user can read and set the radar parameters and fetch raw or processed data frames from the sensor.
3
+ ![Gem](https://img.shields.io/gem/v/rfbeam?color=green&label=version)
4
+ ![Ruby](https://img.shields.io/static/v1?message=Ruby&color=red&logo=Ruby&logoColor=FFFFFF&label=v3.2.1)
5
+ ![Ruby](https://img.shields.io/gitlab/license/robcarruthers/rfbeam?color=orange)
6
+
7
+ RfBeam is a simple, high-level interface for the RFBeam radar modules.
8
+ The user can query process and raw detection data and set the radar parameters for the sensor.
5
9
 
6
10
  At this stage it only works on Linux and Mac with the K-LD7 module.
7
11
 
@@ -63,28 +67,29 @@ Returns a formatted String of all parameter settings. The only way to read param
63
67
 
64
68
  radar.config
65
69
 
66
- Software Version: K-LD7_APP-RFB-0103
67
- Base Frequency: Middle
68
- Max Speed: 25km/h
69
- Max Range: 10m
70
- Threshold offset: 30db
71
- Tracking Filter Type: standard
72
- Vibration Suppression: 2 , (0-16, 0 = No Suppression, 16 = High Suppression)
73
- Minimum Detection Distance: 0 , (0 - 100% of range setting)
74
- Maximum Detection Distance: 50 , (0 - 100% of range setting)
75
- Minimum Detection Angle: -90° , (-90° - 90°)
76
- Maximum Detection Angle: 90° , (0 - 100% of range setting)
77
- Maximum Detection Speed: 0 , (0 - 100% of speed setting)
78
- Maximum Detection Speed: 100 , (0 - 100% of speed setting)
79
- Detection Direction: 2Range Threshold: 10%, (0 - 100% of range setting)
80
- Angle Threshold: 0°, (-90° - 90°)
81
- Speed Threshold: 50%, (0 - 100% of speed setting)
82
- Digital output 1: Direction
83
- Digital output 2: Angle
84
- Digital output 3: Range
85
- Hold time: 1sec
86
- Micro Detection Retrigger: Off
87
- Micro Detection Sensitivity: 4 (0 - 9, 0 = Min, 9 = Max)
70
+ Software Version: K-LD7_APP-RFB-0103
71
+ Base Frequency: Low
72
+ Maximum Speed: 100km/h
73
+ Maximum Range: 100m
74
+ Threshold Offset: 30db
75
+ Tracking Filter Type: Long Visibility
76
+ Vibration Suppression: 16
77
+ Minimum Detection Distance: 0%
78
+ Maximum Detection Distance: 100%
79
+ Minimum Detection Angle: -10°
80
+ Maximum Detection Angle: 90°
81
+ Minimum Detection Speed: 0%
82
+ Maximum Detection Speed: 100%
83
+ Detection Direction: Both
84
+ Range Threshold: 10%
85
+ Angle Threshold: 0°
86
+ Speed Threshold: 50%
87
+ Digital Output 1: Direction
88
+ Digital Output 2: Angle
89
+ Digital Output 3: Range
90
+ Hold Time: 1s
91
+ Micro Detection Trigger: Off
92
+ Micro Detection Sensativity: 4
88
93
 
89
94
  ## Parameter setters
90
95
 
@@ -11,7 +11,7 @@ module RfBeam
11
11
  3 => 'Invalid RPST version',
12
12
  4 => 'Uart error (parity, framing, noise)',
13
13
  5 => 'Sensor busy',
14
- 6 => 'Timeout error',
14
+ 6 => 'Timeout error'
15
15
  }.freeze
16
16
 
17
17
  # The response delay was determined empirically and may need adjusting with baude rate
@@ -27,59 +27,39 @@ module RfBeam
27
27
  angle: %w[Left Right],
28
28
  direction: %w[Receding Approaching],
29
29
  range: %w[Far Near],
30
- speed: %w[Low High],
31
- }.freeze
30
+ speed: %w[Low High]
31
+ }.freeze
32
32
 
33
- # GRPS - Parameter structure, used to map return values to readable strings
34
- PARAMETER_STRUCTURE = {
35
- base_frequency: ['Low', 'Middle', 'High'],
36
- max_speed: ['12.5km/h', '25km/h', '50km/h', '100km/h'],
37
- max_range: %w[5m 10m 30m 100m],
38
- threshold_offset: '10db - 60db',
39
- tracking_filter_type: ['standard', 'Fast Detection', 'Long Visibility'],
40
- vibration_suppression: '0-16, 0 = No Suppression, 16 = High Suppression',
41
- min_detection_distance: '0 - 100% of range setting',
42
- max_detection_distance: '0 - 100% of range setting',
43
- min_detection_angle: '-90° - 90°',
44
- max_detection_angle: '-90° - 90°',
45
- min_detection_speed: '0 - 100% of speed setting',
46
- max_detection_speed: '0 - 100% of speed setting',
47
- detection_direction: %w[receding approaching both],
48
- range_threshold: '0 - 100% of range setting',
49
- angle_threshold: '-90° - 90°',
50
- speed_threshold: '0 - 100% of speed setting',
51
- digital_output_1: %w[Direction Angle Range Speed Micro],
52
- digital_output_2: %w[Direction Angle Range Speed Micro],
53
- digital_output_3: %w[Direction Angle Range Speed Micro],
54
- hold_time: '1 - 7200s',
55
- micro_detection_trigger: %w[Off Retrigger],
56
- micro_detection_sensitivity: '0 - 9, 0 = Min, 9 = Max'
33
+ Param = Data.define(:name, :grps_index, :description, :default, :units, :values) do |_param|
34
+ def initialize(name:, grps_index:, description: nil, default: nil, units: nil, values: [])
35
+ super(name:, grps_index:, description:, default:, units:, values:)
36
+ end
37
+ end
38
+
39
+ RADAR_PARAMETERS = {
40
+ sw_version: Param.new(name: 'Software Version', grps_index: 2, default: 'K-LD7_APP-RFB-XXXX'),
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
+ 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
+ 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
+ threshhold_offset: Param.new( name: 'Threshold Offset', grps_index: 6, description: '10db - 60db', default: 30, units: 'db' ),
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
+ vibration_suppression: Param.new( name: 'Vibration Suppression', grps_index: 8, description: '0-16, 0 = No Suppression, 16 = High Suppression', default: 2 ),
47
+ min_detection_distance: Param.new( name: 'Minimum Detection Distance', grps_index: 9, description: '0 - 100% of range setting', default: 0, units: '%' ),
48
+ max_detection_distance: Param.new( name: 'Maximum Detection Distance', grps_index: 10, description: '0 - 100% of range setting', default: 50, units: '%' ),
49
+ min_detection_angle: Param.new( name: 'Minimum Detection Angle', grps_index: 11, description: '-90° - 90°', default: -90, units: '°' ),
50
+ max_detection_angle: Param.new( name: 'Maximum Detection Angle', grps_index: 12, description: '-90° - 90°', default: 90, units: '°' ),
51
+ min_detection_speed: Param.new( name: 'Minimum Detection Speed', grps_index: 13, description: '0 - 100% of speed setting', default: 0, units: '%' ),
52
+ max_detection_speed: Param.new( name: 'Maximum Detection Speed', grps_index: 14, description: '0 - 100% of speed setting', default: 100, units: '%' ),
53
+ detection_direction: Param.new( name: 'Detection Direction', grps_index: 15, description: '0 = Receding, 1 = Approaching, 2 = Both', default: 2, values: %w[Receding Approaching Both] ),
54
+ range_threshold: Param.new( name: 'Range Threshold', grps_index: 16, description: '0 - 100% of range setting', default: 10, units: '%' ),
55
+ angle_threshold: Param.new( name: 'Angle Threshold', grps_index: 17, description: '-90° - 90°', default: 0, units: '°' ),
56
+ speed_threshold: Param.new( name: 'Speed Threshold', grps_index: 18, description: '0 - 100% of speed setting', default: 50, units: '%' ),
57
+ digital_output1: Param.new( name: 'Digital Output 1', grps_index: 19, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection', default: 0, values: %w[Direction Angle Range Speed Micro] ),
58
+ digital_output2: Param.new( name: 'Digital Output 2', grps_index: 20, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection', default: 1, values: %w[Direction Angle Range Speed Micro] ),
59
+ digital_output3: Param.new( name: 'Digital Output 3', grps_index: 21, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection', default: 2, values: %w[Direction Angle Range Speed Micro] ),
60
+ hold_time: Param.new( name: 'Hold Time', grps_index: 22, description: '1 - 7200s', default: 1, units: 's' ),
61
+ micro_detection_retrigger: Param.new( name: 'Micro Detection Trigger', grps_index: 23, description: '0 = Off, 1 = Retrigger', default: 0, values: %w[Off Retrigger] ),
62
+ micro_detection_sensativity: Param.new( name: 'Micro Detection Sensativity', grps_index: 24, description: '0 - 9, 0 = Min, 9 = Max', default: 4 )
57
63
  }.freeze
58
-
59
- # PARAMETERS = {
60
- # sw_version: { grps_index: 2, default: 'K-LD7_APP-RFB-XXXX' },
61
- # base_frequency: { grps_index: 3, description: '0 = Low, 1 = Middle, 2 = High', default: '1 - Middle', values: ['Low', 'Middle', 'High'] },
62
- # max_speed: { grps_index: 4, description: '0 = 12km/h, 1 = 25km/h, 2 = 50km/h, 3 = 100km/h, default: 1', values: ['12.5km/h', '25km/h', '50km/h', '100km/h'] },
63
- # max_range: { grps_index: 5, description: '0 = 5m, 1 = 10m, 2 = 30m, 3 = 100m, default: 1', values: %w[5m 10m 30m 100m] },
64
- # threshold_offset: { grps_index: 6, description: '10db - 60db, default: 30', values: '10db - 60db' },
65
- # tracking_filter_type: { grps_index: 7, description: '0 = Standard, 2 = Fast Detection, 3 = Long Visibility, default: 0', values: ['standard', 'Fast Detection', 'Long Visibility'] },
66
- # vibration_suppression: { grps_index: 8, description: '0-16, 0 = No Suppression, 16 = High Suppression, default: 2' },
67
- # min_detection_distance: { grps_index: 3, description: '0 - 100% of range setting, default: 0' },
68
- # max_detection_distance: { grps_index: 10, description: '0 - 100% of range setting, default: 50' },
69
- # min_detection_angle: { grps_index: 11, description: '-90° - 90°, default: -90' },
70
- # max_detection_angle: { grps_index: 12, description: '-90° - 90°, default: 90' },
71
- # min_detection_speed: { grps_index: 13, description: '0 - 100% of speed setting, default: 0' },
72
- # max_detection_speed: { grps_index: 14, description: '0 - 100% of speed setting, default: 100' },
73
- # detection_direction: { grps_index: 15, description: '0 = Receding, 1 = Approaching, 2 = Both, default: 2', values: %w[receding approaching both] },
74
- # range_threshold: { grps_index: 16, description: '0 - 100% of range setting, default: 10', values: '0 - 100% of range setting' },
75
- # angle_threshold: { grps_index: 17, description: '-90° - 90°, default: 0' },
76
- # speed_threshold: { grps_index: 18, description: '0 - 100% of speed setting, default: 50' },
77
- # digital_output_1: { grps_index: 19, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default: 0', values: %w[Direction Angle Range Speed Micro] },
78
- # digital_output_2: { grps_index: 20, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default: 1', values: %w[Direction Angle Range Speed Micro] },
79
- # digital_output_3: { grps_index: 21, description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default: 2', values: %w[Direction Angle Range Speed Micro] },
80
- # hold_time: { grps_index: 22, description: '1 - 7200s, default: 1', values: '1 - 7200s' },
81
- # micro_detection_trigger: { grps_index: 23, description: '0 = Off, 1 = Retrigger, default: 0' },
82
- # micro_detection_sensitivity: { grps_index: 24, description: '0 - 9, 0 = Min, 9 = Max, default: 4' }'
83
- # }
84
64
  end
85
65
  end
@@ -0,0 +1,81 @@
1
+ module RfBeam
2
+ module KLD7
3
+ def detection?
4
+ data = ddat
5
+ (data[2] == 1)
6
+ end
7
+
8
+ def pdat(formatted: false)
9
+ request_frame_data(:pdat)
10
+ resp = read(102).unpack('a4LSssSSssSSssSSssSSssSSssSSssSSssSSssSSssS')
11
+ return resp unless formatted
12
+
13
+ target_count = resp[1].to_i / 8
14
+ return [] unless target_count > 0
15
+
16
+ resp.shift 2
17
+ resp.compact
18
+ detected_raw_targets = []
19
+ target_count.times { detected_raw_targets << format_raw_target_data(resp.shift(4)) }
20
+ detected_raw_targets
21
+ end
22
+
23
+ def tdat
24
+ request_frame_data(:tdat)
25
+
26
+ sleep 0.1
27
+ resp = read(16).unpack('a4LSssS')
28
+ return { dist: resp[2], speed: resp[3], angle: resp[4], mag: resp[5] } unless resp[1].zero?
29
+ end
30
+
31
+ def ddat
32
+ request_frame_data(:ddat)
33
+
34
+ read(14).unpack('a4LC6')
35
+ end
36
+
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
+ # Get the radar parameter structure
51
+ def grps
52
+ command = ['GRPS', 0]
53
+ write command.pack('a4L')
54
+ check_response
55
+ read(50).unpack('a4LA19C8c2C4cCCCCSCC')
56
+ end
57
+
58
+
59
+ private
60
+
61
+ def format_raw_target_data(array)
62
+ { dist: array.shift, speed: array.shift, angle: array.shift, mag: array.shift }
63
+ end
64
+
65
+ def request_frame_data(type)
66
+ command = ['GNFD', 4, FRAME_DATA_TYPES[type]]
67
+ write command.pack('a4LL')
68
+ check_response
69
+ 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
+ end
81
+ end
@@ -0,0 +1,390 @@
1
+ module RfBeam
2
+ module KLD7
3
+
4
+ # -----------------
5
+ # Base Frequency, 0 = low, 1 = middle (default), 2 = high
6
+ # -----------------
7
+ def base_frequency
8
+ query_parameter RADAR_PARAMETERS[:base_frequency].grps_index
9
+ end
10
+ alias rbfr base_frequency
11
+
12
+ def base_frequency=(frequency = 1)
13
+ value = case frequency
14
+ when 0, :low, 'low'
15
+ 0
16
+ when 1, :middle, 'middle'
17
+ 1
18
+ when 2, :high, 'high'
19
+ 2
20
+ else
21
+ raise ArgumentError, "Invalid arg: '#{frequency}'"
22
+ end
23
+ set_parameter(:rbfr, value, :uint32)
24
+ end
25
+
26
+ alias set_base_frequency base_frequency=
27
+ alias rbfr= base_frequency=
28
+
29
+ # -----------------
30
+ # Maximum Speed, 0 = 12.5km/h, 1 = 25km/h (default), 2 = 50km/h, 3 = 100km/h
31
+ # -----------------
32
+ def max_speed
33
+ query_parameter(RADAR_PARAMETERS[:max_speed].grps_index)
34
+ end
35
+
36
+ def max_speed=(speed = 1)
37
+ raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..3).include?(speed)
38
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
39
+
40
+ set_parameter :rspi, speed, :uint32
41
+ end
42
+
43
+ alias set_max_speed max_speed=
44
+ alias rspi max_speed=
45
+
46
+ # -----------------
47
+ # Maximum Range, 0 = 5m, 1 = 10m (default), 2 = 30m, 3 = 100m
48
+ # -----------------
49
+ def max_range
50
+ query_parameter(RADAR_PARAMETERS[:max_range].grps_index)
51
+ end
52
+
53
+ def max_range=(range = 1)
54
+ raise ArgumentError, "Invalid arg: '#{range}'" unless (0..3).include?(range)
55
+
56
+ set_parameter :rrai, range, :uint32
57
+ end
58
+
59
+ alias rrai= max_range=
60
+ alias set_max_range max_range=
61
+
62
+ # -----------------
63
+ # Threshold Offset, 10 - 60db, (default = 30)
64
+ # -----------------
65
+ def threshold_offset
66
+ query_parameter RADAR_PARAMETERS[:threshold_offset].grps_index
67
+ end
68
+
69
+ def threshold_offset=(offset = 30)
70
+ raise ArgumentError, "Invalid arg: '#{offset}'" unless (10..60).include?(offset)
71
+ raise ArgumentError, "Expected an Integer" unless range.is_a?(Integer)
72
+
73
+ set_parameter :thof, offset, :uint32
74
+ end
75
+
76
+ alias thof= threshold_offset=
77
+ alias set_threshold_offset threshold_offset=
78
+
79
+ # -----------------
80
+ # Tracking filter type, 0 = Standard (Default), 1 = Fast Tracking, 2 = Long visibility
81
+ # -----------------
82
+ def tracking_filter
83
+ query_parameter RADAR_PARAMETERS[:tracking_filter].grps_index
84
+ end
85
+
86
+ def set_tracking_filter(type = 0)
87
+ raise ArgumentError, "Invalid arg: '#{type}'" unless (0..2).include?(type)
88
+ raise ArgumentError, "Expected an Integer" unless type.is_a?(Integer)
89
+
90
+ set_parameter :trft, type, :uint32
91
+ end
92
+ alias trtf set_tracking_filter
93
+
94
+ # -----------------
95
+ # Vibration suppression, 0 - 16, 0 = No Suppression, 16 = High Suppression, default = 2
96
+ # -----------------
97
+ def vibration_suppression
98
+ query_parameter RADAR_PARAMETERS[:vibration_suppression].grps_index
99
+ end
100
+
101
+ def vibration_suppression=(value = 2)
102
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..16).include?(value)
103
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
104
+
105
+ set_parameter :visu, value, :uint32
106
+ end
107
+ alias visu= vibration_suppression=
108
+ alias set_vibration_suppression vibration_suppression=
109
+
110
+ # -----------------
111
+ # Minimum Detection distance, 0 - 100% of Range setting, default = 0
112
+ # -----------------
113
+ def min_detection_distance
114
+ query_parameter RADAR_PARAMETERS[:min_detection_distance].grps_index
115
+ end
116
+
117
+ def min_detection_distance=(value = 0)
118
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
119
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
120
+
121
+ set_parameter :mira, value, :uint32
122
+ end
123
+ alias mira= min_detection_distance=
124
+ alias set_min_detection_distance min_detection_distance=
125
+
126
+ # -----------------
127
+ # Maximum Detection distance, 0 - 100% of Range setting, default = 50
128
+ # -----------------
129
+ def max_detection_distance
130
+ query_parameter RADAR_PARAMETERS[:min_detection_distance].grps_index
131
+ end
132
+
133
+ def max_detection_distance=(value = 50)
134
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
135
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
136
+
137
+ set_parameter :mara, value, :uint32
138
+ end
139
+ alias mara= max_detection_distance=
140
+ alias set_max_detection_distance max_detection_distance=
141
+
142
+ # -----------------
143
+ # Minimum Detection Angle, -90° - 90°, default = -90
144
+ # -----------------
145
+ def min_detection_angle
146
+ query_parameter RADAR_PARAMETERS[:min_detection_angle].grps_index
147
+ end
148
+
149
+ def min_detection_angle=(angle = -90)
150
+ raise ArgumentError, "Invalid arg: '#{angle}'" unless (-90..90).include?(angle)
151
+ raise ArgumentError, "Expected an Integer" unless angle.is_a?(Integer)
152
+
153
+ set_parameter :mian, angle, :int32
154
+ end
155
+ alias mian= min_detection_angle=
156
+ alias set_min_detection_angle min_detection_angle=
157
+
158
+ # -----------------
159
+ # Maximum Detection Angle, -90° - 90°, default = 90
160
+ # -----------------
161
+ def max_detection_angleq
162
+ query_parameter RADAR_PARAMETERS[:max_detection_angle].grps_index
163
+ end
164
+
165
+ def max_detection_angle=(angle = 90)
166
+ raise ArgumentError, "Invalid arg: '#{angle}'" unless (-90..90).include?(angle)
167
+ raise ArgumentError, "Expected an Integer" unless angle.is_a?(Integer)
168
+
169
+ set_parameter :maan, angle, :int32
170
+ end
171
+ alias maan= max_detection_angle=
172
+ alias set_max_detection_angle max_detection_angle=
173
+
174
+ # -----------------
175
+ # Minimum Detection Speed, 0 - 100% of Speed setting, default = 0
176
+ # -----------------
177
+ def min_detection_speed
178
+ query_parameter RADAR_PARAMETERS[:min_detection_angle].grps_index
179
+ end
180
+
181
+ def min_detection_speed=(speed = 0)
182
+ raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..100).include?(speed)
183
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
184
+
185
+ set_parameter :misp, speed, :uint32
186
+ end
187
+ alias misp= min_detection_speed=
188
+ alias set_min_detection_speed min_detection_speed=
189
+
190
+ # -----------------
191
+ # Maximum Detection Speed, 0 - 100% of Speed setting, default = 100
192
+ # -----------------
193
+ def max_detection_speed
194
+ query_parameter RADAR_PARAMETERS[:max_detection_speed].grps_index
195
+ end
196
+
197
+ def max_detection_speed=(speed = 100)
198
+ raise ArgumentError, "Invalid arg: '#{speed}'" unless (0..100).include?(speed)
199
+ raise ArgumentError, "Expected an Integer" unless speed.is_a?(Integer)
200
+
201
+ set_parameter :masp, speed, :uint32
202
+ end
203
+ alias masp= max_detection_speed=
204
+ alias set_max_detection_speed max_detection_speed=
205
+
206
+ # -----------------
207
+ # Detection Direction, 0 = Receding, 1 = Approaching, 2 = Both (default)
208
+ # -----------------
209
+ def detection_direction
210
+ query_parameter RADAR_PARAMETERS[:detection_direction].grps_index
211
+ end
212
+
213
+ def detection_direction=(direction = 2)
214
+ raise ArgumentError, "Invalid arg: '#{direction}'" unless (0..2).include?(direction)
215
+ raise ArgumentError, "Expected an Integer" unless direction.is_a?(Integer)
216
+
217
+ set_parameter :dedi, direction, :uint32
218
+ end
219
+ alias dedi= detection_direction=
220
+ alias set_detection_direction detection_direction=
221
+
222
+ # -----------------
223
+ # Range Threshold, 0 - 100% of Range setting, default = 10
224
+ # -----------------
225
+ def range_threshold
226
+ query_parameter RADAR_PARAMETERS[:range_threshold].grps_index
227
+ end
228
+
229
+ def range_threshold=(value = 10)
230
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
231
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
232
+
233
+ set_parameter :rath, value, :uint32
234
+ end
235
+ alias rath= range_threshold=
236
+ alias set_range_threshold range_threshold=
237
+
238
+ # -----------------
239
+ # Angle Threshold, -90° to 90°, default = 0
240
+ # -----------------
241
+ def angle_threshold
242
+ query_parameter RADAR_PARAMETERS[:angle_threshold].grps_index
243
+ end
244
+
245
+ def angle_threshold=(value = 0)
246
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (-90..90).include?(value)
247
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
248
+
249
+ set_parameter :anth, value, :int32
250
+ end
251
+ alias anth= angle_threshold=
252
+ alias set_angle_threshold angle_threshold=
253
+
254
+ # -----------------
255
+ # Speed Threshold, 0 - 100% of speed setting, default = 50
256
+ # -----------------
257
+ def speed_threshold
258
+ query_parameter RADAR_PARAMETERS[:speed_threshold].grps_index
259
+ end
260
+
261
+ def speed_threshold=(value = 50)
262
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..100).include?(value)
263
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
264
+
265
+ set_parameter :spth, value, :uint32
266
+ end
267
+ alias spth= angle_threshold=
268
+ alias set_speed_threshold angle_threshold=
269
+
270
+ # -----------------
271
+ # Digital output 1, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 0
272
+ # -----------------
273
+ def digital_output1
274
+ query_parameter RADAR_PARAMETERS[:digital_output1]grps_index
275
+ end
276
+
277
+ def digital_output1=(value = 0)
278
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
279
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
280
+
281
+ set_parameter :dig1, value, :uint32
282
+ end
283
+ alias dig1= digital_output1=
284
+ alias set_digital_output1 digital_output1=
285
+
286
+ # -----------------
287
+ # Digital output 2, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 1
288
+ # -----------------
289
+ def digital_output2
290
+ query_parameter RADAR_PARAMETERS[:digital_output2]grps_index
291
+ end
292
+
293
+ def digital_output2=(value = 1)
294
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
295
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
296
+
297
+ set_parameter :dig2, value, :uint32
298
+ end
299
+ alias dig2= set_digital_output2=
300
+ alias set_digital_output2 digital_output2=
301
+
302
+ # -----------------
303
+ # Digital output 3, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 2
304
+ # -----------------
305
+ def digital_output3
306
+ query_parameter RADAR_PARAMETERS[:digital_output3].grps_index
307
+ end
308
+
309
+ def digital_output3=(value = 2)
310
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..4).include?(value)
311
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
312
+
313
+ set_parameter :dig3, value, :uint32
314
+ end
315
+ alias dig3= digital_output3=
316
+ alias set_digital_output3 digital_output3=
317
+
318
+ # -----------------
319
+ # Hold Time, 1 - 7200s, default = 1
320
+ # -----------------
321
+ def hold_time
322
+ query_parameter RADAR_PARAMETERS[:hold_time].grps_index
323
+ end
324
+
325
+ def hold_time=(time = 1)
326
+ raise ArgumentError, "Invalid arg: '#{time}'" unless (1..7200).include?(time)
327
+ raise ArgumentError, "Expected an Integer" unless time.is_a?(Integer)
328
+
329
+ set_parameter :hold, time, :uint32
330
+ end
331
+ alias hold= hold_time=
332
+ alias set_hold_time hold_time=
333
+
334
+ # -----------------
335
+ # Micro Detection retrigger, 0 = Off (default), 1 = Retrigger
336
+ # -----------------
337
+ def micro_detection_retrigger
338
+ query_parameter RADAR_PARAMETERS[:set_micro_detection_retrigger].grps_index
339
+ end
340
+
341
+ def micro_detection_retrigger=(value = 0)
342
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..1).include?(value)
343
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
344
+
345
+ set_parameter :mide, value, :uint32
346
+ end
347
+ alias mide= micro_detection_retrigger=
348
+ alias set_micro_detection_retrigger micro_detection_retrigger=
349
+
350
+ # -----------------
351
+ # Micro Detection sensitivity, 0 - 9, 0 = Min, 9 = Max, default = 4
352
+ # -----------------
353
+ def micro_detection_sensitivity
354
+ query_parameter RADAR_PARAMETERS[:micro_detection_sensitivity].grps_index
355
+ end
356
+
357
+ def micro_detection_sensitivity=(value = 4)
358
+ raise ArgumentError, "Invalid arg: '#{value}'" unless (0..9).include?(value)
359
+ raise ArgumentError, "Expected an Integer" unless value.is_a?(Integer)
360
+
361
+ set_parameter :mids, value, :uint32
362
+ end
363
+ alias mids= micro_detection_sensitivty=
364
+ alias set_micro_detection_sensitivity micro_detection_sensitivty=
365
+
366
+ private
367
+
368
+ def query_parameter(index)
369
+ data = grps
370
+ data[index]
371
+ end
372
+
373
+ def set_parameter(header, value, return_type = :uint32)
374
+ return_type =
375
+ case return_type
376
+ when :uint32
377
+ 'L'
378
+ when :int32
379
+ 'l'
380
+ when :uint32
381
+ 'S'
382
+ else
383
+ 'L'
384
+ end
385
+ command = [header.upcase.to_s, 4, value]
386
+ write command.pack("a4L#{return_type}")
387
+ check_response
388
+ end
389
+ end
390
+ end
@@ -2,8 +2,6 @@ module RfBeam
2
2
  module KLD7
3
3
  require 'rubyserial'
4
4
  require 'timeout'
5
-
6
-
7
5
 
8
6
  class Error < StandardError
9
7
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RfBeam
4
- VERSION = '0.3.4'
4
+ VERSION = '0.3.5'
5
5
  end
data/lib/rfbeam.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rfbeam/kld7/app_commands'
4
- require 'rfbeam/kld7/app_messages'
5
- require 'rfbeam/kld7/connection'
3
+ require 'rfbeam/kld7/radar_parameters'
4
+ require 'rfbeam/kld7/radar_messages'
5
+ require 'rfbeam/kld7/serial_connection'
6
6
  require 'rfbeam/kld7/constants'
7
7
  require_relative 'rfbeam/version'
8
8
 
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.3.4
4
+ version: 0.3.5
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-03-31 00:00:00.000000000 Z
11
+ date: 2023-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -69,10 +69,10 @@ files:
69
69
  - README.md
70
70
  - Rakefile
71
71
  - lib/rfbeam.rb
72
- - lib/rfbeam/kld7/app_commands.rb
73
- - lib/rfbeam/kld7/app_messages.rb
74
- - lib/rfbeam/kld7/connection.rb
75
72
  - lib/rfbeam/kld7/constants.rb
73
+ - lib/rfbeam/kld7/radar_messages.rb
74
+ - lib/rfbeam/kld7/radar_parameters.rb
75
+ - lib/rfbeam/kld7/serial_connection.rb
76
76
  - lib/rfbeam/version.rb
77
77
  - node_modules/.bin/prettier
78
78
  - node_modules/.yarn-integrity
@@ -1,201 +0,0 @@
1
- module RfBeam
2
- module KLD7
3
-
4
- # Base Frequency, 0 = low, 1 = middle (default), 2 = high
5
- def base_frequency
6
- data = grps
7
- data[3]
8
- end
9
- alias rbfr base_frequency
10
-
11
-
12
- def set_base_frequency(frequency = 1)
13
- value = case frequency
14
- when 0, :low, 'low'
15
- 0
16
- when 1, :middle, 'middle'
17
- 1
18
- when 2, :high, 'high'
19
- 2
20
- else
21
- raise ArgumentError, "Invalid arg: '#{frequency}'"
22
- end
23
- set_parameter(:rbfr, value, :uint8)
24
- end
25
- alias set_rbfr set_base_frequency
26
-
27
- # Maximum Speed, 0 = 12.5km/h, 1 = 25km/h (default), 2 = 50km/h, 3 = 100km/h
28
- def set_max_speed(speed = 1)
29
- set_parameter :rspi, speed, :uint8
30
- end
31
- alias rspi set_max_speed
32
-
33
- # Maximum Range, 0 = 5m, 1 = 10m (default), 2 = 30m, 3 = 100m
34
- def set_max_range(range = 1)
35
- set_parameter :rrai, range, :uint8
36
- end
37
- alias rrai set_max_range
38
-
39
- # Threshold Offset, 10 - 60db, (default = 30)
40
- def set_threshold_offset(offset = 30)
41
- range = 10..60
42
- return false unless range.include?(offset)
43
-
44
- set_parameter :thof, offset, :uint8
45
- end
46
- alias thof set_threshold_offset
47
-
48
- # Tracking filter type, 0 = Standard (Default), 1 = Fast Tracking, 2 = Long visibility
49
- def set_tracking_filter(type = 0)
50
- set_parameter :trft, type, :uint8
51
- end
52
- alias trtf set_tracking_filter
53
-
54
- # Vibration suppression, 0 - 16, 0 = No Suppression, 16 = High Suppression, default = 2
55
- def set_vibration_suppression(value = 2)
56
- set_parameter :visu, value, :uint8
57
- end
58
- alias visu set_vibration_suppression
59
-
60
- # Minimum Detection distance, 0 - 100% of Range setting, default = 0
61
- def set_min_detection_distance(value = 0)
62
- set_parameter :mira, value, :uint8
63
- end
64
- alias mira set_min_detection_distance
65
-
66
- # Maximum Detection distance, 0 - 100% of Range setting, default = 50
67
- def set_max_detection_distance(value = 50)
68
- set_parameter :mara, value, :uint8
69
- end
70
- alias mara set_max_detection_distance
71
-
72
- # Minimum Detection Angle, -90° - 90°, default = -90
73
- def set_min_detection_angle(angle = -90)
74
- set_parameter :mian, angle, :int8
75
- end
76
- alias mian set_min_detection_distance
77
-
78
- # Maximum Detection Angle, -90° - 90°, default = 90
79
- def set_max_detection_angle(angle = 90)
80
- set_parameter :maan, angle, :int8
81
- end
82
- alias maan set_max_detection_angle
83
-
84
- # Minimum Detection Speed, 0 - 100% of Speed setting, default = 0
85
- def set_min_detection_speed(speed = 0)
86
- set_parameter :misp, speed, :uint8
87
- end
88
- alias misp set_min_detection_speed
89
-
90
- # Maximum Detection Speed, 0 - 100% of Speed setting, default = 100
91
- def set_max_detection_speed(speed = 100)
92
- set_parameter :masp, speed, :uint8
93
- end
94
- alias masp set_max_detection_speed
95
-
96
- # Detection Direction, 0 = Receding, 1 = Approaching, 2 = Both (default)
97
- def set_detection_direction(direction = 2)
98
- set_parameter :dedi, direction, :uint8
99
- end
100
- alias dedi set_detection_direction
101
-
102
- # Range Threshold, 0 - 100% of Range setting, default = 10
103
- def set_range_threshold(value = 10)
104
- range = 0..100
105
- return false unless range.include?(value)
106
-
107
- set_parameter :rath, value, :uint8
108
- end
109
- alias rath set_range_threshold
110
-
111
- # Angle Threshold, -90° to 90°, default = 0
112
- def set_range_threshold(value = 0)
113
- range = -90..90
114
- return false unless range.include?(value)
115
-
116
- set_parameter :anth, value, :int8
117
- end
118
- alias anth set_range_threshold
119
-
120
- # Speed Threshold, 0 - 100% of speed setting, default = 50
121
- def set_angle_threshold(value = 50)
122
- range = 0..100
123
- return false unless range.include?(value)
124
-
125
- set_parameter :spth, value, :uint8
126
- end
127
- alias spth set_angle_threshold
128
-
129
- # Digital output 1, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 0
130
- def set_dio_1(value = 0)
131
- range = 0..4
132
- return false unless range.include?(value)
133
-
134
- set_parameter :dig1, value, :uint8
135
- end
136
- alias dig1 set_dio_1
137
-
138
- # Digital output 2, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 1
139
- def set_dio_2(value = 1)
140
- range = 0..4
141
- return false unless range.include?(value)
142
-
143
- set_parameter :dig2, value, :uint8
144
- end
145
- alias dig2 set_dio_2
146
-
147
- # Digital output 3, 0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection, default = 2
148
- def set_dio_3(value = 2)
149
- range = 0..4
150
- return false unless range.include?(value)
151
-
152
- set_parameter :dig3, value, :uint8
153
- end
154
- alias dig3 set_dio_3
155
-
156
- # Hold Time, 1 - 7200s, default = 1
157
- def set_hold_time(time = 1)
158
- range = 1..7200
159
- return false unless range.include?(time)
160
-
161
- set_parameter :hold, time, :uint16
162
- end
163
- alias hold set_hold_time
164
-
165
- # Micro Detection retrigger, 0 = Off (default), 1 = Retrigger
166
- def set_micro_detection_retrigger(value = 0)
167
- return false unless [0, 1].include?(value)
168
-
169
- set_parameter :mide, value, :uint8
170
- end
171
- alias mide set_micro_detection_retrigger
172
-
173
- # Micro Detection sensitivity, 0 - 9, 0 = Min, 9 = Max, default = 4
174
- def set_micro_detection_sensitivty(value = 4)
175
- range = 0..9
176
- return false unless range.include?(value)
177
-
178
- set_parameter :mids, value, :uint8
179
- end
180
- alias mids set_micro_detection_sensitivty
181
-
182
- private
183
-
184
- def set_parameter(header, value, return_type = :uint8)
185
- return_type =
186
- case return_type
187
- when :uint8
188
- 'L'
189
- when :int8
190
- 'l'
191
- when :uint16
192
- 'S'
193
- else
194
- 'L'
195
- end
196
- command = [header.upcase.to_s, 4, value]
197
- write command.pack("a4L#{return_type}")
198
- check_response
199
- end
200
- end
201
- end
@@ -1,100 +0,0 @@
1
- module RfBeam
2
- module KLD7
3
- def detection?
4
- data = ddat
5
- (data[2] == 1)
6
- end
7
-
8
- def pdat(formatted: false)
9
- request_frame_data(:pdat)
10
- resp = read(102).unpack('a4LSssSSssSSssSSssSSssSSssSSssSSssSSssSSssS')
11
- return resp unless formatted
12
-
13
- target_count = resp[1].to_i / 8
14
- return [] unless target_count > 0
15
-
16
- resp.shift 2
17
- resp.compact
18
- detected_raw_targets = []
19
- target_count.times { detected_raw_targets << format_raw_target_data(resp.shift(4)) }
20
- detected_raw_targets
21
- end
22
-
23
- def tdat
24
- request_frame_data(:tdat)
25
-
26
- sleep 0.1
27
- resp = read(16).unpack('a4LSssS')
28
- return { dist: resp[2], speed: resp[3], angle: resp[4], mag: resp[5] } unless resp[1].zero?
29
- end
30
-
31
- def ddat
32
- request_frame_data(:ddat)
33
-
34
- read(14).unpack('a4LC6')
35
- end
36
-
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
- # Get the radar parameter structure
51
- def grps
52
- command = ['GRPS', 0]
53
- write command.pack('a4L')
54
- check_response
55
- read(50).unpack('a4LA19C8c2C4cCCCCSCC')
56
- end
57
-
58
-
59
- private
60
-
61
- def format_raw_target_data(array)
62
- { dist: array.shift, speed: array.shift, angle: array.shift, mag: array.shift }
63
- end
64
-
65
- def request_frame_data(type)
66
- command = ['GNFD', 4, FRAME_DATA_TYPES[type]]
67
- write command.pack('a4LL')
68
- check_response
69
- end
70
-
71
- def formatted_grps(data)
72
- output = "\n"
73
- output << "Software Version: #{data[2]}\n"
74
- output << "Base Frequency: #{PARAMETER_STRUCTURE[:base_frequency][data[3]]}\n"
75
- output << "Max Speed: #{PARAMETER_STRUCTURE[:max_speed][data[4]]}\n"
76
- output << "Max Range: #{PARAMETER_STRUCTURE[:max_range][data[5]]}\n"
77
- output << "Threshold offset: #{data[6]}db\n"
78
- output << "Tracking Filter Type: #{PARAMETER_STRUCTURE[:tracking_filter_type][data[7]]}\n"
79
- output << "Vibration Suppression: #{data[8]} , (#{PARAMETER_STRUCTURE[:vibration_suppression]})\n"
80
- output << "Minimum Detection Distance: #{data[9]} , (#{PARAMETER_STRUCTURE[:min_detection_distance]})\n"
81
- output << "Maximum Detection Distance: #{data[10]} , (#{PARAMETER_STRUCTURE[:max_detection_distance]})\n"
82
- output << "Minimum Detection Angle: #{data[11]}° , (#{PARAMETER_STRUCTURE[:min_detection_angle]})\n"
83
- output << "Maximum Detection Angle: #{data[12]}° , (#{PARAMETER_STRUCTURE[:max_detection_angle]})\n"
84
- output << "Minimum Detection Speed: #{data[13]} , (#{PARAMETER_STRUCTURE[:min_detection_speed]})\n"
85
- output << "Maximum Detection Speed: #{data[14]} , (#{PARAMETER_STRUCTURE[:max_detection_speed]})\n"
86
- output << "Detection Direction: #{PARAMETER_STRUCTURE[:detection_direction][data[15]]}\n"
87
- output << "Range Threshold: #{data[16]}%, (#{PARAMETER_STRUCTURE[:range_threshold]})\n"
88
- output << "Angle Threshold: #{data[17]}°, (#{PARAMETER_STRUCTURE[:angle_threshold]})\n"
89
- output << "Speed Threshold: #{data[18]}%, (#{PARAMETER_STRUCTURE[:speed_threshold]})\n"
90
- output << "Digital output 1: #{PARAMETER_STRUCTURE[:digital_output_1][data[19]]}\n"
91
- output << "Digital output 2: #{PARAMETER_STRUCTURE[:digital_output_2][data[20]]}\n"
92
- output << "Digital output 3: #{PARAMETER_STRUCTURE[:digital_output_3][data[21]]}\n"
93
- output << "Hold time: #{data[22]}sec\n"
94
- output << "Micro Detection Retrigger: #{PARAMETER_STRUCTURE[:micro_detection_trigger][data[23]]}\n"
95
- output << "Micro Detection Sensitivity: #{data[24]} (#{PARAMETER_STRUCTURE[:micro_detection_sensitivity]})"
96
-
97
- output
98
- end
99
- end
100
- end