chiark / gitweb /
clunk.git
6 years agoDon't call clock_getting unnecessarily at startup.
Ben Harris [Sat, 24 Nov 2018 01:30:34 +0000 (01:30 +0000)]
Don't call clock_getting unnecessarily at startup.

If the use has specified -s or -f, we don't need to initialise our
idea of the displayed time from CLOCK_REALTIME.

6 years agoRemove a debugging printf.
Ben Harris [Fri, 23 Nov 2018 23:59:14 +0000 (23:59 +0000)]
Remove a debugging printf.

6 years agoActually use the libgpiod output routine when asked.
Ben Harris [Fri, 23 Nov 2018 23:49:49 +0000 (23:49 +0000)]
Actually use the libgpiod output routine when asked.

6 years agoEnforce a minimum "low" time for the output.
Ben Harris [Fri, 23 Nov 2018 23:26:59 +0000 (23:26 +0000)]
Enforce a minimum "low" time for the output.

By sleeping for 250 ms after each pulse, we ensure that even if
CLOCK_REALTIME is suddenly put forward by 29.7 seconds we won't start
a new pulse before the dial has recovered from the last one.

6 years agoTake advantage of sigtimedwait().
Ben Harris [Fri, 23 Nov 2018 21:27:47 +0000 (21:27 +0000)]
Take advantage of sigtimedwait().

This saves the need for two separate timers, since the sigtimedwait()
timeout can serve the purpose of the fallback timer.

6 years agoOnly one pending signal might need clearing.
Ben Harris [Fri, 23 Nov 2018 19:34:19 +0000 (19:34 +0000)]
Only one pending signal might need clearing.

6 years agoDon't depend on the field order of struct timespec.
Ben Harris [Fri, 23 Nov 2018 19:33:21 +0000 (19:33 +0000)]
Don't depend on the field order of struct timespec.

POSIX merely requires that tv_sec and tv_nsec be present, so
initialisers need to name them explicitly.

6 years agoUse two timers and sigwait rather than looking for EINTR.
Ben Harris [Fri, 23 Nov 2018 18:45:52 +0000 (18:45 +0000)]
Use two timers and sigwait rather than looking for EINTR.

The latter had a race condition whereby if the signal from the
fallback timer was delivered before the call to clock_nanosleep(), it
would be lost.  This was a fundamental problem with using asynchronous
signals, and switching to sigwait(), which can wait for blocked signals,
should solve it.

6 years agoAdd support for operating GPIO lines through libgpiod.
Ben Harris [Thu, 22 Nov 2018 23:46:46 +0000 (23:46 +0000)]
Add support for operating GPIO lines through libgpiod.

Untested, since the Raspberry Pi at my disposal doesn't yet have
libgpiod.

6 years agoUse snprintf() in place of sprintf().
Ben Harris [Thu, 22 Nov 2018 23:08:56 +0000 (23:08 +0000)]
Use snprintf() in place of sprintf().

It shouldn't be necessary, but it seems polite.

6 years agoFix need_advance so it can't run off the end.
Ben Harris [Thu, 22 Nov 2018 23:03:00 +0000 (23:03 +0000)]
Fix need_advance so it can't run off the end.

6 years agoFix init_statefile to not use optarg.
Ben Harris [Thu, 22 Nov 2018 22:34:33 +0000 (22:34 +0000)]
Fix init_statefile to not use optarg.

I failed to update it to use a local variable when I moved it out of
init().

6 years agoNote which issue of B 5301 we're referencing.
Ben Harris [Tue, 20 Nov 2018 23:38:33 +0000 (23:38 +0000)]
Note which issue of B 5301 we're referencing.

6 years agoExperimental use of structure literals.
Ben Harris [Sun, 18 Nov 2018 23:04:24 +0000 (23:04 +0000)]
Experimental use of structure literals.

6 years agoError handling for sigset functions.
Ben Harris [Sun, 18 Nov 2018 14:48:42 +0000 (14:48 +0000)]
Error handling for sigset functions.

Yes, they are allowed to return errors.  Even sigemptyset().

6 years agoUtterly minimal Makefile.
Ben Harris [Sun, 18 Nov 2018 12:06:25 +0000 (12:06 +0000)]
Utterly minimal Makefile.

Linux puts timer_* in -lrt, so we need to use that.

6 years agoMake the fallback timer work.
Ben Harris [Sun, 18 Nov 2018 12:04:59 +0000 (12:04 +0000)]
Make the fallback timer work.

