Jump to content

No Joystick input in TARGET "Thrustmaster Combined"


VC
 Share

Recommended Posts

Just tried TARGET for the first time to run a custom script for my trigger. I have a T.16000M and TWCS. After I run the script, when I go to analyse, there is no input from the stick at all in the virtual "Thrustmaster Combined" controller. And for the throttle, some of the buttons also don't go across. Even on the left panel, the physical panel, the stick is doing nothing. As far as I can tell the script compiled fine and the virtual controllers have been created correctly. I'd appreciate some help, bear in mind I'm a complete noob at this:helpsmilie:

VC

 

=X51= Squadron is recruiting!

X51 website: https://x51squadron.com/

Join our Discord: https://discord.gg/d9JtFY4

Link to comment
Share on other sites

Just tried TARGET for the first time to run a custom script for my trigger. I have a T.16000M and TWCS. After I run the script, when I go to analyse, there is no input from the stick at all in the virtual "Thrustmaster Combined" controller. And for the throttle, some of the buttons also don't go across. Even on the left panel, the physical panel, the stick is doing nothing. As far as I can tell the script compiled fine and the virtual controllers have been created correctly. I'd appreciate some help, bear in mind I'm a complete noob at this:helpsmilie:

 

Install latest driver and try again. Note that the default Target configuration isn't complete, you'll have to remap all axes and buttons manually, and due to Target virtual device limitation you'll have to remap a few buttons to keyboard. Also if you want to use my code you must use the Target Script Editor.

 

https://support.thrustmaster.com/en/product/t-16000m-fcs-hotas-en/

 

http://ts.thrustmaster.com/download/accessories/pc/hotas/software/TARGET/TARGET_Script_Editor_Basics_v1.5_ENG.pdf

 

Edit : Do you use AutoHotKey by chance? I'm trying to find an easier solution, that would not require you to reconfigure your whole hotas for all your module just to fix your trigger issue.

Edit : I tried Joystick Gremlin but it will save how many time the button have been pressed and will loop the macro. In Joy2Key I can't find a way to do a macro.. Ooh I'll try Voice Attack. Do you have it? IIRC the free version is limited to 20 commands but that is enough to do what we want.

 

I did the same as I did in Target with AutoHotKey, remapped to keyboard however, we can't remap to Joystick/Vjoy afaik, not easily at least.

 

#SingleInstance force
#Persistent

#F1::Suspend, Toggle ; Windows key+F1
#F4::ExitApp ; Windows key+F4

4Joy4::
{
SetkeyDelay, 0, 64
Send {Space}
Sleep 333
Return
}

 

I did the test with my Warthog Throttle, the first 4 is the #ID Windows attributed to my Throttle, the second four is the button number. I use a little program to check and hotswap my controller ID if needed, JoyID. I do not know how to check ID in another way. :joystick:

p3PqM2g.png


Edited by Ant0ine
Link to comment
Share on other sites

Ant0ine is the expert, but I sometimes have problems with TARGET finding my stick, but never my throttle

 

Anyway couple of things that might be worth checking, open Task Manager and ensure any Microsoft Store Tasks are not running (if they are disable them). I can usually tell though if this is the case as TARGET takes an inordinately long time to compile a script

 

Stop the script and pull the Joystick USB out the computer and plug it back in, or just stop the script and rerun it again. In my case if I kill the USB input TARGET usually finds the Joystick first time. If just stopping and rerunning the profile, it typically takes 3 shots for TARGET to find it.

 

I also find that TARGET has problems if Voice Attack is running. So disable Voice Attack if it's running before running a script in TARGET. Once it's running you can start Voice Attack and it all works fine

 

 

 

I have no idea if this is a generic thing or just specific to my setup

Link to comment
Share on other sites

I just tried with Voice Attack and it work.

 

0R4Nzte.png

 

No idea why Target have trouble to see Stick sometime. I know about some program that can mess with Target in various way.. Most likely Windows store, TeamSpeak 3 joystick plugin.

 

I had trouble with The TS3 plugin, IIRC it prevented my script to STOP correctly, and so after that I couldn't run a script again until I killed some process.

Link to comment
Share on other sites

Guys thanks for your help but I think the issues is different. The script finds the Joystick and compiles fine, virtual devices created correctly and real ones disabled. But... there is no input. See the highlight in my attached file. In the device analyzer, I can see the joystick is there but no button presses or axis movements are recorded. Throttle shows fine in both left and right panels.

 

