00_HMUARTLGW: reboot module on connect, simplify peer handling

git-svn-id: https://svn.fhem.de/fhem/trunk@12252 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
mgernoth
2016-10-03 10:39:06 +00:00
parent 2b09cbb6bd
commit e42d6e8ec5

View File

@@ -88,7 +88,6 @@ use constant {
HMUARTLGW_STATE_SET_CURRENT_KEY => 14, HMUARTLGW_STATE_SET_CURRENT_KEY => 14,
HMUARTLGW_STATE_SET_PREVIOUS_KEY => 15, HMUARTLGW_STATE_SET_PREVIOUS_KEY => 15,
HMUARTLGW_STATE_SET_TEMP_KEY => 16, HMUARTLGW_STATE_SET_TEMP_KEY => 16,
HMUARTLGW_STATE_GET_PEERS => 17,
HMUARTLGW_STATE_UPDATE_PEER => 90, HMUARTLGW_STATE_UPDATE_PEER => 90,
HMUARTLGW_STATE_UPDATE_PEER_AES1 => 91, HMUARTLGW_STATE_UPDATE_PEER_AES1 => 91,
HMUARTLGW_STATE_UPDATE_PEER_AES2 => 92, HMUARTLGW_STATE_UPDATE_PEER_AES2 => 92,
@@ -637,6 +636,8 @@ sub HMUARTLGW_UpdatePeerReq($;$) {
$msg = HMUARTLGW_APP_REMOVE_PEER . $peer->{id}; $msg = HMUARTLGW_APP_REMOVE_PEER . $peer->{id};
} }
$hash->{Helper}{UpdatePeer}{msg} = $msg;
} elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES1) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES1) {
my $offset = 0; my $offset = 0;
foreach my $c (reverse(unpack "(A2)*", $hash->{Helper}{UpdatePeer}{aes})) { foreach my $c (reverse(unpack "(A2)*", $hash->{Helper}{UpdatePeer}{aes})) {
@@ -679,9 +680,7 @@ sub HMUARTLGW_UpdatePeerReq($;$) {
} }
} elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_CFG) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_CFG) {
$hash->{AssignedPeerCnt} = 0; $msg = $hash->{Helper}{UpdatePeer}{msg};
%{$hash->{Helper}{AssignedPeers}} = ();
$msg = HMUARTLGW_APP_GET_PEERS;
} }
if ($msg) { if ($msg) {
@@ -713,19 +712,21 @@ sub HMUARTLGW_UpdateQueuedPeer($) {
} }
} }
sub HMUARTLGW_ParsePeers($$) { sub HMUARTLGW_ParsePeer($$) {
my ($hash, $msg) = @_; my ($hash, $msg) = @_;
my $peers = substr($msg, 8); #040701010002fffffffffffffff9
while($peers) { $hash->{AssignedPeerCnt} = hex(substr($msg, 8, 4));
my $id = substr($peers, 0, 6, ''); if (length($msg) > 12) {
my $aesChannels = substr($peers, 0, 16, ''); $hash->{Helper}{AssignedPeers}{$hash->{Helper}{UpdatePeer}->{id}} = substr($msg, 12);
my $flags = hex(substr($peers, 0, 2, '')); $hash->{Helper}{UpdatePeer}{aes} = $hash->{Helper}{AssignedPeers}{$hash->{Helper}{UpdatePeer}->{id}};
Log3($hash, HMUARTLGW_getVerbLvl($hash, undef, undef, 4), Log3($hash, HMUARTLGW_getVerbLvl($hash, undef, undef, 4),
"HMUARTLGW $hash->{NAME} known peer: ${id}, aesChannels: ${aesChannels}, flags: ${flags}"); "HMUARTLGW $hash->{NAME} added peer: " . $hash->{Helper}{UpdatePeer}->{id} .
", aesChannels: " . $hash->{Helper}{AssignedPeers}{$hash->{Helper}{UpdatePeer}->{id}});
$hash->{Helper}{AssignedPeers}{$id} = "$aesChannels (flags: ${flags})"; } else {
$hash->{AssignedPeerCnt}++; delete($hash->{Helper}{AssignedPeers}{$hash->{Helper}{UpdatePeer}->{id}});
Log3($hash, HMUARTLGW_getVerbLvl($hash, undef, undef, 4),
"HMUARTLGW $hash->{NAME} remove peer: ". $hash->{Helper}{UpdatePeer}->{id});
} }
} }
@@ -800,11 +801,6 @@ sub HMUARTLGW_GetSetParameterReq($) {
delete($hash->{Helper}{AESKeyQueue}); delete($hash->{Helper}{AESKeyQueue});
HMUARTLGW_send($hash, HMUARTLGW_APP_SET_TEMP_KEY . ($key?$key:"00"x17), HMUARTLGW_DST_APP); HMUARTLGW_send($hash, HMUARTLGW_APP_SET_TEMP_KEY . ($key?$key:"00"x17), HMUARTLGW_DST_APP);
} elsif ($hash->{DevState} == HMUARTLGW_STATE_GET_PEERS) {
$hash->{AssignedPeerCnt} = 0;
%{$hash->{Helper}{AssignedPeers}} = ();
HMUARTLGW_send($hash, HMUARTLGW_APP_GET_PEERS, HMUARTLGW_DST_APP);
} elsif ($hash->{DevState} >= HMUARTLGW_STATE_UPDATE_PEER && } elsif ($hash->{DevState} >= HMUARTLGW_STATE_UPDATE_PEER &&
$hash->{DevState} <= HMUARTLGW_STATE_UPDATE_PEER_CFG) { $hash->{DevState} <= HMUARTLGW_STATE_UPDATE_PEER_CFG) {
HMUARTLGW_UpdatePeerReq($hash); HMUARTLGW_UpdatePeerReq($hash);
@@ -919,31 +915,6 @@ sub HMUARTLGW_GetSetParameters($;$$)
$hash->{DevState} = HMUARTLGW_STATE_SET_TEMP_KEY; $hash->{DevState} = HMUARTLGW_STATE_SET_TEMP_KEY;
} elsif ($hash->{DevState} == HMUARTLGW_STATE_SET_TEMP_KEY) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_SET_TEMP_KEY) {
$hash->{DevState} = HMUARTLGW_STATE_GET_PEERS;
} elsif ($hash->{DevState} == HMUARTLGW_STATE_GET_PEERS) {
if ($ack eq HMUARTLGW_ACK_WITH_MULTIPART_DATA) {
#04070207...
HMUARTLGW_ParsePeers($hash, $msg);
#more parts in multipart message?
if (hex(substr($msg, 4, 2)) < hex(substr($msg, 6, 2))) {
#there will be more answer messages
$hash->{DevState} = HMUARTLGW_STATE_GET_PEERS;
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+HMUARTLGW_CMD_TIMEOUT, "HMUARTLGW_CheckCmdResp", $hash, 0);
return;
}
}
if (defined($hash->{Helper}{AssignedPeers}) &&
%{$hash->{Helper}{AssignedPeers}}) {
foreach my $p (keys(%{$hash->{Helper}{AssignedPeers}})) {
unshift @{$hash->{Helper}{PeerQueue}}, { id => $p, operation => "-" };
}
}
$hash->{DevState} = HMUARTLGW_STATE_RUNNING; $hash->{DevState} = HMUARTLGW_STATE_RUNNING;
} elsif ($hash->{DevState} == HMUARTLGW_STATE_GET_CREDITS) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_GET_CREDITS) {
@@ -970,6 +941,9 @@ sub HMUARTLGW_GetSetParameters($;$$)
$oldState != HMUARTLGW_STATE_RUNNING && $oldState != HMUARTLGW_STATE_RUNNING &&
(!$hash->{Helper}{OneParameterOnly})) { (!$hash->{Helper}{OneParameterOnly})) {
#Init sequence over, add known peers #Init sequence over, add known peers
$hash->{AssignedPeerCnt} = 0;
%{$hash->{Helper}{AssignedPeers}} = ();
foreach my $peer (keys(%{$hash->{Peers}})) { foreach my $peer (keys(%{$hash->{Peers}})) {
if ($modules{CUL_HM}{defptr}{$peer} && if ($modules{CUL_HM}{defptr}{$peer} &&
$modules{CUL_HM}{defptr}{$peer}{helper}{io}{newChn}) { $modules{CUL_HM}{defptr}{$peer}{helper}{io}{newChn}) {
@@ -1002,14 +976,8 @@ sub HMUARTLGW_GetSetParameters($;$$)
} }
if ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER) { if ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER) {
$hash->{AssignedPeerCnt} = 0;
if ($ack eq HMUARTLGW_ACK_WITH_MULTIPART_DATA) { if ($ack eq HMUARTLGW_ACK_WITH_MULTIPART_DATA) {
#040701010002fffffffffffffff9 HMUARTLGW_ParsePeer($hash, $msg);
$hash->{AssignedPeerCnt} = hex(substr($msg, 8, 4));
if (length($msg) > 12) {
$hash->{Helper}{AssignedPeers}{$hash->{Helper}{UpdatePeer}->{id}} = substr($msg, 12);
$hash->{Helper}{UpdatePeer}{aes} = substr($msg, 12);
}
} else { } else {
if ($hash->{Helper}{UpdatePeer}{operation} eq "+") { if ($hash->{Helper}{UpdatePeer}{operation} eq "+") {
Log3($hash, 1, "HMUARTLGW ${name} Adding peer $hash->{Helper}{UpdatePeer}{id} failed! " . Log3($hash, 1, "HMUARTLGW ${name} Adding peer $hash->{Helper}{UpdatePeer}{id} failed! " .
@@ -1023,13 +991,8 @@ sub HMUARTLGW_GetSetParameters($;$$)
if ($hash->{Helper}{UpdatePeer}{operation} eq "+") { if ($hash->{Helper}{UpdatePeer}{operation} eq "+") {
$hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_AES1; $hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_AES1;
} else { } else {
if (defined($hash->{Helper}{PeerQueue}) && @{$hash->{Helper}{PeerQueue}}) { delete($hash->{Helper}{UpdatePeer});
#Still peers in queue, get current assigned peers $hash->{DevState} = HMUARTLGW_STATE_RUNNING;
#only when queue is empty
$hash->{DevState} = HMUARTLGW_STATE_RUNNING;
} else {
$hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_CFG;
}
} }
} elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES1) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES1) {
@@ -1038,30 +1001,16 @@ sub HMUARTLGW_GetSetParameters($;$$)
} elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES2) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_AES2) {
if ($hash->{Helper}{UpdatePeer}->{operation} eq "+") { if ($hash->{Helper}{UpdatePeer}->{operation} eq "+") {
$hash->{Peers}{$hash->{Helper}{UpdatePeer}->{id}} = "assigned"; $hash->{Peers}{$hash->{Helper}{UpdatePeer}->{id}} = "assigned";
$hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_CFG;
} else { } else {
delete($hash->{Peers}{$hash->{Helper}{UpdatePeer}->{id}}); delete($hash->{Peers}{$hash->{Helper}{UpdatePeer}->{id}});
} delete($hash->{Helper}{UpdatePeer});
if (defined($hash->{Helper}{PeerQueue}) && @{$hash->{Helper}{PeerQueue}}) {
#Still peers in queue, get current assigned peers
#only when queue is empty
$hash->{DevState} = HMUARTLGW_STATE_RUNNING; $hash->{DevState} = HMUARTLGW_STATE_RUNNING;
} else {
$hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_CFG;
} }
} elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_CFG) { } elsif ($hash->{DevState} == HMUARTLGW_STATE_UPDATE_PEER_CFG) {
if ($ack eq HMUARTLGW_ACK_WITH_MULTIPART_DATA) { if ($ack eq HMUARTLGW_ACK_WITH_MULTIPART_DATA) {
HMUARTLGW_ParsePeers($hash, $msg); HMUARTLGW_ParsePeer($hash, $msg);
#more parts in multipart message?
if (hex(substr($msg, 4, 2)) < hex(substr($msg, 6, 2))) {
#there will be more messages
$hash->{DevState} = HMUARTLGW_STATE_UPDATE_PEER_CFG;
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+HMUARTLGW_CMD_TIMEOUT, "HMUARTLGW_CheckCmdResp", $hash, 0);
return;
}
} }
delete($hash->{Helper}{UpdatePeer}); delete($hash->{Helper}{UpdatePeer});
@@ -1141,7 +1090,7 @@ sub HMUARTLGW_Parse($$$$)
if ($msg =~ m/^00(..)/) { if ($msg =~ m/^00(..)/) {
my $running = pack("H*", substr($msg, 2)); my $running = pack("H*", substr($msg, 2));
if ($hash->{DevState} == HMUARTLGW_STATE_ENTER_APP) { if ($hash->{DevState} <= HMUARTLGW_STATE_ENTER_APP) {
Log3($hash, 3, "HMUARTLGW ${name} currently running ${running}"); Log3($hash, 3, "HMUARTLGW ${name} currently running ${running}");
if ($running eq "Co_CPU_App") { if ($running eq "Co_CPU_App") {
@@ -1149,7 +1098,14 @@ sub HMUARTLGW_Parse($$$$)
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+1, "HMUARTLGW_GetSetParameters", $hash, 0); InternalTimer(gettimeofday()+1, "HMUARTLGW_GetSetParameters", $hash, 0);
} else { } else {
Log3($hash, 1, "HMUARTLGW ${name} failed to enter App!"); if ($hash->{DevState} == HMUARTLGW_STATE_QUERY_APP) {
$hash->{DevState} = HMUARTLGW_STATE_ENTER_APP;
HMUARTLGW_send($hash, HMUARTLGW_OS_CHANGE_APP, HMUARTLGW_DST_OS);
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+HMUARTLGW_CMD_TIMEOUT, "HMUARTLGW_CheckCmdResp", $hash, 0);
} else {
Log3($hash, 1, "HMUARTLGW ${name} failed to enter App!");
}
} }
} elsif ($hash->{DevState} > HMUARTLGW_STATE_ENTER_APP) { } elsif ($hash->{DevState} > HMUARTLGW_STATE_ENTER_APP) {
Log3($hash, 1, "HMUARTLGW ${name} unexpected info about ${running} received (module crashed?), reopening") Log3($hash, 1, "HMUARTLGW ${name} unexpected info about ${running} received (module crashed?), reopening")
@@ -1171,9 +1127,10 @@ sub HMUARTLGW_Parse($$$$)
Log3($hash, 3, "HMUARTLGW ${name} currently running ${running}"); Log3($hash, 3, "HMUARTLGW ${name} currently running ${running}");
if ($running eq "Co_CPU_App") { if ($running eq "Co_CPU_App") {
$hash->{DevState} = HMUARTLGW_STATE_GETSET_PARAMETERS; #Reset module
HMUARTLGW_send($hash, HMUARTLGW_OS_CHANGE_APP, HMUARTLGW_DST_OS);
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+1, "HMUARTLGW_GetSetParameters", $hash, 0); InternalTimer(gettimeofday()+HMUARTLGW_CMD_TIMEOUT, "HMUARTLGW_CheckCmdResp", $hash, 0);
} else { } else {
if (defined($hash->{FirmwareFile}) && $hash->{FirmwareFile} ne "") { if (defined($hash->{FirmwareFile}) && $hash->{FirmwareFile} ne "") {
Log3($hash, 1, "HMUARTLGW ${name} starting firmware upgrade"); Log3($hash, 1, "HMUARTLGW ${name} starting firmware upgrade");
@@ -1322,7 +1279,7 @@ sub HMUARTLGW_Parse($$$$)
my $wait = 0; my $wait = 0;
if (!(hex($flags) & (1 << 5))) { if (!(hex($flags) & (1 << 5))) {
#!BIDI #!BIDI
$wait = 0.090; $wait = 0.100;
} else { } else {
$wait = 0.300; $wait = 0.300;
} }