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