Joystick to SimConnect Mapping Utility - Honeycomb Bravo Throttle Mappings Included

A while ago I wrote a fairly basic VB.Net app using SimConnect to enable quick slewing to map coordinates and quick adjustments to SimRate. I did it mainly as an excercise in learning managed SimConnect and it has sat there quietly since.

In the meantime I have made quite a lot of progress towards understanding the foibles of SimConnect and also just recently acquired a Honeycomb Bravo. Like most I was frustrated with the poor support for this peripheral in MS2020 and annoyed at the 10 degree and 1000 feet bugs. There have been a few creative ways to address these issues but I wasn’t happy with any of them for various reasons, so I decided to have a go at brewing my own solution. The result turned out better than I expected so herewith I share it here.

The app uses SimConnect to map HID joystick events to SimConnect events and/or keystrokes. I’ve included two profiles specifically targeted to the Bravo - a basic one that keeps the default mapping but eliminates the 10 degree/1000 foot bugs.

A second more complex profile is included that also turns two of the rocker switches into mode select switches allowing the Bravo to control pretty much all of the G-1000 knobs and buttons. Be advised however that this advanced profile requires that the MobiFlight WASM module is correctly installed in order to access these extra events. Instructions for getting and installing this module can be found here.

The app is free and open source and can be downloaded from GitHub - https://github.com/Elephant42/FS_Tool/releases/latest

17 Jan 2021 Version 0.6.2.1 just released:
Added some undocumented SimEvents thanks to karlo922.
Added SimVar functionality to Press/Release joystick events.
Fixed a bug in the SimVar handling code.

8 Jan 2021 Hotfix 0.6.1.4 released.

8 Jan 2021 Version 0.6.1 just released:
Added long press events.
Added ability to send multiple events with a single HID Event.
Added ability to specify the data to send with each SimEvent.
Added ability to send an event multiple times in a single HID event.
Added ability to specify both press and release events for a HID event.
Added mappings for the Logitech Flight Multi Panel.
Added mappings for the Honeycomb Alpha yoke, un-tested as I don’t have one.
Documentation updates and improvements.

8 Likes

Thank u very useful

You are my hero! This is the first thing that acutally works fine with no lag etc.!!
Just the turning knobs of MFD (Inner and outer rotary) are not working for me in the Cessna G1000, but I think this needs to be a MobiFlight WASM issue? It does not react at all. But it does when I map the HeadingBug to it. I use it with my own cusotom built button box. The DRCTTo, FPL etc. are working.

If you can share your JoystickMappings.xml file I might be able to diagnose what’s wrong with your Cessna setup.

Hi, I try to paste only the neccessary changes:

<Joystick MappingName="MSFS Button Box - Special" Name="MSFS Button Box">
		<JoyMap JoyEvent="Button47" JoyEnableEvents="" SimEvent="HEADING_BUG_DEC" />
		<JoyMap JoyEvent="Button48" JoyEnableEvents="" SimEvent="HEADING_BUG_INC" />
		<JoyMap JoyEvent="Button5" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_DIRECTTO" />
		<JoyMap JoyEvent="Button6" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_MENU_Push" />
		<JoyMap JoyEvent="Button11" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_FPL_Push" />
		<JoyMap JoyEvent="Button12" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_PROC_Push" />
		<JoyMap JoyEvent="Button17" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_CLR" />
		<JoyMap JoyEvent="Button18" JoyEnableEvents="" SimEvent="MobiFlight_AS1000_MFD_ENT_Push" />
		<JoyMap JoyEvent="Button61" JoyEnableEvents="" SimEvent="MobiFlight.AS1000_MFD_FMS_Upper_INC" />
		<JoyMap JoyEvent="Button62" JoyEnableEvents="" SimEvent="MobiFlight.AS1000_MFD_FMS_Upper_DEC" />
		<JoyMap JoyEvent="Button63" JoyEnableEvents="" SimEvent="MobiFlight.AS1000_MFD_FMS_Lower_DEC" />
		<JoyMap JoyEvent="Button64" JoyEnableEvents="" SimEvent="MobiFlight.AS1000_MFD_FMS_Lower_INC" />
		<JoyMap JoyEvent="Button65" JoyEnableEvents="" SimEvent="MobiFlight.AS1000_MFD_FMS_Upper_PUSH" />
	</Joystick>

