From 2d3828fb2bbd33ce8f90c4a4394ceb54e36535ef Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Sat, 12 Apr 2025 16:47:40 +0200 Subject: [PATCH] add fn to pass ip:port as values --- example/main.c | 2 +- include/servicepoint.h | 21 ++++++++++++++++++++- src/connection.rs | 37 +++++++++++++++++++++++++------------ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/example/main.c b/example/main.c index 4e63dec..e3cfc8f 100644 --- a/example/main.c +++ b/example/main.c @@ -2,7 +2,7 @@ #include "servicepoint.h" int main(void) { - UdpConnection *connection = sp_connection_open("localhost:2342"); + UdpConnection *connection = sp_connection_open_ipv4(127,0,0,1,2342); if (connection == NULL) return 1; diff --git a/include/servicepoint.h b/include/servicepoint.h index dbce14d..7c0c819 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -979,13 +979,32 @@ void sp_connection_free(UdpConnection */*notnull*/ connection); * # Examples * * ```C - * CConnection connection = sp_connection_open("172.23.42.29:2342"); + * UdpConnection connection = sp_connection_open("172.23.42.29:2342"); * if (connection != NULL) * sp_connection_send_command(connection, sp_command_clear()); * ``` */ UdpConnection *sp_connection_open(char */*notnull*/ host); +/** + * Creates a new instance of [UdpConnection]. + * + * returns: NULL if connection fails, or connected instance + * + * # Examples + * + * ```C + * UdpConnection connection = sp_connection_open_ipv4(172, 23, 42, 29, 2342); + * if (connection != NULL) + * sp_connection_send_command(connection, sp_command_clear()); + * ``` + */ +UdpConnection *sp_connection_open_ipv4(uint8_t ip1, + uint8_t ip2, + uint8_t ip3, + uint8_t ip4, + uint16_t port); + /** * Sends a [TypedCommand] to the display using the [UdpConnection]. * diff --git a/src/connection.rs b/src/connection.rs index 5feb528..d6ffb83 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -1,5 +1,6 @@ use servicepoint::{Connection, Packet, TypedCommand, UdpConnection}; use std::ffi::{c_char, CStr}; +use std::net::{Ipv4Addr, SocketAddrV4}; use std::ptr::NonNull; /// Creates a new instance of [UdpConnection]. @@ -9,7 +10,7 @@ use std::ptr::NonNull; /// # Examples /// /// ```C -/// CConnection connection = sp_connection_open("172.23.42.29:2342"); +/// UdpConnection connection = sp_connection_open("172.23.42.29:2342"); /// if (connection != NULL) /// sp_connection_send_command(connection, sp_command_clear()); /// ``` @@ -28,17 +29,29 @@ pub unsafe extern "C" fn sp_connection_open( Box::into_raw(Box::new(connection)) } -//#[no_mangle] -//pub unsafe extern "C" fn sp_connection_open_ipv4( -// host: SocketAddrV4, -//) -> *mut UdpConnection { -// let connection = match servicepoint::UdpConnection::open(host) { -// Err(_) => return std::ptr::null_mut(), -// Ok(value) => value, -// }; -// -// Box::into_raw(Box::new(UdpConnection(connection))) -//} +/// Creates a new instance of [UdpConnection]. +/// +/// returns: NULL if connection fails, or connected instance +/// +/// # Examples +/// +/// ```C +/// UdpConnection connection = sp_connection_open_ipv4(172, 23, 42, 29, 2342); +/// if (connection != NULL) +/// sp_connection_send_command(connection, sp_command_clear()); +/// ``` +#[no_mangle] +pub unsafe extern "C" fn sp_connection_open_ipv4( + ip1: u8, ip2: u8, ip3: u8, ip4: u8, + port: u16, +) -> *mut UdpConnection { + let addr = SocketAddrV4::new(Ipv4Addr::from( [ip1, ip2, ip3, ip4]), port); + let connection = match UdpConnection::open(addr) { + Err(_) => return std::ptr::null_mut(), + Ok(value) => value, + }; + Box::into_raw(Box::new(connection)) +} // /// Creates a new instance of [SPUdpConnection] for testing that does not actually send anything. // ///