From b157a5135d4c94cecc5aade00fea24681a9662c8 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Thu, 5 May 2016 16:01:48 +0000 Subject: [PATCH] 00_ZWDongle.pm: try to fix backup under Windows. git-svn-id: https://svn.fhem.de/fhem/trunk@11393 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_ZWDongle.pm | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/00_ZWDongle.pm b/fhem/FHEM/00_ZWDongle.pm index 921f90b39..35db9a776 100755 --- a/fhem/FHEM/00_ZWDongle.pm +++ b/fhem/FHEM/00_ZWDongle.pm @@ -168,13 +168,17 @@ ZWDongle_Set($@) my $l = $1 * 1024; my $fName = "$attr{global}{modpath}/$name.bin"; open(OUT, ">$fName") || return "Cant open $fName: $!"; - for(my $off = 0; $off < $l; $off += 64) { + binmode(OUT); + for(my $off = 0; $off < $l;) { ZWDongle_Write($hash, "", sprintf("002a%06x0040", $off)); my ($err, $ret) = ZWDongle_ReadAnswer($hash, "NVM_EXT_READ_LONG_BUFFER", "^012a"); return $err if($err); print OUT pack('H*', substr($ret, 4)); + $off += 64; + Log 3, "$name backupCreate at $off bytes" if($off % 16384 == 0); } + close(OUT); return "Wrote $l bytes to $fName"; } @@ -187,9 +191,10 @@ ZWDongle_Set($@) my $l = -s $fName; return "$fName does not exists, or is empty" if(!$l); open(IN, $fName) || return "Cant open $fName: $!"; + binmode(IN); my $buf; - for(my $off = 0; $off < $l; $off += 64) { + for(my $off = 0; $off < $l;) { if(sysread(IN, $buf, 64) != 64) { return "Cant read 64 bytes from $fName"; } @@ -199,7 +204,10 @@ ZWDongle_Set($@) return $err if($err); return "Unexpected NVM_EXT_WRITE_LONG_BUFFER return value $ret" if($ret !~ m/^012b01/); + $off += 64; + Log 3, "$name backupRestore at $off bytes" if($off % 16384 == 0); } + close(IN); return "Restored $l bytes from $fName"; } @@ -398,12 +406,10 @@ ZWDongle_Clear($) my $hash = shift; # Clear the pipe - $hash->{RA_Timeout} = 1.0; for(;;) { my ($err, undef) = ZWDongle_ReadAnswer($hash, "Clear", "wontmatch"); last if($err && ($err =~ m/^Timeout/ || $err =~ m/No FD/)); } - delete($hash->{RA_Timeout}); $hash->{PARTIAL} = ""; } @@ -648,8 +654,13 @@ ZWDongle_ReadAnswer($$$) $hash->{USBDev}->read_const_time($to*1000); # set timeout (ms) # Read anstatt input sonst funzt read_const_time nicht. $buf = $hash->{USBDev}->read(999); - return ("Timeout reading answer for get $arg", undef) - if(length($buf) == 0); + if(length($buf) == 0) { + if($hash->{GotCAN}) { + ZWDongle_ProcessSendStack($hash); + next; + } + return ("Timeout reading answer for get $arg", undef); + } } else { if(!$hash->{FD}) { @@ -829,8 +840,8 @@ ZWDongle_Ready($) <ZWDongle_Name>.bin in the modpath folder. Since the size of the NVRAM is currently unknown to FHEM, you have to specify the size. The ZWave.me ZME_UZB1 Stick seems to have 256k of NVRAM. Note: writing the file - takes some time, usually about 10s for each 64k, and FHEM is blocked during - this time. + takes some time, usually about 10s for each 64k (and significantly longer + on Windows), and FHEM is blocked during this time.
  • backupRestore