1275970Scy#! @PATH_PERL@ -w
2275970Scy#
3275970Scy# drift of 104.8576 -> +1 tick.  Base  of 10000 ticks.
4275970Scy#
5275970Scy# 970306 HMS Deal with nanoseconds.  Fix sign of adjustments.
6275970Scypackage calc_tickadj;
7275970Scyuse strict;
8275970Scy
9275970Scyexit run(@ARGV) unless caller;
10275970Scy
11275970Scysub run {
12275970Scy    my $opts;
13275970Scy    if (!processOptions(\@_, $opts)) {
14275970Scy        usage(1);
15275970Scy    };
16275970Scy    my $drift_file = $opts->{'drift-file'};
17275970Scy    my $tick       = $opts->{'tick'};
18275970Scy
19275970Scy    if (!$tick) {
20275970Scy        my ($fl) = `tickadj`;
21275970Scy        if (defined $fl && $fl =~ /(?:KERNEL|PRESET)?\s*tick\s+=\s+(\d+)/) {
22275970Scy            $tick = $1;
23275970Scy        }
24275970Scy        else {
25275970Scy            die "Could not get tick value, try manually with -t/--tick\n";
26275970Scy        }
27275970Scy    }
28275970Scy
29275970Scy    # Drift file is in PPM where Milion is actually 2**20
30275970Scy    my $cvt   = (2 ** 20) / $tick;
31275970Scy    my $drift = 0.;
32275970Scy
33275970Scy    open my $dfh, $drift_file or die "Could not open $drift_file: $!\n";
34275970Scy
35275970Scy    $drift = <$dfh>; 
36275970Scy
37275970Scy    close $dfh;
38275970Scy    die "Invalid drift file value <$drift>" if $drift !~ /[+-]?\d+\.?[0-9]+/;
39275970Scy
40275970Scy    while ($drift < 0) {
41275970Scy        $drift += $cvt;
42275970Scy        $tick--;
43275970Scy    }
44275970Scy
45275970Scy    while ($drift > $cvt) {
46275970Scy        $drift -= $cvt;
47275970Scy        $tick++;
48275970Scy    }
49275970Scy
50275970Scy    printf "%.3f (drift)\n", $drift;
51275970Scy    printf "%d usec; %d nsec\n", $tick, ($tick + ($drift/$cvt)) * 1000;
52275970Scy
53275970Scy    return 0;
54275970Scy}
55275970Scy
56275970Scy@calc_tickadj_opts@
57275970Scy
58275970Scy1;
59275970Scy__END__
60