Subversion Repositories HomeAutomation

Rev

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

  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.  
  119.