From b46393984b1190b4d9bae92435102775d9823548 Mon Sep 17 00:00:00 2001 From: Paul Lecuq Date: Sun, 16 Feb 2025 22:16:16 +0100 Subject: [PATCH] update TemperType --- src/temp.rs | 75 +++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/src/temp.rs b/src/temp.rs index fb13c01..244500a 100644 --- a/src/temp.rs +++ b/src/temp.rs @@ -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 { - if DEBUG { - println!("Device already detached"); + unsafe { + if DEBUG { + println!("Device already detached"); + } } } } pub fn find_lvr_winusb(ctx: *mut *mut libusb_context, devices: &mut Vec) -> 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, + ctx: &mut MaybeUninit<*mut libusb_context>, devices: &mut Vec, ) -> 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, ) { 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 = vec![]; setup_libusb_access(&mut ctx, &mut devices); - if DEBUG { - println!("control"); - println!("{:?}", devices[0].t); + unsafe { + if DEBUG { + 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];