bcs-interrogator 0.0.2 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -6
- data/lib/brewery_control_system.rb +106 -0
- data/lib/brewery_control_system/api.rb +94 -0
- data/lib/brewery_control_system/api/3.7.0/bcs_sys.rb +158 -0
- data/lib/brewery_control_system/api/3.7.0/device_endpoint.rb +25 -0
- data/lib/brewery_control_system/api/3.7.0/endpoint.rb +48 -0
- data/lib/brewery_control_system/api/3.7.0/setpoints.rb +15 -0
- data/lib/brewery_control_system/api/3.7.0/sysname.rb +247 -0
- data/lib/brewery_control_system/api/3.7.0/temperature_probe_names_endpoint.rb +21 -0
- data/lib/brewery_control_system/api/3.7.0/temperature_probes_endpoint.rb +42 -0
- data/lib/brewery_control_system/api/3.7.0/temps.rb +15 -0
- data/lib/brewery_control_system/api/3.7.0/ultemp.rb +117 -0
- data/lib/brewery_control_system/api/device.rb +8 -0
- data/lib/brewery_control_system/api/server_version.rb +7 -0
- data/lib/brewery_control_system/api/version_check.rb +26 -0
- data/lib/brewery_control_system/http_service.rb +27 -0
- data/lib/brewery_control_system/http_service/user_agent.rb +33 -0
- data/lib/brewery_control_system/input.rb +4 -0
- data/lib/brewery_control_system/middleware.rb +5 -0
- data/lib/brewery_control_system/middleware/registration.rb +18 -0
- data/lib/brewery_control_system/output.rb +4 -0
- data/lib/brewery_control_system/temperature_probe.rb +4 -0
- data/lib/brewery_control_system/version.rb +6 -0
- data/spec/spec_helper.rb +6 -1
- metadata +48 -80
- data/lib/bcs_interrogator.rb +0 -36
- data/lib/bcs_interrogator/api.rb +0 -46
- data/lib/bcs_interrogator/api/endpoint.rb +0 -61
- data/lib/bcs_interrogator/api/response.rb +0 -38
- data/lib/bcs_interrogator/api/sysname.rb +0 -227
- data/lib/bcs_interrogator/api/ultemp.rb +0 -110
- data/lib/bcs_interrogator/entity.rb +0 -43
- data/lib/bcs_interrogator/version.rb +0 -6
- data/spec/cases/api_spec.rb +0 -33
- data/spec/cases/bcs_interrogator_spec.rb +0 -4
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.join File.dirname(__FILE__), "ultemp"
|
2
|
+
class NRB::BreweryControlSystem::API
|
3
|
+
class Setpoints < Ultemp
|
4
|
+
|
5
|
+
register_middleware middleware_options(self)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def parse
|
10
|
+
return if body_array.nil?
|
11
|
+
setpoints
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
class NRB::BreweryControlSystem::API
|
2
|
+
class Sysname < Endpoint
|
3
|
+
# http://wiki.embeddedcc.com/index.php/Sysname.dat
|
4
|
+
# Entries in the sysname structure cannot be more than 16 characters
|
5
|
+
# Commas are not allowed
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def endpoint; 'sysname.dat'; end
|
9
|
+
end
|
10
|
+
|
11
|
+
DESCRIPTIONS = [
|
12
|
+
'Firmware Version',
|
13
|
+
'Process 0 name',
|
14
|
+
'Process 1 name',
|
15
|
+
'Process 2 name',
|
16
|
+
'Process 3 name',
|
17
|
+
'Process 0 State 0 name',
|
18
|
+
'Process 0 State 1 name',
|
19
|
+
'Process 0 State 2 name',
|
20
|
+
'Process 0 State 3 name',
|
21
|
+
'Process 0 State 4 name',
|
22
|
+
'Process 0 State 5 name',
|
23
|
+
'Process 0 State 6 name',
|
24
|
+
'Process 0 State 7 name',
|
25
|
+
'Process 1 State 0 name',
|
26
|
+
'Process 1 State 1 name',
|
27
|
+
'Process 1 State 2 name',
|
28
|
+
'Process 1 State 3 name',
|
29
|
+
'Process 1 State 4 name',
|
30
|
+
'Process 1 State 5 name',
|
31
|
+
'Process 1 State 6 name',
|
32
|
+
'Process 1 State 7 name',
|
33
|
+
'Process 2 State 0 name',
|
34
|
+
'Process 2 State 1 name',
|
35
|
+
'Process 2 State 2 name',
|
36
|
+
'Process 2 State 3 name',
|
37
|
+
'Process 2 State 4 name',
|
38
|
+
'Process 2 State 5 name',
|
39
|
+
'Process 2 State 6 name',
|
40
|
+
'Process 2 State 7 name',
|
41
|
+
'Process 3 State 0 name',
|
42
|
+
'Process 3 State 1 name',
|
43
|
+
'Process 3 State 2 name',
|
44
|
+
'Process 3 State 3 name',
|
45
|
+
'Process 3 State 4 name',
|
46
|
+
'Process 3 State 5 name',
|
47
|
+
'Process 3 State 6 name',
|
48
|
+
'Process 3 State 7 name',
|
49
|
+
'Output 0 name',
|
50
|
+
'Output 1 name',
|
51
|
+
'Output 2 name',
|
52
|
+
'Output 3 name',
|
53
|
+
'Output 4 name',
|
54
|
+
'Output 5 name',
|
55
|
+
'Din 0 name',
|
56
|
+
'Din 1 name',
|
57
|
+
'Din 2 name',
|
58
|
+
'Din 3 name',
|
59
|
+
'Process 0 Win 0 name',
|
60
|
+
'Process 0 Win 1 name',
|
61
|
+
'Process 0 Win 2 name',
|
62
|
+
'Process 0 Win 3 name',
|
63
|
+
'Process 1 Win 0 name',
|
64
|
+
'Process 1 Win 1 name',
|
65
|
+
'Process 1 Win 2 name',
|
66
|
+
'Process 1 Win 3 name',
|
67
|
+
'Process 2 Win 0 name',
|
68
|
+
'Process 2 Win 1 name',
|
69
|
+
'Process 2 Win 2 name',
|
70
|
+
'Process 2 Win 3 name',
|
71
|
+
'Process 3 Win 0 name',
|
72
|
+
'Process 3 Win 1 name',
|
73
|
+
'Process 3 Win 2 name',
|
74
|
+
'Process 3 Win 3 name',
|
75
|
+
'Temp Probe 0 name',
|
76
|
+
'Temp Probe 1 name',
|
77
|
+
'Temp Probe 2 name',
|
78
|
+
'Temp Probe 3 name',
|
79
|
+
'Process 0 Timer 0 name',
|
80
|
+
'Process 0 Timer 1 name',
|
81
|
+
'Process 0 Timer 2 name',
|
82
|
+
'Process 0 Timer 3 name',
|
83
|
+
'Process 1 Timer 0 name',
|
84
|
+
'Process 1 Timer 1 name',
|
85
|
+
'Process 1 Timer 2 name',
|
86
|
+
'Process 1 Timer 3 name',
|
87
|
+
'Process 2 Timer 0 name',
|
88
|
+
'Process 2 Timer 1 name',
|
89
|
+
'Process 2 Timer 2 name',
|
90
|
+
'Process 2 Timer 3 name',
|
91
|
+
'Process 3 Timer 0 name',
|
92
|
+
'Process 3 Timer 1 name',
|
93
|
+
'Process 3 Timer 2 name',
|
94
|
+
'Process 3 Timer 3 name',
|
95
|
+
'Reserved 0',
|
96
|
+
'Reserved 1',
|
97
|
+
'Temp Probe 4 name',
|
98
|
+
'Temp Probe 5 name',
|
99
|
+
'Temp Probe 6 name',
|
100
|
+
'Temp Probe 7 name',
|
101
|
+
'Din 4 name',
|
102
|
+
'Din 5 name',
|
103
|
+
'Din 6 name',
|
104
|
+
'Din 7 name',
|
105
|
+
'Output 6 name',
|
106
|
+
'Output 7 name',
|
107
|
+
'Output 8 name',
|
108
|
+
'Output 9 name',
|
109
|
+
'Output 10 name',
|
110
|
+
'Output 11 name',
|
111
|
+
'Output 12 name',
|
112
|
+
'Output 13 name',
|
113
|
+
'Output 14 name',
|
114
|
+
'Output 15 name',
|
115
|
+
'Output 16 name',
|
116
|
+
'Output 17 name',
|
117
|
+
'Process 4 name',
|
118
|
+
'Process 5 name',
|
119
|
+
'Process 6 name',
|
120
|
+
'Process 7 name',
|
121
|
+
'Process 4 State 0 name',
|
122
|
+
'Process 4 State 1 name',
|
123
|
+
'Process 4 State 2 name',
|
124
|
+
'Process 4 State 3 name',
|
125
|
+
'Process 4 State 4 name',
|
126
|
+
'Process 4 State 5 name',
|
127
|
+
'Process 4 State 6 name',
|
128
|
+
'Process 4 State 7 name',
|
129
|
+
'Process 5 State 0 name',
|
130
|
+
'Process 5 State 1 name',
|
131
|
+
'Process 5 State 2 name',
|
132
|
+
'Process 5 State 3 name',
|
133
|
+
'Process 5 State 4 name',
|
134
|
+
'Process 5 State 5 name',
|
135
|
+
'Process 5 State 6 name',
|
136
|
+
'Process 5 State 7 name',
|
137
|
+
'Process 6 State 0 name',
|
138
|
+
'Process 6 State 1 name',
|
139
|
+
'Process 6 State 2 name',
|
140
|
+
'Process 6 State 3 name',
|
141
|
+
'Process 6 State 4 name',
|
142
|
+
'Process 6 State 5 name',
|
143
|
+
'Process 6 State 6 name',
|
144
|
+
'Process 6 State 7 name',
|
145
|
+
'Process 7 State 0 name',
|
146
|
+
'Process 7 State 1 name',
|
147
|
+
'Process 7 State 2 name',
|
148
|
+
'Process 7 State 3 name',
|
149
|
+
'Process 7 State 4 name',
|
150
|
+
'Process 7 State 5 name',
|
151
|
+
'Process 7 State 6 name',
|
152
|
+
'Process 7 State 7 name',
|
153
|
+
'Process 4 Win 0 name',
|
154
|
+
'Process 4 Win 1 name',
|
155
|
+
'Process 4 Win 2 name',
|
156
|
+
'Process 4 Win 3 name',
|
157
|
+
'Process 5 Win 0 name',
|
158
|
+
'Process 5 Win 1 name',
|
159
|
+
'Process 5 Win 2 name',
|
160
|
+
'Process 5 Win 3 name',
|
161
|
+
'Process 6 Win 0 name',
|
162
|
+
'Process 6 Win 1 name',
|
163
|
+
'Process 6 Win 2 name',
|
164
|
+
'Process 6 Win 3 name',
|
165
|
+
'Process 7 Win 0 name',
|
166
|
+
'Process 7 Win 1 name',
|
167
|
+
'Process 7 Win 2 name',
|
168
|
+
'Process 7 Win 3 name',
|
169
|
+
'4 Timer 0 name',
|
170
|
+
'4 Timer 1 name',
|
171
|
+
'4 Timer 2 name',
|
172
|
+
'4 Timer 3 name',
|
173
|
+
'5 Timer 0 name',
|
174
|
+
'5 Timer 1 name',
|
175
|
+
'5 Timer 2 name',
|
176
|
+
'5 Timer 3 name',
|
177
|
+
'6 Timer 0 name',
|
178
|
+
'6 Timer 1 name',
|
179
|
+
'6 Timer 2 name',
|
180
|
+
'6 Timer 3 name',
|
181
|
+
'7 Timer 0 name',
|
182
|
+
'7 Timer 1 name',
|
183
|
+
'7 Timer 2 name',
|
184
|
+
'7 Timer 3 name',
|
185
|
+
'Reserved 2',
|
186
|
+
'Reserved 3',
|
187
|
+
'Reserved 4',
|
188
|
+
'Reserved 5',
|
189
|
+
'Reserved 6',
|
190
|
+
'Reserved 7',
|
191
|
+
'Reserved 8',
|
192
|
+
'Reserved 9',
|
193
|
+
'Reserved 10',
|
194
|
+
'Reserved 11',
|
195
|
+
'Reserved 12',
|
196
|
+
'Reserved 13',
|
197
|
+
'Reserved 14',
|
198
|
+
'Reserved 15',
|
199
|
+
'Reserved 16',
|
200
|
+
'Reserved 17',
|
201
|
+
'Reserved 18',
|
202
|
+
'Reserved 19',
|
203
|
+
'Reserved 20',
|
204
|
+
'Reserved 21',
|
205
|
+
'Reserved 22',
|
206
|
+
'Reserved 23',
|
207
|
+
'Reserved 24',
|
208
|
+
'Reserved 25',
|
209
|
+
'Reserved 26',
|
210
|
+
'Reserved 27',
|
211
|
+
'Reserved 28',
|
212
|
+
'Reserved 29',
|
213
|
+
'Reserved 30',
|
214
|
+
'Reserved 31',
|
215
|
+
'Reserved 32',
|
216
|
+
'Reserved 33',
|
217
|
+
'Reserved 34'
|
218
|
+
].freeze
|
219
|
+
|
220
|
+
def descriptions; DESCRIPTIONS; end
|
221
|
+
|
222
|
+
# def input_names; data[43..46] + data[89..92]; end
|
223
|
+
# def output_names; data[37..42] + data[93..104]; end
|
224
|
+
# def temp_probe_names; data[63..66] + data[85..88]; end
|
225
|
+
|
226
|
+
register_middleware middleware_options(self)
|
227
|
+
|
228
|
+
private
|
229
|
+
|
230
|
+
attr_accessor :body_text
|
231
|
+
|
232
|
+
def body_array
|
233
|
+
super.map { |str| str.strip[/.+/m] }
|
234
|
+
end
|
235
|
+
|
236
|
+
|
237
|
+
def parse
|
238
|
+
raise "Stop using this"
|
239
|
+
return if body_text.nil?
|
240
|
+
body_array.each_with_index.inject({}) do |hash,(body,i)|
|
241
|
+
hash[descriptions[i]] = body_array[i]
|
242
|
+
hash
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class NRB::BreweryControlSystem::API
|
2
|
+
class TemperatureProbeNamesEndpoint < Endpoint
|
3
|
+
# http://wiki.embeddedcc.com/index.php/sysname.dat
|
4
|
+
class << self
|
5
|
+
def endpoint; 'sysname.dat'; end
|
6
|
+
end
|
7
|
+
|
8
|
+
register_middleware middleware_options(self)
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def body_array
|
13
|
+
super.map { |val| val.strip[/.+/m] }
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def parse
|
18
|
+
[ *body_array[63..66], *body_array[85..88] ].compact
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.join File.dirname(__FILE__), "temperature_probe_names_endpoint.rb"
|
2
|
+
class NRB::BreweryControlSystem::API
|
3
|
+
class TemperatureProbesEndpoint
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def fetch(api: nil)
|
7
|
+
new(api: api).fetch
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def fetch
|
13
|
+
names = http_service do |b|
|
14
|
+
b.response TemperatureProbeNamesEndpoint
|
15
|
+
end.get(TemperatureProbeNamesEndpoint.endpoint).body
|
16
|
+
ultemp = http_service do |b|
|
17
|
+
b.response Ultemp
|
18
|
+
end.get(Ultemp.endpoint).body
|
19
|
+
temps = ultemp[34..41]
|
20
|
+
setpoints = ultemp[42..49]
|
21
|
+
names.each_with_index.collect do |name,i|
|
22
|
+
NRB::BreweryControlSystem::TemperatureProbe.new name, temps[i], setpoints[i]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def http_service &block
|
28
|
+
api.http_service &block
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def initialize(api: nil)
|
33
|
+
raise ArgumentError.new("Need an api") if api.nil?
|
34
|
+
self.api = api
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
attr_accessor :api
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
class NRB::BreweryControlSystem::API
|
2
|
+
class Ultemp < Endpoint
|
3
|
+
# http://wiki.embeddedcc.com/index.php/Ultemp.dat
|
4
|
+
# All entries in the ultemp structure have to be in the range
|
5
|
+
# 0 <= ultemp < 2^32
|
6
|
+
# Commas are not allowed
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def endpoint; 'ultemp.dat'; end
|
10
|
+
end
|
11
|
+
|
12
|
+
register_middleware middleware_options(self)
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def alarm
|
17
|
+
body_array[54].to_s(2).rjust(9,"0")[8] == "1"
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def bit_range(data, range)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def body_array
|
26
|
+
super.map { |i| i.to_i }
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def body_array_by_ten(range)
|
31
|
+
collect_body_array(range) { |t| t.to_f / 10.0 }
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def collect_body_array(range, &block)
|
36
|
+
body_array[range].collect &block
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def decode_current_state(int)
|
41
|
+
# http://forum.embeddedcc.com/viewtopic.php?f=9&t=484&p=2513
|
42
|
+
( "%08x" % int ).scan(/[0-9a-f\.]{2}/).reverse.collect { |hex| hex == ".." || hex == "ff" ? nil : hex.to_i(16) }
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def input_statuses
|
47
|
+
unmask_boolean body_array[2], 0..7
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def internal_registers
|
52
|
+
unmask_boolean body_array[53], 0..15
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def output_statuses
|
57
|
+
unmask_boolean body_array[1], 0..17
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def parse
|
62
|
+
return if body_array.nil?
|
63
|
+
[ *running_processes,
|
64
|
+
*output_statuses,
|
65
|
+
*input_statuses,
|
66
|
+
*temps,
|
67
|
+
*setpoints,
|
68
|
+
*processes_current_state,
|
69
|
+
*process_timers,
|
70
|
+
*internal_registers,
|
71
|
+
*process_pause_states,
|
72
|
+
alarm
|
73
|
+
]
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def process_pause_states
|
78
|
+
unmask_boolean body_array[54], 0..7
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def processes_current_state
|
83
|
+
[ *decode_current_state(body_array[19]), *decode_current_state(body_array[20]) ]
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def process_timers
|
88
|
+
body_array[21..52]
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def running_processes
|
93
|
+
unmask_boolean body_array[0], 0..7
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
def temps
|
98
|
+
body_array_by_ten(3..10)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def setpoints
|
103
|
+
body_array_by_ten(11..18)
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
def unmask(masked, range)
|
108
|
+
range.collect { |i| masked & (2**i) }
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def unmask_boolean(masked, range)
|
113
|
+
unmask(masked, range).collect { |unmasked| unmasked > 0 }
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|