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:
parent
12b45d442b
commit
e88ca3f191
@ -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
Loading…
x
Reference in New Issue
Block a user