Subversion Repositories HomeAutomation

Rev

Rev 1890 | Rev 2101 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

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