Subversion Repositories HomeAutomation

Rev

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

  1. #!/usr/bin/perl -w
  2. ################################################
  3. #
  4. # author: arune @ efnet
  5. #
  6. ################################################
  7.  
  8. use IO::Socket;
  9. use integer;
  10. use threads;
  11. use Cwd qw(abs_path);
  12. use File::Basename;
  13. use Getopt::Long;
  14.  
  15. use IO::Select;
  16. use Fcntl ':seek';
  17.  
  18. $host = "localhost";
  19. $port = 1201;
  20.  
  21. # Get hostname and port from command line arguments
  22. if ( @ARGV > 0 ) {
  23.     GetOptions( "host=s"    => \$host,          #
  24.             "port=i"    => \$port,          #
  25.                         );
  26. }
  27.  
  28. my $path = dirname(abs_path($0));
  29.  
  30. # Read devices from separate file
  31. if (-e $path."/devices.pl") {
  32.     require $path."/devices.pl";
  33. } else {
  34.     print "Error: No devices.pl was found in ".$path.". \n\n";
  35.     exit 1;
  36. }
  37.  
  38. $biosfile = "bios.inc";
  39. open (FP, "+<".$biosfile) or die "Error: Cannot open file $biosfile\n";
  40. @file = <FP>;
  41. close FP;
  42.  
  43.  
  44. # Check bios.inc for the settings that should be updated
  45. my $foundidrow = 0;
  46. my $foundmcurow = 0;
  47. my $foundhfrow = 0;
  48. my $foundlfrow = 0;
  49. my $foundefrow = 0;
  50. my $foundbootrow = 0;
  51. foreach $file (@file) {
  52.     if ($file =~ m/^NODE_HW_ID=/) {
  53.         print "\nCurrent id-setting: ".$file."\n";
  54.         $foundidrow = 1;
  55.     }
  56.     if ($file =~ m/^MCU=/) {
  57.         $foundmcurow = 1;
  58.     }
  59.     if ($file =~ m/^HIGHFUSE=/) {
  60.         $foundhfrow = 1;
  61.     }
  62.     if ($file =~ m/^LOWFUSE=/) {
  63.         $foundlfrow = 1;
  64.     }
  65.     if ($file =~ m/^EXTFUSE=/) {
  66.         $foundefrow = 1;
  67.     }
  68.     if ($file =~ m/^BOOT_START=/) {
  69.         $foundbootrow = 1;
  70.     }
  71. }
  72. if ($foundidrow == 0) {
  73.     print "Error: Did not find NODE_HW_ID= in file $biosfile\n";
  74.     exit 1;
  75. }
  76. if ($foundmcurow == 0) {
  77.     print "Error: Did not find MCU= in file $biosfile\n";
  78.     exit 1;
  79. }
  80. if ($foundhfrow == 0) {
  81.     print "Error: Did not find HIGHFUSE= in file $biosfile\n";
  82.     exit 1;
  83. }
  84. if ($foundlfrow == 0) {
  85.     print "Error: Did not find LOWFUSE= in file $biosfile\n";
  86.     exit 1;
  87. }
  88. if ($foundefrow == 0) {
  89.     print "Error: Did not find EXTFUSE= in file $biosfile\n";
  90.     exit 1;
  91. }
  92. if ($foundbootrow == 0) {
  93.     print "Error: Did not find BOOT_START= in file $biosfile\n";
  94.     exit 1;
  95. }
  96.  
  97. my $hwid = "";
  98. my @device = ();
  99.  
  100. #print "/usr/bin/atomic -s $host -p $port -c \"Node_WaitForInformation\"\n";
  101. #my @lines = qx{/usr/bin/atomic -s $host -p $port -c \"Node_GetInformation 0xB23F54EA\"};
  102. #my @lines = qx{/usr/bin/atomic -s $host -p $port -c \"Node_WaitForInformation\"};
  103.  
  104. $socket = atomd_initialize($host, $port);
  105. atomd_send_command($socket, "Node_WaitForInformation");
  106. $return = atomd_read_command_response($socket);
  107.  
  108. my @lines = split(/\n/, $return);
  109.  
  110. foreach (@lines)
  111. {
  112.     my $line = $_;
  113.     print($line."\n");
  114.     chomp($line);
  115.    
  116.     if (index($line, "Id") != -1)
  117.     {
  118.         my $temp = substr($line, index($line, ":") + 1);
  119.    
  120.         $temp =~ s/^\s+//;
  121.         $temp =~ s/\s+$//;
  122.  
  123.         my @hwidChars = split(//, $temp);
  124.         $hwid = $hwidChars[0]. $hwidChars[1]. $hwidChars[8]. $hwidChars[9]. $hwidChars[6]. $hwidChars[7]. $hwidChars[4]. $hwidChars[5]. $hwidChars[2]. $hwidChars[3];
  125.  
  126.         print "Setting HWID in bios.inc to ".$hwid."\n";
  127.     }
  128.     elsif (index($line, "Device Type") != -1)
  129.     {
  130.         $devicename = substr($line, index($line, ":") + 1);
  131.    
  132.         $devicename =~ s/^\s+//;
  133.         $devicename =~ s/\s+$//;
  134.    
  135.         @device = $devices[0];
  136.         foreach (@devices)
  137.         {
  138.             if (@{$_}[0] eq $devicename)
  139.             {
  140.                 @device = @{$_};
  141.             }
  142.         }
  143.        
  144.         if ($device[0] eq "unknown")
  145.         {
  146.             print "\nWarning: Unknown device type, will not set MCU settings\n\n";
  147.         }
  148.         else
  149.         {
  150.             print "Setting device type to ".$device[0]."\n";
  151.         }
  152.     }
  153. }
  154.  
  155. if ($hwid eq "")
  156. {
  157.     exit(1);
  158. }
  159.  
  160. # Open bios.inc and replace all settings
  161. open (FP, "<".$biosfile) or die "Cannot open file $biosfile\n";
  162. @file = <FP>;
  163. close FP;
  164. open (FP, ">".$biosfile) or die "Cannot open file $biosfile\n";
  165. foreach $file (@file) {
  166.     $file =~ s/^NODE_HW_ID=.*/NODE_HW_ID=$hwid/g;
  167.     if ($device[0] ne "unknown")
  168.     {
  169.         $file =~ s/^MCU=.*/MCU=$device[0]/g;
  170.         $file =~ s/^HIGHFUSE=.*/HIGHFUSE=$device[1]/g;
  171.         $file =~ s/^LOWFUSE=.*/LOWFUSE=$device[2]/g;
  172.         $file =~ s/^EXTFUSE=.*/EXTFUSE=$device[3]/g;
  173.         $file =~ s/^BOOT_START=.*/BOOT_START=$device[4]/g;
  174.     }
  175.     print FP $file;
  176. }
  177. close FP;
  178.  
  179. exit(0);
  180.  
  181.  
  182. # TODO: Move all atomic-protocol functions to a separate file/lib
  183.  
  184. sub atomd_connect
  185. {
  186.     ($host, $port) = @_;
  187.     $socket = IO::Socket::INET->new(
  188.             Proto    => "tcp",
  189.             PeerAddr => $host,
  190.             PeerPort => $port,
  191.             Blocking => 1,
  192.         )
  193.         or die "Error: Cannot connect to port $port at $host\n";
  194.  
  195.     return $socket;
  196. }
  197.  
  198. sub atomd_read_packet
  199. {
  200.     ($socket) = @_;
  201.     $command="";
  202.     #while (length($command)<4)
  203.     #{
  204.         #sysread blocks and reads at least 1 byte before returning
  205.     #   $bytes = sysread($socket, $buf, 1);
  206.     #   $command .= $buf;
  207.     #}
  208.     read($socket, $command, 4);
  209.  
  210.     $payload_length="";
  211.     #while (length($payload_length)<4)
  212.     #{
  213.     #   $bytes = sysread($socket, $buf, 1);
  214.     #   $payload_length .= $buf;
  215.     #}
  216.     read($socket, $payload_length, 4);
  217.  
  218.     $payload_length = int($payload_length);
  219.     $payload="";
  220.     if ($payload_length > 0)
  221.     {
  222.         #while (length($payload) < $payload_length)
  223.         #{
  224.         #   $bytes = sysread($socket, $buf, 1);
  225.         #   $payload .= $buf;
  226.         #}
  227.         read($socket, $payload, $payload_length);
  228.     }
  229.    
  230.     $payload_length = sprintf("%04d", $payload_length);
  231.    
  232.     #print "areadpacket ".$command . $payload_length . $payload."\n";
  233.     return $command . $payload_length . $payload;
  234. }
  235.  
  236. sub atomd_write_packet
  237. {
  238.     ($socket, $command, $payload) = @_;
  239.    
  240.     $payload_length = sprintf("%04d", length($payload)+1);
  241.     $packet = $command.$payload_length.$payload.chr(0);
  242.  
  243.     #print "awritepacket ".$packet."\n";
  244.     print $socket $packet;
  245. }
  246.  
  247.  
  248. sub atomd_data_available
  249. {
  250.     ($socket) = @_;
  251.     #Get the current buffer position
  252.     $position = tell($socket);
  253.  
  254.     #Set the current position to end of buffer
  255.     seek($socket, -1, SEEK_END);
  256.  
  257.     #Compare end postion to stored position
  258.     $has_data = tell($socket) > $position;
  259.  
  260.     #Restore buffer position
  261.     seek($socket, $position, SEEK_SET);
  262.  
  263.     return $has_data;
  264. }
  265.  
  266.  
  267. sub atomd_initialize
  268. {
  269.     ($host, $port) = @_;
  270.     $socket = atomd_connect($host, $port);
  271.    
  272.     #while (!atomd_data_available($socket)) {}
  273.    
  274.     #while (atomd_data_available($socket))
  275.     #{
  276.     #   $packet = atomd_read_packet($socket); # Read initial prompt
  277.     #}
  278.    
  279.     # Read initial prompt
  280.     $s = IO::Select->new();
  281.     $s->add($socket);
  282.     $s->can_read(1);
  283.    
  284.     sysread($socket, $data, 9000);
  285.     $data="";
  286.     #print "ainit".$data."\n";
  287.     return $socket;
  288. }
  289.  
  290.  
  291. sub atomd_send_command
  292. {
  293.     ($socket, $command) = @_;
  294.     atomd_write_packet($socket, "RESP", $command);
  295. }
  296.  
  297.  
  298. sub atomd_read_command_response
  299. {
  300.     ($socket) = @_;
  301.  
  302.     $response = "";
  303.  
  304.     while (1)
  305.     {
  306.         $packet = atomd_read_packet($socket);
  307.  
  308.         if (substr($packet, 0, 4) ne "TEXT")
  309.         {
  310.             last;
  311.         }
  312.  
  313.         $response .= substr($packet, 8) . "\n";
  314.     }
  315.  
  316.     return $response;
  317. }
  318.  
  319.