Backup function (export/import) for the controls settings

I’d recommend FS2020 Controller Settings be in clear text and accessible outside the game GUI. It is important for backing up copying, sharing and restoring purposes, but also for any other user editing which is not possible with the GUI because of its Xbox oriented design.

An good example of this is how you can never precisely adjust curve sensitivity with the mouse because the slider range in pixels is less than the number of percentage values you can select from.

There is really no useful reason to hide these inside the convoluted file/folder naming convention in my opinion (see details below) and this further reflects the opposite of a simulator for simmers as well. I strongly believe a differentiator between a game and a simulator is the level of low level access to configuring one’s simmer experience and manual access and editing to these files is paramount to the simmer experience. It has been this way for decades with every single other simulator.

Furthermore, in un-hiding the settings system, it would make it easier to solve this topic question (backup/restore) but also other problem reported in this discussion:

https://forums.flightsimulator.com/t/ability-to-have-separate-control-setups-for-each-plane-without-having-to-manually-switch-between-20-controller-profiles/267419

In effect, if not in providing a GUI for this, which I understand is really something for which allocating dev resources at this stage is most likely minor, at least, FS2020 could support the per-aircraft settings in letting users just placing a copy of the XML files I’m referencing above directly in the aircraft folder for example:

OneStore\asobo-aircraft-c152\SimObjects\Airplanes\Asobo_C152\custom_controls.xml


NB: user settings are not just saved in the cloud (if ever they are). They are also already stored in clear text (XML files) but they are also referenced through binary “catalogs” making any manual change or addition impossible as-is.

  1. The folder where settings are saved is:

C:\Users\NAME\AppData\Local\Packages\Microsoft.FlightSimulator_8wekyb3d8bbwe\SystemAppData\wgs

  1. In this folder you’ll find another one with a long series of numbers (most likely a UID converted to text) into which there is a containers.index file (the catalog) and a subfolder per setting entry.

  2. Each subfolder name resemble a GUID which is referenced in the containers.index file and inside each subfolder there are 2 files

  3. the first file is binary and labeled container.##, the second one is also labeled like a GUID and is either a plain XML file or a binary file. The XML files are controller settings and the binary files most likely are the other settings not saved in UserCfg.opt json file.

For example, here are a few of my files:

XML File #1 (showing how I couldn't adjust the same sensitivity values with GUI and mouse)
<?xml version="1.0" encoding="UTF-8"?>
<Version Num="1544"/>
<FriendlyName>Alpha Flight Controls  1</FriendlyName>
<Device DeviceName="Alpha Flight Controls" GUID="{FFDB0870-7855-11EB-8002-444553540000}" ProductID="6400">
	<Axes>
		<Axis AxisName="X" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="2" AxisOutDeadZone="0" AxisResponseRate="-1"/>
		<Axis AxisName="Y" AxisSensitivy="-26" AxisSensitivyMinus="-25" AxisNeutral="0" AxisDeadZone="2" AxisOutDeadZone="26" AxisResponseRate="-1"/>
	</Axes>
	<Context ContextName="PLANE">
		<Action ActionName="KEY_AP_MASTER" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 4">3</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_ELEV_TRIM_DN" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 6">5</KEY>
				<KEY Information="Joystick Button 8">7</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_ELEV_TRIM_UP" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 5">4</KEY>
				<KEY Information="Joystick Button 7">6</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_AXIS_ELEVATOR_SET" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Y ">1042</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_AXIS_AILERONS_SET" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis X ">1026</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_RUDDER_TRIM_LEFT" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 9">8</KEY>
				<KEY Information="Joystick Button 11">10</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_RUDDER_TRIM_RIGHT" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 10">9</KEY>
				<KEY Information="Joystick Button 12">11</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="INGAME_UI">
		<Action ActionName="KEY_ATC" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 2">1</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="MODES">
		<Action ActionName="KEY_VIEW_MODE" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 3">2</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CYCLE_PILOTVIEW_NEXT" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Up">256</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CYCLE_PILOTVIEW_BACK" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Down">258</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="ATC">
		<Action ActionName="KEY_ATC_MENU_1" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 1">0</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="EXTERNAL_CAMERA">
		<Action ActionName="KEY_CHASE_LOOK_LEFT" Flag="1">
			<Primary>
				<KEY Information="Joystick Pov Left">259</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_RIGHT" Flag="1">
			<Primary>
				<KEY Information="Joystick Pov Right">257</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_UP" Flag="1">
			<Primary>
				<KEY Information="Joystick Pov Up">256</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_DOWN" Flag="1">
			<Primary>
				<KEY Information="Joystick Pov Down">258</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_UPLEFT" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Up_Left">260</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_UPRIGHT" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Up_Right">263</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_DOWNLEFT" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Down_Left">261</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_CHASE_LOOK_DOWNRIGHT" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Down_Right">262</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="COCKPIT_CAMERA">
		<Action ActionName="KEY_COCKPIT_QUICKVIEW4" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Left">259</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_COCKPIT_QUICKVIEW3" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Right">257</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="INSTRUMENTS_CAMERA">
		<Action ActionName="KEY_COCKPIT_CYCLE" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Right">257</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_COCKPIT_BACKCYCLE" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Left">259</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="ALWAYS">
		<Action ActionName="KEY_RESET_CAMERA_VR" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Down">258</KEY>
			</Primary>
		</Action>
	</Context>
	<Context ContextName="COCKPIT_VR_CAMERA">
		<Action ActionName="KEY_COCKPIT_VR_FOCUS" Flag="2">
			<Primary>
				<KEY Information="Joystick Pov Up">256</KEY>
			</Primary>
		</Action>
	</Context>
