T16000M FCS Flight Pack Thrustmaster FULL HOTAS HANDS ON SCRIPT
-
Ok, I have finished programming a full HOTAS code for “script editor” for Thrustmaster T16000M FCS full flight pack.
As it is something that should only be used if you understand the code, I believe maybe not many will be interested in this.
However, almost every flight operation is now in my HOTAS and this includes ALL 40 MFD left & right buttons…
If anyone wants it let me know.
This is the most perfect solution, in my view.
OK I don’t think its a great idea to simply copy paste this, each user really needs to adapt to each case, I doubt this will work in a “copy/paste” fashion. I decided to share this anyways. This HOTAS has ALL MFD buttons, I only use the keyboard to give ATC requests etc.
This is a real HOTAS configuration, especially if you use a USB extra-keypad to sit between the throttle and joystick as your ICP control.
I have developed a configuration with laser firing capability added into but haven’t perfected it yet.
I lost count how many commands are in this, more than 100 maybe.
USE AT YOUR OWN PERIL: YOU NEED TO CHANGE THE ICP UP DOWN LEFT RIGHT TO SHIFTED AND ALT ‘Y’ and ‘U’, READ CAREFULLY. Trigger 2nd detent is ‘.’ “decimal point”, change your keymap or the code.
include "target.tmh" int main() { Configure(&HCougar, MODE_EXCLUDED); Configure(&Joystick, MODE_EXCLUDED); Configure(&JoystickF18, MODE_EXCLUDED); Configure(&Throttle, MODE_EXCLUDED); Configure(&T16000L, MODE_EXCLUDED); Configure(&LMFD, MODE_EXCLUDED); Configure(&RMFD, MODE_EXCLUDED); Configure(&TFRPRudder, MODE_EXCLUDED); Configure(&TFRPHARudder, MODE_EXCLUDED); if(Init(&EventHandle)) return 1; SetKBRate(100, 100); SetKBLayout(KB_ENG); // Beginning of CHANGES // SET SHIFT I/O BUTTON TO TBTN1 (where AIRBRAKE used to be) SetShiftButton(&TWCSThrottle, TBTN1); // MapKey(&T16000, TS1, '.'); // JOYSTICK BUTTON 2 SHIFTED LIST+0+6 GPS SPEED! --- TEMPO BORE MISSILE TOGGLE --- POV CENTER >>> LONG PRESS 500ms "LANDING LIGHTS TOGGLE" MapKeyIO(&T16000, TS2, TEMPO(CHAIN( PULSE+F4 ,D(), PULSE+KP0, D(), PULSE+KP6), 's' , 300), TEMPO(PULSE+'3', L_SHIFT+'L',400)); // JOYSTICK BUTTON 3 to SHIFTED = ICP LIST && TEMPO FACK --- UNSHIFTED = > PICKLE WEAPON RELEASE MapKeyIO(&T16000, TS3, TEMPO(F4, BSP, 400), SPC); // SHIFTED ECM POWER TOGGLE --- TEMPO ILS ON/OFF TOGGLE --- UNSHIFTED "UNCAGE" >>> LONG PRESS 400ms "MASTER CAUTION RESET" MapKeyIO(&T16000, TS4, TEMPO(R_CTL+R_ALT+'w', R_SHIFT+R_ALT+'y', 600), TEMPO('u',PULSE+ENT,400)); // B5 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B5, TEMPO( R_SHIFT+R_ALT+KP0, R_SHIFT+R_ALT+KP5,500), TEMPO( R_CTL+R_ALT+KP0, R_CTL+R_ALT+KP5,500)); // B6 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B6, TEMPO( R_SHIFT+R_ALT+KP9, R_SHIFT+R_ALT+KP4,500), TEMPO( R_CTL+R_ALT+KP9, R_CTL+R_ALT+KP4,500)); // B7 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B7, TEMPO( R_SHIFT+R_ALT+KP8, R_SHIFT+R_ALT+KP3,500), TEMPO( R_CTL+R_ALT+KP8, R_CTL+R_ALT+KP3,500)); // B8 SHIFTED = RADAR CURSOR ENABLE && TEMPO CANOPY TOGGLE - UNSHIFTED = REFUEL DOOR OPEN && TEMPO INSTRUMENT-MODE-CYCLE(HSI NAV/TACAN) MapKeyIO(&T16000, B8, TEMPO(INS, PULSE+R_CTL+'c', 400), TEMPO(L_SHIFT+'r', 'i', 300) ); // B9 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B9, TEMPO( R_SHIFT+R_ALT+KP6, R_SHIFT+R_ALT+KP1,500), TEMPO( R_CTL+R_ALT+KP6, R_CTL+R_ALT+KP1,500)); // B10 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B10, TEMPO( R_SHIFT+R_ALT+KP7, R_SHIFT+R_ALT+KP2,500), TEMPO( R_CTL+R_ALT+KP7, R_CTL+R_ALT+KP2,500)); // B11 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B11, TEMPO( R_SHIFT+R_ALT+'3', R_SHIFT+R_ALT+'8',500), TEMPO( R_CTL+R_ALT+'3', R_CTL+R_ALT+'8',500) ); // B12 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B12, TEMPO( R_SHIFT+R_ALT+'2', R_SHIFT+R_ALT+'7',500), TEMPO( R_CTL+R_ALT+'2', R_CTL+R_ALT+'7',500)); // B13 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B13, TEMPO( R_SHIFT+R_ALT+'1', R_SHIFT+R_ALT+'6',500), TEMPO( R_CTL+R_ALT+'1', R_CTL+R_ALT+'6',500) ); // B14 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B14, TEMPO( R_SHIFT+R_ALT+'4', R_SHIFT+R_ALT+'9',500), TEMPO( R_CTL+R_ALT+'4', R_CTL+R_ALT+'9',500)); // B15 SHIFTED = RMFD UNSHIFTED = LMFD MapKeyIO(&T16000, B15, TEMPO( R_SHIFT+R_ALT+'5', R_SHIFT+R_ALT+'0',500), TEMPO( R_CTL+R_ALT+'5', R_CTL+R_ALT+'0',500)); // B16 SHIFTED = RWR TGT SEP && TEMPO RWR ALTITUDE LOW TOGGLE --- UNSHIFTED = RWR HANDOFF $$ TEMPO RWR PRIORITY PRI MapKeyIO(&T16000, B16, TEMPO(R_ALT+KP3, R_ALT+USB[0x63], 400), TEMPO(R_ALT+KP9, R_ALT+KP6, 400) ); // POV HAT SHIFTED = ICP UP & TEMPO ICP NEXT --- UNSHIFTED = POV // REXEC(0, 130, "ActKey(KEYON+USBUSB[0x56]);") //MapKeyIO(&T16000, H1U, TEMPO(R_ALT+'u', USB[0x57], 300), UARROW); MapKeyIO(&T16000, H1U, TEMPO(PULSE+R_ALT+'u', REXEC(4, 400, "ActKey(PULSE+KEYON+USB[0x57]);"), 300), UARROW); // POV HAT SHIFTED = ICP RIGHT & LIGHTS-INSTRUMENTS-CYCLE --- UNSHIFTED = POV MapKeyIO(&T16000, H1R, TEMPO(PULSE+R_CTL+'y', R_SHIFT+R_ALT+'x', 400), RARROW); // POV HAT SHIFTED = ICP DOWN & TEMPO ICP PREVIOUS --- UNSHIFTED = POV MapKeyIO(&T16000, H1D, TEMPO(PULSE+R_CTL+'u', REXEC(3, 400, "ActKey(PULSE+KEYON+USB[0x56]);"), 300), DARROW); // POV HAT SHIFTED = ICP LEFT & TEMPO FLOOD-LIGHTS-CYCLE --- UNSHIFTED = POV MapKeyIO(&T16000, H1L, TEMPO(PULSE+R_ALT+'y', R_SHIFT+R_ALT+'c', 400), LARROW); MapAxis(&T16000, JOYX, DX_X_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&T16000, JOYX, 0, 0, 0, 0, 0); MapAxis(&T16000, JOYY, DX_Y_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&T16000, JOYY, 0, 0, 0, 0, 0); MapAxis(&T16000, RUDDER, 0, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&T16000, RUDDER, 0, 0, 0, 0, 0); MapAxis(&T16000, THR, 0, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&T16000, THR, 0, 0, 0, 0, 0); // SHIFTED RF SILENT CYCLE TOGGLE --- TEMPO GEAR TOGGLE --- UNSHIFTED PINKY SWITCH --- TEMPO EMERGENCY JETTISON MapKeyIO(&TWCSThrottle, TLOCK, TEMPO(PULSE+R_CTL+'r', PULSE+'g', 800), TEMPO(PULSE+'v', R_CTL+'j', 800)); // TBTN2 SHIFTED = NWSTEERING TOGGLE --- TEMPO COMM SWITCH LEFT --- UNSHIFTED = COMM SWITCH DOWN VHF TRANSMIT MapKeyIO(&TWCSThrottle, TBTN2, TEMPO(PULSE+R_SHIFT+'/', DEL, 400), END); // TBTN3 SHIFTED = PARKING BRAKE TOGGLE --- TEMPO COMM SWITCH RIGHT--- UNSHIFTED = COMM SWITCH UP UHF TRANSMIT MapKeyIO(&TWCSThrottle, TBTN3, TEMPO(PULSE+L_ALT+'p', PULSE+PGDN, 400), HOME); // SHIFTED = JET FUEL STARTER JFS!! --- TEMPO = MAN RANGE DOWN MapKeyIO(&TWCSThrottle, TBTN4, PULSE+R_SHIFT+'j', TEMPO(PULSE+F1, R_ALT+F3, 600)); // SHIFTED = THROTTLE IDLE DETENT SWITCH --- TEMPO = MAN RANGE UP MapKeyIO(&TWCSThrottle, TBTN5, PULSE+L_ALT+'i', TEMPO(PULSE+F2, R_ALT+F4, 600)); // TOP HAT: TMS // SHIFTED = RESET TRIM MapKeyIO(&TWCSThrottle, THAT2U, PULSE+R_ALT+ENT, PULSE+R_SHIFT+HOME); // SHIFTED TRIM RIGHT MapKeyIO(&TWCSThrottle, THAT2R, REXEC(0, 130, "ActKey(KEYON+PULSE+R_ALT+'n');"), PULSE+R_SHIFT+PGDN); // SHIFTED NAV & STROBE LIGHTS TOGGLE MapKeyIO(&TWCSThrottle, THAT2D, CHAIN(L_SHIFT+R_CTL+'o' ,D(), R_SHIFT+R_CTL+'u'), PULSE+R_SHIFT+END); // SHIFTED TRIM LEFT MapKeyIO(&TWCSThrottle, THAT2L, REXEC(0, 130, "ActKey(KEYON+PULSE+R_SHIFT+'n');"), PULSE+R_SHIFT+DEL); // MIDDLE HAT: DMS // SHIFTED = ICP AA MASTER MODE --- TEMPO INS KNOB UP --- DMS --- TEMPO NEXT WAYPOINT MapKeyIO(&TWCSThrottle, THAT1U, TEMPO(F5, PULSE+R_CTL+R_ALT+'x', 500), TEMPO(PULSE+R_CTL+HOME, PULSE+'x', 400)); // SHIFTED = RADAR ALT STEP UP --- DMS --- TEMPO ALTIMETER PRESSURE INCREASE MapKeyIO(&TWCSThrottle, THAT1R, PULSE+R_SHIFT+R_CTL+'b', TEMPO(PULSE+R_CTL+PGDN, REXEC(0, 130, "ActKey(KEYON+PULSE+R_SHIFT+R_ALT+34);"), 400)); // SHIFTED ICP AG MASTER MODE --- TEMPO INS KNOB DOWN --- DMS --- TEMPO PREVIOUS WAYPOINT MapKeyIO(&TWCSThrottle, THAT1D, TEMPO(F6, PULSE+R_CTL+R_ALT+'z', 500), TEMPO(PULSE+R_CTL+END, PULSE+'z', 400)); // SHIFTED = RADAR ALT STEP DOWN TEMPO EJECT EJECT EJECT --- DMS --- TEMPO ALTIMETER PRESSURE DECREASE MapKeyIO(&TWCSThrottle, THAT1L, TEMPO(PULSE+R_SHIFT+R_CTL+'v', R_CTL+'e', 800), TEMPO(PULSE+R_CTL+DEL, REXEC(0, 130, "ActKey(KEYON+PULSE+R_SHIFT+R_ALT+';');"), 400)); // BOTTOM HAT: CMS // SHIFTED = CMDS PROGRAM UP --- TEMPO CMDS MODE UP --- UNSHIFTED: CMS UP etc --- TEMPO DGF MODE MapKeyIO(&TWCSThrottle, THAT3U, TEMPO(PULSE+R_CTL+'x', PULSE+R_ALT+'x', 400), TEMPO(PULSE+R_ALT+HOME, PULSE+'d', 400)); // UNSHIFTED: CMS RIGHT --- TEMPO ARM MODE CYCLE MapKey(&TWCSThrottle, THAT3R, TEMPO(PULSE+R_ALT+PGDN, PULSE+R_SHIFT+'m', 400)); // SHIFTED = CMDS PROGRAM DOWN --- TEMPO CMDS MODE DOWN --- UNSHIFTED: CMS DOWN --- TEMPO MRM MODE MapKeyIO(&TWCSThrottle, THAT3D, TEMPO(PULSE+R_CTL+'z', PULSE+R_ALT+'z', 400), TEMPO(PULSE+R_ALT+END , PULSE+'m', 400)); // UNSHIFTED: CMS LEFT --- TEMPO CANCEL MODES MapKey(&TWCSThrottle, THAT3L, TEMPO(PULSE+R_ALT+DEL, PULSE+'c', 400)); // PADDLE RIGHT TO "AIRBRAKE TOGGLE" // PADDLE LEFT FOR SLAPSWITCH KeyAxis(&TWCSThrottle, TRDR, 0, AXMAP2( LIST( 0, 32, 74 ), 's', 0, PULSE+'b' )); KeyAxis(&TWCSThrottle, TCSRIGHT, 0, AXMAP2( LIST( 0, 1 ), 'k', 0 )); MapAxis(&TWCSThrottle, TRDR, DX_THROTTLE_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TRDR, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TTHR, DX_SLIDER_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TTHR, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TANT, DX_Z_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TANT, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TMSTX, DX_XROT_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TMSTX, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TMSTY, DX_YROT_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TMSTY, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TCSRIGHT, 0, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TCSRIGHT, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TCSRUDDER, DX_ZROT_AXIS, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TCSRUDDER, 0, 0, 0, 0, 0); MapAxis(&TWCSThrottle, TCSLEFT, 0, AXIS_NORMAL, MAP_ABSOLUTE); SetSCurve(&TWCSThrottle, TCSLEFT, 0, 0, 0, 0, 0); } int EventHandle(int type, alias o, int x) { DefaultMapping(&o, x); }
With this code, say goodbye to awkward using mouse to increase decrease Altimeter.
In case you have a command that doesnt fit, look at the commentary, and change either your keymap or the code itself.
BE CAREFUL if you change the miliseconds in the delays, NOT EVERY milisecond delay works. It took trial and error to find the minimum. AND this may be DIFFERENT from each pc to a different pc. Be careful. This works perfectly for me.
-
I think there’s plenty of us with this setup, so it would be great to see your script
-
That is great. Registering my interest here.
Thanks -
Copy.
Thanks for your interest.
I have to warn everybody that as of yet, everything works as advertised, but the comments in the code are old and not updated to current config.
So at this point I will not be able to help explaining everything inside the code.
I have not yet prepared a “fully commented user friendly” version of the code.This means all I can do at this point is go public with the code, without any support from me.
%%% CONSEQUENCES:
Anyone using the code has to look up and confirm they understand what each command does.
There is a logic to the bottom pair of 6 base buttons in the joystick.You only have to understand that the RMFD is SHIFTED on ALL BUTTONS.
And that the LMFD is DIRECT NON-SHIFTED on ALL BUTTONS.
And it is configured in this way:
TOP and RIGHT side buttons belong in RIGHT BASE BUTTONS of JOYSTICK (#13 #12 #11 #14 #15)
- and how do you go from TOP to RIGHT SIDE MFD BUTTONS? LONGER PRESS 500 MILISECONDS… TOP IS DIRECT, RIGHT SIDE IS LONGPRESS
PLEASE! READ THE BUTTONS ON MFD FROM LEFT TO RIGHT… its always the same process. Unused for MFD but used for OTHER purposes are #8 and #16…
LEFT AND BOTTOM are pressed with RIGHT BASE BUTTONS of JOYSTICK (#5 #6 #7 #10 #9)
LEFT BUTTONS ARE DIRECT, BOTTOM ARE LONGPRESS…when you look at your RIGHT BASE BUTTONS but its the same logic to the other side, this is what you should see:
RIGHT-SIDE BASE BUTTONS ON JOYSTICK:
BUTTONS PRESSED DIRECTLY (NOT LONGPRESS):
#13 = MFD button 1 –-- #12 = MFD button 2 ---- #11 = MFD button 3 ----
#14 = MFD button 4 ---- #15 = MFD button 5 ---- #16 NOT USED FOR MFD!!!
%%%%%%%%%%%%%%%%%%%%
BUTTONS PRESSED LONGPRESS 500 miliseconds (NOT DIRECTLY INSTANTANEOUS):
#13 = MFD button 6 ---- #12 = MFD button 6 ---- #11 = MFD button 8 ----
#14 = MFD button 9 ---- #15 = MFD button 10 ---- #16 NOT USED FOR MFD!!!
%%%%%%%%%%%%%%%%%
LEFT-SIDE BASE BUTTONS ON JOYSTICK:
BUTTONS PRESSED DIRECTLY (NOT LONGPRESS):
#5 = MFD button 20 –— #6 = MFD button 19 ---- #7 = MFD button 18 ----
#10 = MFD button 17 ---- #9 = MFD button 16 ---- # 8 NOT USED FOR MFD!!!
%%%%%%%%%%%%%%%%%%%%
BUTTONS PRESSED LONGPRESS 500 miliseconds (NOT DIRECTLY INSTANTANEOUS):
#5 = MFD button 15 ---- #6 = MFD button 14 ---- #7 = MFD button 13 ----
#10 = MFD button 12 ---- #9 = MFD button 11 ---- # 8 NOT USED FOR MFD!!!
%%%%%%%%%%%%%%%%%
To SWITCH between LEFT MFD to RIGHT MFD simply PRESS SHIFTED HOTAS….
If you can understand this, everything else follows….
EXAMPLE:
I want to switch from TWS to RWS:
Solution:
- UNSHIFTED(LMFD) quick press #13.
%%%%%%%%%%%%%%%
Example: I want to switch TGP from BHOT to TV:
- SHIFTED(RMFD) LONGPRESS #13.
%%%%%%%%%%
Example: I want to SWAP MFD SIDE TO SIDE:
- LONGPRESS #10.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
If there is anyone who is not discouraged so far and agrees that I will not have time to provide support or explain anything else further, I will publish this script.
I wish I had more time to explain everything in more detail and comment this correctly: SOME COMMENTS ARE WRONG at this point…
-
I have to WARN EVERYONE = This takes a LOT OF PRACTICE to ACE IT!
-
I hesitate to publish this script given the issues and problems that are different from ONE MACHINE TO THE NEXT…
I hope no problem or issue is created by publishing it and creating a situation where your results with my script are totally different from my results in my machine…
I will not answer any questions if I publish it, I simply do not have time.
If anyone is still NOT discouraged, reply to this thread and explicitly ask for the script acknowledging there will be no support or answers from me.
It took me dozens of hours to reach this perfect script for me.
Realize this expeditiously and understand I will not have time to answer any questions.
(Realize also that this script is developed to such a point that even the ALTIMETER increase +1 decrease +1 is included in the HOTAS (in this case the throttle), no more fumbling around during transition altitudes and Flight Levels…)
(With this FULL MFD BUTTONS I even quickly configure my AIM120 to SMALL target RCS in the MRM SMS screen… (depending on situation and context of course…) )
-
Added the code BUMP