Trying to avoid fhtbuf problems

git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@730 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig
2010-10-23 19:38:44 +00:00
parent b90716eb44
commit dd2a46efe4
2 changed files with 30 additions and 23 deletions

View File

@@ -9,7 +9,7 @@ use Time::HiRes qw(gettimeofday);
sub CUL_Clear($); sub CUL_Clear($);
sub CUL_Write($$$); sub CUL_Write($$$);
sub CUL_Read($); sub CUL_Read($);
sub CUL_ReadAnswer($$$); sub CUL_ReadAnswer($$$$);
sub CUL_Ready($); sub CUL_Ready($);
sub CUL_HandleCurRequest($$); sub CUL_HandleCurRequest($$);
sub CUL_HandleWriteQueue($); sub CUL_HandleWriteQueue($);
@@ -22,13 +22,14 @@ sub CUL_SimpleRead($);
sub CUL_Disconnected($); sub CUL_Disconnected($);
my $initstr = "X21"; # Only translated messages + RSSI my $initstr = "X21"; # Only translated messages + RSSI
my %gets = (
"version" => "V", my %gets = ( # Name, Data to send to the CUL, Regexp for the answer
"raw" => "", "ccconf" => 1,
"ccconf" => "=", "file" => 1,
"uptime" => "t", "version" => ["V", '^V .*'],
"file" => "", "raw" => ["", '.*'],
"fhtbuf" => "T03" "uptime" => ["t", '^[0-9A-F]{8}[\r\n]*$' ],
"fhtbuf" => ["T03", '^..[\r\n]*$' ],
); );
my %sets = ( my %sets = (
@@ -192,7 +193,7 @@ CUL_Set($@)
my ($err, $ob); my ($err, $ob);
if(!IsDummy($hash->{NAME})) { if(!IsDummy($hash->{NAME})) {
CUL_SimpleWrite($hash, "C10"); CUL_SimpleWrite($hash, "C10");
($err, $ob) = CUL_ReadAnswer($hash, $type, 0); ($err, $ob) = CUL_ReadAnswer($hash, $type, 0, "^C10 = .*");
return "Can't get old MDMCFG4 value" if($err || $ob !~ m,/ (.*)\r,); return "Can't get old MDMCFG4 value" if($err || $ob !~ m,/ (.*)\r,);
$ob = $1 & 0x0f; $ob = $1 & 0x0f;
} }
@@ -252,7 +253,7 @@ GOTBW:
CUL_SimpleWrite($hash, "X00"); CUL_SimpleWrite($hash, "X00");
CUL_SimpleWrite($hash, sprintf("w%08X$a[1]", $len)); CUL_SimpleWrite($hash, sprintf("w%08X$a[1]", $len));
($err, $msg) = CUL_ReadAnswer($hash, $type, 1); ($err, $msg) = CUL_ReadAnswer($hash, $type, 1, undef);
goto WRITEEND if($err); goto WRITEEND if($err);
if($msg ne sprintf("%08X\r\n", $len)) { if($msg ne sprintf("%08X\r\n", $len)) {
$err = "Bogus length received: $msg"; $err = "Bogus length received: $msg";
@@ -311,7 +312,7 @@ CUL_Get($@)
my %r = ( "0D"=>1,"0E"=>1,"0F"=>1,"10"=>1,"1B"=>1,"1D"=>1 ); my %r = ( "0D"=>1,"0E"=>1,"0F"=>1,"10"=>1,"1B"=>1,"1D"=>1 );
foreach my $a (sort keys %r) { foreach my $a (sort keys %r) {
CUL_SimpleWrite($hash, "C$a"); CUL_SimpleWrite($hash, "C$a");
($err, $msg) = CUL_ReadAnswer($hash, "C$a", 0); ($err, $msg) = CUL_ReadAnswer($hash, "C$a", 0, "^C.* = .*");
return $err if($err); return $err if($err);
my @answ = split(" ", $msg); my @answ = split(" ", $msg);
$r{$a} = $answ[4]; $r{$a} = $answ[4];
@@ -333,7 +334,7 @@ CUL_Get($@)
if(int(@a) == 2) { # No argument: List directory if(int(@a) == 2) { # No argument: List directory
CUL_SimpleWrite($hash, "r."); CUL_SimpleWrite($hash, "r.");
($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0); ($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0, undef);
goto READEND if($err); goto READEND if($err);
$msg =~ s/[\r\n]//g; $msg =~ s/[\r\n]//g;
@@ -352,7 +353,7 @@ CUL_Get($@)
} }
CUL_SimpleWrite($hash, "r$a[2]"); CUL_SimpleWrite($hash, "r$a[2]");
($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0); ($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0, undef);
goto READEND if($err); goto READEND if($err);
if($msg eq "X") { if($msg eq "X") {
@@ -363,7 +364,7 @@ CUL_Get($@)
my ($len, $buf) = (hex($msg), ""); my ($len, $buf) = (hex($msg), "");
$msg = ""; $msg = "";
while(length($msg) != $len) { while(length($msg) != $len) {
($err, $buf) = CUL_ReadAnswer($hash, $a[1], 1); ($err, $buf) = CUL_ReadAnswer($hash, $a[1], 1, undef);
goto READEND if($err); goto READEND if($err);
$msg .= $buf; $msg .= $buf;
} }
@@ -387,8 +388,8 @@ READEND:
} else { } else {
CUL_SimpleWrite($hash, $gets{$a[1]} . $arg); CUL_SimpleWrite($hash, $gets{$a[1]}[0] . $arg);
($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0); ($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0, $gets{$a[1]}[1]);
if(!defined($msg)) { if(!defined($msg)) {
CUL_Disconnected($hash); CUL_Disconnected($hash);
$msg = "No answer"; $msg = "No answer";
@@ -419,7 +420,7 @@ CUL_Clear($)
# Clear the pipe # Clear the pipe
$hash->{RA_Timeout} = 0.1; $hash->{RA_Timeout} = 0.1;
for(;;) { for(;;) {
my ($err, undef) = CUL_ReadAnswer($hash, "Clear", 0); my ($err, undef) = CUL_ReadAnswer($hash, "Clear", 0, undef);
last if($err && $err =~ m/^Timeout/); last if($err && $err =~ m/^Timeout/);
} }
delete($hash->{RA_Timeout}); delete($hash->{RA_Timeout});
@@ -438,7 +439,7 @@ CUL_DoInit($)
my ($ver, $try) = ("", 0); my ($ver, $try) = ("", 0);
while($try++ < 3 && $ver !~ m/^V/) { while($try++ < 3 && $ver !~ m/^V/) {
CUL_SimpleWrite($hash, "V"); CUL_SimpleWrite($hash, "V");
($err, $ver) = CUL_ReadAnswer($hash, "Version", 0); ($err, $ver) = CUL_ReadAnswer($hash, "Version", 0, undef);
return "$name: $err" if($err && ($err !~ m/Timeout/ || $try == 3)); return "$name: $err" if($err && ($err !~ m/Timeout/ || $try == 3));
} }
@@ -462,7 +463,7 @@ CUL_DoInit($)
# FHTID # FHTID
my $fhtid; my $fhtid;
CUL_SimpleWrite($hash, "T01"); CUL_SimpleWrite($hash, "T01");
($err, $fhtid) = CUL_ReadAnswer($hash, "FHTID", 0); ($err, $fhtid) = CUL_ReadAnswer($hash, "FHTID", 0, undef);
return "$name: $err" if($err); return "$name: $err" if($err);
$fhtid =~ s/[\r\n]//g; $fhtid =~ s/[\r\n]//g;
Log 5, "GOT CUL fhtid: $fhtid"; Log 5, "GOT CUL fhtid: $fhtid";
@@ -483,16 +484,15 @@ CUL_DoInit($)
# This is a direct read for commands like get # This is a direct read for commands like get
# Anydata is used by read file to get the filesize # Anydata is used by read file to get the filesize
sub sub
CUL_ReadAnswer($$$) CUL_ReadAnswer($$$$)
{ {
my ($hash, $arg, $anydata) = @_; my ($hash, $arg, $anydata, $regexp) = @_;
my $type = $hash->{TYPE}; my $type = $hash->{TYPE};
while($hash->{TYPE} eq "CUL_RFR") { # Look for the first "real" CUL while($hash->{TYPE} eq "CUL_RFR") { # Look for the first "real" CUL
$hash = $hash->{IODev}; $hash = $hash->{IODev};
} }
return ("No FD", undef) return ("No FD", undef)
if(!$hash || ($^O !~ /Win/ && !defined($hash->{FD}))); if(!$hash || ($^O !~ /Win/ && !defined($hash->{FD})));
@@ -533,7 +533,13 @@ CUL_ReadAnswer($$$)
$mculdata .= $buf; $mculdata .= $buf;
} }
$mculdata = CUL_RFR_DelPrefix($mculdata) if($type eq "CUL_RFR"); $mculdata = CUL_RFR_DelPrefix($mculdata) if($type eq "CUL_RFR");
return (undef, $mculdata) if($mculdata =~ m/\r\n/ || $anydata); if($mculdata =~ m/\r\n/ || $anydata) {
if($regexp && $mculdata !~ m/$regexp/) {
CUL_Parse($hash, $hash, $hash->{NAME}, $mculdata, $initstr);
} else {
return (undef, $mculdata)
}
}
} }
} }

View File

@@ -628,6 +628,7 @@ getFhtBuffer($)
return getFhtMin($io) if(IsDummy($io->{NAME})); return getFhtMin($io) if(IsDummy($io->{NAME}));
for(;;) { for(;;) {
return 0 if(!define($io->{FD})); # Avoid crash if the CUL/FHZ is absent
my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "fhtbuf")); my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "fhtbuf"));
Log 5, "getFhtBuffer: $count $msg"; Log 5, "getFhtBuffer: $count $msg";
return hex($1) if($msg && $msg =~ m/=> ([0-9A-F]+)$/i); return hex($1) if($msg && $msg =~ m/=> ([0-9A-F]+)$/i);