Module: AutomateEm::DatagramServer

Defined in:
lib/automate-em/device/datagram_server.rb

Instance Method Summary collapse

Instance Method Details

#add_device(scheme, device) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/automate-em/device/datagram_server.rb', line 80

def add_device(scheme, device)
	EM.schedule do
		res = ResolverJob.new(scheme.ip)
		res.callback {|ip|
			@devices["#{ip}:#{scheme.port}"] = device
			@ips["#{scheme.ip}:#{scheme.port}"] = ip
		}
		res.errback {|error|
			@devices["#{scheme.ip}:#{scheme.port}"] = device
			@ips["#{scheme.ip}:#{scheme.port}"] = scheme.ip
		}
		
		EM.defer do
			System.logger.info e.message + " adding UDP #{scheme.dependency.actual_name} @ #{scheme.ip} in #{scheme.control_system.name}"
		end
	end
end

#do_send_data(scheme, data) ⇒ Object

Additional controls



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/automate-em/device/datagram_server.rb', line 53

def do_send_data(scheme, data)
	res = ResolverJob.new(scheme.ip)
	res.callback {|ip|
		
		#
		# Just in case the address is a domain name we want to ensure the
		#	IP lookups are always correct and we are always sending to the
		#	specified device
		#
		text = "#{scheme.ip}:#{scheme.port}"
		old_ip = @ips[text]
		if old_ip != ip
			EM.schedule do	# All modifications are on the reactor thread instead of locking
				device = @devices.delete("#{old_ip}:#{scheme.port}")
				@ips[text] = ip
				@devices["#{ip}:#{scheme.port}"] = device
			end
		end
		send_datagram(data, ip, scheme.port)
	}
	res.errback {|error|
		EM.defer do
			System.logger.info e.message + " calling UDP send for #{scheme.dependency.actual_name} @ #{scheme.ip} in #{scheme.control_system.name}"
		end
	}
end

#initialize(*args) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/automate-em/device/datagram_server.rb', line 17

def initialize *args
	super
	
	if !$datagramServer.nil?
		return
	end
	
	$datagramServer = self
	@devices = {}
	@ips = {}
	
	EM.defer do
		System.logger.info 'running datagram server on an ephemeral port'
	end
end

#receive_data(data) ⇒ Object

Eventmachine callbacks



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/automate-em/device/datagram_server.rb', line 37

def receive_data(data)
	#ip = get_peername[2,6].unpack "nC4"
	port, ip = Socket.unpack_sockaddr_in(get_peername)
	begin
		@devices["#{ip}:#{port}"].do_receive_data(data)
	rescue
		#
		# TODO:: error messages here if device is null ect
		#
	end
end

#remove_device(scheme) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/automate-em/device/datagram_server.rb', line 98

def remove_device(scheme)
	EM.schedule do
		begin
			ip = @ips.delete("#{scheme.ip}:#{scheme.port}")
			@devices.delete("#{ip}:#{scheme.port}")
		rescue
			EM.defer do
				System.logger.info e.message + " removing UDP #{scheme.dependency.actual_name} @ #{scheme.ip} in #{scheme.control_system.name}"
			end
		end
	end
end