rfbeam 0.4.0 → 0.4.2

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.
@@ -14,52 +14,176 @@ module RfBeam
14
14
  6 => 'Timeout error'
15
15
  }.freeze
16
16
 
17
- # The response delay was determined empirically and may need adjusting with baude rate
18
- RESP_DELAY = 0.1
17
+ # Delays are determined empirically and may need adjusting with baude rate
18
+ RESPONSE_DELAY = 0.05
19
+ MEASUREMENT_DELAY = 0.15
19
20
 
20
21
  # 'GNFD' command types
21
22
  FRAME_DATA_TYPES = { disabled: 0x00, radc: 0x01, rfft: 0x02, pdat: 0x04, tdat: 0x08, ddat: 0x10, done: 0x20 }.freeze
22
23
 
23
24
  # The angle, direction, range and speed flags are only valid if the detection flag is 1.
24
25
  DETECTION_FLAGS = {
25
- detection: ['No Detection', 'Detection'],
26
- micro_detection: ['No Detection', 'Detection'],
26
+ detection: %w[No Yes],
27
+ micro_detection: %w[No Yes],
27
28
  angle: %w[Left Right],
28
29
  direction: %w[Receding Approaching],
29
30
  range: %w[Far Near],
30
31
  speed: %w[Low High]
31
32
  }.freeze
32
33
 
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:)
34
+ Param =
35
+ Struct.new(:name, :grps_index, :description, :default, :units, :values) do
36
+ def initialize(name:, grps_index:, description: nil, default: nil, units: nil, values: [])
37
+ super(name, grps_index, description, default, units, values)
38
+ end
36
39
  end
37
- end
38
40
 
39
41
  RADAR_PARAMETERS = {
40
42
  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
- threshold_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 )
63
- }.freeze
43
+ base_frequency:
44
+ Param.new(
45
+ name: 'Base Frequency',
46
+ grps_index: 3,
47
+ description: '0 = Low, 1 = Middle, 2 = High',
48
+ default: 1,
49
+ values: %w[Low Middle High]
50
+ ),
51
+ max_speed:
52
+ Param.new(
53
+ name: 'Maximum Speed',
54
+ grps_index: 4,
55
+ description: '0 = 12km/h, 1 = 25km/h, 2 = 50km/h, 3 = 100km/h',
56
+ default: 1,
57
+ units: 'km/h',
58
+ values: %w[12.5 25 50 100]
59
+ ),
60
+ max_range:
61
+ Param.new(
62
+ name: 'Maximum Range',
63
+ grps_index: 5,
64
+ description: '0 = 5m, 1 = 10m, 2 = 30m, 3 = 100m',
65
+ default: 1,
66
+ values: %w[5m 10m 30m 100m]
67
+ ),
68
+ threshold_offset:
69
+ Param.new(name: 'Threshold Offset', grps_index: 6, description: '10db - 60db', default: 30, units: 'db'),
70
+ tracking_filter:
71
+ Param.new(
72
+ name: 'Tracking Filter Type',
73
+ grps_index: 7,
74
+ description: '0 = Standard, 2 = Fast Detection, 3 = Long Visibility',
75
+ default: 0,
76
+ values: ['standard', 'Fast Detection', 'Long Visibility']
77
+ ),
78
+ vibration_suppression:
79
+ Param.new(
80
+ name: 'Vibration Suppression',
81
+ grps_index: 8,
82
+ description: '0-16, 0 = No Suppression, 16 = High Suppression',
83
+ default: 2
84
+ ),
85
+ min_detection_distance:
86
+ Param.new(
87
+ name: 'Minimum Detection Distance',
88
+ grps_index: 9,
89
+ description: '0 - 100% of range setting',
90
+ default: 0,
91
+ units: '%'
92
+ ),
93
+ max_detection_distance:
94
+ Param.new(
95
+ name: 'Maximum Detection Distance',
96
+ grps_index: 10,
97
+ description: '0 - 100% of range setting',
98
+ default: 50,
99
+ units: '%'
100
+ ),
101
+ min_detection_angle:
102
+ Param.new(name: 'Minimum Detection Angle', grps_index: 11, description: '-90° - 90°', default: -90, units: '°'),
103
+ max_detection_angle:
104
+ Param.new(name: 'Maximum Detection Angle', grps_index: 12, description: '-90° - 90°', default: 90, units: '°'),
105
+ min_detection_speed:
106
+ Param.new(
107
+ name: 'Minimum Detection Speed',
108
+ grps_index: 13,
109
+ description: '0 - 100% of speed setting',
110
+ default: 0,
111
+ units: '%'
112
+ ),
113
+ max_detection_speed:
114
+ Param.new(
115
+ name: 'Maximum Detection Speed',
116
+ grps_index: 14,
117
+ description: '0 - 100% of speed setting',
118
+ default: 100,
119
+ units: '%'
120
+ ),
121
+ detection_direction:
122
+ Param.new(
123
+ name: 'Detection Direction',
124
+ grps_index: 15,
125
+ description: '0 = Receding, 1 = Approaching, 2 = Both',
126
+ default: 2,
127
+ values: %w[Receding Approaching Both]
128
+ ),
129
+ range_threshold:
130
+ Param.new(
131
+ name: 'Range Threshold',
132
+ grps_index: 16,
133
+ description: '0 - 100% of range setting',
134
+ default: 10,
135
+ units: '%'
136
+ ),
137
+ angle_threshold:
138
+ Param.new(name: 'Angle Threshold', grps_index: 17, description: '-90° - 90°', default: 0, units: '°'),
139
+ speed_threshold:
140
+ Param.new(
141
+ name: 'Speed Threshold',
142
+ grps_index: 18,
143
+ description: '0 - 100% of speed setting',
144
+ default: 50,
145
+ units: '%'
146
+ ),
147
+ digital_output1:
148
+ Param.new(
149
+ name: 'Digital Output 1',
150
+ grps_index: 19,
151
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
152
+ default: 0,
153
+ values: %w[Direction Angle Range Speed Micro]
154
+ ),
155
+ digital_output2:
156
+ Param.new(
157
+ name: 'Digital Output 2',
158
+ grps_index: 20,
159
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
160
+ default: 1,
161
+ values: %w[Direction Angle Range Speed Micro]
162
+ ),
163
+ digital_output3:
164
+ Param.new(
165
+ name: 'Digital Output 3',
166
+ grps_index: 21,
167
+ description: '0 = Direction, 1 = Angle, 2 = Range, 3 = Speed, 4 = Micro Detection',
168
+ default: 2,
169
+ values: %w[Direction Angle Range Speed Micro]
170
+ ),
171
+ hold_time: Param.new(name: 'Hold Time', grps_index: 22, description: '1 - 7200s', default: 1, units: 's'),
172
+ micro_detection_retrigger:
173
+ Param.new(
174
+ name: 'Micro Detection Trigger',
175
+ grps_index: 23,
176
+ description: '0 = Off, 1 = Retrigger',
177
+ default: 0,
178
+ values: %w[Off Retrigger]
179
+ ),
180
+ micro_detection_sensativity:
181
+ Param.new(
182
+ name: 'Micro Detection Sensativity',
183
+ grps_index: 24,
184
+ description: '0 - 9, 0 = Min, 9 = Max',
185
+ default: 4
186
+ )
187
+ }.freeze
64
188
  end
