Subversion Repositories HomeAutomation

Rev

Rev 2158 | 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
 
2159 arune 19
sub atomd_disconnect
20
{
21
	($socket) = @_;
22
	close($socket);
23
}
24
 
2158 arune 25
# ----------------- Atom JS functions -----------------
26
sub atomjs_read_line
27
{
28
	($socket) = @_;
29
	# read line
30
	defined( $result = <$socket> ) or die "Readline failed: $! \n";
31
 
32
	return $result;
33
}
34
 
35
sub atomjs_write
36
{
37
	($socket, $command) = @_;
38
	print $socket $command;
39
}
40
 
41
#function atomjs_data_available($socket)
42
#{
43
#	$read   = array($socket);
44
#	$write  = NULL;
45
#	$except = NULL;
46
 
47
#	if (false === ($num_changed_streams = stream_select($read, $write, $except, 0)))
48
#	{
49
#		throw new Exception("could not do select on socket");
50
#	}
51
 
52
#	return $num_changed_streams > 0;
53
#}
54
 
55
 
56
# ----------------- Atomic functions -----------------
57
 
1884 arune 58
sub atomd_read_packet
59
{
60
	($socket) = @_;
61
	$command="";
62
	read($socket, $command, 4);
63
 
64
	$payload_length="";
65
	read($socket, $payload_length, 4);
66
 
67
	$payload_length = int($payload_length);
68
	$payload="";
69
	if ($payload_length > 0)
70
	{
2002 arune 71
		read($socket, $payload, $payload_length-1);
1884 arune 72
	}
2002 arune 73
 
1884 arune 74
	#Pad payload length with 0s
2002 arune 75
	$payload_length = sprintf("%04d", $payload_length-1);
1884 arune 76
 
77
	#print "areadpacket ".$command . $payload_length . $payload."\n";
78
	return $command . $payload_length . $payload;
79
}
80
 
81
sub atomd_write_packet
82
{
83
	($socket, $command, $payload) = @_;
84
 
85
	#Pad payload length with 0s
2002 arune 86
#	$payload_length = sprintf("%04d", length($payload)+1);
87
#	$packet = $command.$payload_length.$payload.chr(0);
88
	$payload_length = sprintf("%04d", length($payload));
89
	$packet = $command.$payload_length.$payload;
1884 arune 90
 
91
	#print "awritepacket ".$packet."\n";
92
	print $socket $packet;
93
}
94
 
95
 
96
sub atomd_data_available
97
{
98
	($socket) = @_;
99
 
100
	$s = IO::Select->new();
101
	$s->add($socket);
2101 arune 102
	@handles = $s->can_read(0.005);
1884 arune 103
 
104
	$has_data = 0;
105
	if (@handles)
106
	{
107
		$has_data = 1;
108
	}
109
 
110
	return $has_data;
111
}
112
 
1890 arune 113
sub atomd_kill_promt
114
{
115
	($socket) = @_;
1884 arune 116
 
1890 arune 117
	while (atomd_data_available($socket))
118
	{
119
		$packet = atomd_read_packet($socket); # Read prompt
120
	}
121
}
122
 
1884 arune 123
sub atomd_initialize
124
{
125
	($host, $port) = @_;
126
	$socket = atomd_connect($host, $port);
127
 
1890 arune 128
	atomd_kill_promt($socket);
1884 arune 129
 
130
	return $socket;
131
}
132
 
133
 
134
sub atomd_send_command
135
{
136
	($socket, $command) = @_;
137
	atomd_write_packet($socket, "RESP", $command);
138
}
139
 
140
 
141
sub atomd_read_command_response
142
{
143
	($socket) = @_;
144
 
145
	$response = "";
146
 
147
	while (1)
148
	{
149
		$packet = atomd_read_packet($socket);
150
		if (substr($packet, 0, 4) ne "TEXT")
151
		{
152
			last;
153
		}
154
 
155
		$packet =~ s/\n//g;
2002 arune 156
#		$response .= substr($packet, 8, -1); 
157
		$response .= substr($packet, 8); 
1884 arune 158
		$response .= "\n";
159
	}
160
 
161
	return $response;
162
}
163
 
2002 arune 164
 
165
# Perl trim function to remove whitespace from the start and end of the string
166
sub trim($)
167
{
168
	my $string = shift;
169
	$string =~ s/^\s+//;
170
	$string =~ s/\s+$//;
171
	return $string;
172
}
173
# Left trim function to remove leading whitespace
174
sub ltrim($)
175
{
176
	my $string = shift;
177
	$string =~ s/^\s+//;
178
	return $string;
179
}
180
# Right trim function to remove trailing whitespace
181
sub rtrim($)
182
{
183
	my $string = shift;
184
	$string =~ s/\s+$//;
185
	return $string;
186
}
187
 
188
 
189
 
1884 arune 190
# "return" 1 to not generate an error when loading file
191
1;
192