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