diff --git a/Cargo.lock b/Cargo.lock index 63012a0..41db3cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,17 +187,6 @@ dependencies = [ "wasi", ] -[[package]] -name = "inherent" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c38228f24186d9cc68c729accb4d413be9eaed6ad07ff79e0270d9e56f3de13" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -395,14 +384,13 @@ dependencies = [ [[package]] name = "servicepoint" -version = "0.15.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2800caad491cb44f67e5dd5b8c61ece368eecfe588155d03c7d9864acbad6919" +checksum = "9b04582e916474f1bc1605cad3773262c425d9062b487e49a0df59662f2cca8d" dependencies = [ "bitvec", "bzip2", "flate2", - "inherent", "log", "once_cell", "rust-lzma", diff --git a/Cargo.toml b/Cargo.toml index f6bef14..cd9619c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ keywords = ["cccb", "cccb-servicepoint", "cbindgen"] crate-type = ["staticlib", "cdylib", "rlib"] [dependencies.servicepoint] -version = "0.15.1" +version = "0.16.0" default-features = false [dependencies.env_logger] diff --git a/README.md b/README.md index fa0a49b..10f3193 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # servicepoint_binding_c -[![Release](https://git.berlin.ccc.de/servicepoint/servicepoint_binding_c/badges/release.svg)](https://git.berlin.ccc.de/servicepoint/servicepoint_binding_c/releases) +[![Release](https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c/badges/release.svg)](https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c/releases) [![crates.io](https://img.shields.io/crates/v/servicepoint_binding_c.svg)](https://crates.io/crates/servicepoint) [![Crates.io Total Downloads](https://img.shields.io/crates/d/servicepoint_binding_c)](https://crates.io/crates/servicepoint) [![docs.rs](https://img.shields.io/docsrs/servicepoint_binding_c)](https://docs.rs/servicepoint/latest/servicepoint/) [![GPLv3 licensed](https://img.shields.io/crates/l/servicepoint_binding_c)](./LICENSE) -[![CI](https://git.berlin.ccc.de/servicepoint/servicepoint_binding_c/badges/workflows/rust.yml/badge.svg)](https://git.berlin.ccc.de/servicepoint/servicepoint_binding_c) +[![CI](https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c/badges/workflows/rust.yml/badge.svg)](https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c) In [CCCB](https://berlin.ccc.de/), there is a big pixel matrix hanging on the wall. It is called "Service Point Display" or "Airport Display". @@ -19,18 +19,22 @@ This crate contains C bindings for the [servicepoint](https://git.berlin.ccc.de/ #include "servicepoint.h" int main(void) { - SPConnection *connection = sp_connection_open("172.23.42.29:2342"); + UdpSocket *connection = sp_udp_socket_open("172.23.42.29:2342"); if (connection == NULL) return 1; - SPBitmap *pixels = sp_bitmap_new(SP_PIXEL_WIDTH, SP_PIXEL_HEIGHT); + Bitmap *pixels = sp_bitmap_new(PIXEL_WIDTH, PIXEL_HEIGHT); sp_bitmap_fill(pixels, true); - SPCommand *command = sp_command_bitmap_linear_win(0, 0, pixels, Uncompressed); - while (sp_connection_send_command(connection, sp_command_clone(command))); + BitmapCommand *command = sp_bitmap_command_new(pixels, 0, 0, COMPRESSION_CODE_LZMA); + Packet *packet = sp_bitmap_command_try_into_packet(command); + if (packet == NULL) + return 1; + + if (!sp_udp_socket_send_packet(connection, packet)) + return 1; - sp_command_free(command); - sp_connection_free(connection); + sp_udp_socket_free(connection); return 0; } ``` @@ -41,7 +45,9 @@ A full example including Makefile is available as part of this crate. This library is still in early development. You can absolutely use it, and it works, but expect minor breaking changes with every version bump. -Please specify the full version including patch in your Cargo.toml until 1.0 is released. +Pin a specific version until 1.0 is released. + +Release notes are published [here](https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c/releases). ## Installation @@ -77,6 +83,9 @@ When linked dynamically, you have to provide the `cdylib` at runtime in the _sam guarantees yet. The Makefile in the example directory contains a bunch of additional compiler flags you might want to add depending on your use case. +The nix flake provides a package for referencing in your flake. +The package provides a pkg-config file for automatic linking. + ## Notes on differences to rust library - function names are: `sp_` \ \. diff --git a/example/Makefile b/example/Makefile index 15e53d1..a3c0df4 100644 --- a/example/Makefile +++ b/example/Makefile @@ -96,7 +96,7 @@ endif # ADD NEW EXAMPLES HERE _c_src := src/announce.c src/brightness_tester.c src/header_logger.c \ - src/moving_line.c src/random_stuff.c src/wiping_clear.c src/undefined.c + src/moving_line.c src/random_stuff.c src/wiping_clear.c src/undefined.c src/flut.c _programs := $(basename $(notdir $(_c_src))) _bins := $(_programs) _unstripped_bins := $(addsuffix _unstripped, $(_bins)) diff --git a/example/src/flut.c b/example/src/flut.c new file mode 100644 index 0000000..9f7534f --- /dev/null +++ b/example/src/flut.c @@ -0,0 +1,33 @@ +#include +#include +#include "servicepoint.h" + +volatile bool aborted = false; + +void handle_sigint(int sig) { + (void)sig; // suppress unused warning + aborted = true; +} + +int main(void) { + UdpSocket *connection = sp_udp_socket_open("172.23.42.29:2342"); + if (connection == NULL) + return 1; + + Bitmap *pixels = sp_bitmap_new(PIXEL_WIDTH, PIXEL_HEIGHT); + sp_bitmap_fill(pixels, true); + + BitmapCommand *command = sp_bitmap_command_new(pixels, 0, 0, COMPRESSION_CODE_LZMA); + Packet *packet = sp_bitmap_command_try_into_packet(command); + + signal(SIGINT, handle_sigint); + size_t packets_sent = 0; + while (!aborted && sp_udp_socket_send_packet(connection, sp_packet_clone(packet))) { + ++packets_sent; + } + + printf("packets sent: %zu\n", packets_sent); + sp_packet_free(packet); + sp_udp_socket_free(connection); + return 0; +} diff --git a/src/containers/bitmap.rs b/src/containers/bitmap.rs index 5974016..8bfb6eb 100644 --- a/src/containers/bitmap.rs +++ b/src/containers/bitmap.rs @@ -1,7 +1,7 @@ use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ Bitmap, BitmapCommand, CompressionCode, DataRef, DisplayBitVec, Grid, - Origin, Packet, + GridMut, Origin, Packet, }; use std::ptr::NonNull; diff --git a/src/containers/brightness_grid.rs b/src/containers/brightness_grid.rs index 3b3fabb..e269ced 100644 --- a/src/containers/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -1,7 +1,7 @@ use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ Brightness, BrightnessGrid, BrightnessGridCommand, ByteGrid, DataRef, Grid, - Origin, Packet, + GridMut, Origin, Packet, }; use std::{mem::transmute, ptr::NonNull}; diff --git a/src/containers/char_grid.rs b/src/containers/char_grid.rs index 8946b50..bfc3119 100644 --- a/src/containers/char_grid.rs +++ b/src/containers/char_grid.rs @@ -1,5 +1,5 @@ use crate::{containers::ByteSlice, macros::wrap}; -use servicepoint::{CharGrid, CharGridCommand, Grid, Origin, Packet}; +use servicepoint::{CharGrid, CharGridCommand, Grid, GridMut, Origin, Packet}; use std::ptr::NonNull; wrap! { @@ -25,8 +25,9 @@ wrap! { /// Loads a [CharGrid] with the specified dimensions from the provided data. /// /// returns: new CharGrid or NULL in case of an error - fn load(width: val usize, height: val usize, data: slice ByteSlice) -> move_ok *mut CharGrid { - CharGrid::load_utf8(width, height, data.to_vec()) + fn load(width: val usize, height: val usize, data: slice ByteSlice) -> move_some *mut CharGrid { + String::from_utf8(data.to_vec()).ok() + .and_then(|s| CharGrid::load(width, height, &*s.chars().collect::>())) }; methods: /// Returns the current value at the specified position. diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index b67d1ae..1c4e729 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -1,6 +1,6 @@ use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ - Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet, + Cp437Grid, Cp437GridCommand, DataRef, Grid, GridMut, Origin, Packet, }; use std::ptr::NonNull;