1290001Sglebius#! @PATH_PERL@ -w
2290001Sglebius#
3290001Sglebius# drift of 104.8576 -> +1 tick.  Base  of 10000 ticks.
4290001Sglebius#
5290001Sglebius# 970306 HMS Deal with nanoseconds.  Fix sign of adjustments.
6290001Sglebiuspackage calc_tickadj;
7290001Sglebiususe strict;
8290001Sglebius
9290001Sglebiusexit run(@ARGV) unless caller;
10290001Sglebius
11290001Sglebiussub run {
12290001Sglebius    my $opts;
13290001Sglebius    if (!processOptions(\@_, $opts)) {
14290001Sglebius        usage(1);
15290001Sglebius    };
16290001Sglebius    my $drift_file = $opts->{'drift-file'};
17290001Sglebius    my $tick       = $opts->{'tick'};
18290001Sglebius
19290001Sglebius    if (!$tick) {
20290001Sglebius        my ($fl) = `tickadj`;
21290001Sglebius        if (defined $fl && $fl =~ /(?:KERNEL|PRESET)?\s*tick\s+=\s+(\d+)/) {
22290001Sglebius            $tick = $1;
23290001Sglebius        }
24290001Sglebius        else {
25290001Sglebius            die "Could not get tick value, try manually with -t/--tick\n";
26290001Sglebius        }
27290001Sglebius    }
28290001Sglebius
29290001Sglebius    # Drift file is in PPM where Milion is actually 2**20
30290001Sglebius    my $cvt   = (2 ** 20) / $tick;
31290001Sglebius    my $drift = 0.;
32290001Sglebius
33290001Sglebius    open my $dfh, $drift_file or die "Could not open $drift_file: $!\n";
34290001Sglebius
35290001Sglebius    $drift = <$dfh>; 
36290001Sglebius
37290001Sglebius    close $dfh;
38290001Sglebius    die "Invalid drift file value <$drift>" if $drift !~ /[+-]?\d+\.?[0-9]+/;
39290001Sglebius
40290001Sglebius    while ($drift < 0) {
41290001Sglebius        $drift += $cvt;
42290001Sglebius        $tick--;
43290001Sglebius    }
44290001Sglebius
45290001Sglebius    while ($drift > $cvt) {
46290001Sglebius        $drift -= $cvt;
47290001Sglebius        $tick++;
48290001Sglebius    }
49290001Sglebius
50290001Sglebius    printf "%.3f (drift)\n", $drift;
51290001Sglebius    printf "%d usec; %d nsec\n", $tick, ($tick + ($drift/$cvt)) * 1000;
52290001Sglebius
53290001Sglebius    return 0;
54290001Sglebius}
55290001Sglebius
56290001Sglebius@calc_tickadj_opts@
57290001Sglebius
58290001Sglebius1;
59290001Sglebius__END__
60