update TemperType
This commit is contained in:
parent
93552a148f
commit
b46393984b
75
src/temp.rs
75
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::*;
|
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];
|
||||||
|
Loading…
Reference in New Issue
Block a user