Skip to content

Commit

Permalink
USB: Update GameTablet
Browse files Browse the repository at this point in the history
- Allows to use rawinput handler
- Use a struct to access the input data
  • Loading branch information
Florin9doi committed Apr 29, 2024
1 parent 8d815e8 commit a2d9aad
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 50 deletions.
8 changes: 4 additions & 4 deletions rpcs3/Emu/Cell/lv2/sys_usbd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,9 @@ usb_handler_thread::usb_handler_thread()
}

// Top Shot Elite controllers
check_device(0x12BA, 0x04A0, 0x04A0, "RO Gun Controller");
check_device(0x12BA, 0x04A1, 0x04A1, "RO Gun Controller 2012");
check_device(0x12BA, 0x04B0, 0x04B0, "RO Fishing Rod");
check_device(0x12BA, 0x04A0, 0x04A0, "Top Shot Elite");
check_device(0x12BA, 0x04A1, 0x04A1, "Top Shot Fearmaster");
check_device(0x12BA, 0x04B0, 0x04B0, "Rapala Fishing Rod");

// GT5 Wheels&co
check_device(0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b");
Expand All @@ -346,7 +346,7 @@ usb_handler_thread::usb_handler_thread()
check_device(0x20D6, 0xCB17, 0xCB17, "uDraw GameTablet");

// DVB-T
check_device(0x1415, 0x0003, 0x0003, " PlayTV SCEH-0036");
check_device(0x1415, 0x0003, 0x0003, "PlayTV SCEH-0036");

// 0x0900: "H050 USJ(C) PCB rev00", 0x0910: "USIO PCB rev00"
if (check_device(0x0B9A, 0x0900, 0x0910, "PS3A-USJ"))
Expand Down
130 changes: 85 additions & 45 deletions rpcs3/Emu/Io/GameTablet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,60 @@

LOG_CHANNEL(gametablet_log);

#pragma pack(push, 1)
struct GameTablet_data
{
uint8_t btn_square : 1;
uint8_t btn_cross : 1;
uint8_t btn_circle : 1;
uint8_t btn_triangle : 1;
uint8_t : 4;

uint8_t btn_select : 1;
uint8_t btn_start : 1;
uint8_t : 2;
uint8_t btn_ps: 1;
uint8_t : 3;

uint8_t dpad;
uint8_t stick_lx; // 0x80
uint8_t stick_ly; // 0x80
uint8_t stick_rx; // 0x80
uint8_t stick_ry; // 0x80

uint8_t : 8;
uint8_t : 8;
uint8_t : 8;
uint8_t : 8;
uint8_t pen;
uint8_t : 8;
uint8_t pressure;
uint8_t : 8;
uint8_t pos_x_hi;
uint8_t pos_y_hi;
uint8_t pos_x_lo;
uint8_t pos_y_lo;

uint16_t accel_x;
uint16_t accel_y;
uint16_t accel_z;
uint16_t unk3; // 0x0200
};
#pragma pack(pop)

enum
{
Dpad_North,
Dpad_NE,
Dpad_East,
Dpad_SE,
Dpad_South,
Dpad_SW,
Dpad_West,
Dpad_NW,
Dpad_None = 0x0f
};

usb_device_gametablet::usb_device_gametablet(const std::array<u8, 7>& location)
: usb_device_emulated(location)
{
Expand Down Expand Up @@ -115,37 +169,23 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp
transfer->expected_time = get_timestamp() + 6000;

std::memset(buf, 0, buf_size);
struct GameTablet_data* gt = (struct GameTablet_data*) buf;

buf[0x02] = 0x0f; // dpad

buf[0x03] = 0x80;
buf[0x04] = 0x80;
buf[0x05] = 0x80;
buf[0x06] = 0x80;

buf[0x0d] = 0x72; // pressure
buf[0x0f] = 0x0f; // pos X
buf[0x10] = 0x0f; // pos Y
buf[0x11] = 0xff;
buf[0x12] = 0xff;

buf[0x13] = 0x01; // accel X
buf[0x14] = 0x02;
buf[0x15] = 0x00; // accel Y
buf[0x16] = 0x02;
buf[0x17] = 0xea; // accel Z
buf[0x18] = 0x01;

buf[0x1a] = 0x02;
gt->dpad = Dpad_None;
gt->stick_lx = gt->stick_ly = gt->stick_rx = gt->stick_ry = 0x80;
gt->pressure = 0x72;
gt->pos_x_hi = gt->pos_y_hi = 0x0f;
gt->pos_x_lo = gt->pos_y_lo = 0xff;
gt->accel_x = gt->accel_y = gt->accel_z = gt->unk3 = 0x0200;

if (!is_input_allowed())
{
return;
}

if (g_cfg.io.mouse != mouse_handler::basic)
if (g_cfg.io.mouse == mouse_handler::null)
{
gametablet_log.warning("GameTablet requires mouse_handler configured to basic");
gametablet_log.warning("GameTablet requires a Mouse Handler enabled");
return;
}

Expand All @@ -172,10 +212,10 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp
switch (button.m_outKeyCode)
{
case CELL_PAD_CTRL_SELECT:
buf[1] |= (1 << 0);
gt->btn_select |= 1;
break;
case CELL_PAD_CTRL_START:
buf[1] |= (1 << 1);
gt->btn_start |= 1;
break;
case CELL_PAD_CTRL_UP:
up = true;
Expand All @@ -198,19 +238,19 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp
switch (button.m_outKeyCode)
{
case CELL_PAD_CTRL_SQUARE:
buf[0] |= (1 << 0);
gt->btn_square |= 1;
break;
case CELL_PAD_CTRL_CROSS:
buf[0] |= (1 << 1);
gt->btn_cross |= 1;
break;
case CELL_PAD_CTRL_CIRCLE:
buf[0] |= (1 << 2);
gt->btn_circle |= 1;
break;
case CELL_PAD_CTRL_TRIANGLE:
buf[0] |= (1 << 3);
gt->btn_triangle |= 1;
break;
case CELL_PAD_CTRL_PS:
buf[1] |= (1 << 4);
gt->btn_ps |= 1;
break;
default:
break;
Expand All @@ -221,23 +261,23 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp
}

if (!up && !right && !down && !left)
buf[0x02] = 0x0f;
gt->dpad = Dpad_None;
else if (up && !left && !right)
buf[0x02] = 0x00;
gt->dpad = Dpad_North;
else if (up && right)
buf[0x02] = 0x01;
gt->dpad = Dpad_NE;
else if (right && !up && !down)
buf[0x02] = 0x02;
gt->dpad = Dpad_East;
else if (down && right)
buf[0x02] = 0x03;
gt->dpad = Dpad_SE;
else if (down && !left && !right)
buf[0x02] = 0x04;
gt->dpad = Dpad_South;
else if (down && left)
buf[0x02] = 0x05;
gt->dpad = Dpad_SW;
else if (left && !up && !down)
buf[0x02] = 0x06;
gt->dpad = Dpad_West;
else if (up && left)
buf[0x02] = 0x07;
gt->dpad = Dpad_NW;

auto& mouse_handler = g_fxo->get<MouseHandlerBase>();
std::lock_guard mouse_lock(mouse_handler.mutex);
Expand Down Expand Up @@ -266,10 +306,10 @@ void usb_device_gametablet::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endp
noise_x ^= 0x1;
noise_y ^= 0x1;

buf[0x0b] = 0x40; // pen
buf[0x0d] = mouse_data.buttons & CELL_MOUSE_BUTTON_1 ? 0xbb : 0x72; // pressure
buf[0x0f] = static_cast<u8>(tablet_x_pos / 0x100);
buf[0x10] = static_cast<u8>(tablet_y_pos / 0x100);
buf[0x11] = static_cast<u8>(tablet_x_pos % 0x100);
buf[0x12] = static_cast<u8>(tablet_y_pos % 0x100);
gt->pen = 0x40;
gt->pressure = mouse_data.buttons & CELL_MOUSE_BUTTON_1 ? 0xbb : 0x72;
gt->pos_x_hi = static_cast<u8>(tablet_x_pos / 0x100);
gt->pos_y_hi = static_cast<u8>(tablet_y_pos / 0x100);
gt->pos_x_lo = static_cast<u8>(tablet_x_pos % 0x100);
gt->pos_y_lo = static_cast<u8>(tablet_y_pos % 0x100);
}
2 changes: 1 addition & 1 deletion rpcs3/rpcs3qt/tooltips.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ class Tooltips : public QObject
const QString buzz = tr("Buzz! support.\nSelect 1 or 2 controllers if the game requires Buzz! controllers and you don't have real controllers.\nSelect Null if the game has support for DualShock or if you have real Buzz! controllers.");
const QString turntable = tr("DJ Hero Turntable controller support.\nSelect 1 or 2 controllers if the game requires DJ Hero Turntable controllers and you don't have real turntable controllers.\nSelect Null if the game has support for DualShock or if you have real turntable controllers.\nA real turntable controller can be used at the same time as an emulated turntable controller.");
const QString ghltar = tr("Guitar Hero Live (GHL) Guitar controller support.\nSelect 1 or 2 controllers if the game requires GHL Guitar controllers and you don't have real guitar controllers.\nSelect Null if the game has support for DualShock or if you have real guitar controllers.\nA real guitar controller can be used at the same time as an emulated guitar controller.");
const QString gametablet = tr("uDraw GameTablet emulated controller support.\nDisable to use a physical uDraw GameTablet device.\n• uDraw Studio: Instant Artist requires to configure Mouse Handler=Basic, Pad1=Connected and Pad2=Null.\n• Marvel Super Hero Squad: Comic Combat requires to configure Mouse Handler=Basic, Pad1=Null and Pad2=Connected.");
const QString gametablet = tr("uDraw GameTablet emulated controller support. It requires a Mouse Handler enabled.\nDisable to use a physical uDraw GameTablet device.\n• uDraw Studio: Instant Artist requires Pad1=Connected and Pad2=Null.\n• Marvel Super Hero Squad: Comic Combat requires Pad1=Null and Pad2=Connected.");
const QString background_input = tr("Allows pad and keyboard input while the game window is unfocused.");
const QString show_move_cursor = tr("Shows the raw position of the PS Move input.\nThis can be very helpful during calibration screens.");
const QString midi_devices = tr("Select up to 3 emulated MIDI devices and their types.");
Expand Down

0 comments on commit a2d9aad

Please sign in to comment.