2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 18:56:03 +00:00

ZWave: issuing multiple commands fixed

git-svn-id: https://svn.fhem.de/fhem/trunk@4525 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-01-02 10:38:01 +00:00
parent 12b45d442b
commit e88ca3f191
2 changed files with 573 additions and 922 deletions

View File

@ -15,7 +15,7 @@ sub ZWDongle_Parse($$$);
sub ZWDongle_Read($@); sub ZWDongle_Read($@);
sub ZWDongle_ReadAnswer($$$); sub ZWDongle_ReadAnswer($$$);
sub ZWDongle_Ready($); sub ZWDongle_Ready($);
sub ZWDongle_Write($$$); sub ZWDongle_Write($$$@);
# See also: # See also:
@ -196,6 +196,8 @@ ZWDongle_Define($$)
$hash->{DeviceName} = $dev; $hash->{DeviceName} = $dev;
$hash->{CallbackNr} = 0; $hash->{CallbackNr} = 0;
my @empty;
$hash->{SendStack} = \@empty;
my $ret = DevIo_OpenDev($hash, 0, "ZWDongle_DoInit"); my $ret = DevIo_OpenDev($hash, 0, "ZWDongle_DoInit");
return $ret; return $ret;
} }
@ -385,10 +387,16 @@ ZWDongle_CheckSum($)
##################################### #####################################
sub sub
ZWDongle_Write($$$) ZWDongle_Write($$$@)
{ {
my ($hash,$fn,$msg) = @_; my ($hash,$fn,$msg,$noStack) = @_;
if(!$noStack && $msg =~ m/^13/) { # SEND_DATA, wait for ACK
push @{$hash->{SendStack}}, $msg;
if(int(@{$hash->{SendStack}}) > 1) {
return;
}
}
$msg = "$fn$msg"; $msg = "$fn$msg";
$msg = sprintf("%02x%s", length($msg)/2+1, $msg); $msg = sprintf("%02x%s", length($msg)/2+1, $msg);
$msg = "01$msg" . ZWDongle_CheckSum($msg); $msg = "01$msg" . ZWDongle_CheckSum($msg);
@ -432,6 +440,16 @@ ZWDongle_Read($@)
$data = substr($data, 2); $data = substr($data, 2);
next; next;
} }
if($fb eq "18") { # CAN
if(int(@{$hash->{SendStack}})) {
Log3 $name, 4, "$name: CANCEL received, retransmitting.";
ZWDongle_Write($hash, "00", $hash->{SendStack}->[0], 1);
} else {
Log3 $name, 4, "$name: CANCEL received, nothing to retransmit.";
}
$data = substr($data, 2);
next;
}
if($fb ne "01") { # SOF if($fb ne "01") { # SOF
Log3 $name, 1, "$name: SOF missing (got $fb instead of 01)"; Log3 $name, 1, "$name: SOF missing (got $fb instead of 01)";
last; last;
@ -447,11 +465,18 @@ ZWDongle_Read($@)
my $ccs = ZWDongle_CheckSum("$len$msg"); # Computed Checksum my $ccs = ZWDongle_CheckSum("$len$msg"); # Computed Checksum
if($rcs ne $ccs) { if($rcs ne $ccs) {
Log3 $name, 1, "$name: wrong checksum: received $rcs, computed $ccs"; Log3 $name, 1, "$name: wrong checksum: received $rcs, computed $ccs for $len$msg";
next;
} }
DevIo_SimpleWrite($hash, "06", 1); # Send ACK DevIo_SimpleWrite($hash, "06", 1); # Send ACK
Log3 $name, 5, "ZWDongle_Read $name: $msg"; Log3 $name, 5, "ZWDongle_Read $name: $msg";
if($msg =~ m/^00(04|13)/) { # FIXME: add timeout, check all msgtypes
shift @{$hash->{SendStack}};
if(int(@{$hash->{SendStack}})) {
ZWDongle_Write($hash, "00", $hash->{SendStack}->[0], 1);
}
}
last if(defined($local) && (!defined($regexp) || ($msg =~ m/$regexp/))); last if(defined($local) && (!defined($regexp) || ($msg =~ m/$regexp/)));
ZWDongle_Parse($hash, $name, $msg); ZWDongle_Parse($hash, $name, $msg);
$msg = undef; $msg = undef;

File diff suppressed because it is too large Load Diff