Subversion Repositories HomeAutomation

Rev

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

  1. #!/usr/bin/perl
  2.  
  3. # Written by Mattias Runge 2008-2010
  4.  
  5. use Cwd 'abs_path';
  6. use File::Basename;
  7. use Time::HiRes qw( usleep );
  8.  
  9. $| = 1;
  10.  
  11. $numArgs = $#ARGV + 1;
  12.  
  13. my $hostname = "localhost";
  14. my $port = 1201;
  15. my $filename = "";
  16. my $hwid = "";
  17. my $bios = 0;
  18. my $reset = "false";
  19.  
  20. foreach $argnum (0 .. $#ARGV)
  21. {
  22.     if ($ARGV[$argnum] eq "-h")
  23.     {
  24.         $hostname = $ARGV[$argnum+1];
  25.         next;
  26.  
  27.     }
  28.     elsif ($ARGV[$argnum] eq "-p")
  29.     {
  30.         $port = $ARGV[$argnum+1];
  31.         next;
  32.  
  33.     }
  34.     elsif ($ARGV[$argnum] eq "-i")
  35.     {
  36.         $hwid = $ARGV[$argnum+1];
  37.         next;
  38.  
  39.     }
  40.     elsif ($ARGV[$argnum] eq "-f")
  41.     {
  42.         $filename = abs_path($ARGV[$argnum+1]);
  43.         next;
  44.  
  45.     }
  46.     elsif ($ARGV[$argnum] eq "-b")
  47.     {
  48.         $bios = 1;
  49.     }
  50.     elsif ($ARGV[$argnum] eq "-r")
  51.     {
  52.         $reset = "true";
  53.     }
  54. }
  55.  
  56. if ($hwid eq "")
  57. {
  58.     die "You must specify a hardware id!\n";
  59.     exit 1;
  60. }
  61.  
  62. my $path = dirname(abs_path($0));
  63.  
  64. # Read atom functions from separate file
  65. if (-e $path."/setConfig/AtomLib.pl") {
  66.     require $path."/setConfig/AtomLib.pl";
  67. } else {
  68.     print "Error: No AtomLib.pl was found in ".$path.". \n\n";
  69.     exit 1;
  70. }
  71.  
  72. #0x14f90d1f to 0x1f0df914
  73. @hwidChars = split(//, $hwid);
  74. $hwid = $hwidChars[0]. $hwidChars[1]. uc($hwidChars[8]. $hwidChars[9]. $hwidChars[6]. $hwidChars[7]. $hwidChars[4]. $hwidChars[5]. $hwidChars[2]. $hwidChars[3]);
  75.  
  76. print "atomDude settings:\n";
  77. print "Hardware id: " . $hwid . "\n";
  78. print "Atom address: " . $hostname . ":" . $port . "\n";
  79. print "Hexfile: " . $filename . "\n";
  80. #print "Parameters: " . "\n";
  81.  
  82. ############################## RESET ##############################
  83. if ($reset eq "true" && $filename eq "")
  84. {
  85.     if ($port == 1203)
  86.     {
  87.         $socket = atomd_initialize($hostname, $port);
  88.         atomjs_write($socket, "Node_ResetNative('".$hwid."');\n");
  89.         $response = atomjs_read_line($socket);
  90.         if ($response =~ m/Error/)
  91.         {
  92.             die $response;
  93.         }
  94.         print $response;
  95.  
  96.         $success = 0;
  97.         for ($count = 0; $count < 15; $count++)
  98.         {
  99.             atomjs_write($socket, "Node_ResetPollNative();\n");
  100.             if (atomjs_read_line($socket) =~ m/true/)
  101.             {
  102.                 print "\033[32m" . $hwid . " started okay.\033[0m\n";
  103.                 $success = 1;
  104.                 last;
  105.             }
  106.             usleep(200000);
  107.         }
  108.         if ($success == 0)
  109.         {
  110.             print "\033[31mTimed out waiting for reset.\033[0m\n";
  111.         }
  112.     }
  113.     else
  114.     {
  115.         $socket = atomd_initialize($hostname, $port);
  116.  
  117.         usleep(100000);
  118.         atomd_kill_promt($socket);
  119.         atomd_send_command($socket, "Node_Reset $hwid");
  120.         print atomd_read_command_response($socket);
  121.         #my $result = system("atomic -s $hostname -p $port -c \"Node_Reset $hwid\"");
  122.         #exit($result);
  123.     }
  124. }
  125. ############################## REPROGRAM ##############################
  126. else
  127. {
  128.     if ($port == 1203)
  129.     {
  130.         open (FP, "+<".$filename) or die "Error: Cannot open file $filename\n";
  131.         @filecontents = <FP>;
  132.         close FP;
  133.         $socket = atomd_initialize($hostname, $port);
  134.         atomjs_write($socket, "Node_ClearHex();\n");
  135.         atomjs_read_line($socket);
  136.         my $linenums = 0;
  137.         foreach $filerow (@filecontents)
  138.         {
  139.             $filerow =~ s/^\s+//;
  140.             $filerow =~ s/\s+$//;
  141.             $linenums += 1;
  142.             $command = "Node_AppendHexNative('".$filerow."');\n";
  143.             atomjs_write($socket, $command);
  144.             $response = atomjs_read_line($socket);
  145.             if ($response =~ m/Error/)
  146.             {
  147.                 die $response;
  148.             }
  149.         }
  150.         $command = "Node_ProgramNative('".$hwid."', '".$bios."', '".$linenums."');\n";
  151.         atomjs_write($socket, $command);
  152.         #print $command;
  153.         $response = atomjs_read_line($socket);
  154.         if ($response =~ m/Error/)
  155.         {
  156.             die $response;
  157.         }
  158.         print $response;
  159. #atomd_disconnect($socket);
  160.         $success = 0;
  161.         $alreadyprintfull = 0;
  162.         for ($count = 0; $count < 150; $count++)
  163.         {
  164.             atomjs_write($socket, "Node_ProgramPollNative();\n");
  165.             if (atomjs_read_line($socket) =~ m/true/)
  166.             {
  167.                 print progress_bar( 100, 100, 40, '=' );
  168.                 print "\n\033[32m" . $hwid . " started okay.\033[0m\n";
  169.                 $success = 1;
  170.                 last;
  171.             }
  172.             atomjs_write($socket, "Node_GetProgramProgress('".$hwid."');\n");
  173.             $response = atomjs_read_line($socket);
  174.             if ($response =~ m/Error/)
  175.             {
  176.                 die $response;
  177.             }
  178.             $response =~ s/^\s+//;
  179.             $response =~ s/\s+$//;
  180.             if ($response > 99)
  181.             {
  182.                 $response = 99;
  183.             }
  184.             #print $response."\n";
  185.             print progress_bar( $response, 100, 40, '=' );
  186.            
  187.             usleep(200000);
  188.         }
  189.         if ($success == 0)
  190.         {
  191.             print "\n\033[31mTimed out waiting for program to finish.\033[0m\n";
  192.         }
  193.     }
  194.     else
  195.     {
  196.         open (FP, "+<".$filename) or die "Error: Cannot open file $filename\n";
  197.         @filecontents = <FP>;
  198.         close FP;
  199.         $socket = atomd_initialize($hostname, $port);
  200.         usleep(100000);
  201.         atomd_kill_promt($socket);
  202.    
  203.         #print "Sending Node_ClearHex\n";
  204.         atomd_send_command($socket, "Node_ClearHex");
  205.         atomd_kill_promt($socket);
  206.    
  207.         my $linenums = 0;
  208.         foreach $filerow (@filecontents)
  209.         {
  210.             #print "Sending Node_AppendHex $filerow \n";
  211.             #$filerow =~ s/^\s+//;
  212.             #$filerow =~ s/\s+$//;
  213.             atomd_send_command($socket, "Node_AppendHex $filerow");
  214.             atomd_kill_promt($socket);
  215.             $linenums += 1;
  216.         }
  217.         #print "Sending Node_ProgramHex $hwid $bios $linenums \n";
  218.         atomd_send_command($socket, "Node_ProgramHex $hwid $bios $linenums");
  219.  
  220.         print atomd_read_command_response($socket);
  221.  
  222. #       my $result = system("atomic -s $hostname -p $port -c \"Node_Program $hwid $bios $filename\"");
  223. #       exit($result);
  224.     }
  225. }
  226.  
  227. exit(0);
  228.  
  229. # wget-style. routine by tachyon
  230. # at http://tachyon.perlmonk.org/
  231. sub progress_bar {
  232.     my ( $got, $total, $width, $char ) = @_;
  233.     $width ||= 25; $char ||= '=';
  234.     my $num_width = length $total;
  235.     sprintf "|%-${width}s| (%.2f%%)\r",
  236.         $char x (($width-1)*$got/$total). '>',
  237.         $got, $total, 100*$got/+$total;
  238. }
  239.  
  240.