diff --git a/cbindgen.toml b/cbindgen.toml index 3f619ed..29c19a8 100644 --- a/cbindgen.toml +++ b/cbindgen.toml @@ -25,6 +25,7 @@ sort_by = "Name" [parse] parse_deps = true include = ["servicepoint"] +extra_bindings = ["servicepoint"] [parse.expand] features = ["full"] diff --git a/example/main.c b/example/main.c index 388218e..80a1756 100644 --- a/example/main.c +++ b/example/main.c @@ -6,13 +6,13 @@ int main(void) { if (connection == NULL) return 1; - Bitmap *pixels = sp_bitmap_new(SP_PIXEL_WIDTH, SP_PIXEL_HEIGHT); + Bitmap *pixels = sp_bitmap_new(PIXEL_WIDTH, PIXEL_HEIGHT); if (pixels == NULL) return 1; sp_bitmap_fill(pixels, true); - Command *command = sp_command_bitmap_linear_win(0, 0, pixels, SP_COMPRESSION_CODE_UNCOMPRESSED); + Command *command = sp_command_bitmap_linear_win(0, 0, pixels, COMPRESSION_CODE_UNCOMPRESSED); if (command == NULL) return 1; diff --git a/include/servicepoint.h b/include/servicepoint.h index 1de6cc5..63c1179 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -8,6 +8,35 @@ #include #include +/** + * pixel count on whole screen + */ +#define PIXEL_COUNT (PIXEL_WIDTH * PIXEL_HEIGHT) + +/** + * Display height in pixels + * + * # Examples + * + * ```rust + * # use servicepoint::{PIXEL_HEIGHT, PIXEL_WIDTH, Bitmap}; + * let grid = Bitmap::new(PIXEL_WIDTH, PIXEL_HEIGHT); + * ``` + */ +#define PIXEL_HEIGHT (TILE_HEIGHT * TILE_SIZE) + +/** + * Display width in pixels + * + * # Examples + * + * ```rust + * # use servicepoint::{PIXEL_HEIGHT, PIXEL_WIDTH, Bitmap}; + * let grid = Bitmap::new(PIXEL_WIDTH, PIXEL_HEIGHT); + * ``` + */ +#define PIXEL_WIDTH (TILE_WIDTH * TILE_SIZE) + /** * Count of possible brightness values */ @@ -23,40 +52,60 @@ */ #define SP_BRIGHTNESS_MIN 0 -/** - * pixel count on whole screen - */ -#define SP_PIXEL_COUNT (SP_PIXEL_WIDTH * SP_PIXEL_HEIGHT) - -/** - * Display height in pixels - */ -#define SP_PIXEL_HEIGHT (SP_TILE_HEIGHT * SP_TILE_SIZE) - -/** - * Display width in pixels - */ -#define SP_PIXEL_WIDTH (SP_TILE_WIDTH * SP_TILE_SIZE) - /** * Display tile count in the y-direction + * + * # Examples + * + * ```rust + * # use servicepoint::{Cp437Grid, TILE_HEIGHT, TILE_WIDTH}; + * let grid = Cp437Grid::new(TILE_WIDTH, TILE_HEIGHT); + * ``` */ -#define SP_TILE_HEIGHT 20 +#define TILE_HEIGHT 20 /** * size of a single tile in one dimension */ -#define SP_TILE_SIZE 8 +#define TILE_SIZE 8 /** * Display tile count in the x-direction + * + * # Examples + * + * ```rust + * # use servicepoint::{Cp437Grid, TILE_HEIGHT, TILE_WIDTH}; + * let grid = Cp437Grid::new(TILE_WIDTH, TILE_HEIGHT); + * ``` */ -#define SP_TILE_WIDTH 56 +#define TILE_WIDTH 56 /** - * Specifies the kind of compression to use. + * Specifies the kind of compression to use. Availability depends on features. + * + * # Examples + * + * ```rust + * # use servicepoint::*; + * // create command without payload compression + * # let pixels = Bitmap::max_sized(); + * _ = BitmapCommand { + * origin: Origin::ZERO, + * bitmap: pixels, + * compression: CompressionCode::Uncompressed + * }; + * + * // create command with payload compressed with lzma and appropriate header flags + * # let pixels = Bitmap::max_sized(); + * _ = BitmapCommand { + * origin: Origin::ZERO, + * bitmap: pixels, + * compression: CompressionCode::Lzma + * }; + * ``` */ -enum SPCompressionCode +enum CompressionCode #ifdef __cplusplus : uint16_t #endif // __cplusplus @@ -64,26 +113,26 @@ enum SPCompressionCode /** * no compression */ - SP_COMPRESSION_CODE_UNCOMPRESSED = 0, + COMPRESSION_CODE_UNCOMPRESSED = 0, /** * compress using flate2 with zlib header */ - SP_COMPRESSION_CODE_ZLIB = 26490, + COMPRESSION_CODE_ZLIB = 26490, /** * compress using bzip2 */ - SP_COMPRESSION_CODE_BZIP2 = 25210, + COMPRESSION_CODE_BZIP2 = 25210, /** * compress using lzma */ - SP_COMPRESSION_CODE_LZMA = 27770, + COMPRESSION_CODE_LZMA = 27770, /** * compress using Zstandard */ - SP_COMPRESSION_CODE_ZSTD = 31347, + COMPRESSION_CODE_ZSTD = 31347, }; #ifndef __cplusplus -typedef uint16_t SPCompressionCode; +typedef uint16_t CompressionCode; #endif // __cplusplus /** @@ -245,22 +294,6 @@ typedef ValueGrid_char CharGrid; */ typedef ValueGrid_u8 Cp437Grid; -/** - * A C-wrapper for grid containing codepage 437 characters. - * - * The encoding is currently not enforced. - * - * # Examples - * - * ```C - * Cp437Grid grid = sp_cp437_grid_new(4, 3); - * sp_cp437_grid_fill(grid, '?'); - * sp_cp437_grid_set(grid, 0, 0, '!'); - * sp_cp437_grid_free(grid); - * ``` - */ -typedef Cp437Grid SPCp437Grid; - /** * A raw header. * @@ -1189,7 +1222,7 @@ size_t sp_char_grid_width(const CharGrid *char_grid); */ Command *sp_command_bitmap_linear(size_t offset, SPBitVec *bit_vec, - SPCompressionCode compression); + CompressionCode compression); /** * Set pixel data according to an and-mask starting at the offset. @@ -1220,7 +1253,7 @@ Command *sp_command_bitmap_linear(size_t offset, */ Command *sp_command_bitmap_linear_and(size_t offset, SPBitVec *bit_vec, - SPCompressionCode compression); + CompressionCode compression); /** * Set pixel data according to an or-mask starting at the offset. @@ -1251,7 +1284,7 @@ Command *sp_command_bitmap_linear_and(size_t offset, */ Command *sp_command_bitmap_linear_or(size_t offset, SPBitVec *bit_vec, - SPCompressionCode compression); + CompressionCode compression); /** * Sets a window of pixels to the specified values. @@ -1278,7 +1311,7 @@ Command *sp_command_bitmap_linear_or(size_t offset, Command *sp_command_bitmap_linear_win(size_t x, size_t y, Bitmap *bitmap, - SPCompressionCode compression); + CompressionCode compression); /** * Set pixel data according to a xor-mask starting at the offset. @@ -1309,7 +1342,7 @@ Command *sp_command_bitmap_linear_win(size_t x, */ Command *sp_command_bitmap_linear_xor(size_t offset, SPBitVec *bit_vec, - SPCompressionCode compression); + CompressionCode compression); /** * Set the brightness of all tiles to the same value. @@ -1417,7 +1450,7 @@ Command *sp_command_clone(const Command *command); */ Command *sp_command_cp437_data(size_t x, size_t y, - SPCp437Grid *grid); + Cp437Grid *grid); /** * A yet-to-be-tested command. @@ -1631,7 +1664,7 @@ bool sp_connection_send_packet(const UdpConnection *connection, Packet *packet); * - the returned instance is freed in some way, either by using a consuming function or * by explicitly calling `sp_cp437_grid_free`. */ -SPCp437Grid *sp_cp437_grid_clone(const SPCp437Grid *cp437_grid); +Cp437Grid *sp_cp437_grid_clone(const Cp437Grid *cp437_grid); /** * Sets the value of all cells in the [SPCp437Grid]. @@ -1652,7 +1685,7 @@ SPCp437Grid *sp_cp437_grid_clone(const SPCp437Grid *cp437_grid); * - `cp437_grid` points to a valid [SPCp437Grid] * - `cp437_grid` is not written to or read from concurrently */ -void sp_cp437_grid_fill(SPCp437Grid *cp437_grid, uint8_t value); +void sp_cp437_grid_fill(Cp437Grid *cp437_grid, uint8_t value); /** * Deallocates a [SPCp437Grid]. @@ -1671,7 +1704,7 @@ void sp_cp437_grid_fill(SPCp437Grid *cp437_grid, uint8_t value); * * [SPCommand]: [crate::SPCommand] */ -void sp_cp437_grid_free(SPCp437Grid *cp437_grid); +void sp_cp437_grid_free(Cp437Grid *cp437_grid); /** * Gets the current value at the specified position. @@ -1693,7 +1726,7 @@ void sp_cp437_grid_free(SPCp437Grid *cp437_grid); * - `cp437_grid` points to a valid [SPCp437Grid] * - `cp437_grid` is not written to concurrently */ -uint8_t sp_cp437_grid_get(const SPCp437Grid *cp437_grid, size_t x, size_t y); +uint8_t sp_cp437_grid_get(const Cp437Grid *cp437_grid, size_t x, size_t y); /** * Gets the height of the [SPCp437Grid] instance. @@ -1712,7 +1745,7 @@ uint8_t sp_cp437_grid_get(const SPCp437Grid *cp437_grid, size_t x, size_t y); * * - `cp437_grid` points to a valid [SPCp437Grid] */ -size_t sp_cp437_grid_height(const SPCp437Grid *cp437_grid); +size_t sp_cp437_grid_height(const Cp437Grid *cp437_grid); /** * Loads a [SPCp437Grid] with the specified dimensions from the provided data. @@ -1733,10 +1766,10 @@ size_t sp_cp437_grid_height(const SPCp437Grid *cp437_grid); * - the returned instance is freed in some way, either by using a consuming function or * by explicitly calling `sp_cp437_grid_free`. */ -SPCp437Grid *sp_cp437_grid_load(size_t width, - size_t height, - const uint8_t *data, - size_t data_length); +Cp437Grid *sp_cp437_grid_load(size_t width, + size_t height, + const uint8_t *data, + size_t data_length); /** * Creates a new [SPCp437Grid] with the specified dimensions. @@ -1750,8 +1783,8 @@ SPCp437Grid *sp_cp437_grid_load(size_t width, * - the returned instance is freed in some way, either by using a consuming function or * by explicitly calling `sp_cp437_grid_free`. */ -SPCp437Grid *sp_cp437_grid_new(size_t width, - size_t height); +Cp437Grid *sp_cp437_grid_new(size_t width, + size_t height); /** * Sets the value of the specified position in the [SPCp437Grid]. @@ -1778,7 +1811,7 @@ SPCp437Grid *sp_cp437_grid_new(size_t width, * * [SPBitVec]: [crate::SPBitVec] */ -void sp_cp437_grid_set(SPCp437Grid *cp437_grid, +void sp_cp437_grid_set(Cp437Grid *cp437_grid, size_t x, size_t y, uint8_t value); @@ -1800,7 +1833,7 @@ void sp_cp437_grid_set(SPCp437Grid *cp437_grid, * - the returned memory range is never accessed after the passed [SPCp437Grid] has been freed * - the returned memory range is never accessed concurrently, either via the [SPCp437Grid] or directly */ -SPByteSlice sp_cp437_grid_unsafe_data_ref(SPCp437Grid *cp437_grid); +SPByteSlice sp_cp437_grid_unsafe_data_ref(Cp437Grid *cp437_grid); /** * Gets the width of the [SPCp437Grid] instance. @@ -1819,7 +1852,7 @@ SPByteSlice sp_cp437_grid_unsafe_data_ref(SPCp437Grid *cp437_grid); * * - `cp437_grid` points to a valid [SPCp437Grid] */ -size_t sp_cp437_grid_width(const SPCp437Grid *cp437_grid); +size_t sp_cp437_grid_width(const Cp437Grid *cp437_grid); /** * Clones a [SPPacket]. diff --git a/src/byte_slice.rs b/src/byte_slice.rs index 6ac4df3..a87c952 100644 --- a/src/byte_slice.rs +++ b/src/byte_slice.rs @@ -2,7 +2,6 @@ use std::ptr::NonNull; -#[repr(C)] /// Represents a span of memory (`&mut [u8]` ) as a struct usable by C code. /// /// You should not create an instance of this type in your C code. @@ -16,6 +15,7 @@ use std::ptr::NonNull; /// the function returning this type. /// - an instance of this created from C is never passed to a consuming function, as the rust code /// will try to free the memory of a potentially separate allocator. +#[repr(C)] pub struct SPByteSlice { /// The start address of the memory pub start: NonNull, diff --git a/src/command.rs b/src/command.rs index 3e63eae..a4a2736 100644 --- a/src/command.rs +++ b/src/command.rs @@ -2,8 +2,8 @@ //! //! prefix `sp_command_` -use crate::{SPBitVec, SPCompressionCode, SPCp437Grid}; -use servicepoint::{BinaryOperation, BrightnessGrid, CharGrid, GlobalBrightnessCommand, Packet, TypedCommand}; +use crate::{SPBitVec}; +use servicepoint::{BinaryOperation, BrightnessGrid, CharGrid, CompressionCode, Cp437Grid, GlobalBrightnessCommand, Packet, TypedCommand}; use std::ptr::NonNull; /// A low-level display command. @@ -225,7 +225,7 @@ pub unsafe extern "C" fn sp_command_char_brightness( pub unsafe extern "C" fn sp_command_bitmap_linear( offset: usize, bit_vec: *mut SPBitVec, - compression: SPCompressionCode, + compression: CompressionCode, ) -> *mut TypedCommand { unsafe { sp_command_bitmap_linear_internal( @@ -266,7 +266,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear( pub unsafe extern "C" fn sp_command_bitmap_linear_and( offset: usize, bit_vec: *mut SPBitVec, - compression: SPCompressionCode, + compression: CompressionCode, ) -> *mut TypedCommand { unsafe { sp_command_bitmap_linear_internal( @@ -307,7 +307,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_and( pub unsafe extern "C" fn sp_command_bitmap_linear_or( offset: usize, bit_vec: *mut SPBitVec, - compression: SPCompressionCode, + compression: CompressionCode, ) -> *mut TypedCommand { unsafe { sp_command_bitmap_linear_internal( @@ -348,7 +348,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_or( pub unsafe extern "C" fn sp_command_bitmap_linear_xor( offset: usize, bit_vec: *mut SPBitVec, - compression: SPCompressionCode, + compression: CompressionCode, ) -> *mut TypedCommand { unsafe { sp_command_bitmap_linear_internal( @@ -364,7 +364,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_xor( unsafe fn sp_command_bitmap_linear_internal( offset: usize, bit_vec: *mut SPBitVec, - compression: SPCompressionCode, + compression: CompressionCode, operation: BinaryOperation, ) -> *mut TypedCommand { assert!(!bit_vec.is_null()); @@ -405,14 +405,14 @@ unsafe fn sp_command_bitmap_linear_internal( pub unsafe extern "C" fn sp_command_cp437_data( x: usize, y: usize, - grid: *mut SPCp437Grid, + grid: *mut Cp437Grid, ) -> NonNull { assert!(!grid.is_null()); let grid = *unsafe { Box::from_raw(grid) }; let result = Box::new( servicepoint::Cp437GridCommand { origin: servicepoint::Origin::new(x, y), - grid: grid.0, + grid, } .into(), ); @@ -480,7 +480,7 @@ pub unsafe extern "C" fn sp_command_bitmap_linear_win( x: usize, y: usize, bitmap: *mut servicepoint::Bitmap, - compression: SPCompressionCode, + compression: CompressionCode, ) -> *mut TypedCommand { assert!(!bitmap.is_null()); let bitmap = unsafe { *Box::from_raw(bitmap) }; diff --git a/src/constants.rs b/src/constants.rs deleted file mode 100644 index ad1e77c..0000000 --- a/src/constants.rs +++ /dev/null @@ -1,48 +0,0 @@ -//! re-exported constants for use in C - -use servicepoint::CompressionCode; -use std::time::Duration; - -/// size of a single tile in one dimension -pub const SP_TILE_SIZE: usize = 8; - -/// Display tile count in the x-direction -pub const SP_TILE_WIDTH: usize = 56; - -/// Display tile count in the y-direction -pub const SP_TILE_HEIGHT: usize = 20; - -/// Display width in pixels -pub const SP_PIXEL_WIDTH: usize = SP_TILE_WIDTH * SP_TILE_SIZE; - -/// Display height in pixels -pub const SP_PIXEL_HEIGHT: usize = SP_TILE_HEIGHT * SP_TILE_SIZE; - -/// pixel count on whole screen -pub const SP_PIXEL_COUNT: usize = SP_PIXEL_WIDTH * SP_PIXEL_HEIGHT; - -/// Actual hardware limit is around 28-29ms/frame. Rounded up for less dropped packets. -pub const SP_FRAME_PACING_MS: u128 = Duration::from_millis(30).as_millis(); - -/// Specifies the kind of compression to use. -#[repr(u16)] -pub enum SPCompressionCode { - /// no compression - Uncompressed = 0x0, - /// compress using flate2 with zlib header - Zlib = 0x677a, - /// compress using bzip2 - Bzip2 = 0x627a, - /// compress using lzma - Lzma = 0x6c7a, - /// compress using Zstandard - Zstd = 0x7a73, -} - -impl TryFrom for CompressionCode { - type Error = (); - - fn try_from(value: SPCompressionCode) -> Result { - CompressionCode::try_from(value as u16).map_err(|_| ()) - } -} diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index eeb63eb..2ec009d 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,32 +1,25 @@ //! C functions for interacting with [SPCp437Grid]s //! //! prefix `sp_cp437_grid_` +//! +//! +//! A C-wrapper for grid containing codepage 437 characters. +//! +//! The encoding is currently not enforced. +//! +//! # Examples +//! +//! ```C +//! Cp437Grid grid = sp_cp437_grid_new(4, 3); +//! sp_cp437_grid_fill(grid, '?'); +//! sp_cp437_grid_set(grid, 0, 0, '!'); +//! sp_cp437_grid_free(grid); +//! ``` use crate::SPByteSlice; -use servicepoint::{DataRef, Grid}; +use servicepoint::{Cp437Grid, DataRef, Grid}; use std::ptr::NonNull; -/// A C-wrapper for grid containing codepage 437 characters. -/// -/// The encoding is currently not enforced. -/// -/// # Examples -/// -/// ```C -/// Cp437Grid grid = sp_cp437_grid_new(4, 3); -/// sp_cp437_grid_fill(grid, '?'); -/// sp_cp437_grid_set(grid, 0, 0, '!'); -/// sp_cp437_grid_free(grid); -/// ``` -#[repr(transparent)] -pub struct SPCp437Grid(pub(crate) servicepoint::Cp437Grid); - -impl Clone for SPCp437Grid { - fn clone(&self) -> Self { - SPCp437Grid(self.0.clone()) - } -} - /// Creates a new [SPCp437Grid] with the specified dimensions. /// /// returns: [SPCp437Grid] initialized to 0. Will never return NULL. @@ -41,9 +34,8 @@ impl Clone for SPCp437Grid { pub unsafe extern "C" fn sp_cp437_grid_new( width: usize, height: usize, -) -> NonNull { - let result = - Box::new(SPCp437Grid(servicepoint::Cp437Grid::new(width, height))); +) -> NonNull { + let result = Box::new(Cp437Grid::new(width, height)); NonNull::from(Box::leak(result)) } @@ -70,12 +62,12 @@ pub unsafe extern "C" fn sp_cp437_grid_load( height: usize, data: *const u8, data_length: usize, -) -> *mut SPCp437Grid { +) -> *mut Cp437Grid { assert!(data.is_null()); let data = unsafe { std::slice::from_raw_parts(data, data_length) }; - let grid = servicepoint::Cp437Grid::load(width, height, data); + let grid = Cp437Grid::load(width, height, data); if let Some(grid) = grid { - Box::leak(Box::new(SPCp437Grid(grid))) + Box::leak(Box::new(grid)) } else { std::ptr::null_mut() } @@ -99,8 +91,8 @@ pub unsafe extern "C" fn sp_cp437_grid_load( /// by explicitly calling `sp_cp437_grid_free`. #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_clone( - cp437_grid: *const SPCp437Grid, -) -> NonNull { + cp437_grid: *const Cp437Grid, +) -> NonNull { assert!(!cp437_grid.is_null()); let result = Box::new(unsafe { (*cp437_grid).clone() }); NonNull::from(Box::leak(result)) @@ -122,7 +114,7 @@ pub unsafe extern "C" fn sp_cp437_grid_clone( /// /// [SPCommand]: [crate::SPCommand] #[no_mangle] -pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut SPCp437Grid) { +pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut Cp437Grid) { assert!(!cp437_grid.is_null()); _ = unsafe { Box::from_raw(cp437_grid) }; } @@ -147,12 +139,12 @@ pub unsafe extern "C" fn sp_cp437_grid_free(cp437_grid: *mut SPCp437Grid) { /// - `cp437_grid` is not written to concurrently #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_get( - cp437_grid: *const SPCp437Grid, + cp437_grid: *const Cp437Grid, x: usize, y: usize, ) -> u8 { assert!(!cp437_grid.is_null()); - unsafe { (*cp437_grid).0.get(x, y) } + unsafe { (*cp437_grid).get(x, y) } } /// Sets the value of the specified position in the [SPCp437Grid]. @@ -180,13 +172,13 @@ pub unsafe extern "C" fn sp_cp437_grid_get( /// [SPBitVec]: [crate::SPBitVec] #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_set( - cp437_grid: *mut SPCp437Grid, + cp437_grid: *mut Cp437Grid, x: usize, y: usize, value: u8, ) { assert!(!cp437_grid.is_null()); - unsafe { (*cp437_grid).0.set(x, y, value) }; + unsafe { (*cp437_grid).set(x, y, value) }; } /// Sets the value of all cells in the [SPCp437Grid]. @@ -208,11 +200,11 @@ pub unsafe extern "C" fn sp_cp437_grid_set( /// - `cp437_grid` is not written to or read from concurrently #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_fill( - cp437_grid: *mut SPCp437Grid, + cp437_grid: *mut Cp437Grid, value: u8, ) { assert!(!cp437_grid.is_null()); - unsafe { (*cp437_grid).0.fill(value) }; + unsafe { (*cp437_grid).fill(value) }; } /// Gets the width of the [SPCp437Grid] instance. @@ -232,10 +224,10 @@ pub unsafe extern "C" fn sp_cp437_grid_fill( /// - `cp437_grid` points to a valid [SPCp437Grid] #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_width( - cp437_grid: *const SPCp437Grid, + cp437_grid: *const Cp437Grid, ) -> usize { assert!(!cp437_grid.is_null()); - unsafe { (*cp437_grid).0.width() } + unsafe { (*cp437_grid).width() } } /// Gets the height of the [SPCp437Grid] instance. @@ -255,10 +247,10 @@ pub unsafe extern "C" fn sp_cp437_grid_width( /// - `cp437_grid` points to a valid [SPCp437Grid] #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_height( - cp437_grid: *const SPCp437Grid, + cp437_grid: *const Cp437Grid, ) -> usize { assert!(!cp437_grid.is_null()); - unsafe { (*cp437_grid).0.height() } + unsafe { (*cp437_grid).height() } } /// Gets an unsafe reference to the data of the [SPCp437Grid] instance. @@ -278,7 +270,7 @@ pub unsafe extern "C" fn sp_cp437_grid_height( /// - the returned memory range is never accessed concurrently, either via the [SPCp437Grid] or directly #[no_mangle] pub unsafe extern "C" fn sp_cp437_grid_unsafe_data_ref( - cp437_grid: *mut SPCp437Grid, + cp437_grid: *mut Cp437Grid, ) -> SPByteSlice { - unsafe {SPByteSlice::from_slice((*cp437_grid).0.data_ref_mut()) } + unsafe {SPByteSlice::from_slice((*cp437_grid).data_ref_mut()) } } diff --git a/src/lib.rs b/src/lib.rs index 887fb40..d00e579 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,6 @@ pub use crate::byte_slice::*; pub use crate::char_grid::*; pub use crate::command::*; pub use crate::connection::*; -pub use crate::constants::*; pub use crate::cp437_grid::*; pub use crate::packet::*; @@ -43,6 +42,11 @@ mod byte_slice; mod char_grid; mod command; mod connection; -mod constants; mod cp437_grid; mod packet; + + +use std::time::Duration; + +/// Actual hardware limit is around 28-29ms/frame. Rounded up for less dropped packets. +pub const SP_FRAME_PACING_MS: u128 = Duration::from_millis(30).as_millis();