Created a controller for the keyboard

This commit is contained in:
2021-05-07 23:28:37 +02:00
parent abec6ac0ba
commit d2d324485e
3 changed files with 86 additions and 70 deletions

View File

@@ -0,0 +1,58 @@
/*****************************************************************************
* Module: DasKeyboard
* Created On: Fri 07 May 2021 10:17:24 PM CEST
* Last Modified: Fri 07 May 2021 11:28:01 PM CEST
*
* Driver for DasKeyboard keyboards light
* Jali <jali@orca-central.de>
*****************************************************************************/
use std::ffi::{CStr, CString};
use hidapi::{DeviceInfo, HidApi, HidError, HidResult};
/** Driver for DasKeyboard RGB keyboards
* lighting controller
*/
pub struct DasKeyboardController {
dev: DeviceInfo,
location: CString,
use_traditional_send_data: bool,
version: String,
}
/** Implementation of the controller. */
impl DasKeyboardController {
/**
* Creates a new instance of ```DasKeyboardController```, which is
* bound to a currently connected device.
*
* # Arguments
*
* * `vendor_id` - The unique vendor/manufactorer id of the device
* * `product_id` - The unique product id of the device.
*/
pub fn new(vendor_id: u16, product_id: u16) -> HidResult<DasKeyboardController> {
match HidApi::new() {
Ok(api) => {
let device = api.device_list()
.find(d => d.vendor_id() == vendor_id && d.product_id() == product_id);
match device {
Some(d) => {
let c = DasKeyboardController {
dev = d,
location = d.path()
};
Ok(c)
},
None => {
Err(HidApiError("Could not open device"))
}
}
},
Err(e) => {
e
}
}
}
}

10
src/controllers/mod.rs Normal file
View File

@@ -0,0 +1,10 @@
/*
* Definition of module controllers
*
* Created On: Fri 07 May 2021 09:19:14 PM CEST
* Last Modified: Fri 07 May 2021 09:19:14 PM CEST
*/
mod DasKeyboard;
pub use DasKeyboard::DasKeyboardController;

View File

@@ -1,77 +1,25 @@
extern crate hidapi; extern crate hidapi;
use hidapi::*; use hidapi::HidApi;
fn ReceiveData(device: &HidDevice) -> Result<Vec<u8>,()> {
let mut usb_buf = vec![0u8; 65];
let mut err_cnt = 3;
let mut chk_sum = 0;
loop {
usb_buf[0] = 0x01;
match device.get_feature_report(&mut usb_buf[..]) {
Ok(res) => {
if usb_buf[0] == 0x1 {
for i in 0..res {
chk_sum ^= usb_buf[i];
}
if chk_sum == 0 {
break Err(());
}
break Ok(usb_buf);
}
},
Err(_) => {
err_cnt -= 1;
if err_cnt == 0 {
break Err(());
}
}
}
}
}
fn SendData(device: &HidDevice, data: &[u8]) {
let mut usb_buf = [0u8; 65];
let mut err_cnt = 3;
loop {
let mut chk_sum = 0;
usb_buf[0] = 0x01;
for i in 1..data.len() {
usb_buf[i + 1] = data[i];
chk_sum ^= data[i];
}
usb_buf[data.len() + 1] = chk_sum;
match device.send_feature_report(&usb_buf[..]) {
Ok(_) => break,
Err(_) => {
err_cnt -= 1;
if err_cnt == 0 {
break;
}
()
}
}
}
}
fn main() { fn main() {
println!("Get the version data from the keyboard:"); println!("Get device data:");
let api = HidApi::new().unwrap(); match HidApi::new() {
Ok(api) => {
// connect to the device using VID and PID for device in api.device_list() {
let (VID, PID) = (0x24f0, 0x2037); println!(
let device = api.open(VID, PID).unwrap(); "{:04x}:{:04x} {} - {} {}",
device.vendor_id(),
let usb_init = [0xea, 0x02, 0xb0]; device.product_id(),
SendData(&device, &usb_init[..]); device.path().to_string_lossy().into_owned(),
match ReceiveData(&device) { device.product_string().unwrap_or("<Unknown>"),
Ok(data) => { device.serial_number().unwrap_or("<None>")
println!("It worked!") );
}, }
Err(_) => () }
Err(e) => {
eprintln!("Error: {}", e);
}
} }
} }