65
189
  end
@@ -9,15 +9,27 @@ module RfBeam
9
9
 
10
10
  def rfft
11
11
  request_frame_data(:rfft)
12
+ sleep MEASUREMENT_DELAY
13
+ data = read(1032).unpack('a4LS256S256')
14
+ header, length = data.shift(2)
15
+ raise Error, "RFFT header response, header=#{header}" unless header == 'RFFT'
16
+ raise Error, "RFFT payload length, length=#{length}" unless length == 1024
12
17
 
13
- resp = read(1032).unpack('a4LS256S256')
14
- resp.shift 2
15
- resp
18
+ data
19
+ end
20
+
21
+ def reset
22
+ command = ['RFSE', 0]
23
+ write command.pack('a4L')
24
+ check_response
16
25
  end
17
-
26
+ alias rfse reset
27
+
18
28
  def pdat(formatted: false)
19
- request_frame_data(:pdat)
29
+ request_frame_data(:pdat)
20
30
  resp = read(102).unpack('a4LSssSSssSSssSSssSSssSSssSSssSSssSSssSSssS')
31
+ raise Error, "PDAT response = #{resp[0]}" unless resp[0] == 'PDAT'
32
+
21
33
  return resp unless formatted
22
34
 
23
35
  target_count = resp[1].to_i / 8
@@ -32,26 +44,23 @@ module RfBeam
32
44
 
33
45
  def tdat
34
46
  request_frame_data(:tdat)
47
+ sleep MEASUREMENT_DELAY
35
48
 
36
- sleep 0.1
37
49
  resp = read(16).unpack('a4LSssS')
38
- return { dist: resp[2], speed: resp[3], angle: resp[4], mag: resp[5] } unless resp[1].zero?
50
+ raise Error, "TDAT response = #{resp[0]}" unless resp[0] == 'TDAT'
51
+
52
+ resp
39
53
  end
40
54
 
41
55
  def ddat
42
56
  request_frame_data(:ddat)
43
- flags = %w[Low High]
44
- array = read(14).unpack('a4LC6')
45
- { label: array[0],
46
- detection: DETECTION_FLAGS[:detection][array[2]],
47
- micro_detection: DETECTION_FLAGS[:micro_detection][array[3]],
48
- angle: DETECTION_FLAGS[:angle][array[4]],
49
- direction: DETECTION_FLAGS[:direction][array[5]],
50
- range: DETECTION_FLAGS[:range][array[6]],
51
- speed: DETECTION_FLAGS[:speed][array[7]]
52
- }
57
+ sleep MEASUREMENT_DELAY
58
+
59
+ resp = read(14).unpack('a4LC6')
60
+ raise Error, "DDAT response = #{resp[0]}" unless resp[0] == 'DDAT'
61
+ resp
53
62
  end
54
-
63
+
55
64
  # Get the radar parameter structure
56
65
  def grps
57
66
  command = ['GRPS', 0]
@@ -63,12 +72,10 @@ module RfBeam
63
72
  def config
64
73
  data = grps
65
74
  output = "\n"
66
- RADAR_PARAMETERS.keys.each do |key|
67
- output << formatted_parameter(key, data[RADAR_PARAMETERS[key].grps_index])
68
- end
75
+ RADAR_PARAMETERS.keys.each { |key| output << formatted_parameter(key, data[RADAR_PARAMETERS[key].grps_index]) }
69
76
  output
70
77
  end
71
-
78
+
72
79
  def formatted_parameter(param, value = nil)
73
80
  param = RADAR_PARAMETERS[param]
74
81
  if value.nil?
@@ -82,7 +89,7 @@ module RfBeam
82
89
  private
83
90
 
84
91
  def format_raw_target_data(array)
85
- { dist: array.shift, speed: array.shift, angle: array.shift, mag: array.shift }
92
+ { dist: array.shift, speed: array.shift, angle: array.shift, mag: array.shift }
86
93
  end
87
94
 
88
95
  def request_frame_data(type)