sappho-heatmiser-proxy 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
@@ -20,7 +20,7 @@ module Sappho
|
|
20
20
|
Sappho::ApplicationAutoFlushLog.instance.info "#{NAME} version #{VERSION} - #{HOMEPAGE}"
|
21
21
|
port = SystemConfiguration.instance.heatmiserPort
|
22
22
|
maxClients = SystemConfiguration.instance.maxClients
|
23
|
-
server = Sappho::Socket::SafeServer.new('heatmiser proxy', port, maxClients,
|
23
|
+
server = Sappho::Socket::SafeServer.new('heatmiser proxy', port, maxClients, 15, true)
|
24
24
|
server.serve do
|
25
25
|
| socket, ip | HeatmiserClient.new(socket, ip).communicate
|
26
26
|
end
|
@@ -16,11 +16,27 @@ module Sappho
|
|
16
16
|
include Singleton, Sappho::LogUtilities
|
17
17
|
|
18
18
|
def initialize
|
19
|
+
@refreshStatus = false
|
19
20
|
@queue = []
|
20
21
|
@mutex = Mutex.new
|
21
22
|
@log = Sappho::ApplicationAutoFlushLog.instance
|
22
23
|
end
|
23
24
|
|
25
|
+
def refreshStatus clientIP
|
26
|
+
@log.info "client #{clientIP} requests status refresh"
|
27
|
+
@mutex.synchronize do
|
28
|
+
@refreshStatus = true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def refreshStatus
|
33
|
+
@mutex.synchronize do
|
34
|
+
required = @refreshStatus
|
35
|
+
@refreshStatus = false
|
36
|
+
required
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
24
40
|
def push clientIP, command
|
25
41
|
@log.info "client #{clientIP} requests command: #{hexString command}"
|
26
42
|
@mutex.synchronize do
|
@@ -48,8 +48,9 @@ module Sappho
|
|
48
48
|
log.info "clock correction: #{hexString command}"
|
49
49
|
end
|
50
50
|
end
|
51
|
+
refreshRequested = queue.refreshStatus or yield
|
51
52
|
unless command
|
52
|
-
command = queryCommand if (Time.now - timestamp) >= config.sampleDelay
|
53
|
+
command = queryCommand if refreshRequested or (Time.now - timestamp) >= config.sampleDelay
|
53
54
|
end
|
54
55
|
if command
|
55
56
|
log.debug "sending command: #{hexString command}" if log.debug?
|
@@ -19,40 +19,42 @@ module Sappho
|
|
19
19
|
def initialize client, ip
|
20
20
|
@ip = ip
|
21
21
|
@client = client
|
22
|
-
@status = HeatmiserStatus.instance
|
23
|
-
@log = Sappho::ApplicationAutoFlushLog.instance
|
24
22
|
end
|
25
23
|
|
26
24
|
def communicate
|
25
|
+
queue = CommandQueue.instance
|
26
|
+
queue.refreshStatus @ip
|
27
|
+
status = HeatmiserStatus.instance
|
27
28
|
config = SystemConfiguration.instance
|
29
|
+
log = Sappho::ApplicationAutoFlushLog.instance
|
28
30
|
active = true
|
29
31
|
while active do
|
30
32
|
begin
|
31
33
|
command = read 5
|
32
34
|
if command == 'check'
|
33
|
-
reply =
|
34
|
-
|
35
|
+
reply = status.get { status.valid ? 'ok' : 'error: last response from heatmiser unit was invalid' }
|
36
|
+
log.info "client #{@ip} checking status - reply: #{reply}"
|
35
37
|
@client.write "#{reply}\r\n"
|
36
38
|
active = false
|
37
39
|
else
|
38
40
|
command = command.unpack('c*')
|
39
|
-
|
41
|
+
log.debug "header: #{hexString command}" if log.debug?
|
40
42
|
raise ClientDataError, "invalid pin" unless (command[3] & 0xFF) == config.pinLo and (command[4] & 0xFF) == config.pinHi
|
41
43
|
packetSize = (command[1] & 0xFF) | ((command[2] << 8) & 0xFF00)
|
42
44
|
raise ClientDataError, "invalid packet size" if packetSize < 7 or packetSize > 128
|
43
45
|
command += read(packetSize - 5).unpack('c*')
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
queue.push @ip, command unless (command[0] & 0xFF) == 0x93
|
47
|
+
status.get { @client.write status.raw.pack('c*') if status.valid }
|
48
|
+
log.info "command received from client #{@ip} so it is alive"
|
47
49
|
end
|
48
50
|
rescue Timeout::Error
|
49
|
-
|
51
|
+
log.info "timeout on client #{@ip} so presuming it dormant"
|
50
52
|
active = false
|
51
53
|
rescue ClientDataError => error
|
52
|
-
|
54
|
+
log.info "data error from client #{@ip}: #{error.message}"
|
53
55
|
active = false
|
54
56
|
rescue => error
|
55
|
-
|
57
|
+
log.error error
|
56
58
|
active = false
|
57
59
|
end
|
58
60
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sappho-heatmiser-proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 7
|
10
|
+
version: 0.1.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Heald
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-04-
|
18
|
+
date: 2012-04-21 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rake
|