add more debuging,
[spider.git] / perl / AGWMsg.pm
index 8f78319b0c0430685aae4d32b3eff4bbc6566392..41f23702abd7ab5b79ea6fcd1fa82012867c89ca 100644 (file)
@@ -29,7 +29,8 @@ use Msg;
 use AGWConnect;
 use DXDebug;
 
-use vars qw(@ISA $sock @outqueue $send_offset $inmsg $rproc $noports $lasttime);
+use vars qw(@ISA $sock @outqueue $send_offset $inmsg $rproc $noports $lastytime 
+                       $lasthtime $ypolltime $hpolltime %circuit);
 
 @ISA = qw(Msg ExtMsg);
 $sock = undef;
@@ -38,7 +39,10 @@ $send_offset = 0;
 $inmsg = '';
 $rproc = undef;
 $noports = 0;
-$lasttime = time;
+$lastytime = $lasthtime = time;
+$ypolltime = 10 unless defined $ypolltime;
+$hpolltime = 300 unless defined $hpolltime;
+%circuit = ();
 
 sub init
 {
@@ -47,7 +51,7 @@ sub init
        
        finish();
        dbg('err', "AGW initialising and connecting to $addr/$port ...");
-       $sock = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port, Proto=>'tcp', Timeout => 30);
+       $sock = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port, Proto=>'tcp', Timeout=>15);
        unless ($sock) {
                dbg('err', "Cannot connect to AGW Engine at $addr/$port $!");
                return;
@@ -72,12 +76,16 @@ sub init
        _sendf('m') if $monitor;
 }
 
+my $finishing = 0;
+
 sub finish
 {
+       return if $finishing;
        if ($sock) {
+               $finishing = 1;
                dbg('err', "AGW ending...");
-               for (values %Msg::conns) {
-                       next unless $_->isa('AGWMsg');
+               for (values %circuit) {
+                       &{$_->{eproc}}() if $_->{eproc};
                        $_->disconnect;
                }
                # say we are going
@@ -100,7 +108,17 @@ sub _sendf
        my $len  = 0;
        
        $len = length $data; 
-       dbg('agw', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"");
+       if ($sort eq 'y' || $sort eq 'H') {
+               dbg('agwpoll', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"");
+       } elsif ($sort eq 'D') {
+               if (isdbg('agw')) {
+                       my $d = $data;
+                       $d =~ s/\cM$//;
+                       dbg('agw', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$d\"");
+               }
+       } else {
+               dbg('agw', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"");
+       }
        push @outqueue, pack('C x3 a1 x1 C x1 a10 a10 V x4 a*', $port, $sort, $pid, $from, $to, $len, $data);
        Msg::set_event_handler($sock, write=>\&_send);
 }
@@ -139,6 +157,9 @@ sub _send
                     return 0; # fail. Message remains in queue ..
                 }
             }
+                       if (isdbg('raw')) {
+                               dbgdump('raw', "send $bytes_written: ", $msg);
+                       }
             $offset         += $bytes_written;
             $bytes_to_write -= $bytes_written;
         }
