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