mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-15 22:26:04 +00:00
More robust, when repeat telegrams are received on the bus.
git-svn-id: https://svn.fhem.de/fhem/trunk@1385 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
9bdecee043
commit
d7fa8878d6
@ -210,6 +210,9 @@ TUL_DoInit($)
|
|||||||
# send any initializing request if needed
|
# send any initializing request if needed
|
||||||
# TODO move to device init
|
# TODO move to device init
|
||||||
return 1 unless openGroupSocket($hash);
|
return 1 unless openGroupSocket($hash);
|
||||||
|
|
||||||
|
# reset buffer
|
||||||
|
purgeReceiverBuf($hash);
|
||||||
|
|
||||||
$hash->{STATE} = "Initialized" if(!$hash->{STATE});
|
$hash->{STATE} = "Initialized" if(!$hash->{STATE});
|
||||||
|
|
||||||
@ -240,9 +243,20 @@ TUL_Read($)
|
|||||||
{
|
{
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
#reset the refused flag, so we can check if a telegram was refused
|
||||||
|
# and therefor we did not get a response
|
||||||
|
$hash->{REFUSED} = undef;
|
||||||
my $buf = TUL_SimpleRead($hash);
|
my $buf = TUL_SimpleRead($hash);
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
# check if refused
|
||||||
|
if(defined($hash->{REFUSED}))
|
||||||
|
{
|
||||||
|
Log(3,"TUL $name refused message: $hash->{REFUSED}");
|
||||||
|
$hash->{REFUSED} = undef;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# Lets' try again: Some drivers return len(0) on the first read...
|
# Lets' try again: Some drivers return len(0) on the first read...
|
||||||
if(defined($buf) && length($buf) == 0) {
|
if(defined($buf) && length($buf) == 0) {
|
||||||
@ -728,12 +742,14 @@ sub decode_tpuart($)
|
|||||||
Log(3,"Control Byte " . sprintf("0x%02x",$ctrl) . " does not match expected mask 0xB0");
|
Log(3,"Control Byte " . sprintf("0x%02x",$ctrl) . " does not match expected mask 0xB0");
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log(5,"msg cmd: " . sprintf("0x%02x",$cmd) ." datalen: $len");
|
||||||
|
|
||||||
my $apci = ($cmd >> 6) & 0x0F;
|
my $apci = ($cmd >> 6) & 0x0F;
|
||||||
if($len == 2) { # 1 byte data
|
if($len == 2) { # 1 byte data
|
||||||
$bytes = pack("C",$cmd & 0x3F);
|
$bytes = pack("C",$cmd & 0x3F);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log(5,"msg cmd: " . sprintf("0x%02x",$cmd) ." datalen: $len apci: $apci");
|
Log(5,"msg cmd: " . sprintf("0x%02x",$cmd) ." datalen: $len apci: $apci");
|
||||||
|
|
||||||
my %msg;
|
my %msg;
|
||||||
@ -870,6 +886,23 @@ sub sendGroup($$)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# will read as much byte as exists at the
|
||||||
|
# serial buffer.
|
||||||
|
sub purgeReceiverBuf($)
|
||||||
|
{
|
||||||
|
my ($hash) = @_;
|
||||||
|
if($hash->{DevType} eq 'TPUART')
|
||||||
|
{
|
||||||
|
Log(5,"purging receiver buffer ");
|
||||||
|
my $data = undef;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
my(undef,$data) = $hash->{USBDev}->read(100);
|
||||||
|
Log(5,"purging packet: ". unpack("H*",$data) . "\n") if(defined($data) and length($data)>0);
|
||||||
|
} while(defined($data) and length($data)>0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub getRequestFixLength($$)
|
sub getRequestFixLength($$)
|
||||||
{
|
{
|
||||||
my ($hash, $len) = @_;
|
my ($hash, $len) = @_;
|
||||||
@ -885,15 +918,19 @@ sub getRequestFixLength($$)
|
|||||||
Log(5,"Received fixlen packet: ". unpack("H*",$data) . "\n") if(defined($data) and length($data)>0);
|
Log(5,"Received fixlen packet: ". unpack("H*",$data) . "\n") if(defined($data) and length($data)>0);
|
||||||
|
|
||||||
$buf .= $data if(defined($data));
|
$buf .= $data if(defined($data));
|
||||||
Log(5,"buf len: " . length($buf) . " expected: $len");
|
#Log(5,"buf len: " . length($buf) . " expected: $len");
|
||||||
|
# TODO: if we are longer than 5 seconds here, we should reset
|
||||||
}
|
}
|
||||||
|
|
||||||
# # we got more than needed
|
# # we got more than needed
|
||||||
if(length($buf)>$len)
|
if(length($buf)>$len)
|
||||||
{
|
{
|
||||||
my $remainpart = substr($buf,$len+1);
|
#check if this is ok
|
||||||
|
my $remainpart = substr($buf,$len);
|
||||||
$hash->{PARTIAL} .= $remainpart;
|
$hash->{PARTIAL} .= $remainpart;
|
||||||
$buf = substr($buf,$len);
|
$buf = substr($buf,0,$len);
|
||||||
|
|
||||||
|
Log(5,"we got too much.. buf(" .unpack("H*",$buf).") remainingpart(" .unpack("H*",$remainpart).")");
|
||||||
}
|
}
|
||||||
|
|
||||||
Log(5,"getRequest len: $len packet: ". unpack("H*",$buf) . "\n");
|
Log(5,"getRequest len: $len packet: ". unpack("H*",$buf) . "\n");
|
||||||
@ -961,12 +998,15 @@ sub getGroup($)
|
|||||||
}
|
}
|
||||||
while(!defined($telegram));
|
while(!defined($telegram));
|
||||||
|
|
||||||
Log(5, "Telegram: ($reqlen): " . unpack("H*",$telegram));
|
Log(5, "Telegram: (".length($telegram)."): " . unpack("H*",$telegram));
|
||||||
Log(5, "Buf: (".length($buf)."): " . unpack("H*",$buf));
|
Log(5, "Buf: (".length($buf)."): " . unpack("H*",$buf));
|
||||||
|
|
||||||
$hash->{PARTIAL} = $buf;
|
$hash->{PARTIAL} = $buf;
|
||||||
my $msg = decode_tpuart($telegram);
|
my $msg = decode_tpuart($telegram);
|
||||||
|
|
||||||
|
#check if we refused a telegram (i.e. repeats)
|
||||||
|
$hash->{REFUSED} = unpack("H*",$telegram) if(!defined($msg));
|
||||||
|
|
||||||
# We are always too late for Ack
|
# We are always too late for Ack
|
||||||
# if(defined($msg) && (substr($msg->{'dst'},0,2) eq $ackdst))
|
# if(defined($msg) && (substr($msg->{'dst'},0,2) eq $ackdst))
|
||||||
# {
|
# {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user