@@ -165,6 +186,9 @@ sub _rcv {                     # Complement to _send
        if (defined ($bytes_read)) {
                if ($bytes_read > 0) {
                        $inmsg .= $msg;
+                       if (isdbg('raw')) {
+                               dbgdump('raw', "read $bytes_read: ", $msg);
+                       }
                } 
        } else {
                if (Msg::_err_will_block($!)) {
@@ -178,7 +202,7 @@ FINISH:
     if (defined $bytes_read && $bytes_read == 0) {
                finish();
     } else {
-               _decode() if length $inmsg > 36;
+               _decode() if length $inmsg >= 36;
        }
 }
 
@@ -187,8 +211,8 @@ sub _error
        dbg('agw', "error on AGW connection $addr/$port $!");
        Msg::set_event_handler($sock, read=>undef, write=>undef, error=>undef);
        $sock = undef;
-       for (values %Msg::conns) {
-               next unless $_->isa('AGWMsg');
+       for (%circuit) {
+               &{$_->{eproc}}() if $_->{eproc};
                $_->disconnect;
        }
 }
@@ -230,7 +254,7 @@ sub _decode
                my $d = unpack "Z*", $data;
                $d =~ s/\cM$//;
                dbg('agw', "AGW Data In port: $port pid: $pid '$from'->'$to' length: $len \"$d\"");
-               my $conn = Msg->conns($from eq $main::mycall ? $to : $from);
+               my $conn = _find($from eq $main::mycall ? $to : $from);
                if ($conn) {
                        if ($conn->{state} eq 'WC') {
                                if (exists $conn->{cmd}) {
@@ -244,8 +268,12 @@ sub _decode
                                }
                        } else {
                                my @lines = split /\cM/, $data;
-                               for (@lines) {
-                                       &{$conn->{rproc}}($conn, "I$conn->{call}|$_");
+                               if (@lines) {
+                                       for (@lines) {
+                                               &{$conn->{rproc}}($conn, "I$conn->{call}|$_");
+                                       }
+                               } else {
+                                       &{$conn->{rproc}}($conn, "I$conn->{call}|");
                                }
                        }
                } else {
@@ -282,22 +310,42 @@ sub _decode
                        $conn->{lineend} = "\cM";
                        $conn->{incoming} = 1;
                        $conn->{agwcall} = $call;
+                       $circuit{$call} = $conn;
+                       if ($call =~ /^(\w+)-(\d\d?)$/) {
+                               my $c = $1;
+                               my $s = $2;
+                               $s = 15 - $s;
+                               if ($s <= 8 && $s > 0) {
+                                       $call = "${c}-${s}";
+                               } else {
+                                       $call = $c;
+                               }
+                       }
                        $conn->to_connected($call, 'A', $conn->{csort} = 'ax25');
                }
        } elsif ($sort eq 'd') {
                dbg('agw', "AGW '$from'->'$to' port: $port Disconnected");
                my $conn = _find($from eq $main::mycall ? $to : $from);
-               $conn->in_disconnect if $conn;
+               if ($conn) {
+                       &{$conn->{eproc}}() if $conn->{eproc};
+                       $conn->in_disconnect;
+               }
        } elsif ($sort eq 'y') {
                my ($frames) = unpack "V", $data;
-               dbg('agw', "AGW Frames Outstanding on port $port = $frames");
-               my $conn = Msg->conns($from);
+               dbg('agwpollans', "AGW Frames Outstanding on port $port = $frames");
+               my $conn = _find($from);
                $conn->{oframes} = $frames if $conn;
        } elsif ($sort eq 'Y') {
                my ($frames) = unpack "V", $data;
                dbg('agw', "AGW Frames Outstanding on circuit '$from'->'$to' = $frames");
-               my $conn = Msg->conns($from eq $main::mycall ? $to : $from);
+               my $conn = _find($from eq $main::mycall ? $to : $from);
                $conn->{oframes} = $frames if $conn;
+       } elsif ($sort eq 'H') {
+               unless ($from =~ /^\s+$/) {
+                       my $d = unpack "Z*", $data;
+                       $d =~ s/\cM$//;
+                       dbg('agw', "AGW Heard port: $port \"$d\"");
+               }
        } elsif ($sort eq 'X') {
                my ($r) = unpack "C", $data;
                $r = $r ? "Successful" : "Failed";
@@ -316,7 +364,8 @@ sub _decode
                        dbg('agw', "AGW Port: $_");
                }
                for (my $i = 0; $i < $noports; $i++) {
-                       _sendf('y', undef, undef, $i );
+                       _sendf('y', undef, undef, $i);
+                       _sendf('g', undef, undef, $i);
                }
        } else {
                my $d = unpack "Z*", $data;
@@ -327,12 +376,7 @@ sub _decode
 sub _find
 {
        my $call = shift;
-       for (values %Msg::conns) {
-               if ($_->isa('AGWMsg') && $call eq $_->{agwcall}) {
-                       return $_;
-               }
-       }
-       return undef;
+       return $circuit{$call};
 }
 
 sub connect
@@ -346,44 +390,61 @@ sub connect
        $conn->{incoming} = 0;
        $conn->{csort} = 'ax25';
        $conn->{agwcall} = uc $call;
+       $circuit{$conn->{agwcall}} = $conn; 
        
        _sendf('C', $main::mycall, $conn->{agwcall}, $conn->{agwport}, $conn->{agwpid});
+       $conn->{state} = 'WC';
+       
        return 1;
 }
 
 sub in_disconnect
 {
        my $conn = shift;
+       delete $circuit{$conn->{agwcall}}; 
        $conn->SUPER::disconnect;
 }
 
 sub disconnect
 {
        my $conn = shift;
-       _sendf('d', $main::mycall, $conn->{agwcall}, $conn->{agwport}, $conn->{agwpid});
+       delete $circuit{$conn->{agwcall}}; 
+       if ($conn->{incoming}) {
+               _sendf('d', $conn->{agwcall}, $main::mycall, $conn->{agwport}, $conn->{agwpid});
+       } else {
+               _sendf('d', $main::mycall, $conn->{agwcall}, $conn->{agwport}, $conn->{agwpid});
+       }
        $conn->SUPER::disconnect;
 }
 
 sub enqueue
 {
        my ($conn, $msg) = @_;
-       if ($msg =~ /^[D]/) {
+       if ($msg =~ /^D/) {
                $msg =~ s/^[-\w]+\|//;
-               _sendf('Y', $main::mycall, $conn->{call}, $conn->{agwport}, $conn->{agwpid});
-               _sendf('D', $main::mycall, $conn->{call}, $conn->{agwport}, $conn->{agwpid}, $msg . $conn->{lineend});
+#              _sendf('Y', $main::mycall, $conn->{call}, $conn->{agwport}, $conn->{agwpid});
+               _sendf('D', $main::mycall, $conn->{agwcall}, $conn->{agwport}, $conn->{agwpid}, $msg . $conn->{lineend});
+               my $len = length($msg) + 1; 
+               dbg('agw', "AGW Data Out port: $conn->{agwport} pid: $conn->{agwpid} '$main::mycall'->'$conn->{agwcall}' length: $len \"$msg\"");
        }
 }
 
 sub process
 {
        return unless $sock;
-       if ($main::systime - $lasttime >= 60) {
+       if ($ypolltime && $main::systime - $lastytime >= $ypolltime) {
                for (my $i = 0; $i < $noports; $i++) {
                        _sendf('y', undef, undef, $i );
-#                      _sendf('H', undef, undef, $i );
                }
-               $lasttime = $main::systime;
+               $lastytime = $main::systime;
+       }
+       if ($hpolltime && $main::systime - $lasthtime >= $hpolltime) {
+               for (my $i = 0; $i < $noports; $i++) {
+                       _sendf('H', undef, undef, $i );
+               }
+               $lasthtime = $main::systime;
        }
 }
+
 1;