Ant0ine, I do use VoiceAttack so I quickly set that up and it seems to work! Thanks and much easier than TARGET. However, I am getting some weird and unpredictable results with other aircraft. I will test more but I guess in the end I have to change some bindings, or simply not run the script on some aircraft.

 

Another friend recommended I use AHK as well but I didn't want to keep installing and trying new software yet.

Capture.thumb.PNG.3954e6942299ad63e0503c38c84a2d50.PNG

VC

 

=X51= Squadron is recruiting!

X51 website: https://x51squadron.com/

Join our Discord: https://discord.gg/d9JtFY4

Link to comment
Share on other sites

Guys thanks for your help but I think the issues is different. The script finds the Joystick and compiles fine, virtual devices created correctly and real ones disabled. But... there is no input. See the highlight in my attached file. In the device analyzer, I can see the joystick is there but no button presses or axis movements are recorded. Throttle shows fine in both left and right panels.

 

Ant0ine, I do use VoiceAttack so I quickly set that up and it seems to work! Thanks and much easier than TARGET. However, I am getting some weird and unpredictable results with other aircraft. I will test more but I guess in the end I have to change some bindings, or simply not run the script on some aircraft.

 

Another friend recommended I use AHK as well but I didn't want to keep installing and trying new software yet.

 

I don't know why your stick isn't recognised when you run a script, could you share your script so we can check it please.

 

Depending on the aircraft and even the ordinance you want to deliver you might need some different pusle duration. In your case for exemple doing CCRP isn't really possible anymore. We could do a toggle maybe. Press a button once to hold the virtual trigger down, press again to release.

Link to comment
Share on other sites

I don't know why your stick isn't recognised when you run a script, could you share your script so we can check it please.

 

Depending on the aircraft and even the ordinance you want to deliver you might need some different pusle duration. In your case for exemple doing CCRP isn't really possible anymore. We could do a toggle maybe. Press a button once to hold the virtual trigger down, press again to release.

 

There isn't a problem with CCRP since the full fidelity planes I own have a bomb drop button which is separate from the trigger. Trigger is Air to Air work only. For FC3 planes, those need hold for all weapon release anyway. There I just unmap Spacebar and DCS reads the trigger as normal, VA doesn't interfere with that and those planes never had double input because of the way the "hold to release" is coded for them in DCS. Toggle doesn't sound practical for fast combat situations, can lead to more mistakes. What I have works well enough for now I think.

 

Anyway, still curious why TARGET doesn't behave. This is the script:

 

include "target.tmh"

 

//program startup

int main()

{

if(Init(&EventHandle)) return 1; // declare the event handler, return on error

 

//add initialization code here

}

 

//event handler

int EventHandle(int type, alias o, int x)

{

DefaultMapping(&o, x);

 

MapKey(&T16000, TS1, CHAIN(DOWN+DX1, D(300), UP+DX1));

//add event handling code here

}

 

This is the run output:

 

Running script: E:\Utilities\TARGET\TriggerFix.tmc

*** Allocated ProcInstances found from the previous run: use FreeProcInstance() ***

Mapped plugin module "C:\Program Files (x86)\Thrustmaster\TARGET\Plugins\sys.dll"

Compile Succeeded.

Physical USB HID devices managed by script!

Currently plugged USB HID devices[2]:

1: "T.16000M" - "USB\VID_044F&PID_B10A&REV_0500"

2: "TWCS Throttle" - "USB\VID_044F&PID_B687&REV_0110"

USB HID device with hardware id "VID_044F&PID_0404" cannot be found

USB HID device with hardware id "VID_044F&PID_0402" cannot be found

USB HID device with hardware id "VID_044F&PID_0403" cannot be found

USB HID device with hardware id "VID_044F&PID_b351" cannot be found

USB HID device with hardware id "VID_044F&PID_b352" cannot be found

USB HID device with hardware id "VID_044F&PID_0400" cannot be found

USB HID device "T.16000M"(USB\VID_044F&PID_B10A\6&87C5DE6&0&3) selected

USB HID device with hardware id "VID_044F&PID_B10B" cannot be found

USB HID device "TWCS Throttle"(USB\VID_044F&PID_B687\5&356B5377&0&4) selected

USB HID device with hardware id "VID_044F&PID_B679" cannot be found