</Device>
XML File #2 (a variation of throttles settings for Jets
<?xml version="1.0" encoding="UTF-8"?>
<Version Num="1544"/>
<FriendlyName>Saitek Pro Flight Quadrant Jets</FriendlyName>
<Device DeviceName="Saitek Pro Flight Quadrant" GUID="{7E9C45B0-7221-11EB-8001-444553540000}" ProductID="3117">
	<Axes>
		<Axis AxisName="X" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
		<Axis AxisName="Y" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
		<Axis AxisName="Z" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
	</Axes>
	<Context ContextName="PLANE">
		<Action ActionName="KEY_SPOILERS_TOGGLE" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 5">4</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_PARKING_BRAKES" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 6">5</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_FLAPS_INCR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 2">1</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_FLAPS_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 1">0</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE1_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 7">6</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE2_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 8">7</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_SPOILERS_ARM_SET" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 9">8</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_GEAR_UP" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 3">2</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_GEAR_DOWN" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 4">3</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_AXIS_SPOILER_SET" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Z ">1058</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE1_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis X ">1026</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE2_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Y ">1042</KEY>
			</Primary>
		</Action>
	</Context>
</Device>
XML File #3 (a variation of throttles settings for 4 engines
<?xml version="1.0" encoding="UTF-8"?>
<Version Num="1544"/>
<FriendlyName>Saitek Pro Flight Quadrant 4 Eng</FriendlyName>
<Device DeviceName="Saitek Pro Flight Quadrant" GUID="{7E9C45B0-7221-11EB-8001-444553540000}" ProductID="3117">
	<Axes>
		<Axis AxisName="X" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
		<Axis AxisName="Y" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
		<Axis AxisName="Z" AxisSensitivy="0" AxisSensitivyMinus="0" AxisNeutral="0" AxisDeadZone="0" AxisOutDeadZone="0" AxisResponseRate="-1"/>
	</Axes>
	<Context ContextName="PLANE">
		<Action ActionName="KEY_SPOILERS_TOGGLE" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 5">4</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_PARKING_BRAKES" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 6">5</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_FLAPS_INCR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 2">1</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_FLAPS_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 1">0</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE1_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 7">6</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE2_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 7">6</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE3_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 8">7</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE4_DECR" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 8">7</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_SPOILERS_ARM_SET" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 9">8</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_GEAR_UP" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 3">2</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_GEAR_DOWN" Flag="2">
			<Primary>
				<KEY Information="Joystick Button 4">3</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_AXIS_SPOILER_SET" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Z ">1058</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE1_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis X ">1026</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE2_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis X ">1026</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE3_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Y ">1042</KEY>
			</Primary>
		</Action>
		<Action ActionName="KEY_THROTTLE4_AXIS_SET_EX1" Flag="4">
			<Primary>
				<KEY Information="Joystick L-Axis Y ">1042</KEY>
			</Primary>
		</Action>
	</Context>
</Device>

Additional info:

The default controller assignments are also XML files located in the game folder, for example:

WindowsApps\Microsoft.FlightSimulator_1.12.13.0_x64__8wekyb3d8bbwe\Input

There is in theory nothing precluding adding the missing default FFB2 profile for example in this folder, and you can spot there is a standard support for the Leo Bodnar BU0836X as well:

BU0836X 12-bit joystick interface : Leo Bodnar Electronics

The entire list of default controller image files is in the following file (a catalog in XML):

WindowsApps\Microsoft.FlightSimulator_1.12.13.0_x64__8wekyb3d8bbwe\Packages\fs-base-ui\DeviceConfig\

