Subversion Repositories HomeAutomation

Rev

Rev 1884 | Rev 1890 | 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.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.  
  120.