Here’s how I set up model matching for use with VATSIM tower view in MSFS2020. Honestly, it’s the same model matching I use for flying on VATSIM too. It works well.
FSLTL is great for people flying airliners for real airlines. It is not designed for GA aircraft or people flying MSFS default aircraft under non-airline callsigns.
To fix that download the custom rule sets by Marcus Griep. This includes rules for standard, deluxe, and premium MSFS aircraft, as well as common GA aircraft from Carenado, India Foxtrot Echo, and Kitfox. I don’t bother using the rules for Cape Air or the Mega Pack.
Step 3: Get my GA matching supplement rules
I used Model Matching Magic to make an additional rule file that covers some other GA aircraft and tries to at least get *something* to match for certain aircraft types. Download my custom rule set and put it somewhere safe.
Step 4: Add the rules to vpilot
Order matters. The list should be:
FSLTL_Rules.vmr
Carenado_C182.vmr
Carenado_C182_Similar.vmr
Carenado_M20R.vmr
Carenado_M20R_Similar.vmr
IFE_LongEZ.vmr
Kitfox_STi.vmr
MSFS_Premium.vmr
MSFS_Premium_Similar.vmr
MSFS_Deluxe.vmr
MSFS_Deluxe_Similar.vmr
MSFS_Standard.vmr
MSFS_Standard_Similar.vmr
GA_Matching_Supplement.vmr
Step 5: Enjoy!
That’s it. Now you have great model matching for tower view or flying on VATSIM.
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?
The Cessna Citation CJ4 avionics have been heavily upgraded to bring an authentic CJ4 avionics experience:
Comprehensive visual overhaul for accurate font, symbology, look, operation, and feel
Independent MFD and FMS operation
Advanced flight plan support, including arcs, radius-to-fix, intercepts, hold, procedure turns, missed approaches, and custom waypoint scratchpad entry
Coupled VNAV with editable constraints, flight path angles, vertical path smoothing, and VNAV-invalidation conditions
Advanced autopilot, including armable lateral and vertical modes as well as complex combined-armed modes – Full specification-accurate TCAS II traffic system
Cabin pressurization and complete Crew Alerting System
FMS performance calculations for takeoff and landing speeds
Integrated dual engine FADEC systems with N1 mode indications and accurate N1 targets
Independent display options and state-saving
Enhanced FMS Text MFD display modes
Keyboard entry mode for FMS data entry
AHRS alignment and startup sequence
Improved flight model:
Improvements to ground and crosswind handing during the takeoff and landing phases
Improvements to flight control performance accuracy, smoothness, and handling
Improvements to fuel consumption accuracy
Improvements to handling while in ground effect
Improved engine and interior sound effects
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. As of SU15 there’s a plug-in model for the CJ4 that could make this easier, but apparently there are still a few missing pieces. WorkingTitle did make the necessary changes and they just need to make it into an MSFS2020 update.
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.
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.
How do I change the barometric pressure units to metric (hectopascals)?
The CJ4 follows the real-world aircraft for changing pressure units. There are two separate systems, the PFD and the FMC.
For the PFD: Use the PFD MENU button to open the PFD options, then use the MENU ADV knob to scroll down to CONFIG. Press the MENU ADV knob to select it, then change the PRESSURE to either IN or HPA.
For the FMC: In the real world plane the pilot cannot change the unit used by the FMC. To work around this the CJ4 in the sim follows the unit set in the MSFS2020 options. Go to General Options > Misc and change Units of measurement to U.S. system or Metric system. You can also enter the pressure with a unit identifier after it, e.g. 1013H or 2992I, and the FMC will automatically swap to the appropriate unit.
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:
Make sure that you are not using old WT CJ4 mods of the plane or avionics packages
Make sure you don’t use an old livery that fully overrides panel.cfg (which only old obscure ones would still do)
If you are using the CJ4 Cockpit Texture mod then update it to the latest version
You only have to do this once. The plane will remember this setting for future flights.
Step 2: Enable VNAV display on the MFD
Press the DSPL MENU button on the pilot’s FMC
Press LSK 6L until the WINDOW setting is VNAV
You only have to do this once. The plane will remember this setting for future flights.
Step 3: Set your cruise altitude
Press the PERF button on the FMC
Press LSK 1L to select PERF INIT
Type your cruise altitude in, e.g. F200 (you can omit the L as a shortcut when entering a flight level)
Press RSK 1R to store the cruise altitude in CRZ ALT
Press EXEC to confirm the change
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
Press UPR MENU on the pilot’s Cursor Control Panel
Use the inner knob (DATA) to scroll to FMS TEXT
Press UPR MENU again to save the change
Optional: save this configuration in memory by pressing and holding one of the MEM buttons. This way you can just press the MEM button next time you fly to get this configuration back.
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.
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?
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:
The switch isn’t triggering
The switch isn’t setting the Lvar properly
The workaround in the plane’s XML file has a typo/error in it
The workaround wasn’t applied to the correct file
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.
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 Tools > Behaviors. Then do the following:
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.
Click the InputEvents tab
Uncheck the Minimize data on Load option
Click Reload user container
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:
Expand the event by clicking the triangle next to LANDING_GEAR_ParkingBrake
Click the Add to control panel button
Expand the entry added to the right side of the dialog by clicking the triangle next to LANDING_GEAR_ParkingBrake
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. Create a new input config with an action type of Microsoft Flight Simulator 2020 and check the Show Preset Code box to get a text box for the event code. 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)
It should look something like this:
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!
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.
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.
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:
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:
Switch
Event
Custom input
Prop de-ice
On Press
2 (>L:MF_TBM930_DEICE_Propeller_1_Set)
Prop de-ice
On Release
1 (>L:MF_TBM930_DEICE_Propeller_1_Set)
Inertial separator
On Press
2 (L:>MF_TBM930_DEICE_Engine_1_Set)
Inertial separator
On Release
1 (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:
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.
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.
I built a custom PCB that replicates the TBM930 de-ice panel for use with Microsoft Flight Simulator 2020 and Mobiflight. This is part 1 of a series where I walk through how I managed to do it with an ATmega32u4 directly on the PCB instead of relying on an external Arduino board.
Why an ATmega32u4 (the chip used on the SparkFun Pro Micro) instead of the ATmega2560 (the chip used on the Arduino Mega 2560)? Easy: onboard USB. The 2560 doesn’t have onboard USB and if you look at the schematic for the Mega 2560 you’ll see it also has… a 32u4 to handle the USB communication.
The chip itself has, as you’d expect, a full datasheet. But if you’re like me you just want to know what decoupling capacitors and whatnot are required and how to lay them out on a PCB. Sadly that isn’t really explained in the datasheet so I wound up doing a lot of reading in random forums of people trying to do similar custom boards and looking at the schematics for the Pro Micro and Arduino Leonardo. Distilling all that down got me this schematic:
Schematic illustrating an ATmega32u4’s basic connections.
Important things to note:
Every VCC and AVCC pin gets a 100nf/0.1uF capacitor
UCAP gets a 1uF capacitor
AREF gets a 1uF capacitor
VBUS and UVCC share a 10uF capacitor
Pin 33 (~HWB/PE2) gets tied to ground through a 10kΩ resistor since the Arduino bootloader doesn’t use the HWB feature
In addition the incoming USB port has components to ensure proper power and USB operation. I wanted to include ESD protection but JLCPB didn’t have any available as basic parts so I left it out.
Necessary components for the USB input to an ATmega32u4.
Of note are the 22Ω resistors on the D+ and D- lines.
The Arduino bootloader expects the 32u4 to have an external oscillator providing the clock so that also needs to be included in the schematic:
Necessary components for an external crystal oscillator with an ATmega32u4.
The oscillator is 16MHz and per the datasheet I added 20pF capacitors. 22pF capacitors should work too but 20pF is what I had on hand so that’s what I used.
Finally there has to be a way to get the bootloader onto the chip. I did that by exposing an AVR-ISP header and reset switch on the board. The reset switch really wasn’t necessary but it was easy to include so I added it. The reset circuit design is pulled directly from the chip’s application notes (see figure 2-1).
AVR-ISP and reset circuit for an ATmega32u4.
That’s all it takes! When I first looked at the schematics for the Sparkfun Pro Micro I found it pretty intimidating (and frankly quite messy) but once I walked through it the actual required components aren’t that bad.
The complete schematic is available in GitHub. To see how this got laid out on the PCB check out part 2 of the series.
Mobiflight is an amazing piece of software that makes it possible to easily make physical controls for planes in flight simulators with an off-the-shelf Arduino, some buttons, and some LEDs. I’ve had a ton of fun with it and even designed a custom PCB for a general purpose radio stack. The radio stack is cool but it still relines on an Arduino being stuck to the back.
But did you know it’s possible to make a custom PCB with an ATmega32u4 right on the board and have it work with Mobiflight, no external Arduino required?
TBM930 de-ice panel custom PCB for use with Microsoft Flight Simulator 2020 and Mobiflight.
In this series of blog posts I’ll walk through how I designed the TBM930 de-ice panel as a custom PCB with an onboard ATmega32u4 that works with Mobiflight.
While this PCB is intended for use with Mobiflight the steps involved apply to any PCB you might want to make that uses the 32u4.