Subversion Repositories HomeAutomation

Rev

Rev 1892 | Rev 2101 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1892 Rev 2002
1
use IO::Select;
1
use IO::Select;
2
use IO::Socket;
2
use IO::Socket;
3
 
3
 
4
 
4
 
5
sub atomd_connect
5
sub atomd_connect
6
{
6
{
7
    ($host, $port) = @_;
7
    ($host, $port) = @_;
8
    $socket = IO::Socket::INET->new(
8
    $socket = IO::Socket::INET->new(
9
            Proto    => "tcp",
9
            Proto    => "tcp",
10
            PeerAddr => $host,
10
            PeerAddr => $host,
11
            PeerPort => $port,
11
            PeerPort => $port,
12
            Blocking => 1,
12
            Blocking => 1,
13
        )
13
        )
14
        or die "Error: Cannot connect to port $port at $host\n";
14
        or die "Error: Cannot connect to port $port at $host\n";
15
 
15
 
16
    return $socket;
16
    return $socket;
17
}
17
}
18
 
18
 
19
sub atomd_read_packet
19
sub atomd_read_packet
20
{
20
{
21
    ($socket) = @_;
21
    ($socket) = @_;
22
    $command="";
22
    $command="";
23
    read($socket, $command, 4);
23
    read($socket, $command, 4);
24
 
24
 
25
    $payload_length="";
25
    $payload_length="";
26
    read($socket, $payload_length, 4);
26
    read($socket, $payload_length, 4);
27
 
27
 
28
    $payload_length = int($payload_length);
28
    $payload_length = int($payload_length);
29
    $payload="";
29
    $payload="";
30
    if ($payload_length > 0)
30
    if ($payload_length > 0)
31
    {
31
    {
32
        read($socket, $payload, $payload_length);
32
        read($socket, $payload, $payload_length-1);
33
    }
33
    }
34
   
34
 
35
    #Pad payload length with 0s
35
    #Pad payload length with 0s
36
    $payload_length = sprintf("%04d", $payload_length);
36
    $payload_length = sprintf("%04d", $payload_length-1);
37
   
37
   
38
    #print "areadpacket ".$command . $payload_length . $payload."\n";
38
    #print "areadpacket ".$command . $payload_length . $payload."\n";
39
    return $command . $payload_length . $payload;
39
    return $command . $payload_length . $payload;
40
}
40
}
41
 
41
 
42
sub atomd_write_packet
42
sub atomd_write_packet
43
{
43
{
44
    ($socket, $command, $payload) = @_;
44
    ($socket, $command, $payload) = @_;
45
   
45
   
46
    #Pad payload length with 0s
46
    #Pad payload length with 0s
47
    $payload_length = sprintf("%04d", length($payload)+1);
47
#   $payload_length = sprintf("%04d", length($payload)+1);
48
    $packet = $command.$payload_length.$payload.chr(0);
48
#   $packet = $command.$payload_length.$payload.chr(0);
-
 
49
    $payload_length = sprintf("%04d", length($payload));
-
 
50
    $packet = $command.$payload_length.$payload;
49
 
51
 
50
    #print "awritepacket ".$packet."\n";
52
    #print "awritepacket ".$packet."\n";
51
    print $socket $packet;
53
    print $socket $packet;
52
}
54
}
53
 
55
 
54
 
56
 
55
sub atomd_data_available
57
sub atomd_data_available
56
{
58
{
57
    ($socket) = @_;
59
    ($socket) = @_;
58
 
60
 
59
    $s = IO::Select->new();
61
    $s = IO::Select->new();
60
    $s->add($socket);
62
    $s->add($socket);
61
    @handles = $s->can_read(0.001);
63
    @handles = $s->can_read(0.001);
62
 
64
 
63
    $has_data = 0;
65
    $has_data = 0;
64
    if (@handles)
66
    if (@handles)
65
    {
67
    {
66
        $has_data = 1;
68
        $has_data = 1;
67
    }
69
    }
68
   
70
   
69
    return $has_data;
71
    return $has_data;
70
}
72
}
71
 
73
 
72
sub atomd_kill_promt
74
sub atomd_kill_promt
73
{
75
{
74
    ($socket) = @_;
76
    ($socket) = @_;
75
 
77
 
76
    while (atomd_data_available($socket))
78
    while (atomd_data_available($socket))
77
    {
79
    {
78
        $packet = atomd_read_packet($socket); # Read prompt
80
        $packet = atomd_read_packet($socket); # Read prompt
79
    }
81
    }
80
}
82
}
81
 
83
 
82
sub atomd_initialize
84
sub atomd_initialize
83
{
85
{
84
    ($host, $port) = @_;
86
    ($host, $port) = @_;
85
    $socket = atomd_connect($host, $port);
87
    $socket = atomd_connect($host, $port);
86
   
88
   
87
    atomd_kill_promt($socket);
89
    atomd_kill_promt($socket);
88
   
90
   
89
    return $socket;
91
    return $socket;
90
}
92
}
91
 
93
 
92
 
94
 
93
sub atomd_send_command
95
sub atomd_send_command
94
{
96
{
95
    ($socket, $command) = @_;
97
    ($socket, $command) = @_;
96
    atomd_write_packet($socket, "RESP", $command);
98
    atomd_write_packet($socket, "RESP", $command);
97
}
99
}
98
 
100
 
99
 
101
 
100
sub atomd_read_command_response
102
sub atomd_read_command_response
101
{
103
{
102
    ($socket) = @_;
104
    ($socket) = @_;
103
 
105
 
104
    $response = "";
106
    $response = "";
105
 
107
 
106
    while (1)
108
    while (1)
107
    {
109
    {
108
        $packet = atomd_read_packet($socket);
110
        $packet = atomd_read_packet($socket);
109
 
111
 
110
        if (substr($packet, 0, 4) ne "TEXT")
112
        if (substr($packet, 0, 4) ne "TEXT")
111
        {
113
        {
112
            last;
114
            last;
113
        }
115
        }
114
 
116
 
115
        $packet =~ s/\n//g;
117
        $packet =~ s/\n//g;
116
        $response .= substr($packet, 8, -1);
118
#       $response .= substr($packet, 8, -1); 
-
 
119
        $response .= substr($packet, 8);
117
        $response .= "\n";
120
        $response .= "\n";
118
    }
121
    }
119
 
122
 
120
    return $response;
123
    return $response;
121
}
124
}
-
 
125
 
-
 
126
 
-
 
127
# Perl trim function to remove whitespace from the start and end of the string
-
 
128
sub trim($)
-
 
129
{
-
 
130
    my $string = shift;
-
 
131
    $string =~ s/^\s+//;
-
 
132
    $string =~ s/\s+$//;
-
 
133
    return $string;
-
 
134
}
-
 
135
# Left trim function to remove leading whitespace
-
 
136
sub ltrim($)
-
 
137
{
-
 
138
    my $string = shift;
-
 
139
    $string =~ s/^\s+//;
-
 
140
    return $string;
-
 
141
}
-
 
142
# Right trim function to remove trailing whitespace
-
 
143
sub rtrim($)
-
 
144
{
-
 
145
    my $string = shift;
-
 
146
    $string =~ s/\s+$//;
-
 
147
    return $string;
-
 
148
}
-
 
149
 
-
 
150
 
122
 
151
 
123
# "return" 1 to not generate an error when loading file
152
# "return" 1 to not generate an error when loading file
124
1;
153
1;
125
 
154
 
126
 
155