use crate::enum_wrappers::unit::FanState;
use crate::error::NvmlError;
use crate::ffi::bindings::*;
#[cfg(feature = "serde")]
use serde_derive::{Deserialize, Serialize};
use std::{convert::TryFrom, ffi::CStr};
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct FansInfo {
pub count: u32,
pub fans: Vec<FanInfo>,
}
impl TryFrom<nvmlUnitFanSpeeds_t> for FansInfo {
type Error = NvmlError;
fn try_from(value: nvmlUnitFanSpeeds_t) -> Result<Self, Self::Error> {
let fans = value
.fans
.iter()
.map(|f| FanInfo::try_from(*f))
.collect::<Result<_, NvmlError>>()?;
Ok(FansInfo {
count: value.count,
fans,
})
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct FanInfo {
pub speed: u32,
pub state: FanState,
}
impl TryFrom<nvmlUnitFanInfo_t> for FanInfo {
type Error = NvmlError;
fn try_from(value: nvmlUnitFanInfo_t) -> Result<Self, Self::Error> {
Ok(FanInfo {
speed: value.speed,
state: FanState::try_from(value.state)?,
})
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PsuInfo {
pub current: u32,
pub power_draw: u32,
pub state: String,
pub voltage: u32,
}
impl TryFrom<nvmlPSUInfo_t> for PsuInfo {
type Error = NvmlError;
fn try_from(value: nvmlPSUInfo_t) -> Result<Self, Self::Error> {
unsafe {
let state_raw = CStr::from_ptr(value.state.as_ptr());
Ok(PsuInfo {
current: value.current,
power_draw: value.power,
state: state_raw.to_str()?.into(),
voltage: value.voltage,
})
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct UnitInfo {
pub firmware_version: String,
pub id: String,
pub name: String,
pub serial: String,
}
impl TryFrom<nvmlUnitInfo_t> for UnitInfo {
type Error = NvmlError;
fn try_from(value: nvmlUnitInfo_t) -> Result<Self, Self::Error> {
unsafe {
let version_raw = CStr::from_ptr(value.firmwareVersion.as_ptr());
let id_raw = CStr::from_ptr(value.id.as_ptr());
let name_raw = CStr::from_ptr(value.name.as_ptr());
let serial_raw = CStr::from_ptr(value.serial.as_ptr());
Ok(UnitInfo {
firmware_version: version_raw.to_str()?.into(),
id: id_raw.to_str()?.into(),
name: name_raw.to_str()?.into(),
serial: serial_raw.to_str()?.into(),
})
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct HwbcEntry {
pub id: u32,
pub firmware_version: String,
}
impl TryFrom<nvmlHwbcEntry_t> for HwbcEntry {
type Error = NvmlError;
fn try_from(value: nvmlHwbcEntry_t) -> Result<Self, Self::Error> {
unsafe {
let version_raw = CStr::from_ptr(value.firmwareVersion.as_ptr());
Ok(HwbcEntry {
id: value.hwbcId,
firmware_version: version_raw.to_str()?.into(),
})
}
}
}