mirror of
https://github.com/marcriera/ddgo-pnp-controller.git
synced 2025-04-11 06:29:29 +02:00
Finish VOK-00106 support
This commit is contained in:
parent
e970d1bfd7
commit
46543c3f36
2 changed files with 38 additions and 10 deletions
|
@ -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<ControllerModel> {
|
|||
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]);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue