Categories: MobiFlight, MSFS2020

Uncovering input events using the MSFS2020 model behavior dialog

One of the most common questions asked in the MobiFlight Discord is how to control something in a plane. With the incredible MSFS2020 SimConnect event support in MobiFlight pretty much anything is possible… if you can figure out what event to use.

HubHop is a great resource and should be everyone’s first stop when researching events. Chances are someone else has already done the digging and figured out what works.

But what do you do if the thing you want isn’t in HubHop? That’s where the model behaviour dialog comes in. Let’s walk through how to use it to research the event to use for setting parking brake on a TBM930.

Step 1: Enable developer mode in Flight Simulator

This step is easy 😀 Run Flight Simulator then go to Options > General Options > Developers and toggle Developer Mode to On. Restart flight simulator (restarting is important otherwise the later steps won’t show anything useful).

Step 2: Spawn the plane somewhere

This is also easy 😀 Use the World map to spawn the plane you want to dig into somewhere in the world. For this example I spawned the TBM930 at KPAE.

Step 3: Bring up the model behavior dialog and disable minimizing data on load

Once you’ve spawned at the airport open the model behavior dialog from the developer menu across the top of the screen by going to Windows > Model Behaviors. Then do the following:

  1. In the dropdown at the top center of the dialog select the XML file that contains the events you’re interested in. In most cases the file is named after the plane and has _interior.xml added to the end. For the TBM930 the filename is TBM930_INTERIOR.XML.
  2. Click the InputEvents tab
  3. Uncheck the Minimize data on Load option
  4. Click Reload user container
  5. Wait for the plane to reload then select the XML file from step 1 in the dropdown at the top center of the dialog again.

Steps 3 and 4 ensure that the code behind the different events will be visible for us to inspect.

When you’re done the dialog should look like this:

The model behavior dialog with the InputEvents tab ready for event inspection.

Not seeing any events listed? Check and make sure that you’ve selected the correct XML file from the dropdown. If it doesn’t say INTERIOR in the name you probably have the wrong one selected.

Still don’t see any events listed? Sometimes it happens. Try restarting the sim and going through steps 1-5 again.

Step 4: Find the relevant event

This is where things get a bit tricky since there’s no search feature on the InputEvents tab. It helps to have some idea of what system the input you want belongs to. In the case of the parking brake I guessed that since it relates to wheels it would be in the LANDING_GEAR section so I expanded that:

Model behavior dialog with the LANDING_GEAR events expanded.

Sometimes it’s nice to be lucky 😀 LANDING_GEAR_ParkingBrake looks promising. To find out what makes that specific event work:

  1. Expand the event by clicking the triangle next to LANDING_GEAR_ParkingBrake
  2. Click the Add to control panel button
  3. Expand the entry added to the right side of the dialog by clicking the triangle next to LANDING_GEAR_ParkingBrake
  4. Click the Set tab

Those steps result in a dialog like this:

Model behavior dialog with the LANDING_GEAR_ParkingBrake set code exposed.

At this point we know exactly how the sim manages the parking brake:

p0 0 max 1 min (>K:PARKING_BRAKE_SET) 
(A:BRAKE PARKING POSITION, bool) 100 * (>L:ParkingBrake_Position)

But what does it mean? How do we use it? This is where it takes a bit of practice and understanding RPN. Generally speaking you are trying to identify which Kvar is getting used. In this case it looks like (K:PARKING_BRAKE_SET) is the magic, and it is either 0 or 1. Chances are 0 means off and 1 means on.

Step 5: Putting the event to use

At this point you can jump over to MobiFlight and try the event out using the custom input option. For this example, in On Press, I would try this:

1 (>K:PARKING_BRAKE_SET)

And for On Release I would try this:

0 (>K:PARKING_BRAKE_SET)

Step 6: Document it for others

Once you’ve confirmed the event works as expected head on over to HubHop and add entries so everyone else can benefit going forward!

Step 7: Upvote the feature request so we don’t have to do this anymore

Realistically this is all a big pain and shouldn’t be this hard. Upvote the feature request to let Asobo know you’d like a proper event system where it isn’t necessary to dig through RPN code to make the plane work with external controls!

Article info