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