<Profiles>
	<Profile Name="Default">
		<JoyMapping Name="MSFS Button Box - Special"/>
	</Profile>
	<Profile Name="Extra">
		<JoyMapping Name="MSFS Button Box - TEST"/>
	</Profile>
	<Profile Name="Testing">
		<JoyMapping Name="Logitech Extreme 3D - Default"/>
		<JoyMapping Name="Saitek Pro Flight X-56 Rhino Throttle - Special"/>
		<JoyMapping Name="Bravo Throttle Quadrant - Default"/>
	</Profile>
</Profiles>

Maybe I found it… There is a MobiFlight.AS… instead of “_” MobiFlight_AS… with the FMS knob. Will try later -> UPDATE: Yes - that was the issue. Maybe for next releases, you could change your comment fields down in the XML and change the “.” to " _ ".

  1. Feature wish: I do not need the windows with my coordinates etc. I will only use it for Joystick-Mapping. This is the very first tool that actuall works perfectly for this! And this as open source :slight_smile: Many many thanks!

  2. Would it be possible to send more than one Event by a key? I would like to use the same setup and same profile for say a Classic and a G1000 Cessna. But for that in one case, I would need to send G1000 commands, in the ofther GNS530 commands. I think it would not be an issue to just send both as one of them will not work in the other plane. Is this possible?

  3. And one last question: There are 2 events for short and long push duration like at the CLR buttons. Would it be possible to handle this without needing to assign a different button for long and short press?

Holy cow this is much needed. There are so many buttons on the G1000 that I couldn’t map and really needed. I am very excited to try this out.

Yep good sleuthing and you are right I do need to work on the doco some more - documentation never was my strong suite :confused:

The reason for the . _ issue is that my code makes heavy use of Enums in the SimConnect interface and .NET enums cannot have . characters so I internally map MobiFlight_ to MobiFlight.

Sending multiple sim events for a single hdi event is certainly possible - I’ll see if I can get it in for the next release.

Long/short press events on the same hdi event is also possible - it would require some extra timer code on the event handler - I’ll think about it a bit more and see if I can get that into the next release as well - no promises mind :wink:

Edit: I will not be removing the other functionality (the window, coords etc) as I use these and in fact I have plans for adding quite a lot of useful stuff to the UI in the future - stay tuned. You do realise that there is an option in the Settings dialog to automatically hide the window on startup…

Edit2: Just a heads up - you don’t need to keep the Profile names unchanged in the .xml file - you can have as many profiles as you want and name them what ever you want - the profile menus in the app are not fixed but are dynamically generated from the .xml data.

Thank you very much! Yes I found out to have my very own named profiles :slight_smile:

Maybe one more “wish”: Could you also add a “on release” action? I would like to use your mapping tool also for switches that are on/off, like, but do ot use 2 Buttons to set On and Off state. I currently use it directly with joystick mapping inside MSFS for example “Landing lights SET”. This will turn on the lights if the button is pressed and turn off, if it is not pressed. I did not find a way to get this working with your tool, or am I missing someting? In the examples, all ON/OFF switches used 2 different button presses.

It would also be nice to be able to switch between profiles without needing to deselect the old first and needing 2 clicks: One time to deactivate the current selected and then again right click on the tray and select other profile. (Just my thoughts, you’re definetely the one who is doing the work so I just say what would be cool :slight_smile: )

Re: the kludgy turn off/turn on thing to change profiles - I fully agree and it will be the first thing I change if I ever find out how. I use a library from another developer to handle reading the HID devices and this is frightfully complicated, runs on seperate threads and uses callbacks to get data to the parent process, so it’s incredibly easy to get threading race conditions, lockups etc.

The way I have implemented it is the only safe way of doing it that I could come up with given my limited understanding of how that HID library works.

Edit: re the single event button - I understand what you want and will have a think about how to implement it - more complicated state handling in the event handler I think.

1 Like