Device.Config.xml
<?xml version= "1.0" encoding= "utf-8" ?>
<DeviceConfig>
	<Device ProductId="0x1900" TextureFolder="H.Alpha Flight Control" />					<!-- Alpha Flight Controls -->
	<Device ProductId="0x1901" TextureFolder="Bravo Throttle Quadrant" />					<!-- Bravo Throttle Quadrant-->
	<Device ProductId="0x884B" TextureFolder="Keyboard"					Priority="-10" />	<!-- Keyboard -->
	<Device ProductId="0x378D" TextureFolder="Mouse"					Priority="-9" />	<!-- Mouse -->
	<Device ProductId="0xC215" TextureFolder="Saitek Extreme 3D Pro Stick" />				<!-- Logitech Extreme 3D (NB: Saitek = Logitech) -->
	<Device ProductId="0xA2AE" TextureFolder="Saitek Flight Instrument Panel" />			<!-- Saitek Flight Instrument Panel -->
	<Device ProductId="0x0D06" TextureFolder="Saitek Flight Multi Panel" />					<!-- Saitek Flight Multi Panel -->
	<Device ProductId="0x0D05" TextureFolder="Saitek Flight Radio Panel" />					<!-- Saitek Flight Radio Panel -->
	<Device ProductId="0x0D67" TextureFolder="Saitek Flight Switch Panel" />				<!-- Saitek Flight Switch Panel -->
	<Device ProductId="0x0763" TextureFolder="Saitek Pro Flight Rudder Pedals" />			<!-- Saitek Pro Flight Rudder Pedals -->
	<Device ProductId="0x0C2D" TextureFolder="Saitek Pro Flight Throttle Quadrant" />		<!-- Saitek Pro Flight Quadrant -->
	<Device ProductId="0x2221" TextureFolder="Saitek Pro Flight X-56 Rhino Stick" />		<!-- Saitek Pro Flight X-56 Rhino Stick -->
	<Device ProductId="0xA221" TextureFolder="Saitek Pro Flight X-56 Rhino Throttle" />		<!-- Saitek Pro Flight X-56 Rhino Throttle -->
	<Device ProductId="0x0BAC" TextureFolder="Saitek Pro Flight Yoke" />					<!-- Saitek Pro Flight Yoke -->
	<Device ProductId="0x075C" TextureFolder="Saitek X52 Flight Control System" />			<!-- Saitek X52 Flight Control System -->
	<Device ProductId="0x0762" TextureFolder="Saitek X52 Pro Flight Control System" />		<!-- Saitek X52 Pro Flight Control System -->
	<Device ProductId="0xB68F" TextureFolder="T-Pendular-Rudder" />							<!-- -Pendular-Rudder -->
	<Device ProductId="0xB678" TextureFolder="T-Rudder" />									<!-- T.Flight Rudder Pedals -->
	<Device ProductId="0xB679" TextureFolder="T-Rudder" />									<!-- T-Rudder -->
	<Device ProductId="0xB10A" TextureFolder="T.16000M" />									<!-- T.16000M -->
	<Device ProductId="0xB67B" TextureFolder="T.Flight Hotas 4" />							<!-- T.Flight Hotas 4 -->
	<Device ProductId="0xB68D" TextureFolder="T.Flight Hotas One" />						<!-- T.Flight Hotas One -->
	<Device ProductId="0xB108" TextureFolder="T.Flight Hotas X" />							<!-- T.Flight Hotas X -->
	<Device ProductId="0xB106" TextureFolder="T.Flight Stick X" />							<!-- T.Flight Stick X -->
	<Device ProductId="0x0402" TextureFolder="T.Hotas Warthog Joystick" />					<!-- T.Hotas Warthog Joystick -->
	<Device ProductId="0x0404" TextureFolder="T.Hotas Warthog Throttle" />					<!-- T.Hotas Warthog Throttle -->
	<Device ProductId="0xB687" TextureFolder="TWCS Throttle" />								<!-- TWCS Throttle -->
	<Device ProductId="0x0DA3" TextureFolder="V.Ruddo Plus" />								<!-- VirtualFly - RUDDO+ -->
	<Device ProductId="0x0DA1" TextureFolder="V.TQ3+" />									<!-- VirtualFly - TQ3+ -->
	<Device ProductId="0x0DA2" TextureFolder="V.TQ6" />										<!-- VirtualFly - TQ6+ -->
	<Device ProductId="0x0DA4" TextureFolder="V.V3rnio TPM" />								<!-- VF - TPM V3RNIO -->
	<Device ProductId="0x0DA0" TextureFolder="V.Yoko The Yoke Plus" />						<!-- VirtualFly - YOKO+ -->
	<Device ProductId="0x0001" TextureFolder="XInput Gamepad"			Priority="-1" />	<!-- XInput Gamepad -->
	<!-- Devices without images -->
	<Device ProductId="0x4843" TextureFolder="Unknown Device" />							<!-- Custom DR400 cockpit, BU0836X Interface -->
	<Device ProductId="0x3E20" TextureFolder="Unknown Device" />							<!-- Custom DR400 cockpit, BU0836X Interface -->
	<!-- T.A320 -->
	<Device ProductId="0x0405" TextureFolder="T.A320 Pilot" />								<!-- T.A320 Pilot (Left handed) -->
	<Device ProductId="0x0406" TextureFolder="T.A320 Copilot" />							<!-- T.A320 Copilot (Right handed) -->
	<Device ProductId="0x0407" TextureFolder="T.A320 Quadrant throttle" />					<!-- Airbus T-A320 Quadrant throttle -->
</DeviceConfig>

It is referencing controller images located here:

WindowsApps\Microsoft.FlightSimulator_1.12.13.0_x64__8wekyb3d8bbwe\Packages\fs-base-ui\html_ui\Textures\Menu\Control

I don’t see why the user controller settings hidden in plain sight that I’m describing above couldn’t also be referenced in a similar way, instead of using a binary catalog file.

17 Likes