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.
- data/.document +5 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +24 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/bin/dmm_util +127 -0
- data/dmm_util.gemspec +84 -0
- data/lib/dmm_util/cursor.rb +31 -0
- data/lib/dmm_util/fluke28x_driver.rb +440 -0
- data/lib/dmm_util/format_convertors.rb +46 -0
- data/lib/dmm_util/measurement.rb +64 -0
- data/lib/dmm_util/meter.rb +39 -0
- data/lib/dmm_util/reading.rb +64 -0
- data/lib/dmm_util/recording.rb +35 -0
- data/lib/dmm_util/recording_measurement.rb +62 -0
- data/lib/dmm_util/recording_measurement_cursor.rb +26 -0
- data/lib/dmm_util.rb +36 -0
- data/test/communication_test.rb +183 -0
- data/test/dmm_command_test.rb +489 -0
- data/test/format_convertors_test.rb +61 -0
- data/test/integration_itest.rb +290 -0
- data/test/measurement_test.rb +57 -0
- data/test/meter_test.rb +178 -0
- data/test/reading_test.rb +48 -0
- data/test/recording_measurement_test.rb +55 -0
- data/test/recording_test.rb +75 -0
- data/test/test_helper.rb +176 -0
- metadata +181 -0
@@ -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
|