A rust library for the CCCB service point display. https://docs.rs/servicepoint/latest/servicepoint/
Find a file
Vinzenz Schroeter 0cded79c56
Some checks failed
Rust / build (pull_request) Failing after 1m6s
accept inexact sizes
2025-05-11 16:46:49 +02:00
.github/workflows do not run clippy on examples and tests in CI 2025-03-25 20:24:01 +01:00
examples add example for own command 2025-05-05 18:42:39 +02:00
src accept inexact sizes 2025-05-11 16:46:49 +02:00
.gitignore add script to generate coverage report 2025-03-25 18:55:17 +01:00
about_display.md move about display section into own file 2024-09-07 12:30:09 +02:00
Cargo.lock version 0.14.1 2025-05-04 11:43:04 +02:00
Cargo.toml add example for own command 2025-05-05 18:42:39 +02:00
CONTRIBUTING.md prepare move to forgejo 2025-02-08 14:52:45 +01:00
flake.lock update dependencies 2025-05-03 11:08:17 +02:00
flake.nix this one is different depending on the rust version 2025-03-25 20:35:41 +01:00
generate-coverage add script to generate coverage report 2025-03-25 18:55:17 +01:00
LICENSE Create LICENSE 2024-05-12 00:10:34 +02:00
README.md version 0.14.1 2025-05-04 11:43:04 +02:00
rustfmt.toml reformat with max width 2024-05-11 23:28:08 +02:00

servicepoint

Release crates.io Crates.io Total Downloads docs.rs GPLv3 licensed CI

In CCCB, there is a big pixel matrix hanging on the wall. It is called "Service Point Display" or "Airport Display".

This crate contains a library for parsing, encoding and sending packets to this display via UDP. The library itself is written in Rust, but can be used from multiple languages via language bindings.

Examples

use std::net::UdpSocket;
// everything you need is in the top-level
use servicepoint::{ClearCommand, UdpSocketExt};

fn main() {
  // this should be the IP of the real display @CCCB
  let destination = "172.23.42.29:2342";

  // establish connection
  let connection = UdpSocket::bind_connect(destination).expect("connection failed");

  // clear screen content using the UdpSocketExt
  connection.send_command(ClearCommand).expect("send failed");
}

More examples are available in the crate. Execute cargo run --example for a list of available examples and cargo run --example <name> to run one.

Installation

cargo add servicepoint

or

[dependencies]
servicepoint = "0.14.1"

Note on stability

This library can be used for creative project or just to play around with the display. A decent coverage by unit tests prevents major problems and I also test this with my own projects, which mostly use up-to-date versions.

That being said, the API is still being worked on. Expect breaking changes with every minor version bump. There should be no breaking changes in patch releases, but there may also be features hiding in those.

All of this means for you: please specify the full version including patch in your Cargo.toml until 1.0 is released.

Release notes are published here, please check them before updating.

Currently, this crate requires Rust v1.70 from June 2023.

Features

This library has multiple optional dependencies. You can choose to (not) include them by toggling the related features.

Name Default Description Dependencies
cp437 true Conversion to and from CP-437 once_cell
compression_lzma true Enable additional compression algorithm rust-lzma
compression_zlib false Enable additional compression algorithm flate2
compression_bzip2 false Enable additional compression algorithm bzip2
compression_zstd false Enable additional compression algorithm zstd
rand false impl Distribution<Brightness> for Standard rand

Es an example, if you only want zlib compression:

[dependencies]
servicepoint = { version = "0.14.1", default-features = false, features = ["compression_zlib"] }

If you are looking at features to minimize binary size: take a look at the tiny_announce-example!

Supported language bindings

Language Support level Repo
.NET (C#) Full servicepoint-binding-csharp contains bindings and a .csproj to reference
C Full servicepoint-binding-c contains a header and a library to link against
Ruby Working servicepoint-binding-ruby contains bindings
Python Unsupported bindings can be generated from servicepoint-binding-uniffi, tested once
Go Unsupported bindings can be generated from servicepoint-binding-uniffi
Kotlin Unsupported bindings can be generated from servicepoint-binding-uniffi
Swift Unsupported bindings can be generated from servicepoint-binding-uniffi

Projects using the library

To add yourself to the list, open a pull request.

You can also check out awesome-servicepoint for a bigger collection of projects, including some not related to this library.

If you have access, there is even more software linked in the wiki.

Some more related projects:

  • cccb-servicepoint-browser: a partial typescript implementation inspired by this library and browser stream
  • arfst23/ServicePoint: a bunch of projects in C that used to use the C bindings
    • a CLI tool to display image files on the display or use the display as a TTY
    • a BSD games robots clone
    • a split-flap-display simulator
    • animations that play on the display

Contributing

You are welcome to contribute, see CONTRIBUTING.md.

History

Move to Forgejo

This project moved to git.berlin.ccc.de/servicepoint/servicepoint. The GitHub repository remains available as a mirror.

What happened to servicepoint2?

servicepoint2 was a fork of servicepoint. Since servicepoint2 has been merged into servicepoint, servicepoint2 did not get any updates.