dmm_util 0.1.0

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.
@@ -0,0 +1,489 @@
1
+ require 'test_helper'
2
+
3
+ # need uint32 parser
4
+ # Check if reading un1 is digits precision -- no, at least not the one set using config.
5
+ ####### Seems to be digit resolution (50MO / 500MO + capacitance has 4 dig resolution, maybe low ohm, conductance, d/s, p/w, CF)
6
+ # on max/min/peak stored value: seq_no might be 32 bit, leaves one unknown value, same as qddb, figure out ts1-ts3
7
+ # Press command 'press f1' 'press range,held_down' 'press down,repeated,1' (presses 2 times, seems to work only for arrows)
8
+ # Rename Fluke28xDriverto Fluke28xDriver, make new high level meter class
9
+
10
+ class DmmCommandTest < Test::Unit::TestCase
11
+ include DMMTestHelper
12
+
13
+ def setup
14
+ @meter = DmmUtil::Fluke28xDriver.new(nil)
15
+ @meter.stubs(:meter_command)
16
+ end
17
+
18
+ def test_id
19
+ @meter.expects(:meter_command).with("ID").returns(["The Model", "Version", "Serial"])
20
+ assert_equal({:model_number => "The Model", :software_version => "Version", :serial_number => "Serial"}, @meter.id)
21
+ end
22
+
23
+ def test_qsls
24
+ @meter.expects(:meter_command).with("qsls").returns(["4","3","1","9"])
25
+ assert_equal({:recording => 4, :min_max => 3, :peak => 1, :measurement => 9}, @meter.qsls)
26
+ end
27
+
28
+ def test_qdda__plain
29
+ @meter.expects(:meter_command).with("qdda").returns(["V_AC","NONE","AUTO","VAC","5","0","OFF","0.000","0","2",
30
+ "LIVE","0.0227","VAC","0","4","5","NORMAL","NONE","1273691972.231",
31
+ "PRIMARY","0.0228","VAC","0","4","5","NORMAL","NONE","1273691972.232"])
32
+ expected = {:prim_function => "V_AC", :sec_function => "NONE", :mode => [],
33
+ :auto_range => "AUTO", :range_max => 5,
34
+ :unit => "VAC", :unit_multiplier => 0,
35
+ :bolt => "OFF", :ts => nil,
36
+ :readings => {"LIVE"=> {:decimals=>4, :unit_multiplier=>0,
37
+ :state=>"NORMAL", :ts=> Time.parse("Wed May 12 19:19:32.231 2010"),
38
+ :display_digits=>5, :value=>0.0227, :attribute =>"NONE", :unit=>"VAC"},
39
+ "PRIMARY"=> {:decimals=>4, :unit_multiplier=>0,
40
+ :state=>"NORMAL", :ts => Time.parse("Wed May 12 19:19:32.232 2010"),
41
+ :display_digits=>5, :value=>0.0228, :attribute=>"NONE", :unit=>"VAC"}}
42
+ }
43
+ result = @meter.qdda
44
+
45
+ assert_hashes_equal expected, result
46
+ end
47
+
48
+ def test_qdda__relative_max_min
49
+ @meter.expects(:meter_command).with("qdda").returns(["V_DC", "NONE", "MANUAL", "VDC", "5", "0", "OFF", "1273929235.231",
50
+ "2", "MIN_MAX_AVG", "REL", "7",
51
+ "LIVE", "-0.0002", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929288.341",
52
+ "PRIMARY", "-1.5824", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929288.341",
53
+ "REL_LIVE", "-0.0002", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929288.341",
54
+ "MINIMUM", "1e+38", "VDC", "0", "4", "5", "OL_MINUS", "NONE", "1273929239.054",
55
+ "MAXIMUM", "-1.5352", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929275.265",
56
+ "AVERAGE", "-1.5874", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929288.341",
57
+ "REL_REFERENCE", "1.5822", "VDC", "0", "4", "5", "NORMAL", "NONE", "1273929198.817"])
58
+ # todo un1: channel, sample time
59
+
60
+ expected = {:prim_function => "V_DC", :sec_function => "NONE", :mode => ["MIN_MAX_AVG", "REL"],
61
+ :auto_range => "MANUAL", :range_max => 5,
62
+ :unit => "VDC", :unit_multiplier => 0,
63
+ :bolt => "OFF", :ts => Time.parse("Sat May 15 13:13:55.231 2010"),
64
+ :readings => {"LIVE"=> {:decimals=>4, :unit_multiplier=>0,
65
+ :state=>"NORMAL", :ts=> Time.parse("Sat May 15 13:14:48.341 2010"),
66
+ :display_digits => 5, :attribute => "NONE", :value=>-0.0002, :unit=>"VDC"},
67
+ "PRIMARY"=> {:decimals=>4, :unit_multiplier=>0,
68
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.341 2010"),
69
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5824, :unit=>"VDC"},
70
+ "MAXIMUM"=> {:decimals=>4, :unit_multiplier=>0,
71
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:35.265 2010"),
72
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5352, :unit=>"VDC"},
73
+ "MINIMUM"=> {:decimals=>4, :unit_multiplier=>0,
74
+ :state=>"OL_MINUS", :ts => Time.parse("Sat May 15 13:13:59.054 2010"),
75
+ :display_digits => 5, :attribute => "NONE", :value=>1.0e+38, :unit=>"VDC"},
76
+ "AVERAGE"=> {:decimals=>4, :unit_multiplier=>0,
77
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.341 2010"),
78
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5874, :unit=>"VDC"},
79
+ "REL_LIVE"=> {:decimals=>4, :unit_multiplier=>0,
80
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.341 2010"),
81
+ :display_digits => 5, :attribute => "NONE", :value=>-0.0002, :unit=>"VDC"},
82
+ "REL_REFERENCE"=> {:decimals=>4, :unit_multiplier=>0,
83
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:13:18.817 2010"),
84
+ :display_digits => 5, :attribute => "NONE", :value=>1.5822, :unit=>"VDC"},
85
+ }
86
+ }
87
+
88
+ result = @meter.qdda
89
+ assert_hashes_equal expected, result
90
+ end
91
+
92
+ def test_qddb__relative_max_min
93
+ stub_qemap
94
+ hex = <<-HEX
95
+ 03 00 00 00 00 00 01 00 00 00 14 40 00 00 00 00 ...........@....
96
+ 00 00 00 00 A7 FB D2 41 00 D0 CE 84 50 00 00 00 .......A....P...
97
+ 07 00 01 00 E2 36 1A 3F 2D 43 1C EB 01 00 00 00 .....6.?-C......
98
+ 04 00 05 00 02 00 00 00 A7 FB D2 41 00 B0 22 92 ...........A..".
99
+ 02 00 48 50 F9 BF 8E 06 F0 16 01 00 00 00 04 00 ..HP............
100
+ 05 00 02 00 00 00 A7 FB D2 41 00 B0 22 92 04 00 .........A.."...
101
+ E2 36 1A 3F 2D 43 1C EB 01 00 00 00 04 00 05 00 .6.?-C..........
102
+ 02 00 00 00 A7 FB D2 41 00 B0 22 92 07 00 D3 CE .......A..".....
103
+ D2 47 2D DA C5 29 01 00 00 00 04 00 05 00 06 00 .G-..)..........
104
+ 00 00 A7 FB D2 41 00 70 C3 85 08 00 2D 90 F8 BF .....A.p....-...
105
+ 72 1B 0D E0 01 00 00 00 04 00 05 00 02 00 00 00 r...............
106
+ A7 FB D2 41 00 F0 D0 8E 09 00 FD 65 F9 BF F6 B9 ...A.......e....
107
+ DA 8A 01 00 00 00 04 00 05 00 02 00 00 00 A7 FB ................
108
+ D2 41 00 B0 22 92 0B 00 B0 50 F9 3F FF B2 7B F2 .A.."....P.?..{.
109
+ 01 00 00 00 04 00 05 00 02 00 00 00 A7 FB D2 41 ...............A
110
+ 00 50 B4 7B .P.{
111
+ HEX
112
+
113
+ @meter.expects(:meter_command).with("qddb").returns(bin_parse(hex))
114
+
115
+ # Why does qdda not have :un1?
116
+ expected = {:prim_function => "V_DC", :sec_function => "NONE", :mode => ["MIN_MAX_AVG", "REL"],
117
+ :auto_range => "MANUAL", :range_max => 5,
118
+ :unit => "VDC", :unit_multiplier => 0,
119
+ :bolt => "OFF", :ts => Time.parse("Sat May 15 13:13:55.23145 2010"), :un1 => 0,
120
+ :readings => {"LIVE"=> {:decimals=>4, :unit_multiplier=>0,
121
+ :state=>"NORMAL", :ts=> Time.parse("Sat May 15 13:14:48.54199 2010"),
122
+ :display_digits => 5, :attribute => "NONE", :value=>0.0001, :unit=>"VDC"},
123
+ "PRIMARY"=> {:decimals=>4, :unit_multiplier=>0,
124
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.54199 2010"),
125
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5821, :unit=>"VDC"},
126
+ "MAXIMUM"=> {:decimals=>4, :unit_multiplier=>0,
127
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:35.26465 2010"),
128
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5352, :unit=>"VDC"},
129
+ "MINIMUM"=> {:decimals=>4, :unit_multiplier=>0,
130
+ :state=>"OL_MINUS", :ts => Time.parse("Sat May 15 13:13:59.05371 2010"),
131
+ :display_digits => 5, :attribute => "NONE", :value=>9.99999999e+37, :unit=>"VDC"},
132
+ "AVERAGE"=> {:decimals=>4, :unit_multiplier=>0,
133
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.54199 2010"),
134
+ :display_digits => 5, :attribute => "NONE", :value=>-1.5874, :unit=>"VDC"},
135
+ "REL_LIVE"=> {:decimals=>4, :unit_multiplier=>0,
136
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:14:48.54199 2010"),
137
+ :display_digits => 5, :attribute => "NONE", :value=>0.0001, :unit=>"VDC"},
138
+ "REL_REFERENCE"=> {:decimals=>4, :unit_multiplier=>0,
139
+ :state=>"NORMAL", :ts => Time.parse("Sat May 15 13:13:18.81738 2010"),
140
+ :display_digits => 5, :attribute => "NONE", :value=>1.5822, :unit=>"VDC"},
141
+ }
142
+ }
143
+
144
+ result = @meter.qddb
145
+ assert_hashes_equal expected, result
146
+ end
147
+
148
+ # modes/flags, min/max, timestamp
149
+
150
+ def test_qemap
151
+ @meter.expects(:meter_command).with("qemap state").returns(["8",
152
+ "0","INACTIVE",
153
+ "1","INVALID",
154
+ "2","NORMAL",
155
+ "3","BLANK",
156
+ "4","DISCHARGE",
157
+ "5","OL",
158
+ "6","OL_MINUS",
159
+ "7","OPEN_TC"])
160
+ assert_equal({0 => "INACTIVE",
161
+ 1 => "INVALID",
162
+ 2 => "NORMAL",
163
+ 3 => "BLANK",
164
+ 4 => "DISCHARGE",
165
+ 5 => "OL",
166
+ 6 => "OL_MINUS",
167
+ 7 => "OPEN_TC"}, @meter.qemap("state"))
168
+
169
+ @meter.expects(:meter_command).with("qemap state").returns(["8", "0","INACTIVE"])
170
+
171
+ assert_raise DmmUtil::MeterError do
172
+ @meter.qemap("state")
173
+ end
174
+ end
175
+
176
+ def test_get_map
177
+ @meter.expects(:qemap).once.with(:map_name1).returns({1 => :val_1_1, 2 => :val_1_2})
178
+ @meter.expects(:qemap).once.with(:map_name2).returns({1 => :val_2_1, 2 => :val_2_2})
179
+
180
+ assert_equal :val_1_1, @meter.get_map_value(:map_name1, "\x01\x00", 0)
181
+ assert_equal :val_2_1, @meter.get_map_value(:map_name2, "\x01\x00", 0)
182
+ assert_equal :val_1_2, @meter.get_map_value(:map_name1, "\x02\x00", 0)
183
+ assert_equal :val_2_2, @meter.get_map_value(:map_name2, "\x02\x00", 0)
184
+
185
+ assert_raise DmmUtil::MeterError do
186
+ @meter.get_map_value(:map_name1, "\x03\x00", 0)
187
+ end
188
+ end
189
+
190
+ def test_get_multimap
191
+ @meter.expects(:qemap).once.with(:map_name1).returns({1 => :bit0, 2 => :bit1, 4 => :bit2, 8 => :bit3, 256 => :bit8})
192
+
193
+ assert_equal [], @meter.get_multimap_value(:map_name1, "\x00\x00", 0)
194
+ assert_equal [:bit0], @meter.get_multimap_value(:map_name1, "\x01\x00", 0)
195
+ assert_equal [:bit0, :bit1], @meter.get_multimap_value(:map_name1, "\x03\x00", 0)
196
+ assert_equal [:bit1, :bit2], @meter.get_multimap_value(:map_name1, "\x06\x00", 0)
197
+ assert_equal [:bit0, :bit2], @meter.get_multimap_value(:map_name1, "\x05\x00", 0)
198
+ assert_equal [:bit0, :bit8], @meter.get_multimap_value(:map_name1, "\x01\x01", 0)
199
+
200
+
201
+ assert_raise DmmUtil::MeterError do
202
+ @meter.get_multimap_value(:map_name1, "\x10\x00", 0)
203
+ end
204
+
205
+ end
206
+
207
+ def test_qsmr
208
+ stub_qemap
209
+ hex = <<-HEX
210
+ 01 00 00 00 01 00 00 00 01 00 02 00 00 00 14 40 ...............@
211
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
212
+ 04 00 00 00 01 00 02 00 34 EF C0 3F E5 61 A1 D6 ........4..?.a..
213
+ 02 00 00 00 04 00 05 00 02 00 00 00 25 F9 D2 41 ............%..A
214
+ 00 30 A0 A8 52 65 63 6F 72 64 69 6E 67 20 31 .0..Recording.1
215
+ HEX
216
+
217
+ @meter.expects(:meter_command).with("qsmr 0").returns(bin_parse(hex))
218
+
219
+ expected = {
220
+ :prim_function => "V_AC", :sec_function => "NONE", :mode => ["HOLD"],
221
+ :unit=>"VAC", :seq_no=>1, :bolt=> "OFF", :unit_multiplier=>0,
222
+ :name=>"Recording 1", :auto_range=>"AUTO", :range_max=>5.0,
223
+ :un1 => 0, :un4 => 0, :un5 => 0, :un6 => 0, :un7 => 0, :un9 => 0,
224
+ :readings=> {
225
+ "PRIMARY"=> {:unit => "VAC", :state => "NORMAL", :unit_multiplier => 0,
226
+ :display_digits => 5, :ts => Time.parse("Fri May 07 22:39:30.50293 2010"),
227
+ :value => 0.1323, :attribute => "NONE", :decimals => 4 }
228
+ }
229
+ }
230
+
231
+ real = @meter.qsmr(0)
232
+
233
+ assert_hashes_equal expected, real
234
+ end
235
+
236
+ def test_qmmsi
237
+ stub_qemap
238
+ hex = <<-HEX
239
+ 2B 00 00 00 2C F9 D2 41 00 40 3D 40 2C F9 D2 41 +...,..A.@=@,..A
240
+ 00 20 BA 46 01 00 00 00 01 00 02 00 00 00 14 40 ...F...........@
241
+ 00 00 00 00 00 00 01 00 2C F9 D2 41 00 40 3D 40 ........,..A.@=@
242
+ 10 00 00 00 04 00 02 00 7B F2 A0 3F 6E C5 FE B2 ........{..?n...
243
+ 02 00 00 00 04 00 05 00 02 00 00 00 2C F9 D2 41 ............,..A
244
+ 00 20 BA 46 07 00 76 4F 9E 3F AC AD D8 5F 02 00 ...F..vO.?..._..
245
+ 00 00 04 00 05 00 02 00 00 00 2C F9 D2 41 00 00 ..........,..A..
246
+ 8F 43 08 00 F2 1F A2 3F 72 8A 8E E4 02 00 00 00 .C.....?r.......
247
+ 04 00 05 00 02 00 00 00 2C F9 D2 41 00 90 BD 44 ........,..A...D
248
+ 09 00 A0 89 A0 3F 61 54 52 27 02 00 00 00 04 00 .....?aTR'......
249
+ 05 00 02 00 00 00 2C F9 D2 41 00 20 BA 46 43 69 ......,..A...FCi
250
+ 72 63 75 69 74 20 31 rcuit.1
251
+ HEX
252
+
253
+ @meter.expects(:meter_command).with("qmmsi 0").returns(bin_parse(hex))
254
+
255
+ expected = {:unit=>"VAC", :unit_multiplier=>0, :name=>"Circuit 1", :range_max=>5.0, :mode => ["MIN_MAX_AVG"],
256
+ :prim_function=>"V_AC", :sec_function=>"NONE",:seq_no=>43, :autorange=>"AUTO", :bolt=>"ON",
257
+ :un2=>0, :un8=>0,
258
+ :ts1=>Time.parse("Sat May 08 00:32:00.95703 2010"),
259
+ :ts2=>Time.parse("Sat May 08 00:32:26.9082 2010"),
260
+ :ts3=>Time.parse("Sat May 08 00:32:00.95703 2010"),
261
+ :readings=> {
262
+ "MAXIMUM"=>{:unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
263
+ :ts=>Time.parse("Sat May 08 00:32:18.96191 2010"),
264
+ :value=>0.0354, :attribute=>"NONE", :decimals=>4
265
+ },
266
+ "PRIMARY"=> {
267
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
268
+ :ts=>Time.parse("Sat May 08 00:32:26.9082 2010"),
269
+ :value=>0.0331, :attribute=>"NONE", :decimals=>4
270
+ },
271
+ "AVERAGE"=> {
272
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
273
+ :ts=>Time.parse("Sat May 08 00:32:26.9082 2010"),
274
+ :value=>0.0323, :attribute=>"NONE", :decimals=>4
275
+ },
276
+ "MINIMUM"=> {
277
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
278
+ :ts=>Time.parse("Sat May 08 00:32:14.23438 2010"),
279
+ :value=>0.0296, :attribute=>"NONE", :decimals=>4
280
+ }
281
+ },
282
+ }
283
+ real = @meter.qmmsi(0)
284
+
285
+ assert_hashes_equal expected, real
286
+ end
287
+
288
+ def test_qpsi
289
+ stub_qemap
290
+ hex = <<-HEX
291
+ 2C 00 00 00 2C F9 D2 41 00 60 A1 79 2C F9 D2 41 ,...,..A.`.y,..A
292
+ 00 60 11 7A 01 00 09 00 01 00 02 00 00 00 14 40 .`.z...........@
293
+ 00 00 00 00 00 00 01 00 2C F9 D2 41 00 60 A1 79 ........,..A.`.y
294
+ 10 00 00 00 04 00 02 00 72 68 A1 3F 9C C4 20 B0 ........rh.?....
295
+ 02 00 00 00 03 00 05 00 02 00 00 00 2C F9 D2 41 ............,..A
296
+ 00 60 11 7A 07 00 45 B6 B3 BF 83 C0 CA A1 04 00 .`.z..E.........
297
+ 00 00 03 00 05 00 02 00 00 00 2C F9 D2 41 00 70 ..........,..A.p
298
+ B1 79 08 00 C0 CA C1 3F 98 6E 12 83 04 00 00 00 .y.....?.n......
299
+ 03 00 05 00 02 00 00 00 2C F9 D2 41 00 60 A1 79 ........,..A.`.y
300
+ 09 00 72 68 A1 3F 9C C4 20 B0 02 00 00 00 03 00 ..rh.?..........
301
+ 05 00 02 00 00 00 2C F9 D2 41 00 60 11 7A 43 69 ......,..A.`.zCi
302
+ 72 63 75 69 74 20 32 rcuit.2
303
+ HEX
304
+
305
+ @meter.expects(:meter_command).with("qpsi 0").returns(bin_parse(hex))
306
+
307
+ expected = {:unit=>"VAC", :unit_multiplier=>0, :range_max=>5.0, :name=>"Circuit 2", :mode => ["MIN_MAX_AVG"],
308
+ :prim_function=>"V_AC", :sec_function=>"PEAK_MIN_MAX", :seq_no=>44, :autorange=>"AUTO", :bolt=>"ON",
309
+ :un2=>0, :un8=>0,
310
+ :ts1=>Time.parse("Sat May 08 00:35:50.52148 2010"),
311
+ :ts2=>Time.parse("Sat May 08 00:35:52.27148 2010"),
312
+ :ts3=>Time.parse("Sat May 08 00:35:50.52148 2010"),
313
+ :readings=> {
314
+ "MAXIMUM"=>{
315
+ :unit=>"V", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
316
+ :ts=>Time.parse("Sat May 08 00:35:50.52148 2010"),
317
+ :value=>0.139, :attribute=>"NONE", :decimals=>3
318
+ },
319
+ "PRIMARY"=> {
320
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
321
+ :ts=>Time.parse("Sat May 08 00:35:52.27148 2010"),
322
+ :value=>0.034, :attribute=>"NONE", :decimals=>3
323
+ },
324
+ "AVERAGE"=> {
325
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
326
+ :ts=>Time.parse("Sat May 08 00:35:52.27148 2010"),
327
+ :value=>0.034, :attribute=>"NONE", :decimals=>3
328
+ },
329
+ "MINIMUM"=> {
330
+ :unit=>"V", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
331
+ :ts=>Time.parse("Sat May 08 00:35:50.77246 2010"),
332
+ :value=>-0.077, :attribute=>"NONE", :decimals=>3
333
+ }
334
+ },
335
+ }
336
+
337
+ real = @meter.qpsi(0)
338
+
339
+ assert_hashes_equal expected, real
340
+ end
341
+
342
+ def test_qrsi
343
+ # TODO: validate sample interval
344
+ stub_qemap
345
+ hex = <<-HEX
346
+ 06 00 00 00 26 F9 D2 41 00 00 D4 30 26 F9 D2 41 ....&..A...0&..A
347
+ 00 B0 CB 33 00 20 8C 40 00 00 00 00 E1 7A A4 3F ...3...@.....z.?
348
+ 7B 14 AE 47 07 00 00 00 02 00 00 00 01 00 00 00 {..G............
349
+ 01 00 02 00 00 00 14 40 00 00 00 00 00 00 01 00 .......@........
350
+ 00 00 00 00 00 00 00 00 20 00 00 00 01 00 02 00 ................
351
+ D7 12 A2 3F 51 FC 18 73 02 00 00 00 04 00 05 00 ...?Q..s........
352
+ 02 00 00 00 26 F9 D2 41 00 B0 CB 33 42 61 74 74 ....&..A...3Batt
353
+ 65 72 79 20 31 ery.1
354
+ HEX
355
+
356
+ @meter.expects(:meter_command).with("qrsi 0").returns(bin_parse(hex))
357
+
358
+ expected = {:seq_no => 6, :prim_function => "V_AC", :sec_function => "NONE", :bolt => "ON",
359
+ :unit=>"VAC", :sample_interval=>900.0, :num_samples=>2,
360
+ :unit_multiplier=>0, :event_threshold=>0.04, :name=>"Battery 1",
361
+ :mode =>['RECORD'], :auto_range=>"AUTO", :range_max=>5.0, :reading_index=>7, # un1 is mode?
362
+ :un4 => 0, :un3 => 0, :un10 => 0, :un11 => 0, :un2 => 0, :un12 => 0, :un9 => 0, :un8 => 0,
363
+ :start_ts=>Time.parse("Fri May 07 22:48:35.3125 2010"),
364
+ :end_ts=>Time.parse("Fri May 07 22:48:47.18262 2010"),
365
+ :readings=> {
366
+ "PRIMARY"=> {
367
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
368
+ :ts=>Time.parse("Fri May 07 22:48:47.18262 2010"),
369
+ :value=>0.0353, :attribute=>"NONE", :decimals=>4
370
+ }
371
+ },
372
+ }
373
+ real = @meter.qrsi(0)
374
+ assert_hashes_equal expected, real
375
+ end
376
+
377
+ def test_qsrr
378
+ stub_qemap
379
+ hex = <<-HEX
380
+ 26 F9 D2 41 00 00 D4 30 26 F9 D2 41 00 B0 CB 33 &..A...0&..A...3
381
+ 08 00 CE 88 A2 3F 7F FB 3A 70 02 00 00 00 04 00 .....?..:p......
382
+ 05 00 02 00 00 00 26 F9 D2 41 00 10 01 31 07 00 ......&..A...1..
383
+ 4E D1 A1 3F A9 35 CD 3B 02 00 00 00 04 00 05 00 N..?.5.;........
384
+ 02 00 00 00 26 F9 D2 41 00 60 14 31 09 00 55 B0 ....&..A.`.1..U.
385
+ 10 40 1C 7C 61 32 02 00 00 00 04 00 05 00 02 00 .@.|a2..........
386
+ 00 00 26 F9 D2 41 00 00 D4 30 76 00 00 00 02 00 ..&..A...0v.....
387
+ F2 1F A2 3F 72 8A 8E E4 02 00 00 00 04 00 05 00 ...?r...........
388
+ 02 00 00 00 26 F9 D2 41 00 00 D4 30 00 00 01 00 ....&..A...0....
389
+ 00 00 ..
390
+ HEX
391
+
392
+ # We have to drop the last byte here because the way bin_parse works
393
+ @meter.expects(:meter_command).with("qsrr 7,0", 149).returns(bin_parse(hex)[0..-2])
394
+
395
+ expected = {
396
+ :stable=>"STABLE", :record_type=>"INPUT", :un2=>0, :transient_state=>"NON_T", :duration=>11.8,
397
+ :start_ts=>Time.parse("Fri May 07 22:48:35.3125 2010"),
398
+ :end_ts=>Time.parse("Fri May 07 22:48:47.18262 2010"),
399
+ :readings=> {
400
+ "MAXIMUM"=> {
401
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
402
+ :ts=>Time.parse("Fri May 07 22:48:36.0166 2010"),
403
+ :value=>0.0362, :attribute=>"NONE", :decimals=>4
404
+ },
405
+ "AVERAGE"=> {
406
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
407
+ :ts=>Time.parse("Fri May 07 22:48:35.3125 2010"),
408
+ :value=>4.1722, :attribute=>"NONE", :decimals=>4
409
+ },
410
+ "MINIMUM"=> {
411
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
412
+ :ts=>Time.parse("Fri May 07 22:48:36.31836 2010"),
413
+ :value=>0.0348, :attribute=>"NONE", :decimals=>4
414
+ }
415
+ },
416
+ :readings2=> {
417
+ "PRIMARY"=> {
418
+ :unit=>"VAC", :state=>"NORMAL", :unit_multiplier=>0, :display_digits=>5,
419
+ :ts=>Time.parse("Fri May 07 22:48:35.3125 2010"),
420
+ :value=>0.0354, :attribute=>"NONE", :decimals=>4
421
+ }
422
+ },
423
+ }
424
+ real = @meter.qsrr(7,0)
425
+ assert_hashes_equal expected, real
426
+ end
427
+
428
+ def test_mpq_set_get
429
+ @meter.expects(:meter_command).with("qmpq operator").returns([:the_operator])
430
+ assert_equal :the_operator, @meter.operator
431
+
432
+ @meter.expects(:meter_command).with("mpq operator,'new operator'", 0)
433
+ @meter.operator = "new operator"
434
+ end
435
+
436
+ def test_mp_set_get
437
+ @meter.expects(:meter_command).with("qmp beeper").returns([:beeper_state])
438
+ assert_equal :beeper_state, @meter.beeper
439
+
440
+ @meter.expects(:meter_command).never
441
+ assert_raise DmmUtil::MeterError do
442
+ @meter.beeper = "new_state"
443
+ end
444
+
445
+ @meter.expects(:meter_command).with("mp beeper,off", 0)
446
+ @meter.beeper = :off
447
+
448
+ @meter.expects(:meter_command).with("qmp cusdbm").returns(["100"])
449
+ assert_equal 100, @meter.cusdbm
450
+
451
+ @meter.expects(:meter_command).never
452
+ assert_raise DmmUtil::MeterError do
453
+ @meter.cusdbm = "astring"
454
+ end
455
+ end
456
+
457
+ def test_clock_set_get
458
+ t_local = Time.parse("Wed May 12 21:15:51 2010")
459
+ t_utc = Time.parse("Wed May 12 21:15:51 UTC 2010")
460
+
461
+ @meter.expects(:meter_command).with("mp clock,#{t_utc.to_i}", 0)
462
+ @meter.clock = t_local
463
+
464
+ @meter.expects(:meter_command).with("qmp clock").returns(["#{t_utc.to_i}"])
465
+ assert_equal t_local, @meter.clock
466
+ end
467
+
468
+
469
+ ###### Test helper test????
470
+ def test_hex
471
+ str = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\n123\n234"
472
+ teststr = str + str + "hellothere"
473
+ expected = <<-ASC
474
+ 01 02 03 04 05 06 07 08 09 0A 31 32 33 0A 32 33 ..........123.23
475
+ 34 01 02 03 04 05 06 07 08 09 0A 31 32 33 0A 32 4..........123.2
476
+ 33 34 68 65 6C 6C 6F 74 68 65 72 65 34hellothere
477
+ ASC
478
+ assert_equal expected.strip, hex(teststr)
479
+ assert_equal teststr, bin_parse(expected)
480
+ end
481
+ ######## End test helper test???
482
+
483
+ def stub_qemap
484
+ QEMAP.each do |key, val|
485
+ @meter.stubs(:qemap).with(key).returns(val)
486
+ end
487
+ end
488
+
489
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+
4
+ class FormatConvertorsTest < Test::Unit::TestCase
5
+ include DMMTestHelper
6
+
7
+ def setup
8
+ test_class = Class.new()
9
+ test_class.send(:include, DmmUtil::FormatConvertors)
10
+ @fc = test_class.new
11
+ end
12
+
13
+ def test_get_u16
14
+ assert_equal 0, @fc.get_u16("\x00\x00", 0)
15
+ assert_equal 1, @fc.get_u16("\x01\x00", 0)
16
+ assert_equal 257, @fc.get_u16("\x01\x01", 0)
17
+ assert_equal 1, @fc.get_u16("\xff\x01\x00\xff", 1)
18
+ end
19
+
20
+ def test_get_s16
21
+ assert_equal 0, @fc.get_s16("\x00\x00", 0)
22
+ assert_equal 1, @fc.get_s16("\x01\x00", 0)
23
+ assert_equal 256, @fc.get_s16("\x00\x01", 0)
24
+ assert_equal 257, @fc.get_s16("\x01\x01", 0)
25
+ assert_equal 1, @fc.get_s16("\xff\x01\x00\xff", 1)
26
+
27
+ assert_equal -0x8000, @fc.get_s16("\x00\x80", 0)
28
+ assert_equal -0x8000 + 1, @fc.get_s16("\x01\x80", 0)
29
+ assert_equal -0x8000 + 256, @fc.get_s16("\x00\x81", 0)
30
+ assert_equal -0x8000 + 257, @fc.get_s16("\x01\x81", 0)
31
+ end
32
+
33
+ def test_get_double
34
+ assert_equal 0, @fc.get_double("\x00\x00\x00\x00\x00\x00\x00\x00", 0)
35
+ assert_equal 1, @fc.get_double("\00\00\xf0\x3F\x00\x00\x00\x00", 0)
36
+ assert_equal 123.4, @fc.get_double("\x99\xd9\x5e\x40\x9a\x99\x99\x99", 0)
37
+ assert_equal -123.4, @fc.get_double("\x99\xd9\x5e\xc0\x9a\x99\x99\x99", 0)
38
+ assert_equal 123.4, @fc.get_double("\xff\xff\x99\xd9\x5e\x40\x9a\x99\x99\x99\xff\xff", 2)
39
+ end
40
+
41
+ def test_parse_time
42
+ t_local = Time.parse("Wed May 12 21:15:51 2010")
43
+ t_utc = Time.parse("Wed May 12 21:15:51 UTC 2010")
44
+ assert_equal 0, t_local - @fc.parse_time(t_utc.to_f)
45
+ assert_equal -0.12, t_local - @fc.parse_time(t_utc.to_f + 0.12)
46
+ end
47
+
48
+ def test_get_time
49
+ @fc.expects(:get_double).with(:str, :offset).returns(:floatval)
50
+ @fc.expects(:parse_time).with(:floatval).returns(:timeval)
51
+ assert_equal :timeval, @fc.get_time(:str, :offset)
52
+ end
53
+
54
+ def test_quote_str
55
+ assert_equal "'a string'", @fc.quote_str("a string")
56
+ assert_equal "\"a 'string'\"", @fc.quote_str("a 'string'")
57
+ assert_equal "'a \"string\"'", @fc.quote_str('a "string"')
58
+ assert_equal "'a ''string\"'", @fc.quote_str("a 'string\"")
59
+ end
60
+
61
+ end