I have downloaded and set this up yesterday restarted my pc at some point while testing and now it errors when trying to launch the app, .net (Error: “An item with the same key has already been added”) any one got any idea’s its not the xml and i have redownload the app from github and its still giving this error which is weird as it was working fine before. Kind Regards,
Harrison

This looks like that you try to assigning the same button twice without different enable conditions. Just try again a fresh setup with no changes in the XML.

This was my first thought but tryed with a fresh copy from github same issue just downloaded 0.6.0 and same again, .net error with a fresh install and fresh xml. Tryed to rebuild in VS: got this ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2123,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built “MSIL” and the processor architecture of the reference “Microsoft.FlightSimulator.SimConnect, Version=11.0.62651.3, Culture=neutral, PublicKeyToken=baf445ffb3a06b5c, processorArchitecture=AMD64”, “AMD64”. This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.
1> SimConnectLib -> C:\Users%username%\Downloads\FS_Tool-master\FS_Tool-master\FS_Tool\SimConLib\bin\Debug\SimConnectLib.dll
1> C:\MSFS SDK\SimConnect SDK\lib\SimConnect.dll

edit: Got it working when rebuilding the 6.1 version now available on github i needed to change the cpu platform from “all” to x64 then rebuild and its working now.

Hi, I see your note that your app eliminates the 10 d and 1000 ft bugs. As I understand it, when any peripheral with a two or three position switch is connected to MSFS (like the Bravo, or a Thrustmaster Warthog Throttle, for example), many of the controls, such as the trim, have the 10x or continuous jumps. I found that with a Thrustmaster Warthog Throttle, my trim adjustments were large jumps and not smooth small increments. When it was unplugged, my other controllers worked as expected. Does your app eliminate those issues as well? My understanding is a bit limited, so the 10d & 1000ft fix may by definition fix all related issues.
Thanks for your work on this.
Best regards,
Mark

Hi, the issue seems to come from the controller profiles. If you create a “new” and empty profile for your Warthog Throttle, you should also do not have this 10/1000 bug anymore. This tool here makes it possible that you have a rather empty controller profile (and so get around the 10/1000 issue) and control the switches directly by sending SimConnect comands.
But you can also send a ZenDesk ticket to the MSFS support to make them more aware of this annoying bug. I did this already and this is now on their list to fix.

Thanks, that is helpful, and makes sense to me. I have also reported this to ZenDesk, and may do so again.
Best regards,
Mark

I also now use the Pre-Release 0.6.1 version but I’m unable to send some commands - For example I cannot set MIXTURE_INCR:1 to increase Mixture in a Cessna, or ALTITUDE_SLOT_INDEX_SET:2 to control managed mode in a A320. This works both with FSUIPC - so in my understanding they should work within SimConnect. May the commands are missing somehow?
Sending paramter values at all works now, as your example with AP_ALT_VAR_SET_ENGLISH:1000

<JoyMap JoyEvent="Button10" JoyEnableEvents="" SimEvent="ALTITUDE_SLOT_INDEX_SET:2"  /> <!--BTN SW 9-->
<JoyMap JoyEvent="Button11" JoyEnableEvents="" SimEvent="MIXTURE_INCR:1"  /> <!--BTN SW 9-->

EDIT: Yes they were missing - I’ve added them im your SimData.vb and recompiled -> Now it works. Could you add all known SimEvents? Right now I just found missing: “ALTITUDE_SLOT_INDEX_SET, HEADING_SLOT_INDEX_SET, SPEED_SLOT_INDEX_SET, MIXTURE_INCR, MIXTURE_DECR, VS_SLOT_INDEX_SET, AUTO_THROTTLE_ARM, AP_LOC_HOLD_ON, AP_LOC_HOLD_OFF”

That is correct - not all SimEvents are supported yet - I’m putting the finishing touches on the next release right now so I’ll try to get all known SimEvents into the supported list.

Yep it’s because MSFS itself as well as the SimConnect bridge DLL are both native x64 apps. I’ll add this to the Readme for future reference.

This error can be caused by duplicate entries in the .xml but it can also be caused by certain types of usb peripherals that don’t report a FriendlyName parameter.
I’m pretty sure that I’ve eliminated this USB issue in the latest release but I can’t do anything about duplicate xml entries, you’ll have to find them yourself.