icsneoc2 0.1002002.0-rc.4

High-level Rust interface for Intrepid Control Systems vehicle network adapters
Documentation
//! Standalone utility functions.
//!
//! These helpers do not require a [`Device`](crate::Device) handle.

use std::ffi::CString;

use crate::error::Result;
use crate::functions::{check, ffi_string};
use crate::sys;

/// Returns the `libicsneoc2` library version string (e.g. `"1.2.3"`).
pub fn version() -> Result<String> {
    ffi_string(64, |buf, len| unsafe {
        sys::icsneoc2_version_get(buf, len)
    })
}

/// Converts a numeric device serial number to its string form.
///
/// For example, a neoVI FIRE 3 might return `"RS2043"`.
pub fn serial_num_to_string(num: u32) -> Result<String> {
    ffi_string(64, |buf, len| unsafe {
        sys::icsneoc2_serial_num_to_string(num, buf, len)
    })
}

/// Converts a device serial string (e.g. `"GS1128"`) to its numeric form.
pub fn serial_string_to_num(serial: &str) -> Result<u32> {
    let serial_c = CString::new(serial)?;
    let mut num: u32 = 0;
    let raw = serial_c.into_raw();
    let result =
        check(unsafe { sys::icsneoc2_serial_string_to_num(raw, serial.len(), &raw mut num) });
    // SAFETY: `raw` was produced by `CString::into_raw` above.
    let _ = unsafe { CString::from_raw(raw) };
    result?;
    Ok(num)
}