update TemperType

This commit is contained in:
Paul 2025-02-16 22:16:16 +01:00
parent 93552a148f
commit b46393984b

View File

@ -1,4 +1,6 @@
use std::ffi::*;
use std::ffi::CStr;
use std::mem::MaybeUninit;
use std::ptr::{null_mut, slice_from_raw_parts};
use libusb_sys::*;
@ -12,7 +14,7 @@ const TIMEOUT: u32 = 5000;
const UTEMPERATURE: &[u8; 8] = &[0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00];
static DEBUG: bool = false;
static mut DEBUG: bool = false;
const TEMPER_TYPES: usize = 3;
@ -24,7 +26,7 @@ const TEMPERS: [TemperType; TEMPER_TYPES] = [
check_product_name: true,
has_sensor: true,
has_humid: false,
}, //decode_answer_fm75}, // TEMPer2* eg. TEMPer2V1.3
}, // TEMPer2* eg. TEMPer2V1.3
TemperType {
vendor_id: 0x0c45,
product_id: 0x7401,
@ -33,7 +35,7 @@ const TEMPERS: [TemperType; TEMPER_TYPES] = [
check_product_name: false,
has_sensor: true,
has_humid: false,
}, //decode_answer_fm75}, // other 0c45:7401 eg. TEMPerV1.4
}, // other 0c45:7401 eg. TEMPerV1.4
TemperType {
vendor_id: 0x0c45,
product_id: 0x7402,
@ -66,6 +68,7 @@ impl Default for TemperType {
}
}
}
impl Copy for TemperType {}
#[derive(Clone)]
@ -76,28 +79,24 @@ pub struct TemperDevice {
impl Copy for TemperDevice {}
pub struct Device(*mut libusb_device);
unsafe impl Send for Device {}
unsafe impl Sync for Device {}
impl From<*mut libusb_device> for Device {
fn from(value: *mut libusb_device) -> Self {
Self(value)
}
}
impl Default for TemperDevice {
fn default() -> Self {
Self {
handle: std::ptr::null_mut(),
handle: null_mut(),
t: TemperType::default(),
}
}
}
impl TemperType {
pub fn decode(&self, answer: &[u8; 100], tempd: &mut [f32; 2], calibration: &[f32; 2]) {
match self.product_name {
"TEMPer2" => self.decode_answer_fm75(answer, tempd, calibration),
"TEMPerV1.4" => self.decode_answer_fm75(answer, tempd, calibration),
_ => self.decode_answer_fm75(answer, tempd, calibration),
}
}
pub fn decode_answer_fm75(
&self,
answer: &[u8; 100],
@ -114,24 +113,25 @@ impl TemperType {
tempd[1] = buf as f32 * (125.0 / 32000.0);
tempd[1] = tempd[1] * calibration[0] + calibration[1];
}
pub fn decode_func() {}
}
pub fn usb_detach(lvr_winusb: *mut libusb_device_handle, iInterface: i32) {
pub fn usb_detach(lvr_winusb: *mut libusb_device_handle, i_interface: i32) {
let ret;
unsafe {
ret = libusb_detach_kernel_driver(lvr_winusb, iInterface);
ret = libusb_detach_kernel_driver(lvr_winusb, i_interface);
}
if ret == LIBUSB_ERROR_NOT_FOUND {
unsafe {
if DEBUG {
println!("Device already detached");
}
}
}
}
pub fn find_lvr_winusb(ctx: *mut *mut libusb_context, devices: &mut Vec<TemperDevice>) -> isize {
let mut devs_raw: *const *mut libusb_device = std::ptr::null_mut();
let mut devs_raw: *const *mut libusb_device = null_mut();
let cnt: usize;
unsafe { cnt = libusb_get_device_list(*ctx, &mut devs_raw) as usize };
@ -144,9 +144,9 @@ pub fn find_lvr_winusb(ctx: *mut *mut libusb_context, devices: &mut Vec<TemperDe
let devs_tmp;
unsafe {
devs_tmp = &*std::ptr::slice_from_raw_parts(devs_raw, cnt);
devs_tmp = &*slice_from_raw_parts(devs_raw, cnt);
}
let devs: &mut [*mut libusb_device; 16] = &mut [std::ptr::null_mut(); 16];
let devs: &mut [*mut libusb_device; 16] = &mut [null_mut(); 16];
for i in 0usize..cnt as usize {
devs[i] = devs_tmp[i];
}
@ -195,7 +195,7 @@ pub fn find_lvr_winusb(ctx: *mut *mut libusb_context, devices: &mut Vec<TemperDe
bus = libusb_get_bus_number(devs[i]);
addr = libusb_get_device_address(devs[i]);
let mut handle: *mut libusb_device_handle = std::ptr::null_mut();
let mut handle: *mut libusb_device_handle = null_mut();
let s = libusb_open(devs[i], &mut handle);
if s != 0 {
println!("error open {}", s);
@ -266,10 +266,10 @@ pub fn find_lvr_winusb(ctx: *mut *mut libusb_context, devices: &mut Vec<TemperDe
}
pub fn setup_libusb_access(
ctx: &mut std::mem::MaybeUninit<*mut libusb_context>,
ctx: &mut MaybeUninit<*mut libusb_context>,
devices: &mut Vec<TemperDevice>,
) -> isize {
let mut numdev = 0isize;
let numdev;
let ctx = ctx.as_mut_ptr();
unsafe {
@ -392,7 +392,7 @@ pub fn interrupt_read(dev: &mut TemperDevice, data: &mut [u8; 100]) {
}
pub fn cleanup_usb_devices(
ctx: &mut std::mem::MaybeUninit<*mut libusb_context>,
ctx: &mut MaybeUninit<*mut libusb_context>,
devices: &mut Vec<TemperDevice>,
) {
for device in devices {
@ -410,7 +410,7 @@ pub fn cleanup_usb_devices(
}
pub fn get_temp_r() -> f32 {
let mut ctx = std::mem::MaybeUninit::<*mut libusb_context>::uninit();
let mut ctx = MaybeUninit::<*mut libusb_context>::uninit();
let mut answer: &mut [u8; 100] = &mut [0; 100];
let mut tempd: &mut [f32; 2] = &mut [0.; 2];
let calibration: &[f32; 2] = &[1., 0.];
@ -418,15 +418,16 @@ pub fn get_temp_r() -> f32 {
let mut devices: Vec<TemperDevice> = vec![];
setup_libusb_access(&mut ctx, &mut devices);
unsafe {
if DEBUG {
println!("control");
println!("{:?}", devices[0].t);
}
control_transfer(&mut devices[0], &mut UTEMPERATURE);
}
control_transfer(&mut devices[0], &UTEMPERATURE);
interrupt_read(&mut devices[0], &mut answer);
devices[0]
.t
.decode_answer_fm75(&answer, &mut tempd, calibration);
devices[0].t.decode(&answer, &mut tempd, calibration);
cleanup_usb_devices(&mut ctx, &mut devices);
return tempd[0];