2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-07 23:09:26 +00:00

Merge branch 'dev' (make sure the FRM IODev is allways the main FRM-device when connecting by tcp)

git-svn-id: https://svn.fhem.de/fhem/trunk@4095 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ntruchsess 2013-10-21 23:25:54 +00:00
parent b7f370a87b
commit 27e65c2517

View File

@ -97,15 +97,18 @@ sub FRM_Undef($) {
if (defined $hash->{DeviceName}) {
DevIo_Disconnected($hash);
};
my $device = $hash->{FirmataDevice};
if (defined $device) {
if (defined $device->{io}) {
delete $hash->{FirmataDevice}->{io}->{handle} if defined $hash->{FirmataDevice}->{io}->{handle};
delete $hash->{FirmataDevice}->{io};
foreach my $d ( sort keys %main::defs ) { # close and dispose open tcp-connection (if any) to free open filedescriptors
if ( defined( my $dev = $main::defs{$d} )) {
if ( defined( $main::defs{$d}{SNAME} )
&& $main::defs{$d}{SNAME} eq $hash->{NAME}) {
FRM_Tcp_Connection_Close($main::defs{$d});
}
}
delete $device->{protocol} if defined $device->{protocol};
delete $hash->{FirmataDevice};
}
FRM_FirmataDevice_Close($hash);
return undef;
}
@ -168,6 +171,16 @@ sub FRM_Read($) {
return if(!$chash);
$chash->{DeviceName}=$hash->{PORT}; # required for DevIo_CloseDev and FRM_Ready
$chash->{TCPDev}=$chash->{CD};
# dispose preexisting connections
foreach my $e ( sort keys %main::defs ) {
if ( defined( my $dev = $main::defs{$e} )) {
if ( $dev != $chash && defined( $dev->{SNAME} ) && ( $dev->{SNAME} eq $chash->{SNAME} )) {
FRM_Tcp_Connection_Close($dev);
}
}
}
FRM_FirmataDevice_Close($hash);
FRM_DoInit($chash);
return;
}
@ -180,13 +193,8 @@ sub FRM_Ready($) {
my ($hash) = @_;
my $name = $hash->{NAME};
if ($name=~/^^FRM:.+:\d+$/) { # this is a closed tcp-connection, remove it
TcpServer_Close($hash);
delete $main::defs{$hash->{SNAME}}{FirmataDevice} if (defined $hash->{SNAME} && defined $main::defs{$hash->{SNAME}}{FirmataDevice});
my $dev = $hash->{DeviceName};
delete $main::readyfnlist{"$name.$dev"};
delete $main::attr{$name};
delete $main::defs{$name};
return undef;
FRM_Tcp_Connection_Close($hash);
FRM_FirmataDevice_Close($hash);
}
return DevIo_OpenDev($hash, 1, "FRM_DoInit") if($hash->{STATE} eq "disconnected");
@ -199,6 +207,32 @@ sub FRM_Ready($) {
return ($InBytes && $InBytes>0);
}
sub FRM_Tcp_Connection_Close($) {
my $hash = shift;
TcpServer_Close($hash);
my $dev = $hash->{DeviceName};
my $name = $hash->{NAME};
if (defined $name) {
delete $main::readyfnlist{"$name.$dev"} if (defined $dev);
delete $main::attr{$name};
delete $main::defs{$name};
}
return undef;
}
sub FRM_FirmataDevice_Close($) {
my $hash = shift;
my $device = $hash->{FirmataDevice};
if (defined $device) {
if (defined $device->{io}) {
delete $hash->{FirmataDevice}->{io}->{handle} if defined $hash->{FirmataDevice}->{io}->{handle};
delete $hash->{FirmataDevice}->{io};
}
delete $device->{protocol} if defined $device->{protocol};
delete $hash->{FirmataDevice};
}
}
sub FRM_Attr(@) {
my ($command,$name,$attribute,$value) = @_;
if ($command eq "set") {
@ -252,7 +286,7 @@ sub FRM_DoInit($) {
my $name = $hash->{SNAME}; #is this a serversocket-connection?
my $shash = defined $name ? $main::defs{$name} : $hash;
$name = $hash->{NAME} if (!defined $name);
$name = $hash->{NAME};# if (!defined $name);
my $firmata_io = Firmata_IO->new($hash);
my $device = Device::Firmata::Platform->attach($firmata_io) or return 1;
@ -373,18 +407,20 @@ FRM_Init_Pin_Client($$$) {
return $u unless defined $args and int(@$args) > 0;
my $pin = @$args[0];
foreach my $d ( sort keys %main::defs ) {
if ( defined( $main::defs{$d} )
&& defined( $main::defs{$d}{IODev} )
&& defined( $main::defs{$d}{PIN} )
&& $main::defs{$d}{IODev} == $hash->{IODev}
&& $main::defs{$d}{PIN} == $pin ) {
die "Device $main::defs{$d}{NAME} allready defined for pin $pin";
}
}
$hash->{PIN} = $pin;
eval {
FRM_Client_FirmataDevice($hash)->pin_mode($pin,$mode);
foreach my $d ( sort keys %main::defs ) {
if ( defined( my $dev = $main::defs{$d} )) {
if ( $dev != $hash
&& defined( $dev->{IODev} )
&& defined( $dev->{PIN} )
&& $dev->{IODev} == $hash->{IODev}
&& $dev->{PIN} == $pin ) {
die "Device $main::defs{$d}{NAME} allready defined for pin $pin";
}
}
}
$hash->{PIN} = $pin;
eval {
FRM_Client_FirmataDevice($hash)->pin_mode($pin,$mode);
};
if ($@) {
main::Log(2,"FRM_Init error setting pin_mode: ".$@);
@ -403,6 +439,9 @@ FRM_Client_Define($$)
$hash->{STATE}="defined";
AssignIoPort($hash);
if ( defined($hash->{IODev}) && defined($hash->{IODev}->{SNAME})) {
$hash->{IODev} = $main::defs{$hash->{IODev}->{SNAME}};
}
eval {
FRM_Init_Client($hash,[@a[2..scalar(@a)-1]]);
};