It has a null signal handler, which has the side-effect of causing
clock_nanosleep to return EINTR.

6 years agoCorrect error handling for clock_nanosleep().
Ben Harris [Sun, 18 Nov 2018 11:46:50 +0000 (11:46 +0000)]
Correct error handling for clock_nanosleep().

It apparently returns its errors rather than setting errno.

6 years agoRemove a spurious space.
Ben Harris [Sun, 18 Nov 2018 10:48:20 +0000 (10:48 +0000)]
Remove a spurious space.

6 years agoCreate a timer to catch CLOCK_REALTIME going backwards.
Ben Harris [Sun, 18 Nov 2018 10:47:36 +0000 (10:47 +0000)]
Create a timer to catch CLOCK_REALTIME going backwards.

Not used yet: I've spotted a couple of other problems to fix first.

6 years agoBlock SIGINT and SIGTERM while emitting a pulse.
Ben Harris [Sat, 17 Nov 2018 12:33:06 +0000 (12:33 +0000)]
Block SIGINT and SIGTERM while emitting a pulse.

That should ensure that we emit a full pulse and don't either truncate
it or leave the GPIO line high because of those signals.  SIGTERM will
catch a normal shutdown by systemd etc, SIGINT the manual killing of a
foreground process.

6 years agoWith "-s" specified, cope with empty or missing state file.
Ben Harris [Wed, 14 Nov 2018 00:26:35 +0000 (00:26 +0000)]
With "-s" specified, cope with empty or missing state file.

6 years agoImplement reading from state file.
Ben Harris [Sun, 11 Nov 2018 18:24:37 +0000 (18:24 +0000)]
Implement reading from state file.

6 years agoRecord the current time displayed on the dial to a file.
Ben Harris [Sun, 11 Nov 2018 15:54:18 +0000 (15:54 +0000)]
Record the current time displayed on the dial to a file.

This would allow for recovering from a power failure automatically, if
clunk bothered reading the file.

6 years agoBetter references in comments.
Ben Harris [Sun, 11 Nov 2018 14:09:41 +0000 (14:09 +0000)]
Better references in comments.

6 years agoAdjust maxadvance doc to match 1 s advance rate.
Ben Harris [Sun, 11 Nov 2018 12:13:28 +0000 (12:13 +0000)]
Adjust maxadvance doc to match 1 s advance rate.

6 years agoComment on pulse width and adjust advance rate.
Ben Harris [Sun, 11 Nov 2018 01:49:04 +0000 (01:49 +0000)]
Comment on pulse width and adjust advance rate.

Both based on the spec for Post Office clock 26 mark 6.  This
specifies the pulse width (200-500 ms) and the advance rate (one pulse
per second).

6 years agoFactor out code to raise and lower output line from pulse().
Ben Harris [Fri, 9 Nov 2018 18:55:22 +0000 (18:55 +0000)]
Factor out code to raise and lower output line from pulse().

The timing code in pulse is slightly twiddly and will probably be the
same for all output implementations.

6 years agoMake the boundary between ADVANCE and STOP variable at compile time.
Ben Harris [Sat, 3 Nov 2018 23:06:07 +0000 (23:06 +0000)]
Make the boundary between ADVANCE and STOP variable at compile time.

6 years agoAdd an option to specify the current displayed time at startup.
Ben Harris [Sat, 3 Nov 2018 22:25:48 +0000 (22:25 +0000)]
Add an option to specify the current displayed time at startup.

6 years agoStart keeping track of what time we think the clock is displaying.
Ben Harris [Sat, 3 Nov 2018 14:25:04 +0000 (14:25 +0000)]
Start keeping track of what time we think the clock is displaying.

6 years agoCall tzset() explicitly at startup.
Ben Harris [Sat, 3 Nov 2018 11:57:55 +0000 (11:57 +0000)]
Call tzset() explicitly at startup.

It's required in portable code before invoking localtime_r().

6 years agoMake the "pulse" have non-zero width.
Ben Harris [Sat, 3 Nov 2018 11:56:58 +0000 (11:56 +0000)]
Make the "pulse" have non-zero width.

Since I think most impulse clocks advance on the trailing edge of the
pulse, this requires subtracting the pulse width from the wake-up
time.

6 years agoMinimal beginnings of an impulse clock driver.
Ben Harris [Sat, 3 Nov 2018 11:44:05 +0000 (11:44 +0000)]
Minimal beginnings of an impulse clock driver.

Currently says "tick!" every 30 seconds.