summaryrefslogtreecommitdiff
path: root/ckcptime.awk
diff options
context:
space:
mode:
authorwukong <wukong@longaeva>2026-06-09 10:47:09 -0700
committerwukong <wukong@longaeva>2026-06-09 10:47:09 -0700
commit7fb50be1944f3a76a285ac04423ae233728b5bf7 (patch)
tree957548d230a9ab48eb80dac4d8ee5e493cbaea6d /ckcptime.awk
parent40548183b45666afc50373b0ee172465660fc479 (diff)
merge code between ckcptime and ckt0 scripts;
added btime check from /proc/stat in ckt0.awk;
Diffstat (limited to '')
-rw-r--r--ckcptime.awk135
1 files changed, 111 insertions, 24 deletions
diff --git a/ckcptime.awk b/ckcptime.awk
index 7bfef6e..a45e046 100644
--- a/ckcptime.awk
+++ b/ckcptime.awk
@@ -8,6 +8,10 @@ function log10(n) {
function merge_meas(est_val, est_unc, meas_val, meas_unc) {
+ # add sanity (staleness) check on previous estimate
+ #z_est = (meas_val - est_val)/est_unc
+ #z_meas = (meas_val - est_val)/meas_unc
+
# Kalman filtering compares variances,
# convert uncertainties to square units
est_unc = (0.5*est_unc)^2.0
@@ -17,8 +21,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)
@@ -27,24 +32,38 @@ function merge_meas(est_val, est_unc, meas_val, meas_unc) {
function sigfig(val, unc) {
- ordmag_val = log10(val)
- ordmag_unc = log10(unc)
+ omag_val = log10(val)
+ omag_unc = log10(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
+ omag_high = sqrt((omag_val)^2.0 + (omag_unc)^2.0)
+ omag_low = ((omag_val)^-1.0 + (omag_unc)^-1.0)^-1.0
- 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))
+ sfig_unc = sprintf("%.f", sqrt((omag_high - omag_low)^2.0 + 6.0^2.0))
+ sfig_val = sprintf("%.f", sqrt(sfig_unc^2.0 + 9.0^2.0))
- ofmt_val = "%." sigfig_val "g"
- ofmt_unc = "%." sigfig_unc "g"
+ ofmt_val = "%." sfig_val "g"
+ ofmt_unc = "%." sfig_unc "g"
return sprintf(ofmt_val OFS ofmt_unc, val, unc)
}
+function unc_g(val) {
+
+ # order of magnitude
+ omag_val = log10(val)
+
+ # trim punctuation from val
+ sub("[eE].*$", "", val)
+ gsub("[.+-]", "", val)
+ omag_unc = sprintf("%d", omag_val - length(val) + 1.0)
+
+ return sprintf("%g", 10.0^(omag_unc))
+
+}
+
+
function ck_cptime() {
t_sys_meas[1] = systime()
@@ -59,12 +78,28 @@ function ck_cptime() {
gsub(",", OFS, cptime_cmd)
#split(cptime_cmd, cptime_arr, ",")
- return sprintf(OFMT OFS "%s", t_sys_meas[1], cptime_cmd)
+ return sprintf("%s", cptime_cmd)
+
+}
+
+
+function ck_time(unm) {
+
+ if (unm ~ /FreeBSD/ || unm ~ /Linux/) {
+ "date +%s.%N" | getline t
+ close("date +%s.%N")
+ }
+ else {
+ "date +%s" | getline t
+ close("date +%s")
+ }
+
+ return t
}
-function ck_uptime() {
+function ck_uptime(unm) {
# check uptime cmd
"uptime" | getline t_up_cmd
@@ -72,57 +107,109 @@ function ck_uptime() {
# evaluate measured uptime
t_up_meas[1] = 0.0
- t_up_meas[2] = systime()
+ t_up_meas[2] = ck_time(unm)
- sub("^.*up ", "", t_up_cmd)
+ sub("^[ ]*[0-9]:[0-9]*[ ]", "", t_up_cmd)
+ sub("^.* up ", "", t_up_cmd)
sub(", load.*$", "", t_up_cmd)
split(t_up_cmd, t_up_cmd_arr, ",")
for (i in t_up_cmd_arr) {
- # TODO: add cases for days, months, years, etc.
if (t_up_cmd_arr[i] ~ /day/) {
split(t_up_cmd_arr[i], days)
- t_up_meas[1] += 86400.0*(days[1] + 0.0)
- (t_up_meas[2] > 86400.0) ? t_up_meas[2] = 86400.0 : t_up_meas[2] += 0.0
+ (days[1] + 0.0) ? t_up_meas[1] += 86400.0*(days[1] + 0.0) : t_up_meas[1] += 0.0
+ (t_up_meas[2] + 0.0) > 86400.0 ? t_up_meas[2] = 86400.0 : t_up_meas[2] += 0.0
}
if (t_up_cmd_arr[i] ~ /hr/) {
split(t_up_cmd_arr[i], hrs)
- t_up_meas[1] += 3600.0*(hrs[1] + 0.0)
- (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0
+ (hrs[1] + 0.0) ? t_up_meas[1] += 3600.0*(hrs[1] + 0.0) : t_up_meas[1] += 0.0
+ (t_up_meas[2] + 0.0) > 3600.0 ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0
}
if (t_up_cmd_arr[i] ~ /min/) {
split(t_up_cmd_arr[i], mins)
- t_up_meas[1] += (60.0*(mins[1] + 0.0))
- (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0
+ (mins[1] + 0.0) ? t_up_meas[1] += 60.0*(mins[1] + 0.0) : t_up_meas[1] += 0.0
+ (t_up_meas[2] + 0.0) > 60.0 ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0
+ }
+
+ if (t_up_cmd_arr[i] ~ /sec/) {
+ split(t_up_cmd_arr[i], sec)
+ (sec[1] + 0.0) ? t_up_meas[1] += sec[1] : t_up_meas[1] += 0.0
+ (t_up_meas[2] + 0.0) > 1.0 ? t_up_meas[2] = 1.0 : t_up_meas[2] += 0.0
}
if (t_up_cmd_arr[i] ~ /:/) {
split(t_up_cmd_arr[i], hrs_min, ":")
t_up_meas[1] += 3600.0*(hrs_min[1] + 0.0)
- (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0
+ (t_up_meas[2] + 0.0) > 3600.0 ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0
t_up_meas[1] += 60.0*(hrs_min[2] + 0.0)
- (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0
+ (t_up_meas[2] + 0.0) > 60.0 ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0
}
}
+ if (uname ~ /FreeBSD/ || uname ~ /Linux/) {
+ split(ck_proc_uptime(uname), t_pu_meas)
+ t_pu_meas[2] = unc_g(t_pu_meas[1])
+ split(merge_meas(t_up_meas[1], t_up_meas[2], t_pu_meas[1], t_pu_meas[2]), t_up_meas)
+ }
+
return sigfig(t_up_meas[1], t_up_meas[2])
}
+function ck_proc_uptime(unm) {
+
+ proc_file = ""
+ if (unm ~ /FreeBSD/) {
+ proc_file = "/compat/linux/proc/uptime"
+ }
+ if (unm ~ /Linux/) {
+ proc_file = "/proc/uptime"
+ }
+
+ getline proc_uptime < proc_file
+ close(proc_file)
+
+ return proc_uptime
+
+}
+
+
BEGIN {
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())
- print( ck_cptime() )
+ #print( uname, ck_cptime() )
+
+
+ ## check systime, check uptime, check systime again
+ t_meas[1] = ck_time(uname)
+ split(ck_uptime(uname), t_up_meas)
+ t_meas[2] = ck_time(uname)
+
+ ## convert to [val, unc] vector
+ t_meas[2] -= t_meas[1]
+ t_meas[1] += 0.5*t_meas[2]
+ if ( t_meas[2] == 0.0 ) {
+ t_meas[2] = unc_g(t_meas[1])
+ }
+ 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]
+ print( t_meas_str, ck_cptime() )
}