Subversion Repositories HomeAutomation

Rev

Rev 1885 | Go to most recent revision | Details | Last modification | View Log | SVN | RSS feed

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