#![allow(clippy::unnecessary_cast)]
#![deny(
missing_docs,
missing_copy_implementations,
trivial_casts,
unstable_features,
unused_import_braces,
unused_qualifications
)]
use std::{
ffi::CStr,
os::raw::{c_char, c_uint, c_void},
ptr,
time::Duration,
};
pub use phidget_sys::{
self as ffi, PHIDGET_CHANNEL_ANY, PHIDGET_HUBPORTSPEED_AUTO, PHIDGET_HUBPORT_ANY,
PHIDGET_SERIALNUMBER_ANY, PHIDGET_TIMEOUT_DEFAULT, PHIDGET_TIMEOUT_INFINITE,
};
pub mod errors;
pub use crate::errors::*;
pub mod phidget;
pub use crate::phidget::{AttachCallback, DetachCallback, GenericPhidget, Phidget};
pub mod net;
pub use crate::net::ServerType;
pub mod devices;
pub use crate::devices::{
digital_input::DigitalInput, digital_output::DigitalOutput, hub::Hub,
humidity_sensor::HumiditySensor, temperature_sensor::TemperatureSensor,
voltage_input::VoltageInput, voltage_output::VoltageOutput,
voltage_ratio_input::VoltageRatioInput,
};
pub const TIMEOUT_INFINITE: Duration = Duration::from_millis(PHIDGET_TIMEOUT_INFINITE as u64);
pub const TIMEOUT_DEFAULT: Duration = Duration::from_millis(PHIDGET_TIMEOUT_DEFAULT as u64);
pub(crate) fn get_ffi_string<F>(mut f: F) -> Result<String>
where
F: FnMut(*mut *const c_char) -> c_uint,
{
unsafe {
let mut ver: *const c_char = ptr::null_mut();
ReturnCode::result(f(&mut ver))?;
if ver.is_null() {
return Err(ReturnCode::NoMemory);
}
let s = CStr::from_ptr(ver);
Ok(s.to_string_lossy().into())
}
}
pub(crate) fn drop_cb<P: ?Sized>(cb: Option<*mut c_void>) {
if let Some(ctx) = cb {
let _: Box<Box<P>> = unsafe { Box::from_raw(ctx as *mut _) };
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u32)]
#[allow(missing_docs)]
pub enum ChannelClass {
Nothing = ffi::Phidget_ChannelClass_PHIDCHCLASS_NOTHING, Accelerometer = ffi::Phidget_ChannelClass_PHIDCHCLASS_ACCELEROMETER, BldcMotor = ffi::Phidget_ChannelClass_PHIDCHCLASS_BLDCMOTOR, CaptiveTouch = ffi::Phidget_ChannelClass_PHIDCHCLASS_CAPACITIVETOUCH, CurrentInput = ffi::Phidget_ChannelClass_PHIDCHCLASS_CURRENTINPUT, CurrentOutput = ffi::Phidget_ChannelClass_PHIDCHCLASS_CURRENTOUTPUT, DataAdapter = ffi::Phidget_ChannelClass_PHIDCHCLASS_DATAADAPTER, DcMotor = ffi::Phidget_ChannelClass_PHIDCHCLASS_DCMOTOR, Dictionary = ffi::Phidget_ChannelClass_PHIDCHCLASS_DICTIONARY, DigitalInput = ffi::Phidget_ChannelClass_PHIDCHCLASS_DIGITALINPUT, DigitalOutput = ffi::Phidget_ChannelClass_PHIDCHCLASS_DIGITALOUTPUT, DistanceSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_DISTANCESENSOR, Encoder = ffi::Phidget_ChannelClass_PHIDCHCLASS_ENCODER, FirmwareUpgrade = ffi::Phidget_ChannelClass_PHIDCHCLASS_FIRMWAREUPGRADE, FrequencyCounter = ffi::Phidget_ChannelClass_PHIDCHCLASS_FREQUENCYCOUNTER, Generic = ffi::Phidget_ChannelClass_PHIDCHCLASS_GENERIC, Gps = ffi::Phidget_ChannelClass_PHIDCHCLASS_GPS, Gyroscope = ffi::Phidget_ChannelClass_PHIDCHCLASS_GYROSCOPE, Hub = ffi::Phidget_ChannelClass_PHIDCHCLASS_HUB, HumiditySensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_HUMIDITYSENSOR, Ir = ffi::Phidget_ChannelClass_PHIDCHCLASS_IR, Lcd = ffi::Phidget_ChannelClass_PHIDCHCLASS_LCD, LightSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_LIGHTSENSOR, Magnetometer = ffi::Phidget_ChannelClass_PHIDCHCLASS_MAGNETOMETER, MeshDongle = ffi::Phidget_ChannelClass_PHIDCHCLASS_MESHDONGLE, MotorPositionController = ffi::Phidget_ChannelClass_PHIDCHCLASS_MOTORPOSITIONCONTROLLER, MotorVelocityController = ffi::Phidget_ChannelClass_PHIDCHCLASS_MOTORVELOCITYCONTROLLER, PhSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_PHSENSOR, PowerGuard = ffi::Phidget_ChannelClass_PHIDCHCLASS_POWERGUARD, PressureSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_PRESSURESENSOR, RcServo = ffi::Phidget_ChannelClass_PHIDCHCLASS_RCSERVO, ResistanceInput = ffi::Phidget_ChannelClass_PHIDCHCLASS_RESISTANCEINPUT, Rfid = ffi::Phidget_ChannelClass_PHIDCHCLASS_RFID, SoundSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_SOUNDSENSOR, Spatial = ffi::Phidget_ChannelClass_PHIDCHCLASS_SPATIAL, Stepper = ffi::Phidget_ChannelClass_PHIDCHCLASS_STEPPER, TemperatureSensor = ffi::Phidget_ChannelClass_PHIDCHCLASS_TEMPERATURESENSOR, VoltageInput = ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGEINPUT, VoltageOutput = ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGEOUTPUT, VoltageRatioInput = ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGERATIOINPUT, }
impl TryFrom<u32> for ChannelClass {
type Error = Error;
fn try_from(val: u32) -> Result<Self> {
use ChannelClass::*;
match val {
ffi::Phidget_ChannelClass_PHIDCHCLASS_NOTHING => Ok(Nothing), ffi::Phidget_ChannelClass_PHIDCHCLASS_ACCELEROMETER => Ok(Accelerometer), ffi::Phidget_ChannelClass_PHIDCHCLASS_BLDCMOTOR => Ok(BldcMotor), ffi::Phidget_ChannelClass_PHIDCHCLASS_CAPACITIVETOUCH => Ok(CaptiveTouch), ffi::Phidget_ChannelClass_PHIDCHCLASS_CURRENTINPUT => Ok(CurrentInput), ffi::Phidget_ChannelClass_PHIDCHCLASS_CURRENTOUTPUT => Ok(CurrentOutput), ffi::Phidget_ChannelClass_PHIDCHCLASS_DATAADAPTER => Ok(DataAdapter), ffi::Phidget_ChannelClass_PHIDCHCLASS_DCMOTOR => Ok(DcMotor), ffi::Phidget_ChannelClass_PHIDCHCLASS_DICTIONARY => Ok(Dictionary), ffi::Phidget_ChannelClass_PHIDCHCLASS_DIGITALINPUT => Ok(DigitalInput), ffi::Phidget_ChannelClass_PHIDCHCLASS_DIGITALOUTPUT => Ok(DigitalOutput), ffi::Phidget_ChannelClass_PHIDCHCLASS_DISTANCESENSOR => Ok(DistanceSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_ENCODER => Ok(Encoder), ffi::Phidget_ChannelClass_PHIDCHCLASS_FIRMWAREUPGRADE => Ok(FirmwareUpgrade), ffi::Phidget_ChannelClass_PHIDCHCLASS_FREQUENCYCOUNTER => Ok(FrequencyCounter), ffi::Phidget_ChannelClass_PHIDCHCLASS_GENERIC => Ok(Generic), ffi::Phidget_ChannelClass_PHIDCHCLASS_GPS => Ok(Gps), ffi::Phidget_ChannelClass_PHIDCHCLASS_GYROSCOPE => Ok(Gyroscope), ffi::Phidget_ChannelClass_PHIDCHCLASS_HUB => Ok(Hub), ffi::Phidget_ChannelClass_PHIDCHCLASS_HUMIDITYSENSOR => Ok(HumiditySensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_IR => Ok(Ir), ffi::Phidget_ChannelClass_PHIDCHCLASS_LCD => Ok(Lcd), ffi::Phidget_ChannelClass_PHIDCHCLASS_LIGHTSENSOR => Ok(LightSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_MAGNETOMETER => Ok(Magnetometer), ffi::Phidget_ChannelClass_PHIDCHCLASS_MESHDONGLE => Ok(MeshDongle), ffi::Phidget_ChannelClass_PHIDCHCLASS_MOTORPOSITIONCONTROLLER => {
Ok(MotorPositionController)
} ffi::Phidget_ChannelClass_PHIDCHCLASS_MOTORVELOCITYCONTROLLER => {
Ok(MotorVelocityController)
} ffi::Phidget_ChannelClass_PHIDCHCLASS_PHSENSOR => Ok(PhSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_POWERGUARD => Ok(PowerGuard), ffi::Phidget_ChannelClass_PHIDCHCLASS_PRESSURESENSOR => Ok(PressureSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_RCSERVO => Ok(RcServo), ffi::Phidget_ChannelClass_PHIDCHCLASS_RESISTANCEINPUT => Ok(ResistanceInput), ffi::Phidget_ChannelClass_PHIDCHCLASS_RFID => Ok(Rfid), ffi::Phidget_ChannelClass_PHIDCHCLASS_SOUNDSENSOR => Ok(SoundSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_SPATIAL => Ok(Spatial), ffi::Phidget_ChannelClass_PHIDCHCLASS_STEPPER => Ok(Stepper), ffi::Phidget_ChannelClass_PHIDCHCLASS_TEMPERATURESENSOR => Ok(TemperatureSensor), ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGEINPUT => Ok(VoltageInput), ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGEOUTPUT => Ok(VoltageOutput), ffi::Phidget_ChannelClass_PHIDCHCLASS_VOLTAGERATIOINPUT => Ok(VoltageRatioInput), _ => Err(ReturnCode::InvalidArg),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u32)]
#[allow(missing_docs)]
pub enum DeviceClass {
Nothing = ffi::Phidget_DeviceClass_PHIDCLASS_NOTHING, Accelerometer = ffi::Phidget_DeviceClass_PHIDCLASS_ACCELEROMETER, AdvancedServo = ffi::Phidget_DeviceClass_PHIDCLASS_ADVANCEDSERVO, Analog = ffi::Phidget_DeviceClass_PHIDCLASS_ANALOG, Bridge = ffi::Phidget_DeviceClass_PHIDCLASS_BRIDGE, DataAdapter = ffi::Phidget_DeviceClass_PHIDCLASS_DATAADAPTER, Dictionary = ffi::Phidget_DeviceClass_PHIDCLASS_DICTIONARY, Encoder = ffi::Phidget_DeviceClass_PHIDCLASS_ENCODER, FirmwareUpgrade = ffi::Phidget_DeviceClass_PHIDCLASS_FIRMWAREUPGRADE, FrequencyCounter = ffi::Phidget_DeviceClass_PHIDCLASS_FREQUENCYCOUNTER, Generic = ffi::Phidget_DeviceClass_PHIDCLASS_GENERIC, Gps = ffi::Phidget_DeviceClass_PHIDCLASS_GPS, Hub = ffi::Phidget_DeviceClass_PHIDCLASS_HUB, InterfaceKit = ffi::Phidget_DeviceClass_PHIDCLASS_INTERFACEKIT, Ir = ffi::Phidget_DeviceClass_PHIDCLASS_IR, Led = ffi::Phidget_DeviceClass_PHIDCLASS_LED, MeshDongle = ffi::Phidget_DeviceClass_PHIDCLASS_MESHDONGLE, MotorControl = ffi::Phidget_DeviceClass_PHIDCLASS_MOTORCONTROL, PhSensor = ffi::Phidget_DeviceClass_PHIDCLASS_PHSENSOR, Rfid = ffi::Phidget_DeviceClass_PHIDCLASS_RFID, Servo = ffi::Phidget_DeviceClass_PHIDCLASS_SERVO, Spatial = ffi::Phidget_DeviceClass_PHIDCLASS_SPATIAL, Steper = ffi::Phidget_DeviceClass_PHIDCLASS_STEPPER, TemperatreSensor = ffi::Phidget_DeviceClass_PHIDCLASS_TEMPERATURESENSOR, TextLcd = ffi::Phidget_DeviceClass_PHIDCLASS_TEXTLCD, Vint = ffi::Phidget_DeviceClass_PHIDCLASS_VINT, }
impl TryFrom<u32> for DeviceClass {
type Error = Error;
fn try_from(val: u32) -> Result<Self> {
use DeviceClass::*;
match val {
ffi::Phidget_DeviceClass_PHIDCLASS_NOTHING => Ok(Nothing), ffi::Phidget_DeviceClass_PHIDCLASS_ACCELEROMETER => Ok(Accelerometer), ffi::Phidget_DeviceClass_PHIDCLASS_ADVANCEDSERVO => Ok(AdvancedServo), ffi::Phidget_DeviceClass_PHIDCLASS_ANALOG => Ok(Analog), ffi::Phidget_DeviceClass_PHIDCLASS_BRIDGE => Ok(Bridge), ffi::Phidget_DeviceClass_PHIDCLASS_DATAADAPTER => Ok(DataAdapter), ffi::Phidget_DeviceClass_PHIDCLASS_DICTIONARY => Ok(Dictionary), ffi::Phidget_DeviceClass_PHIDCLASS_ENCODER => Ok(Encoder), ffi::Phidget_DeviceClass_PHIDCLASS_FIRMWAREUPGRADE => Ok(FirmwareUpgrade), ffi::Phidget_DeviceClass_PHIDCLASS_FREQUENCYCOUNTER => Ok(FrequencyCounter), ffi::Phidget_DeviceClass_PHIDCLASS_GENERIC => Ok(Generic), ffi::Phidget_DeviceClass_PHIDCLASS_GPS => Ok(Gps), ffi::Phidget_DeviceClass_PHIDCLASS_HUB => Ok(Hub), ffi::Phidget_DeviceClass_PHIDCLASS_INTERFACEKIT => Ok(InterfaceKit), ffi::Phidget_DeviceClass_PHIDCLASS_IR => Ok(Ir), ffi::Phidget_DeviceClass_PHIDCLASS_LED => Ok(Led), ffi::Phidget_DeviceClass_PHIDCLASS_MESHDONGLE => Ok(MeshDongle), ffi::Phidget_DeviceClass_PHIDCLASS_MOTORCONTROL => Ok(MotorControl), ffi::Phidget_DeviceClass_PHIDCLASS_PHSENSOR => Ok(PhSensor), ffi::Phidget_DeviceClass_PHIDCLASS_RFID => Ok(Rfid), ffi::Phidget_DeviceClass_PHIDCLASS_SERVO => Ok(Servo), ffi::Phidget_DeviceClass_PHIDCLASS_SPATIAL => Ok(Spatial), ffi::Phidget_DeviceClass_PHIDCLASS_STEPPER => Ok(Steper), ffi::Phidget_DeviceClass_PHIDCLASS_TEMPERATURESENSOR => Ok(TemperatreSensor), ffi::Phidget_DeviceClass_PHIDCLASS_TEXTLCD => Ok(TextLcd), ffi::Phidget_DeviceClass_PHIDCLASS_VINT => Ok(Vint), _ => Err(ReturnCode::InvalidArg),
}
}
}
pub fn library_version() -> Result<String> {
get_ffi_string(|s| unsafe { ffi::Phidget_getLibraryVersion(s) })
}
pub fn library_version_number() -> Result<String> {
get_ffi_string(|s| unsafe { ffi::Phidget_getLibraryVersionNumber(s) })
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {}
}