Control in/out both work

This commit is contained in:
G2-Games 2024-01-31 08:06:35 -06:00
parent db9605fbb7
commit 3ca83e5f8c
3 changed files with 13 additions and 17 deletions

View file

@ -7,10 +7,12 @@ edition = "2021"
[lib] [lib]
crate-type = ["cdylib", "rlib"] crate-type = ["cdylib", "rlib"]
# Wasm deps
[target.'cfg(target_family = "wasm")'.dependencies] [target.'cfg(target_family = "wasm")'.dependencies]
wasm-bindgen = "0.2.84" wasm-bindgen = "0.2.84"
wasm-bindgen-futures = "0.4.39" wasm-bindgen-futures = "0.4.39"
js-sys = "0.3.67" js-sys = "0.3.67"
gloo = "0.11.0"
[target.'cfg(target_family = "wasm")'.dependencies.web-sys] [target.'cfg(target_family = "wasm")'.dependencies.web-sys]
version = "0.3" version = "0.3"
@ -29,14 +31,12 @@ features = [
"Storage" "Storage"
] ]
# Non-wasm deps
[target.'cfg(not(target_family = "wasm"))'.dependencies] [target.'cfg(not(target_family = "wasm"))'.dependencies]
nusb = "0.1.4" nusb = "0.1.4"
[profile.release] [profile.release]
opt-level = "s" opt-level = "s"
[dependencies]
thiserror = "1.0.56"
[package.metadata.wasm-pack.profile.dev.wasm-bindgen] [package.metadata.wasm-pack.profile.dev.wasm-bindgen]
dwarf-debug-info = true dwarf-debug-info = true

View file

@ -1,7 +1,7 @@
#![cfg_attr(debug_assertions, allow(dead_code, unused_imports))] #![cfg_attr(debug_assertions, allow(dead_code, unused_imports))]
use std::error::Error; use std::error::Error;
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use js_sys::JSON; use gloo::console::log;
use web_sys::{ use web_sys::{
console, console,
@ -14,7 +14,7 @@ use web_sys::{
UsbRequestType, UsbRequestType,
UsbDeviceRequestOptions, UsbDeviceRequestOptions,
}; };
use js_sys::{Array, Uint8Array, Promise}; use js_sys::{Array, Uint8Array, Promise, Object};
use wasm_bindgen_futures::JsFuture; use wasm_bindgen_futures::JsFuture;
// Crate stuff // Crate stuff
@ -89,7 +89,6 @@ impl Device for UsbDevice {
return Err(format!("{:?}", err).into()) return Err(format!("{:?}", err).into())
}, },
}; };
//let interface: WasmUsbInterface = dev_promise.await.unwrap().into();
Ok(UsbInterface { Ok(UsbInterface {
device: self.device.clone() device: self.device.clone()
@ -121,9 +120,9 @@ impl<'a> Interface<'a> for UsbInterface {
let length = data.length; let length = data.length;
let params: UsbControlTransferParameters = data.into(); let params: UsbControlTransferParameters = data.into();
let promise = Promise::resolve(&self.device.control_transfer_in(&params, length)); let result = JsFuture::from(Promise::resolve(
&self.device.control_transfer_in(&params, length)
let result = JsFuture::from(promise).await; )).await;
let transfer_result: UsbInTransferResult = match result { let transfer_result: UsbInTransferResult = match result {
Ok(res) => res.into(), Ok(res) => res.into(),
@ -141,13 +140,15 @@ impl<'a> Interface<'a> for UsbInterface {
} }
async fn control_out(&self, data: crate::usb::ControlOut<'a>) -> Result<(), Box<dyn Error>> { async fn control_out(&self, data: crate::usb::ControlOut<'a>) -> Result<(), Box<dyn Error>> {
let params = data.into(); let array = Uint8Array::from(data.data);
let promise = Promise::resolve(&self.device.control_transfer_out(&params)); let array_obj = Object::try_from(&array).unwrap();
let params: UsbControlTransferParameters = data.into();
let promise = Promise::resolve(&self.device.control_transfer_out_with_buffer_source(&params, &array_obj));
let result = JsFuture::from(promise).await; let result = JsFuture::from(promise).await;
match result { match result {
Ok(_) => Ok(()), Ok(res) => Ok(()),
Err(err) => Err(format!("{:?}", err).into()), Err(err) => Err(format!("{:?}", err).into()),
} }
} }

View file

@ -1,11 +1,6 @@
#![cfg_attr(debug_assertions, allow(async_fn_in_trait))] #![cfg_attr(debug_assertions, allow(async_fn_in_trait))]
use std::error::Error; use std::error::Error;
use crate::context::UsbInterface; use crate::context::UsbInterface;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum UsbError {
}
/// A unique USB device /// A unique USB device
pub trait Device { pub trait Device {