2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

10_DUOFERNSTICK: add send queue

git-svn-id: https://svn.fhem.de/fhem/trunk@9991 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
telekatz 2015-11-24 17:09:04 +00:00
parent 707bdb691b
commit da1e8e5241

View File

@ -79,7 +79,9 @@ DUOFERNSTICK_Define($$)
return $ret; return $ret;
} }
sub DUOFERNSTICK_setStates($$) #####################################
sub
DUOFERNSTICK_setStates($$)
{ {
my ($hash, $val) = @_; my ($hash, $val) = @_;
$hash->{STATE} = $val; $hash->{STATE} = $val;
@ -111,7 +113,8 @@ DUOFERNSTICK_Undef($$)
##################################### #####################################
sub DUOFERNSTICK_Set($@) sub
DUOFERNSTICK_Set($@)
{ {
my ($hash, @a) = @_; my ($hash, @a) = @_;
@ -129,21 +132,21 @@ sub DUOFERNSTICK_Set($@)
return DUOFERNSTICK_Reopen($hash); return DUOFERNSTICK_Reopen($hash);
} elsif ($cmd eq "statusBroadcast") { } elsif ($cmd eq "statusBroadcast") {
DUOFERNSTICK_SimpleWrite($hash, $duoStatusRequest); DUOFERNSTICK_AddSendQueue($hash, $duoStatusRequest);
return undef; return undef;
} elsif ($cmd eq "pair") { } elsif ($cmd eq "pair") {
DUOFERNSTICK_SimpleWrite($hash, $duoStartPair); DUOFERNSTICK_AddSendQueue($hash, $duoStartPair);
$hash->{pair} = 1; $hash->{pair} = 1;
delete($hash->{unpair}); delete($hash->{unpair});
InternalTimer(gettimeofday()+60, "DUOFERNSTICK_RemovePair", $hash, 1); InternalTimer(gettimeofday()+60, "DUOFERNSTICK_RemovePair", "$hash->{NAME}:RP", 1);
return undef; return undef;
} elsif ($cmd eq "unpair") { } elsif ($cmd eq "unpair") {
DUOFERNSTICK_SimpleWrite($hash, $duoStartUnpair); DUOFERNSTICK_AddSendQueue($hash, $duoStartUnpair);
$hash->{unpair} = 1; $hash->{unpair} = 1;
delete($hash->{pair}); delete($hash->{pair});
InternalTimer(gettimeofday()+60, "DUOFERNSTICK_RemoveUnpair", $hash, 1); InternalTimer(gettimeofday()+60, "DUOFERNSTICK_RemoveUnpair", "$hash->{NAME}:RU", 1);
return undef; return undef;
} elsif ($cmd eq "remotePair") { } elsif ($cmd eq "remotePair") {
@ -151,7 +154,7 @@ sub DUOFERNSTICK_Set($@)
if(!$arg || (uc($arg) !~ m/^[a-f0-9]{6}$/i)); if(!$arg || (uc($arg) !~ m/^[a-f0-9]{6}$/i));
my $buf = $duoRemotePair; my $buf = $duoRemotePair;
$buf =~ s/yyyyyy/$arg/; $buf =~ s/yyyyyy/$arg/;
DUOFERNSTICK_SimpleWrite($hash, $buf); DUOFERNSTICK_AddSendQueue($hash, $buf);
return undef; return undef;
} }
@ -217,7 +220,7 @@ DUOFERNSTICK_Write($$)
$msg =~ s/zzzzzz/$hash->{DongleSerial}/; $msg =~ s/zzzzzz/$hash->{DongleSerial}/;
DUOFERNSTICK_SimpleWrite($hash, $msg); DUOFERNSTICK_AddSendQueue($hash,$msg);
} }
@ -227,11 +230,15 @@ DUOFERNSTICK_Parse($$)
{ {
my ($hash, $rmsg) = @_; my ($hash, $rmsg) = @_;
DUOFERNSTICK_SimpleWrite($hash, $duoACK) if($rmsg ne $duoACK);;
if($rmsg =~ m/81.{42}/) {
DUOFERNSTICK_HandleWriteQueue($hash);
}
return if($rmsg eq $duoACK); return if($rmsg eq $duoACK);
$hash->{RAWMSG} = $rmsg; $hash->{RAWMSG} = $rmsg;
return undef if ($rmsg eq $duoACK);
DUOFERNSTICK_SimpleWrite($hash, $duoACK);
if($rmsg =~ m/0602.{40}/) { if($rmsg =~ m/0602.{40}/) {
my %addvals = (RAWMSG => $rmsg); my %addvals = (RAWMSG => $rmsg);
@ -250,6 +257,9 @@ DUOFERNSTICK_Parse($$)
} elsif ($rmsg =~ m/0FFF11.{38}/) { } elsif ($rmsg =~ m/0FFF11.{38}/) {
return undef; return undef;
} elsif ($rmsg =~ m/81000000.{36}/) {
return undef;
} }
my %addvals = (RAWMSG => $rmsg); my %addvals = (RAWMSG => $rmsg);
@ -279,11 +289,10 @@ DUOFERNSTICK_Ready($)
sub sub
DUOFERNSTICK_RemovePair($) DUOFERNSTICK_RemovePair($)
{ {
my ($hash) = @_; my ($name,$id) = split(":",$_[0]);
my ($hash) = $defs{$name};
DUOFERNSTICK_SimpleWrite($hash, $duoStopPair); DUOFERNSTICK_AddSendQueue($hash, $duoStopPair);
(undef, undef) = DUOFERNSTICK_ReadAnswer($hash, "Pair");
DUOFERNSTICK_SimpleWrite($hash, $duoACK);
delete($hash->{pair}); delete($hash->{pair});
@ -294,11 +303,10 @@ DUOFERNSTICK_RemovePair($)
sub sub
DUOFERNSTICK_RemoveUnpair($) DUOFERNSTICK_RemoveUnpair($)
{ {
my ($hash) = @_; my ($name,$id) = split(":",$_[0]);
my ($hash) = $defs{$name};
DUOFERNSTICK_SimpleWrite($hash, $duoStopUnpair); DUOFERNSTICK_AddSendQueue($hash, $duoStopUnpair);
(undef, undef) = DUOFERNSTICK_ReadAnswer($hash, "Unpair");
DUOFERNSTICK_SimpleWrite($hash, $duoACK);
delete($hash->{unpair}); delete($hash->{unpair});
@ -394,6 +402,9 @@ DUOFERNSTICK_DoInit($)
next if($err); next if($err);
DUOFERNSTICK_SimpleWrite($hash, $duoACK); DUOFERNSTICK_SimpleWrite($hash, $duoACK);
$hash->{helper}{cmdEx} = 0;
@{$hash->{cmdStack}} = ();
readingsSingleUpdate($hash, "state", "Initialized", 1); readingsSingleUpdate($hash, "state", "Initialized", 1);
return undef; return undef;
} }
@ -493,7 +504,8 @@ DUOFERNSTICK_ReadAnswer($$$$)
} }
##################################### #####################################
sub DUOFERNSTICK_Notify($$) sub
DUOFERNSTICK_Notify($$)
{ {
my ($own, $dev) = @_; my ($own, $dev) = @_;
my $me = $own->{NAME}; # own name / hash my $me = $own->{NAME}; # own name / hash
@ -515,6 +527,47 @@ sub DUOFERNSTICK_Notify($$)
return undef; return undef;
} }
#####################################
sub
DUOFERNSTICK_HandleWriteQueue($)
{
my ($hash) = @_;
RemoveInternalTimer($hash);
$hash->{helper}{cmdEx} -= 1 if ($hash->{helper}{cmdEx});
my $entries = scalar @{$hash->{cmdStack}};
if ($entries > 0) {
readingsSingleUpdate($hash, "state", ($entries + $hash->{helper}{cmdEx})." CMDs_pending", 1);
my $msg = shift @{$hash->{cmdStack}};
$hash->{helper}{cmdEx} += 1;
DUOFERNSTICK_SimpleWrite($hash, $msg);
InternalTimer(gettimeofday()+5, "DUOFERNSTICK_HandleWriteQueue", $hash, 1);
} else {
readingsSingleUpdate($hash, "state","CMDs_done", 1);
}
}
#####################################
sub
DUOFERNSTICK_AddSendQueue($$)
{
my ($hash, $msg) = @_;
push(@{$hash->{cmdStack}}, $msg);
my $entries = scalar @{$hash->{cmdStack}};
if ($hash->{helper}{cmdEx} == 0 ) {
DUOFERNSTICK_HandleWriteQueue($hash);
} else {
readingsSingleUpdate($hash, "state", ($entries + $hash->{helper}{cmdEx})." CMDs_pending", 1);
InternalTimer(gettimeofday()+5, "DUOFERNSTICK_HandleWriteQueue", $hash, 1);
};
}
1; 1;
=pod =pod