Categories: MSFS2020

What’s the deal with the Working Title CJ4 mod now?

Note: Microsoft pushed SU15 pre-release out to beta testers on February 24th which includes a new plug-in model for the FMS. This means any add-ons that use the FMS will break, specifically the dementedmonkey web application. Until those add-ons have access to the documentation for the new plug-in model you’ll either need to disable them or revert back to the SU14 release.

In January 2023 Microsoft/Asobo released “AAU1”, a massive overhaul of several default planes in Microsoft Flight Simulator 2020, including a complete rewrite of the CJ4.

People still seem to be confused by this update and often come to the Working Title Discord with questions. Here are answers to the common ones.

Do I still need to install the mod from the Working Title website?

No.

The plane was re-written from the ground up and all future updates ship directly with MSFS2020.

There is no need to install a mod anymore to get the latest and greatest. You should uninstall any Working Title CJ4 mod you may have in your community folder.

How do I install and find the Working Title CJ4 in flight sim then?

It is the default CJ4 in Microsoft Flight Simulator 2020 now. If you run MSFS2020 you have it, the “AAU1” update is downloaded automatically.

Simply search for “CJ4” in the plane list. The one that shows up is the one you want.

How do I know I have the re-written, latest and greatest, version?

Turn on the avionics. Look at the co-pilot’s MFD and verify it has a dedicated section for CAS messages at the top of the display (the two white rectangles):

They “rewrote” it so… is it better? What’s new with the plane?

Yes, it is better. The release notes for Aircraft & Avionics Update 1 give a good overview of all the improvements:

The Cessna Citation CJ4 avionics have been heavily upgraded to bring an authentic CJ4 avionics experience:

What happened to Simbrief data import?

It was removed, but as of Sim Update 13 (released September 28, 2023) it is back. You can find it under IDX > ROUTE MENU on the FMC. See the Navigraph blog post for full details on how to set it up.

What happened to Navigraph Charts integration?

It’s gone. Navigraph has previously stated they don’t want to deal with forking the code to add chart support, which is understandable. Here is one comment on it from Navigraph. HOWEVER! As of SU15 pre-release there is a plug-in model for the CJ4 which should allow 3rd parties like Navigraph to add features without having to copy the entire code, which is a promising development.

What happened to ground power?

It was removed, but as of Sim Update 13 (released September 28, 2023) it is back. You can find it under IDX > USR SETTINGS. You still need to be parked at a gate that supports ground power for it to work.

Note that real world pilots rarely use ground power with the CJ4. They just start the engines instead.

What happened to the checklists?

The focus for the rewrite of the CJ4 was on avionics and flight model. The checklist feature was, unfortunately, cut due to time. The Working Title team has said it will be coming back though and they even posted a preview of it to the Discord! There is no announced release date for it, and it was not included in Sim Update 13.

What happened to the passenger briefing sounds?

They weren’t included in the rewrite due to rights reasons. Other sounds, like the 500′ callout, are supported because they reuse default sounds included in MSFS 2020.

My liveries don’t work anymore. What’s going on?

Most liveries have updated at this point to work with the rewritten CJ4. If you find one that isn’t working it is likely because it completely overrides the panel.cfg file, which is a no no. You can resolve the issue by replacing the livery’s panel.cfg file with the one from Working Title.

Why does the plane refuse to take off until well after the Vr speed?

Nobody knows. This doesn’t happen for everyone, and it doesn’t happen all the time. There is no known workaround, all you can do is keep holding back on the yoke until the plane decides to take off.

Why isn’t TOD/VNAV working?

VNAV works fine but does require some extra steps to get configured the first time. See my blog post on configuring VNAV for how to get it up and running.

I’m getting white screens. What’s going on?

You can resolve white screens by checking the following:


Categories: MSFS2020

Fixing ILS 10L at KPDX in Microsoft Flight Simulator 2020 with Navigraph

Update: This fix is no longer needed. Instead download the latest chart update from Navigraph.

AIRAC release 2032 rev 1 broke the ILS 10L approach at KPDX if you use Microsoft Flight Simulator 2020 with Navigraph NavData.

To fix the issue download this custom scenery for KVUO (Pearson) and install it in your Community folder.

After running MSFS2020 you will need to adjust the scenery’s priority so it loads after the Navigraph data. To do this:

  1. Go to Options > General Options from the main screen.
  2. On the Experimental tab set PACKAGE REORDER TOOL to ON.
  3. In the weird window that pops up filter by neilenns then use the down arrow to change the priority to 3 or higher.
  4. Close the package reorder tool window.

Categories: MSFS2020

Displaying TOD information in the Citation CJ4 after the AAU1 update

