Subversion Repositories HomeAutomation

Rev

Rev 1890 | Rev 2002 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
1884 arune 1
use IO::Select;
1885 arune 2
use IO::Socket;
1884 arune 3
 
4
 
5
sub atomd_connect
6
{
7
	($host, $port) = @_;
8
	$socket = IO::Socket::INET->new(
9
			Proto    => "tcp",
10
			PeerAddr => $host,
11
			PeerPort => $port,
12
			Blocking => 1,
13
		)
14
		or die "Error: Cannot connect to port $port at $host\n";
15
 
16
	return $socket;
17
}
18
 
19
sub atomd_read_packet
20
{
21
	($socket) = @_;
22
	$command="";
23
	read($socket, $command, 4);
24
 
25
	$payload_length="";
26
	read($socket, $payload_length, 4);
27
 
28
	$payload_length = int($payload_length);
29
	$payload="";
30
	if ($payload_length > 0)
31
	{
32
		read($socket, $payload, $payload_length);
33
	}
34
 
35
	#Pad payload length with 0s
36
	$payload_length = sprintf("%04d", $payload_length);
37
 
38
	#print "areadpacket ".$command . $payload_length . $payload."\n";
39
	return $command . $payload_length . $payload;
40
}
41
 
42
sub atomd_write_packet
43
{
44
	($socket, $command, $payload) = @_;
45
 
46
	#Pad payload length with 0s
47
	$payload_length = sprintf("%04d", length($payload)+1);
48
	$packet = $command.$payload_length.$payload.chr(0);
49
 
50
	#print "awritepacket ".$packet."\n";
51
	print $socket $packet;
52
}
53
 
54
 
55
sub atomd_data_available
56
{
57
	($socket) = @_;
58
 
59
	$s = IO::Select->new();
60
	$s->add($socket);
1890 arune 61
	@handles = $s->can_read(0.001);
1884 arune 62
 
63
	$has_data = 0;
64
	if (@handles)
65
	{
66
		$has_data = 1;
67
	}
68
 
69
	return $has_data;
70
}
71
 
1890 arune 72
sub atomd_kill_promt
73
{
74
	($socket) = @_;
1884 arune 75
 
1890 arune 76
	while (atomd_data_available($socket))
77
	{
78
		$packet = atomd_read_packet($socket); # Read prompt
79
	}
80
}
81
 
1884 arune 82
sub atomd_initialize
83
{
84
	($host, $port) = @_;
85
	$socket = atomd_connect($host, $port);
86
 
1890 arune 87
	atomd_kill_promt($socket);
1884 arune 88
 
89
	return $socket;
90
}
91
 
92
 
93
sub atomd_send_command
94
{
95
	($socket, $command) = @_;
96
	atomd_write_packet($socket, "RESP", $command);
97
}
98
 
99
 
100
sub atomd_read_command_response
101
{
102
	($socket) = @_;
103
 
104
	$response = "";
105
 
106
	while (1)
107
	{
108
		$packet = atomd_read_packet($socket);
109
 
110
		if (substr($packet, 0, 4) ne "TEXT")
111
		{
112
			last;
113
		}
114
 
115
		$packet =~ s/\n//g;
1892 arune 116
		$response .= substr($packet, 8, -1); 
1884 arune 117
		$response .= "\n";
118
	}
119
 
120
	return $response;
121
}
122
 
123
# "return" 1 to not generate an error when loading file
124
1;
125