From 46543c3f360d316264cc9691cb007ba654ec2138 Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Thu, 4 May 2023 00:24:53 +0200 Subject: [PATCH] Finish VOK-00106 support --- src/controller/emulated.rs | 13 ++++++----- src/controller/emulated/vok00106.rs | 35 +++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/controller/emulated.rs b/src/controller/emulated.rs index 2f77865..1e89e84 100644 --- a/src/controller/emulated.rs +++ b/src/controller/emulated.rs @@ -22,6 +22,7 @@ mod zkns001; const FFS_MOUNT: &str = "/tmp/ffs"; const ENDPOINT0: &str = "/tmp/ffs/ep0"; const ENDPOINT1: &str = "/tmp/ffs/ep1"; +const ENDPOINT3: &str = "/tmp/ffs/ep3"; const ANDROID_GADGET: &str = "/sys/class/android_usb/android0"; #[derive(PartialEq, Debug, Clone, Copy)] @@ -92,11 +93,11 @@ pub fn set_model(state: &ControllerState) -> Option { model = ControllerModel::SOTP031201P5B7; descriptors = (&sotp031201_p5b7::DEVICE_DESCRIPTOR, &sotp031201_p5b7::DESCRIPTORS, &sotp031201_p5b7::STRINGS); } -/* else if state.button_a { + else if state.button_a { model_name = "VOK-00106"; model = ControllerModel::VOK00106; descriptors = (&vok00106::DEVICE_DESCRIPTOR, &vok00106::DESCRIPTORS, &vok00106::STRINGS); - } */ + } else { println!("No controller selected."); return None; @@ -139,6 +140,7 @@ pub fn set_state(state: &mut ControllerState, model: &ControllerModel) { } pub fn handle_ctrl_transfer(model: ControllerModel, data: &[u8]) { + println!("CTRL REQ: {:?}", data); if data[1] == 6 && data[3] == 34 { // Get HID report descriptor let report: Option<&[u8]>; @@ -164,9 +166,9 @@ pub fn handle_ctrl_transfer(model: ControllerModel, data: &[u8]) { } else if data[1] == 9 { if let Ok(mut ep0) = File::open(&ENDPOINT0) { - let mut buffer = [0; 2]; - ep0.read(&mut buffer).ok(); - println!("CTRL data: {:?}", buffer); + let mut buffer = [0; 8]; + ep0.read(&mut buffer).unwrap(); + println!("CTRL DAT: {:?}", buffer); } } } @@ -193,7 +195,6 @@ fn init_gadget(model: &ControllerModel, (device, descriptors, strings): (&Device let mut buffer = [0; 12]; loop { if let Ok(_result) = ep0.read(&mut buffer) { - println!("EP0: {:?}", buffer); if buffer[8] == 0x4 { // Control transfer received handle_ctrl_transfer(controller_model, &buffer[0..8]); diff --git a/src/controller/emulated/vok00106.rs b/src/controller/emulated/vok00106.rs index 0206f29..d00e02d 100644 --- a/src/controller/emulated/vok00106.rs +++ b/src/controller/emulated/vok00106.rs @@ -1,5 +1,7 @@ +use std::fs::File; +use std::io::{Write}; use crate::controller::physical::ControllerState; -use crate::controller::emulated::{DeviceDescriptor, ENDPOINT1}; +use crate::controller::emulated::{DeviceDescriptor, ENDPOINT3}; pub const DESCRIPTORS: [u8; 76] = [0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, @@ -14,12 +16,37 @@ pub const STRINGS: [u8; 16] = [0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0 pub const DEVICE_DESCRIPTOR: DeviceDescriptor = DeviceDescriptor{b_device_class: 0x02, b_device_sub_class: 0x0, id_vendor: 0x067B, id_product: 0x2303, bcd_device: 0x0102, i_manufacturer: "TAITO", i_product: "Densha de Go! Plug & Play (Master Controller II mode)", i_serial_number: "VOK-00106"}; - const POWER_NOTCHES: [&str; 6] = ["TSA50", "TSA55", "TSA65", "TSA75", "TSA85", "TSA95"]; const BRAKE_NOTCHES: [&str; 10] = ["TSA50", "TSA45", "TSA35", "TSA25", "TSA15", "TSA05", "TSE99", "TSB40", "TSB30", "TSB20"]; +const BUTTON_A: [&str; 2] = ["TSX00", "TSX99"]; +const BUTTON_B: [&str; 2] = ["TSY00", "TSY99"]; +const BUTTON_C: [&str; 2] = ["TSZ00", "TSZ99"]; +const BUTTON_S: [&str; 2] = ["TSK00", "TSK99"]; + pub fn update_gadget(state: &mut ControllerState) { // Calculate data for handles - let power = POWER_NOTCHES[state.power as usize]; - let brake = BRAKE_NOTCHES[state.brake as usize]; + let mut handle = POWER_NOTCHES[state.power as usize]; + if state.brake > 0 { + handle = BRAKE_NOTCHES[state.brake as usize]; + } + + // Calculate data for buttons + let button_a = if state.button_a {BUTTON_A[1]} else {BUTTON_A[0]}; + let button_b = if state.button_b {BUTTON_B[1]} else {BUTTON_B[0]}; + let button_c = if state.button_c {BUTTON_C[1]} else {BUTTON_C[0]}; + let button_s = if state.button_d {BUTTON_S[1]} else {BUTTON_S[0]}; + + if let Ok(mut file) = File::create(ENDPOINT3) { + file.write(handle.as_bytes()).ok(); + file.write(&[0xD]).ok(); + file.write(button_a.as_bytes()).ok(); + file.write(&[0xD]).ok(); + file.write(button_b.as_bytes()).ok(); + file.write(&[0xD]).ok(); + file.write(button_c.as_bytes()).ok(); + file.write(&[0xD]).ok(); + file.write(button_s.as_bytes()).ok(); + file.write(&[0xD]).ok(); + } } \ No newline at end of file