Subversion Repositories HomeAutomation

Rev

Rev 1884 | Rev 1890 | 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);
61
    @handles = $s->can_read(0.01);
62
 
63
    $has_data = 0;
64
    if (@handles)
65
    {
66
        $has_data = 1;
67
    }
68
 
69
    return $has_data;
70
}
71
 
72
 
73
sub atomd_initialize
74
{
75
    ($host, $port) = @_;
76
    $socket = atomd_connect($host, $port);
77
 
78
    while (atomd_data_available($socket))
79
    {
80
        $packet = atomd_read_packet($socket); # Read initial prompt
81
    }
82
 
83
    return $socket;
84
}
85
 
86
 
87
sub atomd_send_command
88
{
89
    ($socket, $command) = @_;
90
    atomd_write_packet($socket, "RESP", $command);
91
}
92
 
93
 
94
sub atomd_read_command_response
95
{
96
    ($socket) = @_;
97
 
98
    $response = "";
99
 
100
    while (1)
101
    {
102
        $packet = atomd_read_packet($socket);
103
 
104
        if (substr($packet, 0, 4) ne "TEXT")
105
        {
106
            last;
107
        }
108
 
109
        $packet =~ s/\n//g;
110
        $response .= substr($packet, 8);
111
        $response .= "\n";
112
    }
113
 
114
    return $response;
115
}
116
 
117
# "return" 1 to not generate an error when loading file
118
1;
119