Step 1: Enable advisory VNAV information

You only have to do this once. The plane will remember this setting for future flights.

Step 2: Enable VNAV display on the MFD

You only have to do this once. The plane will remember this setting for future flights.

Step 3: Set your cruise altitude

If you fail to do this step then TOD information will only display when you are approximately 50 miles from TOD.

Step 4: Enable display on the MFD

Troubleshooting

If you still aren’t seeing TOD information after following the above steps check your flight plan and make sure you don’t have a DISCONTINUITY between your en-route and arrival/approach.


Installing vJoy on Windows 11

Trying to get vJoy to work on Windows 11? Sick of it installing and then when you go to Enable vJoy you can’t actually get a virtual joystick to appear?

Install version 2.1.9.1 from some guy’s random vJoy fork. Problem solved.


Categories: VATSIM

Splitting Discord and VATSIM audio with Voicemeeter Potato

This post is no longer current. See the new post on how to do this with the latest VoiceMeeter Potato beta and VectorAudio.

If you fly or do ATC on VATSIM chances are you’re also in Discord. You’re either chatting with your friends while flying or having a few laughs with CTR while fixing flight plans working GND.

It’s fun… until someone is talking on Discord and audio comes through on VATSIM. Now you’ve missed your new heading from approach or some poor pilot called for clearance and you have to go “Uhhh, sorry, say again?”

What if you could split the audio so Discord is only in your left headset ear and VATSIM audio was in your right headset ear? Or even better, what if Discord would just automatically mute whenever VATSIM audio happens? Well either one is possible with Voicemeeter Potato, a bizzarely named piece of magical software. This post will show you how to do it.

Step 1: Install Voicemeeter Potato

Download Voicemeeter Potato. Make sure it’s the Potato version, not Standard or Banana.

Make sure to reboot your computer after installing. Yes, you really have to reboot.

VoiceMeeter provides three separate input devices that we’ll use in later steps. One will receive Discord audio, one will receive audio from VATSIM, and the third will handle all other system audio.

Step 2: Configure Discord

Open Discord settings and select Voice & Video. Change the output device to VoiceMeeter Input (VB-Audio VoiceMeeter VAIO):

Step 3: Configure Audio for VATSIM/vPilot/xPilot/etc.

Whatever app generates the audio from VATSIM needs to get updated to use the Voicemeeter Potato output device.

If you’re running Audio For VATSIM select Settings and change the Headset Device to VoiceMeeter AUX Input (VB-Audio VoiceMeeter AUX VAIO):

If you’re running vPilot select Settings then Audio and change the Output Device to VoiceMeeter AUX Input (VB-Audio VoiceMeeter AUX VAIO):

I’ve never used xPilot but I assume its audio settings are similar to vPilot. Regardless of where your VATSIM audio comes from you should change it to use VoiceMeeter AUX Input (VB-Audio VoiceMeeter AUX VAIO) for the output device.

Step 4: Set up the VoiceMeeter Potato basic settings

Run VoiceMeeter Potato. The screen will be large and overwhelming. Don’t panic.

In the top right select the Menu button and pick System tray and Run on Windows Startup:

In the top right third of the screen click on the A1 button and select the WDM output that corresponds to your primary PC speakers. This is the channel all audio except Discord and VATSIM will flow to. In my case it’s my external speakers so A1 looks like this:

Next click on the A2 button and select the WDM output that corresponds to your headset. This is the channel Discord and VATSIM audio will flow to. In my case it’s a second output jack on my PC’s front panel so A2 looks like this:

With the output devices configured the next step is to tell VoiceMeeter what inputs to send to the output devices. In the middle of the VoiceMeeter window are three virtual inputs: VoiceMeeter VAIO (this will be Discord audio), VoiceMeeter AUX (this will be VATSIM audio) and VAIO 3 (this is all other audio). Map them to the appropriate output devices by setting the A1 and A2 buttons for each input appropriately:

At this point you should stop and test that the audio is working correctly. Get in a Discord voice chat and on VATSIM and verify that you are hearing Discord and VATSIM audio through your headset, and all other audio is going through your speakers.

Now for the fun part: splitting audio to different channels or auto-ducking.

Option 1: Split audio to two different headset channels

To put the Discord audio in your left ear and VATSIM audio in your right ear you change the balance of the two input channels by dragging the red dot to the left (for the VAIO input) and to the right (for the AUX input):

Hop on Discord and VATSIM and verify this works.

Option 2: Auto-duck other sources on VATSIM audio transmissions

Instead of splitting audio to two different channels you can use VoiceMeeter to automatically mute all other audio whenever there’s VATSIM audio traffic. This is done with two VoiceMeeter macros.

