summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ckcptime.awk60
-rw-r--r--ckt0.awk121
-rw-r--r--ckt0.sh10
3 files changed, 104 insertions, 87 deletions
diff --git a/ckcptime.awk b/ckcptime.awk
index e6c88d1..7bfef6e 100644
--- a/ckcptime.awk
+++ b/ckcptime.awk
@@ -8,12 +8,7 @@ function log10(n) {
function merge_meas(est_val, est_unc, meas_val, meas_unc) {
- # add (meas - est) delta to the measurement uncertainty
- # note: this works when tracking a constant value,
- # the first derivative of a constant 'should' be zero
- # unc_meas = sqrt(unc_meas^2.0 + (val_meas - val_est)^2.0)
-
- # Kalman filtering compares variances
+ # Kalman filtering compares variances,
# convert uncertainties to square units
est_unc = (0.5*est_unc)^2.0
meas_unc = (0.5*meas_unc)^2.0
@@ -35,14 +30,17 @@ function sigfig(val, unc) {
ordmag_val = log10(val)
ordmag_unc = log10(unc)
- #sigfig_unc = sprintf("%.f", 6)
- sigfig_unc = sprintf("%.f", sqrt((ordmag_val - ordmag_unc)^2.0) + 1.0)
- sigfig_val = sprintf("%.f", (ordmag_val - ordmag_unc + sigfig_unc))
+ ordmag_high = sqrt((ordmag_val)^2.0 + (ordmag_unc)^2.0)
+ ordmag_low = ((ordmag_val)^-1.0 + (ordmag_unc)^-1.0)^-1.0
+ ordmag_range = ordmag_high - ordmag_low
+
+ sigfig_unc = sprintf("%.f", sqrt((ordmag_range)^2.0 + 3.0^2.0))
+ sigfig_val = sprintf("%.f", sqrt((ordmag_range)^2.0 + (sigfig_unc)^2.0 + 3.0^2.0))
ofmt_val = "%." sigfig_val "g"
ofmt_unc = "%." sigfig_unc "g"
- return sprintf(ofmt_val OFS ofmt_unc ORS, val, unc)
+ return sprintf(ofmt_val OFS ofmt_unc, val, unc)
}
@@ -66,20 +64,12 @@ function ck_cptime() {
}
-function ck_uptime(t0_est, t0_unc) {
-
- t_sys_meas[1] = systime()
- t_sys_meas[2] = 1.0
+function ck_uptime() {
+ # check uptime cmd
"uptime" | getline t_up_cmd
close("uptime")
- split(merge_meas(t_sys_meas[1], t_sys_meas[2], systime(), 1.0), t_sys_meas)
-
- # estimate (predict) uptime
- t_up_est[1] = t_sys_meas[1] - t0_est
- t_up_est[2] = t_sys_meas[2] + t0_unc
-
# evaluate measured uptime
t_up_meas[1] = 0.0
t_up_meas[2] = systime()
@@ -119,38 +109,20 @@ function ck_uptime(t0_est, t0_unc) {
}
- # merge predicted and measured uptimes
- split(merge_meas(t_up_est[1], t_up_est[2], t_up_meas[1], t_up_meas[2]), t_up_est)
-
- # evaluate measured boot time, t0
- t_boot_meas[1] = t_sys_meas[1] - t_up_meas[1]
- t_boot_meas[2] = t_sys_meas[2] + t_up_meas[2]
-
- # merge previous and updated boot time, t0
- split(merge_meas(t0_est, t0_unc, t_boot_meas[1], t_boot_meas[2]), t_boot_est)
-
- return sigfig(t_boot_est[1], t_boot_est[2])
+ return sigfig(t_up_meas[1], t_up_meas[2])
}
BEGIN {
- OFMT="%.21g"
+ OFMT="%f"
+ pi = 4.0*atan2(1.0, 1.0)
+ c0 = 299792458 # m/sec
+
#print("_systime_", systime())
#print("_boottime_", ck_boottime())
- printf("%s" ORS, ck_cptime())
-
- # check ARGV for previous estimate
- # if (ARGC > 0) {
- # ARGV[1] ? t0_est[1] = ARGV[1] : t0_est[1] = 0.0
- # ARGV[2] ? t0_est[2] = ARGV[2] : t0_est[2] = systime()
- # }
- #print("t0_est = ", t0_est[1])
- #print("t_boot_unc = ", t0_est[2])
-
- # check uptime, update estimate
- #print(ck_uptime(t0_est[1], t0_est[2]))
+ print( ck_cptime() )
}
diff --git a/ckt0.awk b/ckt0.awk
index baeb599..dd83717 100644
--- a/ckt0.awk
+++ b/ckt0.awk
@@ -17,8 +17,9 @@ function merge_meas(est_val, est_unc, meas_val, meas_unc) {
est_val = est_val + K*(meas_val - est_val)
est_unc = (est_unc*meas_unc)/(est_unc + meas_unc)
- # convert est_unc back to original units
+ # convert uncertainties back to original units
est_unc = 2.0*sqrt(est_unc)
+ meas_unc = 2.0*sqrt(meas_unc)
return sprintf(OFMT OFS OFMT ORS, est_val, est_unc)
@@ -30,24 +31,24 @@ function sigfig(val, unc) {
ordmag_val = log10(val)
ordmag_unc = log10(unc)
- #sigfig_unc = sprintf("%.f", 6)
- sigfig_unc = sprintf("%.f", sqrt((ordmag_val - ordmag_unc)^2.0) + 1.0)
- sigfig_val = sprintf("%.f", (ordmag_val - ordmag_unc + sigfig_unc))
+ ordmag_high = sqrt((ordmag_val)^2.0 + (ordmag_unc)^2.0)
+ ordmag_low = ((ordmag_val)^-1.0 + (ordmag_unc)^-1.0)^-1.0
+ ordmag_range = ordmag_high - ordmag_low
+
+ sigfig_unc = sprintf("%.f", ordmag_range)
+ sigfig_val = sprintf("%.f", sigfig_unc + 6.0)
ofmt_val = "%." sigfig_val "g"
ofmt_unc = "%." sigfig_unc "g"
- return sprintf(ofmt_val OFS ofmt_unc ORS, val, unc)
+ return sprintf(ofmt_val OFS ofmt_unc, val, unc)
}
-function ck_boottime() {
+function ck_boottime(unm) {
- "uname" | getline uname
- close("uname")
-
- if (uname ~/OpenBSD/) {
+ if (unm ~/OpenBSD/) {
"sysctl kern.boottime" | getline t0_k
close("sysctl kern.boottime")
sub("^.*=", "", t0_k)
@@ -58,7 +59,7 @@ function ck_boottime() {
t0_k = mktime(t0_k)
}
- if (uname ~/FreeBSD/) {
+ if (unm ~/FreeBSD/) {
"sysctl kern.boottime" | getline t0_k
close("sysctl kern.boottime")
sub("^.*{", "", t0_k)
@@ -78,19 +79,27 @@ function ck_boottime() {
}
-function ck_uptime(t0_est, t0_unc) {
+function ck_time(unm) {
- t_sys_meas[1] = systime()
- t_sys_meas[2] = 1.0
+ if (unm ~/FreeBSD/) {
+ #t = systime()
+ "date +%s.%N" | getline t
+ close("date +%s.%N")
+ }
+ else {
+ t = systime()
+ }
- "uptime" | getline t_up_cmd
- close("uptime")
+ return t
- split(merge_meas(t_sys_meas[1], t_sys_meas[2], systime(), 1.0), t_sys_meas)
+}
- # estimate (predict) uptime
- t_up_est[1] = t_sys_meas[1] - t0_est
- t_up_est[2] = t_sys_meas[2] + t0_unc
+
+function ck_uptime() {
+
+ # check uptime cmd
+ "uptime" | getline t_up_cmd
+ close("uptime")
# evaluate measured uptime
t_up_meas[1] = 0.0
@@ -131,40 +140,72 @@ function ck_uptime(t0_est, t0_unc) {
}
- # merge predicted and measured uptimes
- split(merge_meas(t_up_est[1], t_up_est[2], t_up_meas[1], t_up_meas[2]), t_up_est)
-
- # evaluate measured boot time, t0
- t_boot_meas[1] = t_sys_meas[1] - t_up_meas[1]
- t_boot_meas[2] = t_sys_meas[2] + t_up_meas[2]
-
- # merge previous and updated boot time, t0
- split(merge_meas(t0_est, t0_unc, t_boot_meas[1], t_boot_meas[2]), t_boot_est)
-
- return sigfig(t_boot_est[1], t_boot_est[2])
+ return sigfig(t_up_meas[1], t_up_meas[2])
}
BEGIN {
- OFMT="%.21g"
+ OFMT="%f"
pi = 4.0*atan2(1.0, 1.0)
c0 = 299792458 # m/sec
+ "uname" | getline uname
+ close("uname")
+
#print("_systime_", systime())
#print("_boottime_", ck_boottime())
- # check ARGV for previous estimate
- if (ARGC > 0) {
- ARGV[1] ? t0_est[1] = ARGV[1] : split(ck_boottime(), t0_est)
- ARGV[2] ? t0_est[2] = ARGV[2] : split(ck_boottime(), t0_est)
+ # check ARGV for previous estimates
+ #print("ARGC:", ARGC)
+ if (ARGC) {
+ ARGV[1] ? t_prev[1] = ARGV[1] : t_prev[1] = 0.0
+ ARGV[2] ? t_prev[2] = ARGV[2] : t_prev[2] = systime()
+ ARGV[3] ? t_up_prev[1] = ARGV[3] : t_up_prev[1] = 0.0
+ ARGV[4] ? t_up_prev[2] = ARGV[4] : t_up_prev[2] = systime()
+ ARGV[5] ? t0_prev[1] = ARGV[5] : split(ck_boottime(uname), t0_prev)
+ ARGV[6] ? t0_prev[2] = ARGV[6] : split(ck_boottime(uname), t0_prev)
}
- #print("t0_est = ", t0_est[1])
- #print("t_boot_unc = ", t0_est[2])
+ #print( t_prev[1], t_prev[2], t_up_prev[1], t_up_prev[2], t0_prev[1], t0_prev[2] )
+
+ # check systime, check uptime, check systime again
+ t_meas[1] = ck_time(uname)
+ split(ck_uptime(), t_up_meas)
+ t_meas[2] = ck_time(uname)
+
+ # convert to [val, unc] vector
+ if ( t_meas[1] != t_meas[2] ) {
+ t_meas[2] -= t_meas[1]
+ t_meas[1] += 0.5*t_meas[2]
+ } else {
+ t_meas[2] = 1.0
+ }
+ t_meas_str = sigfig(t_meas[1], t_meas[2])
+
+ # estimate dt
+ dt[1] = t_meas[1] - t_prev[1]
+ dt[2] = t_meas[2] + t_prev[2]
+
+ # predict uptime based on dt, t_up(new) = t_up(old) + dt
+ t_up_est[1] = t_up_prev[1] + dt[1]
+ t_up_est[2] = t_up_prev[2] + dt[2]
+
+ # merge predicted and measured uptimes
+ split(merge_meas(t_up_est[1], t_up_est[2], t_up_meas[1], t_up_meas[2]), t_up_est)
+ t_up_est[2] = sqrt( t_up_est[2]^2.0 + (t_up_est[1] - t_up_prev[1] - dt[1])^2.0 )
+ t_up_est_str = sigfig(t_up_est[1], t_up_est[2])
+
+ # evaluate measured boot time, t0
+ t0_est[1] = t_meas[1] - t_up_est[1]
+ t0_est[2] = t_meas[2] + t_up_est[2]
+
+ # merge previous and updated boot time, t0
+ split(merge_meas(t0_est[1], t0_est[2], t0_prev[1], t0_prev[2]), t0_est)
+ t0_est[2] = sqrt( t0_est[2]^2.0 + (t0_est[1] - t0_prev[1])^2.0 )
+ t0_est_str = sigfig(t0_est[1], t0_est[2])
- # check uptime, update estimate
- print(ck_uptime(t0_est[1], t0_est[2]))
+ print(t_meas_str, t_up_est_str, t0_est_str)
}
diff --git a/ckt0.sh b/ckt0.sh
index eeb0479..88fbb78 100644
--- a/ckt0.sh
+++ b/ckt0.sh
@@ -11,20 +11,24 @@ set -e
#sysctl_t0_str=$( sysctl kern.boottime | mawk -F= '{print($NF)}' )
#sysctl_t0=$( date -jf "%a %b %d %H:%M:%S %G" "${sysctl_t0_str}" +%s )
+
+# check for saved state
if [ -f t0_est.log ] ; then {
t0_est="$( cat t0_est.log )"
} else {
t0_est=""
} fi
-printf "N t0_est t0_unc\n" | column -t
+printf "n t_est t_unc t_up_est t_up_unc t0_est t0_unc\n" | column -t
for N in $(seq 0 10080) ; do
printf "${N} ${t0_est}\n" | column -t
t0_est=$( mawk -f ckt0.awk ${t0_est} | tail -n2 )
#mawk -f ckt0.awk
- sleep $( mawk 'BEGIN {print( sqrt(rand()^2.0 + 1.0) )}' )
- #sleep $( echo $t0_est | mawk '{print(sqrt(1.0 + ((60.0*$NF)/(60.0 + $NF))^2.0 + rand()^2.0 ))}' )
+ sleep $( mawk 'BEGIN {print(sqrt( rand()^2.0 + 1.0 ))}' )
+ #sleep $( echo $t0_est | mawk '{print(sqrt( ((60.0*$4)/(60.0 + $4))^2.0 + rand()^2.0 ))}' )
+ #sleep $( echo $t0_est | mawk '{print(sqrt( ($2)^2.0 + ($4)^2.0 + ($6)^2.0 + rand()^2.0 ))}' )
+ #sleep $( echo $t0_est | mawk '{print( 10.0 - (systime() - $5)%10.0 + 0.5*rand()^2.0 )}' )
done