diff --git a/crates/servicepoint_binding_cs/ServicePoint/BindGen/ServicePoint.g.cs b/crates/servicepoint_binding_cs/ServicePoint/BindGen/ServicePoint.g.cs
index 2b5f14e..c8bb0a2 100644
--- a/crates/servicepoint_binding_cs/ServicePoint/BindGen/ServicePoint.g.cs
+++ b/crates/servicepoint_binding_cs/ServicePoint/BindGen/ServicePoint.g.cs
@@ -14,124 +14,261 @@ namespace ServicePoint.BindGen
{
const string __DllName = "servicepoint_binding_c";
- public const nuint SP_TILE_SIZE = 8;
- public const nuint SP_TILE_WIDTH = 56;
- public const nuint SP_TILE_HEIGHT = 20;
public const byte SP_BRIGHTNESS_MIN = 0;
public const byte SP_BRIGHTNESS_MAX = 11;
public const byte SP_BRIGHTNESS_LEVELS = 12;
+ public const nuint SP_TILE_SIZE = 8;
+ public const nuint SP_TILE_WIDTH = 56;
+ public const nuint SP_TILE_HEIGHT = 20;
///
- /// Creates a new instance of [SPConnection].
+ /// Creates a new [SPBitmap] with the specified dimensions.
///
- /// returns: NULL if connection fails, or connected instance
+ /// # Arguments
+ ///
+ /// - `width`: size in pixels in x-direction
+ /// - `height`: size in pixels in y-direction
+ ///
+ /// returns: [SPBitmap] initialized to all pixels off. Will never return NULL.
///
/// # Panics
///
- /// - when `host` is null or an invalid host
+ /// - when the width is not dividable by 8
///
/// # Safety
///
/// The caller has to make sure that:
///
/// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_connection_free`.
+ /// by explicitly calling `sp_bitmap_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_connection_open", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Connection* sp_connection_open(byte* host);
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_new", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Bitmap* sp_bitmap_new(nuint width, nuint height);
///
- /// Sends a [SPPacket] to the display using the [SPConnection].
+ /// Loads a [SPBitmap] with the specified dimensions from the provided data.
///
- /// The passed `packet` gets consumed.
+ /// # Arguments
///
- /// returns: true in case of success
+ /// - `width`: size in pixels in x-direction
+ /// - `height`: size in pixels in y-direction
+ ///
+ /// returns: [SPBitmap] that contains a copy of the provided data. Will never return NULL.
///
/// # Panics
///
- /// - when `connection` is NULL
- /// - when `packet` is NULL
+ /// - when `data` is NULL
+ /// - when the dimensions and data size do not match exactly.
+ /// - when the width is not dividable by 8
///
/// # Safety
///
/// The caller has to make sure that:
///
- /// - `connection` points to a valid instance of [SPConnection]
- /// - `packet` points to a valid instance of [SPPacket]
- /// - `packet` is not used concurrently or after this call
+ /// - `data` points to a valid memory location of at least `data_length` bytes in size.
+ /// - the returned instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_bitmap_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_connection_send_packet", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.U1)]
- public static extern bool sp_connection_send_packet(Connection* connection, Packet* packet);
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Bitmap* sp_bitmap_load(nuint width, nuint height, byte* data, nuint data_length);
///
- /// Sends a [SPCommand] to the display using the [SPConnection].
- ///
- /// The passed `command` gets consumed.
- ///
- /// returns: true in case of success
- ///
- /// # Panics
- ///
- /// - when `connection` is NULL
- /// - when `command` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `connection` points to a valid instance of [SPConnection]
- /// - `command` points to a valid instance of [SPPacket]
- /// - `command` is not used concurrently or after this call
- ///
- [DllImport(__DllName, EntryPoint = "sp_connection_send_command", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.U1)]
- public static extern bool sp_connection_send_command(Connection* connection, Command* command);
-
- ///
- /// Closes and deallocates a [SPConnection].
- ///
- /// # Panics
- ///
- /// - when `connection` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `connection` points to a valid [SPConnection]
- /// - `connection` is not used concurrently or after this call
- ///
- [DllImport(__DllName, EntryPoint = "sp_connection_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_connection_free(Connection* connection);
-
- ///
- /// Turns a [SPCommand] into a [SPPacket].
- /// The [SPCommand] gets consumed.
+ /// Clones a [SPBitmap].
///
/// Will never return NULL.
///
/// # Panics
///
- /// - when `command` is NULL
+ /// - when `bitmap` is NULL
///
/// # Safety
///
/// The caller has to make sure that:
///
- /// - [SPCommand] points to a valid instance of [SPCommand]
- /// - [SPCommand] is not used concurrently or after this call
- /// - the returned [SPPacket] instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_packet_free`.
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - `bitmap` is not written to concurrently
+ /// - the returned instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_bitmap_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_packet_from_command", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Packet* sp_packet_from_command(Command* command);
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Bitmap* sp_bitmap_clone(Bitmap* bitmap);
///
- /// Tries to load a [SPPacket] from the passed array with the specified length.
+ /// Deallocates a [SPBitmap].
///
- /// returns: NULL in case of an error, pointer to the allocated packet otherwise
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - `bitmap` is not used concurrently or after bitmap call
+ /// - `bitmap` was not passed to another consuming function, e.g. to create a [SPCommand]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitmap_free(Bitmap* bitmap);
+
+ ///
+ /// Gets the current value at the specified position in the [SPBitmap].
+ ///
+ /// # Arguments
+ ///
+ /// - `bitmap`: instance to read from
+ /// - `x` and `y`: position of the cell to read
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ /// - when accessing `x` or `y` out of bounds
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - `bitmap` is not written to concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ [return: MarshalAs(UnmanagedType.U1)]
+ public static extern bool sp_bitmap_get(Bitmap* bitmap, nuint x, nuint y);
+
+ ///
+ /// Sets the value of the specified position in the [SPBitmap].
+ ///
+ /// # Arguments
+ ///
+ /// - `bitmap`: instance to write to
+ /// - `x` and `y`: position of the cell
+ /// - `value`: the value to write to the cell
+ ///
+ /// returns: old value of the cell
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ /// - when accessing `x` or `y` out of bounds
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - `bitmap` is not written to or read from concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_set", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitmap_set(Bitmap* bitmap, nuint x, nuint y, [MarshalAs(UnmanagedType.U1)] bool value);
+
+ ///
+ /// Sets the state of all pixels in the [SPBitmap].
+ ///
+ /// # Arguments
+ ///
+ /// - `bitmap`: instance to write to
+ /// - `value`: the value to set all pixels to
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - `bitmap` is not written to or read from concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_fill", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitmap_fill(Bitmap* bitmap, [MarshalAs(UnmanagedType.U1)] bool value);
+
+ ///
+ /// Gets the width in pixels of the [SPBitmap] instance.
+ ///
+ /// # Arguments
+ ///
+ /// - `bitmap`: instance to read from
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_width", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern nuint sp_bitmap_width(Bitmap* bitmap);
+
+ ///
+ /// Gets the height in pixels of the [SPBitmap] instance.
+ ///
+ /// # Arguments
+ ///
+ /// - `bitmap`: instance to read from
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_height", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern nuint sp_bitmap_height(Bitmap* bitmap);
+
+ ///
+ /// Gets an unsafe reference to the data of the [SPBitmap] instance.
+ ///
+ /// # Panics
+ ///
+ /// - when `bitmap` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bitmap` points to a valid [SPBitmap]
+ /// - the returned memory range is never accessed after the passed [SPBitmap] has been freed
+ /// - the returned memory range is never accessed concurrently, either via the [SPBitmap] or directly
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitmap_unsafe_data_ref", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern ByteSlice sp_bitmap_unsafe_data_ref(Bitmap* bitmap);
+
+ ///
+ /// Creates a new [SPBitVec] instance.
+ ///
+ /// # Arguments
+ ///
+ /// - `size`: size in bits.
+ ///
+ /// returns: [SPBitVec] with all bits set to false. Will never return NULL.
+ ///
+ /// # Panics
+ ///
+ /// - when `size` is not divisible by 8.
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - the returned instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_bitvec_free`.
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_new", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern BitVec* sp_bitvec_new(nuint size);
+
+ ///
+ /// Interpret the data as a series of bits and load then into a new [SPBitVec] instance.
+ ///
+ /// returns: [SPBitVec] instance containing data. Will never return NULL.
///
/// # Panics
///
@@ -141,51 +278,187 @@ namespace ServicePoint.BindGen
///
/// The caller has to make sure that:
///
- /// - `data` points to a valid memory region of at least `length` bytes
- /// - `data` is not written to concurrently
- /// - the returned [SPPacket] instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_packet_free`.
- ///
- [DllImport(__DllName, EntryPoint = "sp_packet_try_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Packet* sp_packet_try_load(byte* data, nuint length);
-
- ///
- /// Clones a [SPPacket].
- ///
- /// Will never return NULL.
- ///
- /// # Panics
- ///
- /// - when `packet` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `packet` points to a valid [SPPacket]
- /// - `packet` is not written to concurrently
+ /// - `data` points to a valid memory location of at least `data_length`
+ /// bytes in size.
/// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_packet_free`.
+ /// by explicitly calling `sp_bitvec_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_packet_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Packet* sp_packet_clone(Packet* packet);
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern BitVec* sp_bitvec_load(byte* data, nuint data_length);
///
- /// Deallocates a [SPPacket].
+ /// Clones a [SPBitVec].
+ ///
+ /// returns: new [SPBitVec] instance. Will never return NULL.
///
/// # Panics
///
- /// - when `sp_packet_free` is NULL
+ /// - when `bit_vec` is NULL
///
/// # Safety
///
/// The caller has to make sure that:
///
- /// - `packet` points to a valid [SPPacket]
- /// - `packet` is not used concurrently or after this call
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - `bit_vec` is not written to concurrently
+ /// - the returned instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_bitvec_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_packet_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_packet_free(Packet* packet);
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern BitVec* sp_bitvec_clone(BitVec* bit_vec);
+
+ ///
+ /// Deallocates a [SPBitVec].
+ ///
+ /// # Panics
+ ///
+ /// - when `but_vec` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - `bit_vec` is not used concurrently or after this call
+ /// - `bit_vec` was not passed to another consuming function, e.g. to create a [SPCommand]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitvec_free(BitVec* bit_vec);
+
+ ///
+ /// Gets the value of a bit from the [SPBitVec].
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to read from
+ /// - `index`: the bit index to read
+ ///
+ /// returns: value of the bit
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ /// - when accessing `index` out of bounds
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - `bit_vec` is not written to concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ [return: MarshalAs(UnmanagedType.U1)]
+ public static extern bool sp_bitvec_get(BitVec* bit_vec, nuint index);
+
+ ///
+ /// Sets the value of a bit in the [SPBitVec].
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to write to
+ /// - `index`: the bit index to edit
+ /// - `value`: the value to set the bit to
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ /// - when accessing `index` out of bounds
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - `bit_vec` is not written to or read from concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_set", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitvec_set(BitVec* bit_vec, nuint index, [MarshalAs(UnmanagedType.U1)] bool value);
+
+ ///
+ /// Sets the value of all bits in the [SPBitVec].
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to write to
+ /// - `value`: the value to set all bits to
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - `bit_vec` is not written to or read from concurrently
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_fill", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_bitvec_fill(BitVec* bit_vec, [MarshalAs(UnmanagedType.U1)] bool value);
+
+ ///
+ /// Gets the length of the [SPBitVec] in bits.
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to write to
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_len", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern nuint sp_bitvec_len(BitVec* bit_vec);
+
+ ///
+ /// Returns true if length is 0.
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to write to
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_is_empty", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ [return: MarshalAs(UnmanagedType.U1)]
+ public static extern bool sp_bitvec_is_empty(BitVec* bit_vec);
+
+ ///
+ /// Gets an unsafe reference to the data of the [SPBitVec] instance.
+ ///
+ /// # Arguments
+ ///
+ /// - `bit_vec`: instance to write to
+ ///
+ /// # Panics
+ ///
+ /// - when `bit_vec` is NULL
+ ///
+ /// ## Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `bit_vec` points to a valid [SPBitVec]
+ /// - the returned memory range is never accessed after the passed [SPBitVec] has been freed
+ /// - the returned memory range is never accessed concurrently, either via the [SPBitVec] or directly
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_bitvec_unsafe_data_ref", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern ByteSlice sp_bitvec_unsafe_data_ref(BitVec* bit_vec);
///
/// Creates a new [SPBrightnessGrid] with the specified dimensions.
@@ -414,226 +687,6 @@ namespace ServicePoint.BindGen
[DllImport(__DllName, EntryPoint = "sp_brightness_grid_unsafe_data_ref", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern ByteSlice sp_brightness_grid_unsafe_data_ref(BrightnessGrid* brightness_grid);
- ///
- /// Creates a new [SPBitmap] with the specified dimensions.
- ///
- /// # Arguments
- ///
- /// - `width`: size in pixels in x-direction
- /// - `height`: size in pixels in y-direction
- ///
- /// returns: [SPBitmap] initialized to all pixels off. Will never return NULL.
- ///
- /// # Panics
- ///
- /// - when the width is not dividable by 8
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitmap_free`.
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_new", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Bitmap* sp_bitmap_new(nuint width, nuint height);
-
- ///
- /// Loads a [SPBitmap] with the specified dimensions from the provided data.
- ///
- /// # Arguments
- ///
- /// - `width`: size in pixels in x-direction
- /// - `height`: size in pixels in y-direction
- ///
- /// returns: [SPBitmap] that contains a copy of the provided data. Will never return NULL.
- ///
- /// # Panics
- ///
- /// - when `data` is NULL
- /// - when the dimensions and data size do not match exactly.
- /// - when the width is not dividable by 8
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `data` points to a valid memory location of at least `data_length` bytes in size.
- /// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitmap_free`.
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Bitmap* sp_bitmap_load(nuint width, nuint height, byte* data, nuint data_length);
-
- ///
- /// Clones a [SPBitmap].
- ///
- /// Will never return NULL.
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - `bitmap` is not written to concurrently
- /// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitmap_free`.
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern Bitmap* sp_bitmap_clone(Bitmap* bitmap);
-
- ///
- /// Deallocates a [SPBitmap].
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - `bitmap` is not used concurrently or after bitmap call
- /// - `bitmap` was not passed to another consuming function, e.g. to create a [SPCommand]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitmap_free(Bitmap* bitmap);
-
- ///
- /// Gets the current value at the specified position in the [SPBitmap].
- ///
- /// # Arguments
- ///
- /// - `bitmap`: instance to read from
- /// - `x` and `y`: position of the cell to read
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- /// - when accessing `x` or `y` out of bounds
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - `bitmap` is not written to concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.U1)]
- public static extern bool sp_bitmap_get(Bitmap* bitmap, nuint x, nuint y);
-
- ///
- /// Sets the value of the specified position in the [SPBitmap].
- ///
- /// # Arguments
- ///
- /// - `bitmap`: instance to write to
- /// - `x` and `y`: position of the cell
- /// - `value`: the value to write to the cell
- ///
- /// returns: old value of the cell
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- /// - when accessing `x` or `y` out of bounds
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - `bitmap` is not written to or read from concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_set", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitmap_set(Bitmap* bitmap, nuint x, nuint y, [MarshalAs(UnmanagedType.U1)] bool value);
-
- ///
- /// Sets the state of all pixels in the [SPBitmap].
- ///
- /// # Arguments
- ///
- /// - `bitmap`: instance to write to
- /// - `value`: the value to set all pixels to
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - `bitmap` is not written to or read from concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_fill", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitmap_fill(Bitmap* bitmap, [MarshalAs(UnmanagedType.U1)] bool value);
-
- ///
- /// Gets the width in pixels of the [SPBitmap] instance.
- ///
- /// # Arguments
- ///
- /// - `bitmap`: instance to read from
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_width", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern nuint sp_bitmap_width(Bitmap* bitmap);
-
- ///
- /// Gets the height in pixels of the [SPBitmap] instance.
- ///
- /// # Arguments
- ///
- /// - `bitmap`: instance to read from
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_height", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern nuint sp_bitmap_height(Bitmap* bitmap);
-
- ///
- /// Gets an unsafe reference to the data of the [SPBitmap] instance.
- ///
- /// # Panics
- ///
- /// - when `bitmap` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bitmap` points to a valid [SPBitmap]
- /// - the returned memory range is never accessed after the passed [SPBitmap] has been freed
- /// - the returned memory range is never accessed concurrently, either via the [SPBitmap] or directly
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitmap_unsafe_data_ref", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern ByteSlice sp_bitmap_unsafe_data_ref(Bitmap* bitmap);
-
///
/// Tries to turn a [SPPacket] into a [SPCommand].
///
@@ -969,6 +1022,90 @@ namespace ServicePoint.BindGen
[DllImport(__DllName, EntryPoint = "sp_command_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern void sp_command_free(Command* command);
+ ///
+ /// Creates a new instance of [SPConnection].
+ ///
+ /// returns: NULL if connection fails, or connected instance
+ ///
+ /// # Panics
+ ///
+ /// - when `host` is null or an invalid host
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - the returned instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_connection_free`.
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_connection_open", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Connection* sp_connection_open(byte* host);
+
+ ///
+ /// Sends a [SPPacket] to the display using the [SPConnection].
+ ///
+ /// The passed `packet` gets consumed.
+ ///
+ /// returns: true in case of success
+ ///
+ /// # Panics
+ ///
+ /// - when `connection` is NULL
+ /// - when `packet` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `connection` points to a valid instance of [SPConnection]
+ /// - `packet` points to a valid instance of [SPPacket]
+ /// - `packet` is not used concurrently or after this call
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_connection_send_packet", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ [return: MarshalAs(UnmanagedType.U1)]
+ public static extern bool sp_connection_send_packet(Connection* connection, Packet* packet);
+
+ ///
+ /// Sends a [SPCommand] to the display using the [SPConnection].
+ ///
+ /// The passed `command` gets consumed.
+ ///
+ /// returns: true in case of success
+ ///
+ /// # Panics
+ ///
+ /// - when `connection` is NULL
+ /// - when `command` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `connection` points to a valid instance of [SPConnection]
+ /// - `command` points to a valid instance of [SPPacket]
+ /// - `command` is not used concurrently or after this call
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_connection_send_command", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ [return: MarshalAs(UnmanagedType.U1)]
+ public static extern bool sp_connection_send_command(Connection* connection, Command* command);
+
+ ///
+ /// Closes and deallocates a [SPConnection].
+ ///
+ /// # Panics
+ ///
+ /// - when `connection` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `connection` points to a valid [SPConnection]
+ /// - `connection` is not used concurrently or after this call
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_connection_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_connection_free(Connection* connection);
+
///
/// Creates a new [SPCp437Grid] with the specified dimensions.
///
@@ -1177,32 +1314,31 @@ namespace ServicePoint.BindGen
public static extern ByteSlice sp_cp437_grid_unsafe_data_ref(Cp437Grid* cp437_grid);
///
- /// Creates a new [SPBitVec] instance.
+ /// Turns a [SPCommand] into a [SPPacket].
+ /// The [SPCommand] gets consumed.
///
- /// # Arguments
- ///
- /// - `size`: size in bits.
- ///
- /// returns: [SPBitVec] with all bits set to false. Will never return NULL.
+ /// Will never return NULL.
///
/// # Panics
///
- /// - when `size` is not divisible by 8.
+ /// - when `command` is NULL
///
/// # Safety
///
/// The caller has to make sure that:
///
- /// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitvec_free`.
+ /// - [SPCommand] points to a valid instance of [SPCommand]
+ /// - [SPCommand] is not used concurrently or after this call
+ /// - the returned [SPPacket] instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_packet_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_new", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern BitVec* sp_bitvec_new(nuint size);
+ [DllImport(__DllName, EntryPoint = "sp_packet_from_command", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Packet* sp_packet_from_command(Command* command);
///
- /// Interpret the data as a series of bits and load then into a new [SPBitVec] instance.
+ /// Tries to load a [SPPacket] from the passed array with the specified length.
///
- /// returns: [SPBitVec] instance containing data. Will never return NULL.
+ /// returns: NULL in case of an error, pointer to the allocated packet otherwise
///
/// # Panics
///
@@ -1212,191 +1348,70 @@ namespace ServicePoint.BindGen
///
/// The caller has to make sure that:
///
- /// - `data` points to a valid memory location of at least `data_length`
- /// bytes in size.
+ /// - `data` points to a valid memory region of at least `length` bytes
+ /// - `data` is not written to concurrently
+ /// - the returned [SPPacket] instance is freed in some way, either by using a consuming function or
+ /// by explicitly calling `sp_packet_free`.
+ ///
+ [DllImport(__DllName, EntryPoint = "sp_packet_try_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Packet* sp_packet_try_load(byte* data, nuint length);
+
+ ///
+ /// Clones a [SPPacket].
+ ///
+ /// Will never return NULL.
+ ///
+ /// # Panics
+ ///
+ /// - when `packet` is NULL
+ ///
+ /// # Safety
+ ///
+ /// The caller has to make sure that:
+ ///
+ /// - `packet` points to a valid [SPPacket]
+ /// - `packet` is not written to concurrently
/// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitvec_free`.
+ /// by explicitly calling `sp_packet_free`.
///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_load", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern BitVec* sp_bitvec_load(byte* data, nuint data_length);
+ [DllImport(__DllName, EntryPoint = "sp_packet_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern Packet* sp_packet_clone(Packet* packet);
///
- /// Clones a [SPBitVec].
- ///
- /// returns: new [SPBitVec] instance. Will never return NULL.
+ /// Deallocates a [SPPacket].
///
/// # Panics
///
- /// - when `bit_vec` is NULL
+ /// - when `sp_packet_free` is NULL
///
/// # Safety
///
/// The caller has to make sure that:
///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - `bit_vec` is not written to concurrently
- /// - the returned instance is freed in some way, either by using a consuming function or
- /// by explicitly calling `sp_bitvec_free`.
+ /// - `packet` points to a valid [SPPacket]
+ /// - `packet` is not used concurrently or after this call
///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_clone", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern BitVec* sp_bitvec_clone(BitVec* bit_vec);
-
- ///
- /// Deallocates a [SPBitVec].
- ///
- /// # Panics
- ///
- /// - when `but_vec` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - `bit_vec` is not used concurrently or after this call
- /// - `bit_vec` was not passed to another consuming function, e.g. to create a [SPCommand]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitvec_free(BitVec* bit_vec);
-
- ///
- /// Gets the value of a bit from the [SPBitVec].
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to read from
- /// - `index`: the bit index to read
- ///
- /// returns: value of the bit
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- /// - when accessing `index` out of bounds
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - `bit_vec` is not written to concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.U1)]
- public static extern bool sp_bitvec_get(BitVec* bit_vec, nuint index);
-
- ///
- /// Sets the value of a bit in the [SPBitVec].
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to write to
- /// - `index`: the bit index to edit
- /// - `value`: the value to set the bit to
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- /// - when accessing `index` out of bounds
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - `bit_vec` is not written to or read from concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_set", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitvec_set(BitVec* bit_vec, nuint index, [MarshalAs(UnmanagedType.U1)] bool value);
-
- ///
- /// Sets the value of all bits in the [SPBitVec].
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to write to
- /// - `value`: the value to set all bits to
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - `bit_vec` is not written to or read from concurrently
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_fill", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern void sp_bitvec_fill(BitVec* bit_vec, [MarshalAs(UnmanagedType.U1)] bool value);
-
- ///
- /// Gets the length of the [SPBitVec] in bits.
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to write to
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_len", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern nuint sp_bitvec_len(BitVec* bit_vec);
-
- ///
- /// Returns true if length is 0.
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to write to
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- ///
- /// # Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_is_empty", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- [return: MarshalAs(UnmanagedType.U1)]
- public static extern bool sp_bitvec_is_empty(BitVec* bit_vec);
-
- ///
- /// Gets an unsafe reference to the data of the [SPBitVec] instance.
- ///
- /// # Arguments
- ///
- /// - `bit_vec`: instance to write to
- ///
- /// # Panics
- ///
- /// - when `bit_vec` is NULL
- ///
- /// ## Safety
- ///
- /// The caller has to make sure that:
- ///
- /// - `bit_vec` points to a valid [SPBitVec]
- /// - the returned memory range is never accessed after the passed [SPBitVec] has been freed
- /// - the returned memory range is never accessed concurrently, either via the [SPBitVec] or directly
- ///
- [DllImport(__DllName, EntryPoint = "sp_bitvec_unsafe_data_ref", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
- public static extern ByteSlice sp_bitvec_unsafe_data_ref(BitVec* bit_vec);
+ [DllImport(__DllName, EntryPoint = "sp_packet_free", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+ public static extern void sp_packet_free(Packet* packet);
}
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe partial struct Bitmap
+ {
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe partial struct BitVec
+ {
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe partial struct BrightnessGrid
+ {
+ }
+
[StructLayout(LayoutKind.Sequential)]
public unsafe partial struct ByteSlice
{
@@ -1404,38 +1419,23 @@ namespace ServicePoint.BindGen
public nuint length;
}
- [StructLayout(LayoutKind.Sequential)]
- public unsafe partial struct Connection
- {
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public unsafe partial struct Packet
- {
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public unsafe partial struct BrightnessGrid
- {
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public unsafe partial struct Bitmap
- {
- }
-
[StructLayout(LayoutKind.Sequential)]
public unsafe partial struct Command
{
}
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe partial struct Connection
+ {
+ }
+
[StructLayout(LayoutKind.Sequential)]
public unsafe partial struct Cp437Grid
{
}
[StructLayout(LayoutKind.Sequential)]
- public unsafe partial struct BitVec
+ public unsafe partial struct Packet
{
}
diff --git a/crates/servicepoint_binding_cs/build.rs b/crates/servicepoint_binding_cs/build.rs
index 5287698..8caf589 100644
--- a/crates/servicepoint_binding_cs/build.rs
+++ b/crates/servicepoint_binding_cs/build.rs
@@ -8,8 +8,12 @@ fn main() {
let mut builder = csbindgen::Builder::default();
- for source in fs::read_dir("../servicepoint_binding_c/src").unwrap() {
- let path = source.unwrap().path();
+ let mut paths = fs::read_dir("../servicepoint_binding_c/src").unwrap()
+ .map(|x| x.unwrap().path())
+ .collect::>();
+ paths.sort();
+
+ for path in paths {
println!("cargo:rerun-if-changed={}", path.display());
builder = builder.input_extern_file(path);
}