 #!/usr/bin/perl -w
 
use strict;
use Device::SerialPort;
$|++; # Ausgabe-Pufferung abschalten

print <<WARREND;

*** No Warranty
***
*** This program is distributed in the hope that it will be useful,
*** but is provided AS IS with ABSOLUTELY NO WARRANTY;
*** The entire risk as to the quality and performance
*** of the program is with you. Should the program prove defective,
*** you assume the cost of all necessary servicing, repair or correction.
*** In no event will any of the developers, or any other party,
*** be liable to anyone for damages arising out of the use or inability to use the program.

WARREND

my ($count, $datei, $cur, $test, $line);
my ($dev, $file) = @ARGV;

die "Parameterfehler! $0 <serial port> <flash file>" unless $dev and $file;

my $serial = Device::SerialPort->new($dev) or
	die ("Kann Schnittstelle nicht oeffnen: Schreibweise korrekt? (z.B. /dev/ttyUSB0)");

$serial->baudrate(115200);
$serial->databits(8);
$serial->purge_all();
$serial->rts_active(0);
$serial->dtr_active(0);
$serial->read_const_time(1000);

open($datei, $file) or die "Datei wurde nicht gefunden.";
my @temp = <$datei>;
close($datei);

$count = @temp;

for $line (@temp) {

	$cur++;

	if ($line =~ /^#.*/) {
		print("Kommentar nicht uebertragen\n");
		next;
	}
	$line =~ s/[\r\n]//g; # da ich immer nicht weiß, in welcher Reihenfolge die Kriepel auftreten... :D

	print "$cur/$count: $line ";
	$serial->write("$line\r"); # von hinten durch die Brust ins Auge, aber \r muss oben entfernt werden, weil sonst die Terminalausgabe mies aussieht ;)

	#warten auf Rueckmeldung
	my ($try, $summe, $buffer) = (0, 0, '');
	while ($buffer !~ /\+/) {
		my ($anzahl, $saw) = $serial->read(length($line) + 2);
		$summe += $anzahl;	
		$buffer = "$buffer$saw";
		print '.';
		die "Timeout!" if $try++ > 10;
	}

	if ($buffer =~ /$line/) {
		print " OK\n"
	} else {
		print "\n  Die letzte Rueckgabe war: $buffer\n";
		die "Fehler bei der Uebertragung\n";
	}

	if ($cur == $count){ 
		print "FERTIG!\n";
		last;
	}

	#Alle 2000 Zeilen ein Paeuschen machen
	sleep(1) unless $cur % 2000;
}

