WIP: next #1
|
@ -695,6 +695,10 @@ Brightness sp_brightness_grid_get(BrightnessGrid */*notnull*/ brightness_grid,
|
||||||
*/
|
*/
|
||||||
size_t sp_brightness_grid_height(BrightnessGrid */*notnull*/ brightness_grid);
|
size_t sp_brightness_grid_height(BrightnessGrid */*notnull*/ brightness_grid);
|
||||||
|
|
||||||
|
Packet *sp_brightness_grid_into_packet(BrightnessGrid */*notnull*/ grid,
|
||||||
|
size_t x,
|
||||||
|
size_t y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a [BrightnessGrid] with the specified dimensions from the provided data.
|
* Loads a [BrightnessGrid] with the specified dimensions from the provided data.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::byte_slice::ByteSlice;
|
use crate::byte_slice::ByteSlice;
|
||||||
use crate::{heap_drop, heap_move, heap_move_nonnull, SPBitVec};
|
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, SPBitVec};
|
||||||
use servicepoint::{Bitmap, DataRef, Grid};
|
use servicepoint::{Bitmap, DataRef, Grid};
|
||||||
use std::ptr::NonNull;
|
use std::ptr::NonNull;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ pub unsafe extern "C" fn sp_bitmap_from_bitvec(
|
||||||
width: usize,
|
width: usize,
|
||||||
bitvec: NonNull<SPBitVec>,
|
bitvec: NonNull<SPBitVec>,
|
||||||
) -> *mut Bitmap {
|
) -> *mut Bitmap {
|
||||||
let bitvec = unsafe { *Box::from_raw(bitvec.as_ptr()) };
|
let bitvec = unsafe { heap_remove(bitvec) };
|
||||||
if let Ok(bitmap) = Bitmap::from_bitvec(width, bitvec.0) {
|
if let Ok(bitmap) = Bitmap::from_bitvec(width, bitvec.0) {
|
||||||
heap_move(bitmap)
|
heap_move(bitmap)
|
||||||
} else {
|
} else {
|
||||||
|
@ -196,6 +196,6 @@ pub unsafe extern "C" fn sp_bitmap_unsafe_data_ref(
|
||||||
pub unsafe extern "C" fn sp_bitmap_into_bitvec(
|
pub unsafe extern "C" fn sp_bitmap_into_bitvec(
|
||||||
bitmap: NonNull<Bitmap>,
|
bitmap: NonNull<Bitmap>,
|
||||||
) -> NonNull<SPBitVec> {
|
) -> NonNull<SPBitVec> {
|
||||||
let bitmap = unsafe { *Box::from_raw(bitmap.as_ptr()) };
|
let bitmap = unsafe { heap_remove(bitmap) };
|
||||||
heap_move_nonnull(SPBitVec(bitmap.into()))
|
heap_move_nonnull(SPBitVec(bitmap.into()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
use crate::{heap_drop, heap_move, heap_move_nonnull, ByteSlice};
|
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice};
|
||||||
use servicepoint::{Brightness, BrightnessGrid, ByteGrid, DataRef, Grid};
|
use servicepoint::{
|
||||||
|
Brightness, BrightnessGrid, BrightnessGridCommand, ByteGrid, DataRef, Grid,
|
||||||
|
Origin, Packet,
|
||||||
|
};
|
||||||
use std::mem::transmute;
|
use std::mem::transmute;
|
||||||
use std::ptr::NonNull;
|
use std::ptr::NonNull;
|
||||||
|
|
||||||
|
@ -167,5 +170,23 @@ pub unsafe extern "C" fn sp_brightness_grid_unsafe_data_ref(
|
||||||
const _: () = assert!(size_of::<Brightness>() == 1);
|
const _: () = assert!(size_of::<Brightness>() == 1);
|
||||||
|
|
||||||
let data = unsafe { (*brightness_grid.as_ptr()).data_ref_mut() };
|
let data = unsafe { (*brightness_grid.as_ptr()).data_ref_mut() };
|
||||||
unsafe { ByteSlice::from_slice(transmute::<&mut [Brightness], &mut [u8]>(data)) }
|
unsafe {
|
||||||
|
ByteSlice::from_slice(transmute::<&mut [Brightness], &mut [u8]>(data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn sp_brightness_grid_into_packet(
|
||||||
|
grid: NonNull<BrightnessGrid>,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
) -> *mut Packet {
|
||||||
|
let grid = unsafe { heap_remove(grid) };
|
||||||
|
match Packet::try_from(BrightnessGridCommand {
|
||||||
|
grid,
|
||||||
|
origin: Origin::new(x, y),
|
||||||
|
}) {
|
||||||
|
Ok(packet) => heap_move(packet),
|
||||||
|
Err(_) => std::ptr::null_mut(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{heap_drop, heap_move};
|
use crate::{heap_drop, heap_move, heap_remove};
|
||||||
use servicepoint::{Connection, Header, Packet, TypedCommand, UdpConnection};
|
use servicepoint::{Connection, Header, Packet, TypedCommand, UdpConnection};
|
||||||
use std::ffi::{c_char, CStr};
|
use std::ffi::{c_char, CStr};
|
||||||
use std::net::{Ipv4Addr, SocketAddrV4};
|
use std::net::{Ipv4Addr, SocketAddrV4};
|
||||||
|
@ -67,8 +67,8 @@ pub unsafe extern "C" fn sp_udp_send_packet(
|
||||||
connection: NonNull<UdpConnection>,
|
connection: NonNull<UdpConnection>,
|
||||||
packet: NonNull<Packet>,
|
packet: NonNull<Packet>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let packet = unsafe { Box::from_raw(packet.as_ptr()) };
|
let packet = unsafe { heap_remove(packet) };
|
||||||
unsafe { connection.as_ref().send(*packet) }.is_ok()
|
unsafe { connection.as_ref().send(packet) }.is_ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a [TypedCommand] to the display using the [UdpConnection].
|
/// Sends a [TypedCommand] to the display using the [UdpConnection].
|
||||||
|
@ -87,7 +87,7 @@ pub unsafe extern "C" fn sp_udp_send_command(
|
||||||
connection: NonNull<UdpConnection>,
|
connection: NonNull<UdpConnection>,
|
||||||
command: NonNull<TypedCommand>,
|
command: NonNull<TypedCommand>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let command = *unsafe { Box::from_raw(command.as_ptr()) };
|
let command = unsafe { heap_remove(command) };
|
||||||
unsafe { connection.as_ref().send(command) }.is_ok()
|
unsafe { connection.as_ref().send(command) }.is_ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,5 +61,9 @@ pub(crate) fn heap_move_nonnull<T>(x: T) -> NonNull<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
|
pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
|
||||||
drop(unsafe { Box::from_raw(x.as_ptr()) });
|
drop(unsafe { heap_remove(x) });
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) unsafe fn heap_remove<T>(x: NonNull<T>) -> T {
|
||||||
|
unsafe { *Box::from_raw(x.as_ptr()) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{heap_drop, heap_move, heap_move_nonnull, ByteSlice};
|
use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice};
|
||||||
use servicepoint::{CommandCode, Header, Packet, TypedCommand};
|
use servicepoint::{CommandCode, Header, Packet, TypedCommand};
|
||||||
use std::ptr::NonNull;
|
use std::ptr::NonNull;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ use std::ptr::NonNull;
|
||||||
pub unsafe extern "C" fn sp_packet_from_command(
|
pub unsafe extern "C" fn sp_packet_from_command(
|
||||||
command: NonNull<TypedCommand>,
|
command: NonNull<TypedCommand>,
|
||||||
) -> *mut Packet {
|
) -> *mut Packet {
|
||||||
let command = unsafe { *Box::from_raw(command.as_ptr()) };
|
let command = unsafe { heap_remove(command) };
|
||||||
if let Ok(packet) = command.try_into() {
|
if let Ok(packet) = command.try_into() {
|
||||||
heap_move(packet)
|
heap_move(packet)
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue