The Output Protocol “USB Multi Interface HID” is a bit special.
It allows the Output to be send as keyboard, mouse and gamepad controls. The connect console/PC on the T2 Output Port will see the T2 as a keyboard/mouse.

This requires different scripting approaches than the usual console controller output protocols. Instead of “set_val” you have to use mouse_set (for mouse output) or key_set (for keyboard output).

Utilizing this “USB Multi Interface HID” Output Protocol you can do scripting with the T2 for the PC. Pablosscripts created a forum post with some information about it: Pablo's Beginners Guide to Scripting for PC

You can find a few scripts for this protocol in the Online Resource within GTuner IV: Search for “usb-hid”.
Some USB HID Script specific links:
Universal HID Gamepack (USB Multi Interface HID)
USB-HID Anti Recoil (USB Multi Interface HID)
USB-HID Gamepad 2 Keyboard+Mouse (USB Multi Interface HID)

GPC functions

Important GPC functions for USB HID protocol usage:
Keyboard: keymapping key_passthru key_check key_status key_get key_set
Mouse: mousemapping mouse_passthru mouse_status mouse_get mouse_set

When you want to forward mouse input or keyboard input use the corresponding _passthru function.
As soon as you want to alter the input before outputting it you need to be careful:

Combination of mouse_passthru() with mouse_set() : The first function will overwrite the output buffer with the latest data received from the connected mouse

More information:
mouse_passthru and mouse_set
mouse_set: always set all mouse ouputs -> X/Y/Wheel/Buttons



A very basic example to forward all mouse and keyboard input to the output port will look like this:

  mousemapping(); // clears defaultt T2 mouse mappings
  keymapping(); // clears default T2 keyboard mappings
  mouse_passthru(); // forward mouse input to output
  key_passthru(); // forward keyboard input to output

Anti Recoil

When mouse button 1 is pressed the anti recoil will be applied.

#include <mouse.gph>
// configuration 
// note: when a value of 1 is still to strong anti recoil try a higher value for mouse_speed
const int mouse_speed = 10; // <- should be around 10 or higher, a value too low can stop the mouse from working
const int AntiRecoil_X = 0; // anti recoil horizontal
const int AntiRecoil_Y = 1; // anti recoil vertical
// internal
int32 X, Y, WHEEL;
int32 RX, RY;
init {
main {
  RX = 0; RY = 0;
  X = 0; Y = 0; WHEEL = 0;
  if(mouse_status(MREPORT_UPDATED)) {
      mouse_passthru(); // only passthru when there is data to send
      X = mouse_status(MOUSE_X);
      Y = mouse_status(MOUSE_Y);
      WHEEL = mouse_status(MOUSE_WHEEL);
    if(!(system_time()%mouse_speed)) {
        RX = AntiRecoil_X;
        RY = AntiRecoil_Y;
        mouse_set(MOUSE_X, X+RX);
        mouse_set(MOUSE_Y, Y+RY);


t2/gpc_scripting/usb_hid.txt · Last modified: 2021/01/04 10:09 by scachi