From the Menu in the top right enable Run MacroButtons on Voicemeeter start:

This should open the MacroButtons window with a single button showing. Resize the window so you have two buttons visible.

Setting up auto-ducking when receiving VATSIM audio

Right click on the first button and configure it as follows:

strip(6) is a reference to the Voicemeeter AUX virtual input that receives VATSIM audio. The trigger at the bottom also references the Voicemeeter AUX input (even though it says in #7. Yes, it is confusing.) Whenever audio is detected on that input channel the macro will fire and put the AUX input in solo mode, muting all other system audio. When the audio stops the macro will wait 500ms and then re-enable all the other audio channels.

You can use the red and green arrow to fine-tune the audio level required to trigger the start and stop action.

Setting up auto-ducking when transmitting on VATSIM

This step assumes you have a keyboard push to talk key configured for VATSIM audio.

Right click on the second macro button and configure it as follows:

Change the Keyboard Shortcut setting to match the keyboard key you push to talk on VATSIM.

It is possible to do it via a HID device button as well (such as a joystick), however I haven’t done that and don’t know how the HID Device Button section works. See the VoiceMeeter manual for more info if you want to use a joystick button instead.

That’s it! Hop on Discord and VATSIM and verify this works. All system audio should mute whenever you receive or send VATSIM audio then unmute when the transmission is done.

Other variations

Don’t want to mute *all* audio when VATSIM audio happens and just want to mute Discord? Change the macros to do strip(5).mute = 1 and strip(5).mute = 0 for the on and off requests respectively. strip(5) references the Voicemeeter VAIO virtual input and mutes/unmutes just that channel.

Don’t want to completely mute Discord audio? Use strip(5).fadeto = (-15.0, 100); and strip(5).fadeto = (0.0, 200); for a subtle fade in and out.

Don’t want to completely mute system audio but still want to mute Discord audio? Combine the two approaches to mute Discord and fade system audio:

strip(5).mute = 1
strip(7).fadeto = (-15.0, 100);

then unmute and unfade:

strip(5).mute = 0
strip(7).fadeto = (0, 200);

strip(7) references the VAIO 3 virtual input which is carrying all other system audio.

Many more options are available, basically whatever you can control via the VoiceMeeter UI you can also set via macros. See the VoiceMeeter user manual for all the details.


Fixing broken app passwords with Microsoft Outlook

I have two Exchange-hosted accounts with 2FA enabled that for some reason never work properly with Microsoft Outlook. They don’t get detected as 2FA and prompt for a regular username/password combination, and my normal password doesn’t work.

The solution is an app password, but if you’re reading this blog post you already know what happens. Since you already tried logging in with the regular username/password your app password doesn’t work. At all. No matter how many times you put it in the dialog box Outlook just prompts you again.

Here’s how to fix it.

  1. Remove all entries for the offending account from the Accounts control panel in Windows. Check on both the Email & Accounts page and the Access work or school page
  2. Remove all entries for the offending account from Credentials Manager on the Windows Credentials tab. Make sure to check everything, not just ones where the account name is visible in the list. In my case there was an outlook.office365.com item in the list that, when expanded, showed it was attached to the offending email address.
  3. Remove all entries for the offending account from the registry. Use regedit to do a find for the email address and delete all the keys that use it. I removed the associated entries under these two keys, but there may be others:
    • Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Identity\Identities
    • Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Identity\DocToIdMapping
  4. Obtain a new app password and save it to a text file on your computer somewhere.
  5. REBOOT YOUR COMPUTER. It seems pointless but this is a critical step. Somehow Outlook caches one or more of the pieces of information that you deleted in earlier steps and a reboot must be done to clear out that cached information.
  6. Run Outlook, add a new account selecting the manual configuration option, and then Exchange as the server type.
  7. Enter your app password from the text file.

Then it will work. It boggles my mind that it’s 2022 and this is still broken (I’ve had this issue as far back as 2016).


Laying out a PCB for an ATmega32u4 based board

Feb 26, 2023: While this information is still accurate I would never, ever, do an ATmega32u4 PCB anymore. Instead I use an RP2040 chip. So much easier to find, cheaper, and easier to deal with.

It’s one thing to design a nice schematic for a board based on an ATmega32u4. It’s quite another to figure out how to get all the traces to work well on the actual PCB you’re planning to send off to fabrication.

In this post, part 2 in a series, I’ll walk through some of the things that worked for me when trying to solve layout issues during my custom PCB design.

The final PCB design sent to fabrication.

Routing the power traces

For cost reasons I really wanted to keep this to a 2-layer board which meant I couldn’t fall back to a dedicated power plane on an inner board layer. I’ve done PCBs in the past and routing the power traces was pretty easy but dealing with the ATmega32u4 was… tricky.

Package selection makes a difference here. Originally I tried to use a QFN package but those pins are tiny and I was really having a tough go of it. Things got a lot easier when I switched to TQFP, which conveniently is easier to hand solder as well.

The other trick is to remember you can run traces underneath the chip (something I always forget). To get all the VCC pins connected I took full advantage of this, running all the power traces on the front side of the board and using vias to pop them out on the back side where the 32u4 lived:

Power traces connecting the VCC pins on an ATmega32u4

Placing the decoupling capacitors and oscillator

The capacitors and oscillator should be placed as close to the ATmega32u4 as possible. I tried several layouts and what worked for me was to use teeny tiny capacitors (0402) placed close to the power and ground pins, but still leaving enough space to get a soldering iron in since I was going to hand solder the 32u4. Since I planned to use JLCPCB’s SMT assembly service for all the small components on the back of the board I thankfully didn’t have to worry about trying to solder the tiny capacitors.

The oscillator and its associated capacitors also took a bit of layout tweaking but eventually I settled on this:

The crystal oscillator and its associated capacitors.

The other thing that helped me with this part of the layout was to route all the power traces first.

Routing the data lines

The data lines coming off the GPIO pins were something I redid multiple times. My initial pin assignment in the schematic for each of the data lines was essentially arbitrary and many of them just didn’t make sense when it came to doing the board layout. I kept hitting situations where I was jumping traces between board layers and the overall trace layout was messy.

This is where going back to the schematic and making changes is valuable. There are only two lines that have to be on pins with PWM support (the two that control LED brightness). All the other data lines can go on any GOIP pin.

I did several revisions where I swapped data lines to different pins, doing my best to select pins that were closer to where the traces eventually had to run. Don’t be afraid to revise your schematic! In the end I came up with this:

Data lines coming out of the ATmega32u4.

The traces are clean, flow reasonably directly to where they need to go, and only a handful of vias were required to jump over other traces.


Debugging workarounds to MSFS2020 for MobiFlight

In a previous post I walked through how to apply workarounds to MSFS2020 to get access to Bvars from MobiFlight.

If you run into trouble getting the workaround to take effect here are some ways to debug it using developer tools in MSFS2020. All of these techniques assume you have developer mode enabled in flight simulator and have the Model Behaviour dialog open.

Tip 1: Verify your custom Lvar is getting set

Open the Model Behaviour dialog and switch to the Local Variables tab. Use the search box to filter the list to the custom Lvar name created for your workaround. In the screenshot below the list is filtered to the Lvar wrapping the Bvar for the TBM930 inertial separator:

The Local Variables tab filtered to the custom Lvar for controlling the TBM930 inertial separator.

With the variable visible trigger the input event using your attached device (e.g. flip the physical switch to the on position). You should see the Lvar change, first to the value specified in MobiFlight (e.g. two) then to one less than that value, then zero. For example, when turning the inertial separator on the values should be 2, 1, then 0.

If you do not see the Lvar value changing the issue could be:

Tip 2: Verify the Bvar is changing

If the Lvar is changing but the plane isn’t reflecting the new state the next step is to verify the Bvar is changing.

Open the Model Behaviour dialog and switch to the Input Events tab. Find the Bvar that’s being wrapped by the workaround and click the <Start tracking> button. This will add the Bvar to the list on the right side of the dialog and show its current value.

The Input Events tab showing the current value for the TBM930 inertial separator Bvar.

With the dialog open trigger the custom event using MobiFlight, e.g. by flipping your switch on. The Bvar should update to the set value. For example, in the case of the TBM930 inertial separator the value should become 1.

If the Bvar doesn’t change then verify the workaround RPN is setting the correct Bvar.


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!


Adding workarounds to MSFS2020 for MobiFlight

Update 2024-02-10: If you are trying to access the inaccessible switches on the TBM930 there’s an add-on available that exposes them as Lvars. You can use that add-on to implement the below workaround without having to edit the file yourself.

With the release of Sim Update 5, Asobo and Microsoft dramatically changed how sim events work to manipulate airplane controls. Unfortunately this broke the experience for many switches when trying to set them via MobiFlight.

Wish you didn’t have to apply this workaround? Me too. Help change this by upvoting the feature request for better access!

What happens without a workaround is you can control the switches via MobiFlight but the in-sim switch doesn’t update to reflect the current state. For example you can turn the inertial separator of the TBM930 on with MobiFlight and the MFD will show the “Inert sep” warning correctly but the switch on the in-sim de-ice panel will still be in the off position.

Luckily there’s a workaround. In this post I’ll walk through the steps to apply the workaround for two switches in the TBM 930: propeller de-ice and inertial separator.

Step 1: Download and install the TBM930 improvement mod

Technically you can make this change to the sim files directly but since the TBM930 improvement mod is a must-have if you fly the TBM930 we’ll be applying the workaround to its files instead.

Download and install the mod.

Step 2: Open the tbm930_interior.xml file in a text editor

The file to edit is located in the aircraft-tbm930-improvement\SimObjects\Airplanes\Asobo_TBM930\model folder, inside the MSFS2020 Community folder. Open the tbm930_interior.xml in the text editor of your choice. I prefer Visual Studio Code but it can be any text editor like Notepad, Notepad++, etc.

Step 3: Add the workaround to the file

Locate the following section near the top of the tbm930_interior.xml file:

    <!-- INSTRUMENT ################################# -->
    <Component ID="INSTRUMENT">

Above that section paste the workaround in:

    <!-- ############################################### -->
    <Component ID="MobiFlight_External_Control">
      <UseTemplate Name="ASOBO_GT_Update">
        <UPDATE_CODE>
            (L:MF_TBM930_DEICE_Engine_1_Set, Number) s0 0 &gt; if{ l0 1 - (&gt;B:DEICE_Engine_1_Set) 0 (&gt;L:MF_TBM930_DEICE_Engine_1_Set) }
        </UPDATE_CODE>
        <FREQUENCY>1</FREQUENCY>
      </UseTemplate>
    </Component>

The resulting file should look like this:

Screenshot of the workaround applied to the TBM930_interior.xml file.

Save the file, close it, and restart Microsoft Flight Simulator.

Step 4: Update your MobiFlight switch configurations

For the On Press and On Release actions of each switch you’ll need to update the configuration to use the MSFS2020 – Custom Input option and add the correct custom event. They are:

SwitchEventCustom input
Prop de-iceOn Press2 (>L:MF_TBM930_DEICE_Propeller_1_Set)
Prop de-iceOn Release1 (>L:MF_TBM930_DEICE_Propeller_1_Set)
Inertial separatorOn Press2 (L:>MF_TBM930_DEICE_Engine_1_Set)
Inertial separatorOn Release1 (L:>MF_TBM930_DEICE_Engine_1_Set)
Custom inputs to use in MobiFlight with the workaround.

For example the On Press event for the prop de-ice switch should look like this:

Screenshot of a properly configured prop de-ice switch On Press event in MobiFlight using the workaround.

Step 5: Fly!

That’s all there is to it! Now you’re ready to fly and enjoy the physical switches working as they should with the sim.

Using this technique on other planes

While this post focused on modifying the TBM930 the same technique works on other planes as well. For other planes you’ll edit the *_interior.xml file for that plane, likely in the Asobo official file, and insert a similar block of XML that defines new events to wrap the Bvars in the sim.

When creating your custom event it’s important to offset the value by one from 0. This ensures the event only takes effect if the value is explicitly set by MobiFlight. For example if the sim expects a value of 0 to turn something off and 1 to turn something on the custom event should instead take a value of 1 for off, 2 for on, and then subtract 1 from the provided value before passing it to the sim.

You can see this in action with any of the above custom events, for example:

(L:MF_TBM930_FUEL_Selection_Set, Number) s0 0 &gt; if{ l0 1 - (&gt;B:FUEL_Selection_set) 0 (&gt;L:MF_TBM930_FUEL_Selection_Set) }

The custom event checks to see if the value is greater than 0 before doing anything. If it’s 0 nothing happens and the sim will function as if the workaround isn’t applied at all. If it’s greater than 0 then 1 is subtracted from the specified value (to turn it into what the sim expects), then it is passed to the sim.

A few closing notes

The workaround will get overwritten every time a new version of the TBM930 improvement mod is released. You’ll need to go back to step 3 and apply the change after every improvement mod update.

There are other switches in the TBM930 that need these changes, such as the fuel selector switch. You can find them documented on HubHop, the unofficial repository of all MSFS2020 events. When adding additional workarounds you only need to insert the new Lvar from hubhop into the existing workaround block applied in step 3. For example to apply the workaround for the fuel selector switch the workaround block winds up looking like this:

Screenshot showing multiple workarounds applied to the TBM930_interior.xml file.

The MobiFlight wiki is a wealth of knowledge for how to do things like this. Check out the article on how to use custom input page or how to use the developer tools to uncover events.

2021-10-14: Updated RPN to use registers instead of duplicating on the stack. Corrected a > to &gt;.