OSC controlled simple clock
This is a simplistic clock written in go that can be used either as a video out with SDL or as a dedicated clock buidt with a 32x32 pixel hub75 led matrix and a ring of 60 addressable leds.
The clock can be controlled with the depili-clock-8001 companion module: https://github.com/bitfocus/companion-module-depili-clock-8001
Developed in co-operation with Daniel Richert.
Ready made raspberry pi images
SD-card images for raspberry pi can be found at https://kissa.depili.fi/clock-8001/images
- Images with
no_loginin filename are secure without login password
- Images with
clockworkadminhave root login enabled with password
clockworkadmin. They should be considered insecure.
- All image flavors except "bridge-only" contain the hdmi clock.
- By default the clock listens for osc messages on port 1245 and broadcasts osc feedback on the same port
- Images with "bridge" in their name also contain the mitti+millumin translator bridge.
- By default the bridge listens on port 1234 and broadcasts the translated messages to port 1245
The images support raspberry pi 2B / 3B / 3B+ boards. They need at least 64Mb SD-cards. Write them to the card like any other raspberry pi sd-card image.
The image tries to get a dhcp address on wired ethernet and also brings up a virtual interface eth0:1 with static ip (default 192.168.10.245 with 255.255.255.0 netmask).
Customizing the images
You can place the following files on the sd-card FAT partition to customize the installation:
hostnameto change the hostname used by the clock, it is available with "hostname.local" for bonjour / mDNS requests
interfacesa replacement for /etc/network/interfaces for custom network configuration
ntp.conffor custom ntp server configuration
config.systhe normal raspberry pi boot configuration for changing video modes etc.
sdl-clockto update the clock binary with this file
clock_cmd.shis the command line for the clock, it should start with
/root/sdl-clockand be followed by any command line parameters you wish to use for the clock.
clock_bridgeto update the clock bridge binary file
clock_bridge_cmd.shto update the clock bridge command line. It should start with
/root/clock-bridgeand be followed by any command line paramaters for the bridge.
sdl-clock - Output the clock to hdmi on the raspberry pi
You can build the clock binary with
go get gitlab.com/Depili/clock-8001/cmd/sdl_clock. Compiling requires SDL 2 and SDL_GFX 2 libraries. On the raspberry pi the default libraries shipped with rasbian will only output data to X11 window, so for full screen dedicated clock you need to compile the SDL libraries from source. For compiling use
./configure --host=armv7l-raspberry-linux-gnueabihf --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl for config flags.
- Latest from git master: sdl-clock
- Testing builds: https://kissa.depili.fi/clock-8001/testing/
- Tagged releases: https://kissa.depili.fi/clock-8001/releases/
Command line parameters
Usage: sdl-clock [OPTIONS] Application Options: -s Scale to 192x192px -F, --font= Font for event name (default: fonts/7x13.bdf) -r, --red= Red component of text color (default: 255) -g, --green= Green component of text color (default: 128) -b, --blue= Blue component of text color (default: 0) --static-red= Red component of static color (default: 80) --static-green= Green component of static color (default: 80) --static-blue= Blue component of static color (default: 0) --sec-red= Red component of second color (default: 200) --sec-green= Green component of second color (default: 0) --sec-blue= Blue component of second color (default: 0) -p, --time-pin= Pin to select foreign timezone, active low (default: 15) --debug Enable debug output --flash= Flashing interval when countdown reached zero (ms), 0 disables (default: 500) -t, --local-time= Local timezone (default: Europe/Helsinki) --osc-listen= Address to listen for incoming osc messages (default: 0.0.0.0:1245) -d, --timeout= Timeout for OSC message updates in milliseconds (default: 1000) -o, --osc-dest= Address to send OSC feedback to (default: 255.255.255.255:1245) --cd-red= Red component of secondary countdown color (default: 255) --cd-green= Green component of secondary countdown color (default: 0) --cd-blue= Blue component of secondary countdown color (default: 0) --disable-osc Disable OSC control and feedback --disable-feedback Disable OSC feedback Help Options: -h, --help Show this help message
matrix-clock - Dedicated led matrix clock
Bill of materials:
- Raspberry pi
- 32x32 pixel 4mm pixel pitch led matrix
- Led ring with 60 ws2812b leds
- Arduino (nano recommend)
- Adapter hat for the raspberry pi to connect to the led matrix
- 5V 3A power supply
- 12 leds of your choice for the static "hour" markers and current limiting resistors
You need to compile https://gitlab.com/Depili/rpi-matrix for a small program that will listen on udp socket for the led matrix data and handle driving the led matrix.
Compile the led matrix clock binary with
go get gitlab.com/Depili/clock-8001/cmd/clock
- Latest from git master: matrix-clock
clock-bridge: Mitti and Millumin osc-converter
To convert timecodes and video information sent by Mitti or Millumin to commands understood by the clock use
go get gitlab.com/Depili/cmd/clock-bridge. This can also be used to bridge the osc traffic across different networks.
Command line parameters
Usage: clock-clock [OPTIONS] Application Options: --clock-remaining-threshold= Remaining time highlight threshold (default: 20) --millumin-ignore-layer=REGEXP Ignore matching millumin layers (case-insensitive regexp) (default: ignore) --osc-listen= Address to listen for mitti/millumin osc messages (default: 0.0.0.0:1234) --osc-debug qmsk/osc-tally clock client: --clock-client-connect= Address to send clock osc messages to (default: 255.255.255.255:1245) Help Options: -h, --help Show this help message
OSC commands understood by the clock
/clock/tally and /qmsk/clock/count (legacy)
- float32 red component of the text color
- float32 green component of the text color
- float32 blue component of the text color
- string single character symbol to display before the time
- int32 the time, 0-99, will be displayed as two characters
- string single character for the time unit (h, m, s)
Displays up to 4 characters above the main time display for the time specified on the clock -d command line parameter (default 1000ms).
- float32 Red component of the text color
- float32 Green component of the text color
- float32 Blue component of the text color
- string up to 4 characters to display
Starts a countdown timer with the duration from the payload.
- int32 timer duration in seconds
Starts a secondary countdown above the main clock display. This is the same area as is used by the "tally" display. The countdown has lower priority than the tally.
- int32 timer duration in seconds
/clock/countdown/modify & /clock/countdown2/modify
Modifies the duration of running countdown.
- int32 time in seconds to add or substract from the running timer
/clock/countdown/stop & /clock/countdown2/stop
Stops the countdown. The killed countdown will vanish from the clock display. To restore time display issue /clock/normal command.
Starts counting up time.
(Almost) blanks the display. Only the 12 static leds and one led on the ring will be on.
Returns the clock to normal mode displaying current time.
Pauses countdown timer(s).
Resumes countdown timers()
/clock/seconds/off and /clock/seconds/on
Shows or hides the seconds display under the main timer display.
Sets the system time on the clock host. Requires that the clock is running on linux with enough priviledges, which is the default on the raspberry pi images. NTP syncronized time will override time set by this command periodically. To set all clocks in the network to same time use broadcast.
Payload: String in format
01:02:03 where 01 is the hours in 24 hour format, 02 the minutes and 03 the seconds.
The clock sends it's state to the address specified with --osc-dest on
/clock/status message. The payload is:
- int32 clock display mode, 0 = time of day, 1 = countdown, 2 = count up, 3 = off
- string: hours display
- string: minutes display
- string: seconds display
- string: "tally" text
- int32: pause state, 0 = running, 1 = paused
The above fields can be considered as stable, but additional fields are possible, so if possible check that the field count is 6 or more in implementations.