Plus particulièrement destiné à Falcon 4 BMS
Préambule
Je ne suis pas un pro en informatique. Ce post peut contenir des erreurs, merci de m'en faire part et je corrigerais
Je m'inspire beaucoup du travail de "Morphine" et du fichier excel pour la programmation clavier de Falcon BMS.
Je l'ai adapté, et selon moi amélioré (à mon niveau)
Je débute avec Falcon BMS, et du coup je ne connais pas encore bien les fonctions qui seront utiles plus tard, quand on "maîtrise un peu plus"
Bonjour tout le monde,
Avec ce post je ne cherche pas à faire un nouveau guide de programmation pour le Warthog, il y a déjà l'officiel de chez Thrustmaster, et quelques autres aides, traduites ou pas, que l'on trouve sur le web.
Je cherche plus particulièrement à préciser le fonctionnement avec Falcon 4 BMS, et les différentes interfaces DirectX et/ou TARGET qu'il peut y avoir avec le jeu.
Je me suis lancé là dedans car je cherchais à faire un profil TARGET qui fonctionne avec Falcon 4, mais aussi d'utiliser la programmation DirectX directement dans le jeu par le fichier .key
Beaucoup de ce travail a été inspiré par le profil TARGET de Morphine, duquel j'ai repris beaucoup d'idées.
Mes raisons d'utiliser un profil TARGET :
- Réglage de la sensibilité du curseur = sans modification impossible de cliquer en laissant le curseur sur place (pour moi tout du moins)
- Création d'une courbe de sensibilité pour le stick spécifique lors du ravitaillement air-air. Mon stick est fixé sur le côté de mon fauteil, et du coup la précision des mouvements fins est diminuée par rapport à un positionnement entre les jambes. Peut-être qu'un jour je passerais sur un capteur de force RealSimulator, mais ce n'est pas encore à l'ordre du jour
- Personnalisation plus poussée de mon HOTAS.
Fort de ces constations, je devais passer par un script TARGET pour arriver à mes fins.
Points négatifs à l'utilisation de TARGET :
- Uniquement 32 boutons DirectX programmables, après combinaison du stick et du throttle
- Il faut penser à lancer le script avant de lancer F4BMS
- Capricieux avec Windows 10, des fois la combinaison et la création d'un contrôleur virtuel plante, et c'est bien **** !!
Voilà pour la petite intro, maintenant, le vif du sujet !
ORDRE DES CONTRÔLEURS DANS FALCON BMS
Falcon BMS voit les contrôleurs dans le même ordre que Windows, et l'affectation des touches DirectX en est affecté, explication :
Chaque contrôleur a 32 boutons DirectX. Le premier aura les boutons 0 à 31, le second 32 à 63, etc...
Si votre joystick apparait en second dans la liste (avec le palonnier en premier), il aura alors les boutons 32 à 63. Si c'est bien programmé comme cela dans votre fichier .key, pas de problème. Par contre, si ce n'est pas le cas, il faut forcer un ordre différent.
Pour connaître l'order des contrôleurs dans Windows 10, voici la procédure :
Code : Tout sélectionner
Touches Windows+R pour ouvrir la fenêtre d'exécution, taper joy.cpl et cliquer sur OK
Le contrôleur #1 est le premier dans la liste, le #2 le second, etc...
L'ordre n'est pas vraiment modifiable, et si on s'entête à le modifier, tout peut sauter au prochain redémarrage, donc pas très stable. A laisser tranquile, expérience personnelle !
L'ordre des contrôleurs peut être forcé dans le fichier "DeviceSorting.txt" situé dans le dossier de Falcon BMS/User/Config
A vous de modifier le votre pour que l'ordre soit bien respecté !
LE NOM DES BOUTONS
Lors de la combinaison du stick et du throttle, TARGET crée un contrôleur virtuel "THRUSTMASTER COMBINED" qui les rassemble en un seul contrôleur DirectX, contenant 32 boutons.
Ci-dessous le nom de chaque bouton pour la programmation sous TARGET, ainsi que le numéro DirectX s'il y en a un, dans le cas de l'utilisation de deux contrôleurs séparés (sans script TARGET), ou d'un seul contrôleur "Combined" (avec utilisation d'un script TARGET).
Ensuite, j'ai décidé de faire un maximum de programmation DirectX directement par le fichier Key de Falcon BMS, ce qui n'est pas facile en ligne de code.
Le fichier excel permettant la création de ce fichier clé n'a pas d'option pour le contrôleur "TRUSTMASTER COMBINED", je l'ai donc créé en utiliser la page "GENERIC PRIMARY" que j'ai personnalisé pour l'occasion.
Vous pouvez télécharger le fichier avec le lien à la fin de ce post.
Avec ce fichier vous pouvez directement programmation les 32 premiers boutons DirectX et générer votre fichier clé.
Je ne rentrerais pas dans les détails de son utilisation, vous pouvez tout trouver dans la documentation de Falcon BMS.
Pour les boutons restants, je les ai programmés par des appels clavier en utilisant TARGET.
Afin de rendre la chose plus lisible, j'ai séparé les macros et la programmation. Ca permet de mieux comprendre les étapes, et rend les modifications beaucoup plus faciles.
J'ai nommé les macros avec le même nom que l'appel de fonction F4BMS, comme cela l'édition et la vérification du code est encore plus facile.
J'ai également créé des sensibilités spécifiques pour le curseur et le stick lors du ravitaillement air-air.
Les macros :
Code : Tout sélectionner
define SimSelectMRMOverride PULSE+','
define SimDeselectOverride PULSE+'c'
define SimSelectSRMOverride PULSE+'d'
define RangeDecrease AXIS(DX_THROTTLE_AXIS, -500, 20)
define RangeIncrease AXIS(DX_THROTTLE_AXIS, 500, 20)
define SimLightsFlash PULSE+L_SHIFT+L_CTL+'k'
define SimExtlMasterNorm PULSE+L_SHIFT+L_ALT+L_CTL+'t'
define SimLightsSteady PULSE+L_SHIFT+L_CTL+'l'
define SimExtlMasterOff PULSE+L_SHIFT+L_ALT+L_CTL+'i'
define SimLaserArmOn PULSE+L_ALT+'l'
define SimLaserArmOff PULSE+L_SHIFT+L_ALT+'l'
define SimCATI PULSE+L_SHIFT+L_ALT+L_CTL+'c'
define SimCATIII PULSE+L_SHIFT+L_ALT+L_CTL+'v'
define SimEngContPri PULSE+L_SHIFT+L_ALT+L_CTL+'y'
define SimEngContSec PULSE+L_SHIFT+L_ALT+L_CTL+'u'
define AFAlternateGear PULSE+L_ALT+'g'
define AFAlternateGearReset PULSE+L_SHIFT+'g'
define AFGearToggle PULSE+'g'
define SimRightAPDown PULSE+L_SHIFT+L_ALT+L_CTL+'l'
define SimRightAPMid PULSE+L_SHIFT+L_ALT+L_CTL+''k'
define SimRightAPUp PULSE+L_SHIFT+L_ALT+L_CTL+'j'
define SimRFNorm PULSE+L_SHIFT+L_CTL+'r'
define SimRFQuiet PULSE+L_SHIFT+L_ALT+L_CTL+'r'
define SimArmMasterArm PULSE+L_SHIFT+L_ALT+L_CTL+'w'
define SimSafeMasterArm PULSE+L_SHIFT+L_ALT+L_CTL+'x'
define SimLeftAPUp PULSE+L_SHIFT+L_ALT+L_CTL+'F'
define SimLeftAPDown PULSE+L_SHIFT+L_ALT+L_CTL+'H'
define SimLeftAPMid PULSE+L_SHIFT+L_ALT+L_CTL+'G'
define SimDriftCOOn PULSE+L_CTL+USB[0x54]
define SimDriftCOOff PULSE+L_ALT+USB[0x54]
define SimParkingBrakeToggle PULSE+L_ALT+'p'
define SimFuelDoorOpen PULSE+L_SHIFT+L_ALT+L_CTL+'q'
define SimFuelDoorClose PULSE+L_SHIFT+L_ALT+L_CTL+'s'
define JoySensitivityReduced CHAIN(EXEC("SetSCurve(&Joystick, JOYX,0,0,0,0,-1);SetSCurve(&Joystick, JOYY,0,0,0,0,-1);"), D(), LED(&Throttle, LED_ONOFF, LED_CURRENT+LED5))
define JoySensitivityNorm CHAIN(EXEC("SetSCurve(&Joystick, JOYX,0,0,0,0,0);SetSCurve(&Joystick, JOYY,0,0,0,0,0);"), D(), LED(&Throttle, LED_ONOFF, LED_CURRENT-LED5))
define SimToggleTFR PULSE+L_CTL+'q'
define SimDoNothing 0
define TrackIRRecenter 0
define TrackIRPause 0
define TeamSpeakPTT 0
define TeamSpeakWhisper 0
define VoiceAttack 0
Code : Tout sélectionner
include "target.tmh"
include "F4BMSTargetMacros.ttm" //Keystrokes macro
int main()
{
Configure(&LMFD, MODE_EXCLUDED);
Configure(&RMFD, MODE_EXCLUDED);
Configure(&HCougar, MODE_EXCLUDED);
Configure(&T16000, MODE_EXCLUDED);
Configure(&TWCSThrottle, MODE_EXCLUDED);
Configure(&TFRPRudder, MODE_EXCLUDED);
Configure(&T16000L, MODE_EXCLUDED);
if(Init(&EventHandle)) return 1;
SetKBRate(32, 50);
SetKBLayout(KB_FR);
SetShiftButton(&Joystick, S3);
////////////////// LED CONTROLS //////////////////////////////
//initialize LED status all "OFF"
ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1)); //set LED 1 OFF
ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED2)); //set LED 2 OFF
ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED3)); //set LED 3 OFF
ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED4)); //set LED 4 OFF
ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED5)); //set LED 5 OFF
//LED Throttle Position Indicator; LED 1 - MIL Power; LED 2 - AfterBurner
KeyAxis(&Throttle, THR_LEFT, 0, AXMAP2( LIST( 0, 65, 75 ),
LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1), //0 to 65% throttle
CHAIN( LED(&Throttle, LED_ONOFF, LED_CURRENT+LED1), D(), LED(&Throttle, LED_ONOFF, LED_CURRENT-LED2)), //65 to 75% throttle
CHAIN( LED(&Throttle, LED_ONOFF, LED_CURRENT+LED2)))); //>75% throttle
////////////////// AXIS CONTROLS //////////////////////////////
MapAxis(&Joystick, JOYX, DX_X_AXIS);
MapAxis(&Joystick, JOYY, DX_Y_AXIS);
MapAxis(&Throttle, THR_LEFT, DX_ZROT_AXIS);
SetCustomCurve(&Throttle, THR_LEFT, LIST(0,5, 65,70, 75,70, 100,100)); //start at 5% for idle cuttoff & create a deadzone between 65% and 75% for AB
MapAxis(&Throttle, THR_RIGHT, DX_Z_AXIS);
SetCustomCurve(&Throttle, THR_RIGHT, LIST(0,5, 65,70, 75,70, 100,100)); //start at 5% for idle cuttoff & create a deadzone between 65% and 75% for AB
//Cursor control :
MapAxis(&Throttle, SCX, DX_XROT_AXIS);
SetSCurve(&Throttle, SCX, 0, //Left Deadzone
95, //Center Deadzone
0, //Right Deadzone
0, //Curve
-1); //Scale/zoom
MapAxis(&Throttle, SCY, DX_YROT_AXIS);
SetSCurve(&Throttle, SCY, 0, //Left Deadzone
95, //Center Deadzone
0, //Right Deadzone
0, //Curve
-1); //Scale/zoom
MapAxis(&Throttle, THR_FC, DX_SLIDER_AXIS);
SetSCurve(&Throttle, THR_FC, 0, 0, 0, 5, 0); //Radar antenna elevation. Reduced sensitivity in the center.
////////////////// Idle Cutoff Code //////////////////////////////
MapKey (&Throttle, IDLELON,
EXEC("TrimDXAxis(DX_ZROT_AXIS, 90);"
));
MapKeyR (&Throttle, IDLELON,
EXEC("TrimDXAxis(DX_ZROT_AXIS, SET(0));"
));
MapKey (&Throttle, IDLERON,
EXEC("TrimDXAxis(DX_Z_AXIS, 90);"
));
MapKeyR (&Throttle, IDLERON,
EXEC("TrimDXAxis(DX_Z_AXIS, SET(0));"
));
////////////////// JOYSTICK KEY MAPPING //////////////////////////////
//TG1
//keyflie controlled
//Pickle/S2
//keyflie controlled
//Pinky/S3
//keyflie controlled
//Paddle/S4
//keyflie controlled
//MslStep/S1
//keyflie controlled
//TG2
//keyflie controlled
//TMS/H2
//keyflie controlled
//DMS/H3
//keyflie controlled
//CMS/H4/Z-Axis
//keyflie controlled
////////////////// THROTTLE KEY MAPPING //////////////////////////////
//Left Throttle Button
//keyflie controlled
//Cursor Button
//keyflie controlled
//Coolie Switch
//keyflie controlled
//Mic Switch
//Keyfile controlled
//Speedbrakes
//keyflie controlled
//Boat Switch
MapKey(&Throttle, BSF, SimSelectMRMOverride);
MapKey(&Throttle, BSM, SimDeselectOverride);
MapKey(&Throttle, BSB, SimSelectSRMOverride);
//China Hat
MapKey(&Throttle, CHF, RangeDecrease);
MapKey(&Throttle, CHB, RangeIncrease);
//Pinky Switch
MapKey(&Throttle, PSF, CHAIN(SimExtlMasterNorm, D(), SimLightsFlash));
MapKey(&Throttle, PSM, CHAIN(SimExtlMasterNorm, D(), SimLightsSteady));
MapKey(&Throttle, PSB, SimExtlMasterOff);
//Engine Fuel Flow Left
MapKey(&Throttle, EFLNORM, SimRFNorm);
MapKey(&Throttle, EFLOVER, SimRFQuiet);
//Engine Fuel Flow Right
MapKey(&Throttle, EFRNORM, SimDriftCOOn);
MapKey(&Throttle, EFROVER, SimDriftCOOff);
//Engine Operate Left
MapKey(&Throttle, EOLIGN, SimDoNothing);
MapKey(&Throttle, EOLNORM, SimEngContPri);
MapKey(&Throttle, EOLMOTOR, SimEngContSec);
//Engine Operate Right
MapKey(&Throttle, EORIGN, SimDoNothing);
MapKey(&Throttle, EORNORM, SimCATI);
MapKey(&Throttle, EORMOTOR, SimCATIII);
//APU
MapKey(&Throttle, APUON, CHAIN(SimFuelDoorClose, D(), JoySensitivityNorm));
MapKey(&Throttle, APUOFF, CHAIN(SimFuelDoorOpen, D(), JoySensitivityReduced));
//Landing Gear
MapKeyIO(&Throttle, LDGH, SEQ(AFAlternateGear, AFAlternateGearReset), AFGearToggle);
//Autopilot
MapKey(&Throttle, APPAT, SimRightAPDown);
MapKey(&Throttle, APAH, SimRightAPMid);
MapKey(&Throttle, APALT, SimRightAPUp);
//Autopilot Engage/Disengage
MapKeyIO(&Throttle, APDIS, SimParkingBrakeToggle, SimToggleTFR);
//Radar Altimeter
MapKey(&Throttle, RDRNRM, SimLaserArmOn);
MapKey(&Throttle, RDRDIS, SimLaserArmOff);
//EAC
MapKey(&Throttle, EACON, SimArmMasterArm);
MapKey(&Throttle, EACOFF, SimSafeMasterArm);
//Flaps
MapKey(&Throttle, FLAPU, SimLeftAPUp);
MapKey(&Throttle, FLAPD, SimLeftAPDown);
MapKey(&Throttle, FLAPM, SimLeftAPMid);
//Idle Off
//See Idle Cutoff code in Axis Controls
}
int EventHandle(int type, alias o, int x)
{
DefaultMapping(&o, x);
}
https://www.dropbox.com/s/v95btb3w7u8je ... G.zip?dl=0
Voilà, j'espère que cela vous donne un peu plus de matière pour personnaliser votre Warthog
Tout ça sont des infos qui me manquaient quand j'ai programmé le miens, et je souhaite que mes recherches vous facilitent un peu la vie !