USB HID device with hardware id "VID_044F&PID_B68F" cannot be found

Virtual HID devices managed by script!

Connecting virtual joystick...Done

Device name set to Thrustmaster Combined

Connecting virtual keyboard...Done

Connecting virtual mouse (absolute axes)...Done

 

main returned 0

VC

 

=X51= Squadron is recruiting!

X51 website: https://x51squadron.com/

Join our Discord: https://discord.gg/d9JtFY4

Link to comment
Share on other sites

The "recognition" problem likely come from your script which is incomplete.

If the only thing you want from the script is the trigger fix then you should exclude the TWCS throttle.

 

int main() 
{ 
   Configure(&Joystick, MODE_EXCLUDED);
   Configure(&JoystickF18, MODE_EXCLUDED);
   Configure(&HCougar, MODE_EXCLUDED);
   
   Configure(&T16000L, MODE_EXCLUDED);
   Configure(&T16000, MODE_EXCLUDED);    

   Configure(&LMFD, MODE_EXCLUDED);
   Configure(&RMFD, MODE_EXCLUDED);

   Configure(&TFRPHARudder, MODE_EXCLUDED);
   Configure(&TFRPRudder, MODE_EXCLUDED);

//   Configure(&Throttle, MODE_EXCLUDED);
  Configure(&TWCSThrottle, MODE_EXCLUDED);

 

Above are the exclude line for all Target compatible device afaik, I simply comment the line of the controller I want to include. By adding two // at the beginning of a line.

 

I think if there is only the T16000 in your script then the default mapping target apply to the T16000 should work. We can see it at the end of the Target.tmh file. We can edit it as well. Indeed by default the hat isn't mapped IIRC.

 

int T16000Map[] ={TS1,DX1, TS2,DX2, TS3,DX3, TS4,DX4, B5,DX5, B6,DX6, B7,DX7, B8,DX8, B9,DX9, B10,DX10, B11,DX11, B12,DX12, B13,DX13, B14,DX14, B15,DX15, B16,DX16, H1U,DXHATUP, H1L,DXHATLEFT, H1R,DXHATRIGHT, H1D,DXHATDOWN};

 

Edit : Oh but that is for button, maybe you absolutely need to remap axes, I don't remember. If so then here you go :

MapAxis(&T16000, JOYX, DX_X_AXIS);
MapAxis(&T16000, JOYY, DX_Y_AXIS);
MapAxis(&T16000, RUDDER, DX_ZROT_AXIS);
MapAxis(&T16000, THR, DX_SLIDER_AXIS);

 

Edit : Oh also I think your pasted the line at the wrong place. Personally my mapping is inside int main().

 

Try this :

 

include "target.tmh"

 

int main()

{

Configure(&Joystick, MODE_EXCLUDED);

Configure(&JoystickF18, MODE_EXCLUDED);

Configure(&HCougar, MODE_EXCLUDED);

 

Configure(&T16000L, MODE_EXCLUDED);

//Configure(&T16000, MODE_EXCLUDED);

 

Configure(&LMFD, MODE_EXCLUDED);

Configure(&RMFD, MODE_EXCLUDED);

 

Configure(&TFRPHARudder, MODE_EXCLUDED);

Configure(&TFRPRudder, MODE_EXCLUDED);

 

Configure(&Throttle, MODE_EXCLUDED);

Configure(&TWCSThrottle, MODE_EXCLUDED);

 

if(Init(&EventHandle)) return 1;

 

MapAxis(&T16000, JOYX, DX_X_AXIS);

MapAxis(&T16000, JOYY, DX_Y_AXIS);

MapAxis(&T16000, RUDDER, DX_ZROT_AXIS);

MapAxis(&T16000, THR, DX_SLIDER_AXIS);

 

MapKey(&T16000, TS1, CHAIN(DOWN+DX1, D(300), UP+DX1));

 

}

 

int EventHandle(int type, alias o, int x)

{

DefaultMapping(&o, x);

}


Edited by Ant0ine
Link to comment
Share on other sites

Any0ine thanks, clearly I skim-read the guide and had no idea what I was doing. I fixed the Joystick detection by unplugging and re-plugging... for about 5 seconds. Then it stops being detected again.

 

I think I'll give up on TARGET anyway though, the VA fix I have should be OK and I'm looking at a major HOTAS upgrade now anyway.


Edited by VC

VC

 

=X51= Squadron is recruiting!

X51 website: https://x51squadron.com/

Join our Discord: https://discord.gg/d9JtFY4

Link to comment
Share on other sites

@VC,

I was about to post regarding plugging/unplugging the stick. I get this more than i should, despite having only 5 TM devices plugged into a 10 port powered hub. I think it's due to power draw, and it's just one of those things.

 

 

Hmm... power draw issues that have not affected me for years in multiple games, but somehow only affect TARGET. :joystick:

VC

 

=X51= Squadron is recruiting!

X51 website: https://x51squadron.com/

Join our Discord: https://discord.gg/d9JtFY4

Link to comment
Share on other sites

Hmm... power draw issues that have not affected me for years in multiple games, but somehow only affect TARGET. :joystick:

 

TARGET middleware (aka Thrustmaster FAST) isn't the most stable service in Windows. High CPU saturation can also cause a profile to crash, as can programming 2 LEDs at the same time.

 

Still, I put up with it because of what I can do.

Link to comment
Share on other sites

  • 2 weeks later...

I ran across this issue for about the 10th time in the last 5 years just a few days ago or so.

 

What can happen with Windows is it can re-order the usb devices.

True examples (over the years).

1. I plugged in a web cam (HID device)

I had no problems until I removed it.

Even with the drivers gone, it trapped a usb spot between the joystick and the throttle.

When combined. it left an additional throttle and joystick and many variations therof.

Uninstalls and re-installs of target and drivers never permanently repaired that.

In the end I reset windows with all devices attached and that cam in the garbage.

All was well.

2. Plugged in another cam and then unplugged it. Darn. Same same. Locked in.

In or out. It must not change.

3. Last week, I plugged a Bluetooth module and the whole scenario came back.

Removed, it trapped a spot.

 

Referring to joy.cpl is always a good idea. run joy.cpl.

One should see a joystick and a throttle one over top of the other with nothing in between like pedals with the joystick on top for optimal performance although it MAY work otherwise. For a while.

 

When a script is run by gui or otherwise, joy.cpl should show only one combined device (and maybe pedals.

 

All other advice is relevant indeed like ensuring it is not shut down to save power.

 

The majority of these types of issues are usb device footprint conflict related.

My machine is dedicated to DCS and to only those usb devices it is equipped with at present.

 

I'll go another year before I forget and do it all again. lol.

 

If Target does not fire up quickly with a fast blippedy blip, you've got underlying usb device allocation problems likely.

It is a Windows thing. there are third party things to reorder usb devices. A reset works just fine along with all the re-installs once one finds the offending culprit and promises never to insert it's usb prong again.

 

Truth guys.

Win 10 pro 64 bit. Intel i7 4790 4 Ghz running at 4.6. Asus z97 pro wifi main board, 32 gig 2400 ddr3 gold ram, 50 inch 4K UHD and HDR TV for monitor. H80 cpu cooler. 8 other cooling fans in full tower server case. Soundblaster ZX sound card. EVGA 1080 TI FTW3. TM Hotas Wartog. TM T.16000M MFG Crosswinds Pedals. Trackir 5.

"Everyone should fly a Spitfire at least once" John S. Blyth

Link to comment
Share on other sites

Anyway, still curious why TARGET doesn't behave. This is the script:

 

Maybe it is too late, but some correction and explanation here...

 

To begin, your script is syntactically correct, but programmatically/logically wrong. So, it "compile", it "run", but did "nothing"... nothing effective.

 

The EventHandler() function is what is called a "callback", called (executed) by the driver at every TM physical device state changes. This is not mandatory but it is better (for readability and understandability) to define the EventHandler() before the main() function, because if you look closely in the main(), the "alias" (in C/C++ we would say, the "reference", "pointer" or "adress") of the function is passed as argument to another function.

 

Anyway, except you explicitely want to introduce your own personnal Mapping function to received and send input and ouput frome physical to virtual device, the EventHandler() should always have the same form, with nothing more and nothing less:

 

[color=seagreen]// Event Handler function definition, will be called at every [/color]
[color=seagreen]// physical device state change.[/color]
[b][color=royalblue]int [/color][/b]EventHandle([b][color=RoyalBlue]int [/color][/b]type, [b][color=royalblue]alias [/color][/b]o, [b][color=royalblue]int [/color][/b]x)
{
  DefaultMapping(&o, x); [color=seagreen]// Default mapping *process* (input -> output)[/color]
}

Followed by this, you now must define the main() function, with, at first stage, a call to the initialization function, with the "alias to" (Reference/address/pointer to) the previousely defined Handeler callback function (so the programm know which function to be called when it is needed to process an "input event" to generate an "output" event):

 

 

[b][color=royalblue]int [/color][/b]main()
{
[color=seagreen]   // Initializes the whole mechanics & specifies the event handling callback[/color]
[color=seagreen]   // function reference/adress (alias)[/color]
 [color=royalblue][b]if[/b][/color](Init([color=Magenta]&[/color]EventHandle)) [b][color=royalblue]return [/color][/b]1;

 [color=seagreen]// ...things will continue bellow[/color]

NOW, you can add your mapping commands. Theses commands are evaluated ONCE at the script start (when you hit the Start button).

 

Actually, all the "MapKey*" and "MapAxis*" commands are creating some values in a table in memory before the whole thing enter in the "event loop". This table (litterarly a "mapping table") is used to generate the desired output according the physical device state. All this happen within the DefaultMapping() function, called within our EventHandle() callback function.

 

[b][color=royalblue]int [/color][/b]main()
[b][color=red]{[/color][/b]
[color=seagreen]   // Initializes the whole mechanics & specifies the event handling callback[/color]
[color=seagreen]   // function reference/adress (alias)[/color]
  [color=royalblue][b]if[/b][/color](Init([color=Magenta]&[/color]EventHandle)) [b][color=royalblue]return [/color][/b]1;

  [color=seagreen]// "Write" in the mapping table, that physical TS1 must generate DX1 in the virtual combined device.[/color]
[color=seagreen]  [color=Black] MapKey([color=Magenta]&[/color]T16000, TS1, DX1);[/color][/color]

[color=seagreen][color=Black]  [color=SeaGreen] // Here we create another mapping for TS2 with Press and Release[/color][/color][/color]
[color=seagreen][color=Black][color=seagreen][color=Black]   MapKey([color=Magenta]&[/color]T16000, TS2, DOWN+'a');[/color][/color][/color][/color]
  [color=seagreen][color=Black][color=seagreen][color=Black]MapKeyR([color=Magenta]&[/color]T16000, TS2, UP+'a');[/color][/color][/color][/color]

[color=seagreen][color=Black][color=seagreen][color=Black]  [color=SeaGreen] // do not forget to close the brace[/color][/color][/color][/color][/color]
[color=seagreen][color=Black][color=seagreen][color=Black][b][color=Red]}[/color][/b][/color][/color][/color][/color]

If you read back your code, notice that you called the MapKey() function within the EventHandle() function. This mean each time you pressed or released a button, you write the mapping table with the same rule EACH TIME... this is perfectly useless and take ressources (comput cycles, function call, etc..). This can event lead to memory leak, since you used the "CHAIN()" function, which create dynamically allocated function, but I will not enter in details here. In one word: THIS IS BAD, Do not do that ! do not call any "MapKey" or "MapAxis" function within the EventHandle(), always do it within the main() function.

 

Hope this will help.


Edited by sedenion
Link to comment
Share on other sites

  • 1 year later...

Hi,   I had this same issue, really kicked my arse.   It's pretty funny a 2 year old thread and we are both resurrecting it todday!   

In any case, I downloaded usbdeview.zip (Free) and ran it to delete most/all of my USB registries... fixed the issue for about 1 minute.   It's  an excellent program and may help you, but in the end I found my issue was a touch different.   I had MISPROGRAMMED my TWCS and assigned an AXIS to it that was also assigned to my T16000M in the TARGET software while creating a profile/file for DCS F18....  somehow, this was causing havoc with TARGET and when I ran this  file to the joysticks... it created the combined unit but only the TWCS was working.   

 After I finally removed all USB registries AND fixed that axis programming error in TARGET... everything is now working!  Just the USB thing only fixed it for about 10 seconds or so  (If I left the T16000M alone for 10 seconds... it goes dead, but if I move it every 9 seconds it stayed alive...  not a full fix).   

 

Just thought I'd provide info as I've been reading for hours to fix this issue... took me over 6 hours.   Hope I'm done!   Good luck.

 

John


Edited by FlyNavy
  • Like 1
Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...