Subversion Repositories HomeAutomation

Rev

Rev 2187 | 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 integer;
  9. use threads;
  10. use Cwd qw(abs_path);
  11. use File::Basename;
  12. use Getopt::Long;
  13. use Time::HiRes qw(usleep nanosleep);
  14.  
  15. $host = "localhost";
  16. $port = 1201;
  17.  
  18. # Get hostname and port from command line arguments
  19. if ( @ARGV > 0 ) {
  20.     GetOptions( "host=s"    => \$host,          #
  21.             "port=i"    => \$port,          #
  22.                         );
  23. }
  24.  
  25. my $path = dirname(abs_path($0));
  26.  
  27. # Read atom functions from separate file
  28. if (-e $path."/AtomLib.pl") {
  29.     require $path."/AtomLib.pl";
  30. } else {
  31.     print "Error: No AtomLib.pl was found in ".$path.". \n\n";
  32.     exit 1;
  33. }
  34.  
  35. # Read devices from separate file
  36. if (-e $path."/devices.pl") {
  37.     require $path."/devices.pl";
  38. } else {
  39.     print "Error: No devices.pl was found in ".$path.". \n\n";
  40.     exit 1;
  41. }
  42.  
  43. $biosfile = "bios.inc";
  44. open (FP, "+<".$biosfile) or die "Error: Cannot open file $biosfile\n";
  45. @file = <FP>;
  46. close FP;
  47.  
  48.  
  49. # Check bios.inc for the settings that should be updated
  50. my $foundidrow = 0;
  51. my $foundmcurow = 0;
  52. my $foundhfrow = 0;
  53. my $foundlfrow = 0;
  54. my $foundefrow = 0;
  55. my $foundbootrow = 0;
  56. foreach $file (@file) {
  57.     if ($file =~ m/^NODE_HW_ID=/) {
  58.         print "\nCurrent id-setting: ".$file."\n";
  59.         $foundidrow = 1;
  60.     }
  61.     if ($file =~ m/^MCU=/) {
  62.         $foundmcurow = 1;
  63.     }
  64.     if ($file =~ m/^HIGHFUSE=/) {
  65.         $foundhfrow = 1;
  66.     }
  67.     if ($file =~ m/^LOWFUSE=/) {
  68.         $foundlfrow = 1;
  69.     }
  70.     if ($file =~ m/^EXTFUSE=/) {
  71.         $foundefrow = 1;
  72.     }
  73.     if ($file =~ m/^BOOT_START=/) {
  74.         $foundbootrow = 1;
  75.     }
  76. }
  77. if ($foundidrow == 0) {
  78.     print "Error: Did not find NODE_HW_ID= in file $biosfile\n";
  79.     exit 1;
  80. }
  81. if ($foundmcurow == 0) {
  82.     print "Error: Did not find MCU= in file $biosfile\n";
  83.     exit 1;
  84. }
  85. if ($foundhfrow == 0) {
  86.     print "Error: Did not find HIGHFUSE= in file $biosfile\n";
  87.     exit 1;
  88. }
  89. if ($foundlfrow == 0) {
  90.     print "Error: Did not find LOWFUSE= in file $biosfile\n";
  91.     exit 1;
  92. }
  93. if ($foundefrow == 0) {
  94.     print "Error: Did not find EXTFUSE= in file $biosfile\n";
  95.     exit 1;
  96. }
  97. if ($foundbootrow == 0) {
  98.     print "Error: Did not find BOOT_START= in file $biosfile\n";
  99.     exit 1;
  100. }
  101.  
  102. my $hwid = "";
  103. my @device = ();
  104.  
  105. #print "/usr/bin/atomic -s $host -p $port -c \"Node_WaitForInformation\"\n";
  106. #my @lines = qx{/usr/bin/atomic -s $host -p $port -c \"Node_GetInformation 0xB23F54EA\"};
  107. #my @lines = qx{/usr/bin/atomic -s $host -p $port -c \"Node_WaitForInformation\"};
  108. my @lines;
  109.  
  110. print "Abort with Ctrl+c\n";
  111.  
  112. $socket = atomd_initialize($host, $port);
  113. if ($port == 1203)
  114. {
  115.     atomjs_write($socket, "Node_WaitForInformationNative();\n");
  116.  
  117.     $success = 0;
  118.     for ($count = 0; $count < 300; $count++)
  119.     {
  120.         atomjs_write($socket, "Node_WaitNodePollNative();\n");
  121.         $return = atomjs_read_line($socket);
  122.         if (($return =~ m/NoInfo/) || ($return =~ m/undefined/))
  123.         {
  124.         }
  125.         elsif ($return =~ m/Error/)
  126.         {
  127.             die $return;
  128.         }
  129.         else
  130.         {
  131.             @lines = split(/\t/, $return);
  132.             $success = 1;
  133.             last;
  134.         }
  135.         usleep(200000);
  136.     }
  137.     if ($success == 0)
  138.     {
  139.         die "\033[31mTimed out waiting for node to start.\033[0m\n";
  140.     }
  141. }
  142. else
  143. {
  144.     usleep(100000);
  145.     atomd_kill_promt($socket);
  146.     atomd_send_command($socket, "Node_WaitForInformation");
  147.     #atomd_send_command($socket, "Node_GetInformation 0x7DD44E0A");
  148.     $return = atomd_read_command_response($socket);
  149.     @lines = split(/\n/, $return);
  150. }
  151.  
  152. my $foundDeviceType = 0;
  153. foreach (@lines)
  154. {
  155.     my $line = $_;
  156.     print($line."\n");
  157.     chomp($line);
  158.    
  159.     if (index($line, "Id") != -1)
  160.     {
  161.         my $temp = substr($line, index($line, ":") + 1);
  162.    
  163.         $temp =~ s/^\s+//;
  164.         $temp =~ s/\s+$//;
  165.  
  166.         my @hwidChars = split(//, $temp);
  167.         $hwid = $hwidChars[0]. $hwidChars[1]. $hwidChars[8]. $hwidChars[9]. $hwidChars[6]. $hwidChars[7]. $hwidChars[4]. $hwidChars[5]. $hwidChars[2]. $hwidChars[3];
  168.  
  169.         print "\033[32mSetting HWID in bios.inc to ".$hwid."\033[0m\n";
  170.     }
  171.     elsif (index($line, "Device Type") != -1)
  172.     {
  173.         $devicename = substr($line, index($line, ":") + 1);
  174.    
  175.         $devicename =~ s/^\s+//;
  176.         $devicename =~ s/\s+$//;
  177.        
  178.         @device = $devices[0];
  179.         foreach (@devices)
  180.         {
  181.             if (@{$_}[0] eq $devicename)
  182.             {
  183.                 @device = @{$_};
  184.                 $foundDeviceType = 1;
  185.             }
  186.         }
  187.        
  188.         if ($foundDeviceType == 0)
  189.         {
  190.             print "\nWarning: Unknown device type, will not set MCU settings\n\n";
  191.         }
  192.         else
  193.         {
  194.             print "Setting device type to ".$device[0]."\n";
  195.         }
  196.     }
  197. }
  198.  
  199. if ($hwid eq "" || $foundDeviceType == 0)
  200. {
  201.     exit(1);
  202. }
  203.  
  204. # Open bios.inc and replace all settings
  205. open (FP, "<".$biosfile) or die "Cannot open file $biosfile\n";
  206. @file = <FP>;
  207. close FP;
  208. open (FP, ">".$biosfile) or die "Cannot open file $biosfile\n";
  209. foreach $file (@file) {
  210.     $file =~ s/^NODE_HW_ID=.*/NODE_HW_ID=$hwid/g;
  211.     if ($device[0] ne "unknown")
  212.     {
  213.         $file =~ s/^MCU=.*/MCU=$device[0]/g;
  214.         $file =~ s/^HIGHFUSE=.*/HIGHFUSE=$device[1]/g;
  215.         $file =~ s/^LOWFUSE=.*/LOWFUSE=$device[2]/g;
  216.         $file =~ s/^EXTFUSE=.*/EXTFUSE=$device[3]/g;
  217.         $file =~ s/^BOOT_START=.*/BOOT_START=$device[4]/g;
  218.     }
  219.     print FP $file;
  220. }
  221. close FP;
  222.  
  223. exit(0);
  224.  
  225.