Compare commits

...

3 commits

Author SHA1 Message Date
Stephan I. Böttcher
5073fc7a0f clock fudge: provide qticks 2023-12-04 21:20:28 +01:00
Stephan I. Böttcher
f2cf3e949f set_clock: sleepless clock/fudge implementation 2023-12-04 20:29:37 +01:00
Stephan I. Böttcher
eea7fdf883 clock/fudge tests 2023-12-02 16:16:14 +01:00
2 changed files with 37 additions and 33 deletions

View file

@ -1,7 +1,7 @@
irena pres/inj
irena uart/base=85
irena var uart_size = -1
irena var rtc_drift[3] = 0x20f04
clock_sync 3600
set_clock fudge config
set_clock
set_clock sleep
set_clock fudge

72
irena.c
View file

@ -2407,36 +2407,40 @@ int send_file(const char *fn, const char *cfmt, unsigned int drop)
int set_clock(int do_sleep)
{
time_t t = 0;
if (do_sleep) {
struct timespec ts;
poll_uart(1);
if (!clock_gettime(CLOCK_REALTIME, &ts)) {
while (ts.tv_nsec < 900000000) {
ts.tv_nsec += 50000000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &ts, 0);
if (verbose(3))
fprintf(mout, "slept 50ms ns=%lu\n", ts.tv_nsec);
poll_uart(1);
clock_gettime(CLOCK_REALTIME, &ts);
}
ts.tv_sec++;
t = ts.tv_sec;
ts.tv_nsec=0;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &ts, 0);
}
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts)) {
merror("clock_gettime(CLOCK_REALTIME)");
return 0;
}
else
t = time(0);
struct tm gm;
gmtime_r(&t, &gm);
if (do_sleep & 1) {
poll_uart(1);
while (ts.tv_nsec < 900000000) {
ts.tv_nsec += 50000000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &ts, 0);
if (verbose(3))
fprintf(mout, "slept 50ms ns=%lu\n", ts.tv_nsec);
poll_uart(1);
clock_gettime(CLOCK_REALTIME, &ts);
}
ts.tv_sec++;
ts.tv_nsec=0;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &ts, 0);
}
char utc[64];
char *cmd = "clock %Y-%m-%d %H:%M:%S";
if (do_sleep == 2)
cmd = "cl/dr %Y-%m-%d %H:%M:%S";
if (do_sleep == 3)
cmd = "cl/fu %Y-%m-%d %H:%M:%S";
strftime(utc, sizeof(utc), cmd, &gm);
if (do_sleep == 2) {
unsigned int q = (ts.tv_nsec/(1000000000>>15));
if (q > 0x7fff) q = 0x7fff;
snprintf(utc, sizeof(utc), "cl/fu 0x%08lx 0x%04x", ts.tv_sec, q);
}
else {
char *cmd = "clock %Y-%m-%d %H:%M:%S";
if (do_sleep == 3)
cmd = "cl/dr %Y-%m-%d %H:%M:%S";
struct tm gm;
gmtime_r(&ts.tv_sec, &gm);
strftime(utc, sizeof(utc), cmd, &gm);
}
return send_irena_command(utc);
}
@ -2762,7 +2766,7 @@ struct numbers {
{.name="fct_packets", .doc="packets", .i=&fct_packets, .flags=NU_INT},
{.name="clock_sync", .doc="seconds", .u=&clock_cadence, .flags=NU_INT},
{.name="clock_mod", .doc="seconds", .u=&clock_modulus, .flags=NU_INT},
{.name="clock_sleep", .doc="(1:sleep,2:drift,3:fudge)", .i=&clock_sleep, .flags=NU_INT},
{.name="clock_sleep", .doc="(1:sleep,2:fudge,3:drift)", .i=&clock_sleep, .flags=NU_INT},
{.name="reset_cadence", .doc="seconds", .i=&status_reset_cadence, .flags=NU_INT},
{.name="last_reset", .doc="time", .t=&last_status_reset, .flags=NU_TIME},
{.name="init_time", .doc="time", .t=&init_time, .flags=NU_TIME},
@ -2891,7 +2895,7 @@ int process_cmd(char *l)
"\tirena «commandline»\n"
"\tvar «irena variable command»\n"
"\tfct «lines»\n"
"\tset_clock [sleep|drift|fudge] [config]\n"
"\tset_clock [sleep|fudge|drift] [config]\n"
"\tdatafile [«fn» [«rotate» [«rotate-modulus» [«flags»]]]] [close|rotate]\n"
"\tcounterfile [«fn» [«rotate» [«rotate-modulus» [«flags»]]]] [close|rotate]\n"
"\tstatusfile [«fn» [ «rotate» [ «rotate-modulus» [«flags»]]]] [close|rotate]\n"
@ -3085,8 +3089,8 @@ int process_cmd(char *l)
int config = !strcmp(av[na-1], "config");
if ( !strcmp(av[1], "nosleep")) do_sleep = 0;
else if (!strcmp(av[1], "sleep")) do_sleep = 1;
else if (!strcmp(av[1], "drift")) do_sleep = 2;
else if (!strcmp(av[1], "fudge")) do_sleep = 3;
else if (!strcmp(av[1], "fudge")) do_sleep = 2;
else if (!strcmp(av[1], "drift")) do_sleep = 3;
else if (!config || na>2) do_sleep = -1;
if (na>3 || na>2 && !config)
do_sleep = -1;
@ -3096,8 +3100,8 @@ int process_cmd(char *l)
"- set the µC RTC to the current host time.\n"
"option `sleep`: Wait until the end of the current second.\n"
"option `drift`: Sleep, set clock and ask the µC to adjust the clock speed.\n"
"option `fudge`: Sleep, and ask the µC to adjust the clock speed.\n"
"option `config`: configure the sleep mode of the periodic clock setting,\n"
"option `fudge`: Ask the µC to adjust the clock speed.\n"
"option `config`: Configure the sleep mode of the periodic clock setting,\n"
" (does not set the µC clock).\n"
);
return -1;