2 # This module impliments the new protocal mode for a dx cluster
4 # Copyright (c) 2001 Dirk Koopman G1TLH
11 @ISA = qw(DXChannel DXProt);
25 use Time::HiRes qw(gettimeofday tv_interval);
37 use vars qw($VERSION $BRANCH);
38 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
39 $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/,(0,0));
40 $main::build += $VERSION;
41 $main::branch += $BRANCH;
45 my $user = DXUser->get($main::mycall);
46 $DXProt::myprot_version += ($main::version - 1 + 0.52)*100;
47 $main::me = QXProt->new($main::mycall, 0, $user);
48 $main::me->{here} = 1;
49 $main::me->{state} = "indifferent";
50 $main::me->{sort} = 'S'; # S for spider
51 $main::me->{priv} = 9;
52 $main::me->{metric} = 0;
53 $main::me->{pingave} = 0;
54 $main::me->{registered} = 1;
55 $main::me->{version} = $main::version;
56 $main::me->{build} = $main::build;
58 # $Route::Node::me->adddxchan($main::me);
64 $self->SUPER::start(@_);
71 my $t = Thingy::Route->new_node_connect($main::mycall, $main::mycall, nextmsgid(), $self->{call});
77 if ($_[1] =~ /^PC\d\d\^/) {
82 # Although this is called the 'QX' Protocol, this is historical
83 # I am simply using this module to save a bit of time.
86 return unless my ($tonode, $fromnode, $class, $msgid, $hoptime, $rest) =
87 $_[1] =~ /^([^,]+,){5,5}:(.*)$/;
91 # add this interface's hop time to the one passed
92 my $newhoptime = $self->{pingave} >= 999 ?
93 $hoptime+10 : ($hoptime + int($self->{pingave}*10));
95 # split up the 'rest' which are 'a=b' pairs separated by commas
96 # and create a new thingy based on the class passed (if known)
97 # ignore pairs with a leading '_'.
99 my @par = map {/^_/ ? split(/=/,$_,2) : ()} split /,/, $rest;
101 my $pkg = 'Thingy::' . lcfirst $class;
102 my $t = $pkg->new(_tonode=>$tonode, _fromnode=>$fromnode,
103 _msgid=>$msgid, _hoptime=>$newhoptime,
104 _newdata=>$rest, _inon=>$self->{call},
105 @par) if defined *$pkg && $pkg->can('new');
110 my $last_node_update = 0;
111 my $node_update_interval = 60*60;
115 if ($main::systime >= $last_node_update+$node_update_interval) {
116 $last_node_update = $main::systime;
123 my $t = Thingy::Route->new_node_disconnect($main::mycall, $main::mycall, nextmsgid(), $self->{call});
125 $self->DXProt::disconnect(@_);
133 $msgid = 1 if ++$msgid > 99999;
139 my $t = Thingy::Route->new_node_update(nextmsgid());