Site Tools
Sidebar
This is an old revision of the document!
Table of Contents
USB HID
… WORK IN PROGRESS …
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
Examples
Basic
A very basic example to forward all mouse and keyboard input to the output port will look like this:
init{ mousemapping(); // clears defaultt T2 mouse mappings keymapping(); // clears default T2 keyboard mappings } main{ 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 { keymapping(); mousemapping(); } main { key_passthru(); 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(mouse_status(MBUTTON_1)) { if(!(system_time()%mouse_speed)) { RX = AntiRecoil_X; RY = AntiRecoil_Y; mouse_set(MOUSE_X, X+RX); mouse_set(MOUSE_Y, Y+RY); mouse_set(MOUSE_WHEEL,WHEEL); } } }
Anti Recoil Decimal
When mouse button 1 is pressed the anti recoil will be applied, supporting decimal/fix32 values.
#include <mouse.gph> // configuration const fix32 antirecoil_X = 0.0; // anti recoil horizontal const fix32 antirecoil_Y = 0.5; // anti recoil vertical // advanced configuration const int MOUSE_SPEED = 10; // <- should be around 10 or higher, a value too low can stop the mouse from working // internal uint32 ARTIMER; int32 X, Y, WHEEL; int32 RX, RY; fix32 ARX, ARY; init { keymapping(); mousemapping(); } main { key_passthru(); X = 0; Y = 0; WHEEL = 0; RX = 0; RY = 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(mouse_status(MBUTTON_1)) { ARTIMER += elapsed_time(); if(!(ARTIMER%MOUSE_SPEED)) { ARX += (fix32)(antirecoil_X); ARY += (fix32)(antirecoil_Y); if (antirecoil_X < 0.0) RX += (int)ceil((ARX)); else RX += (int)floor((ARX)); if (antirecoil_Y < 0.0) RY += (int)ceil((ARY)); else RY += (int)floor((ARY)); mouse_set(MOUSE_X, X+RX); mouse_set(MOUSE_Y, Y+RY); mouse_set(MOUSE_WHEEL,WHEEL); ARX = mod(ARX,1.0); ARY = mod(ARY,1.0); } } else { ARTIMER = MOUSE_SPEED; ARX = 0.0; ARY = 0.0; } }
… WORK IN PROGRESS …