<!-- Airbus A3XX FCS by Joshua Davidson (it0uchpods) -->

<!--
#########################################
# Copyright (c) it0uchpods Design Group #
#########################################
-->

<system name="A3XX: FCS">

	<property value="2">fcs/internal-fbw-law</property>

	<channel name="FBW">

		<switch name="Internal FBW Law">
			<default value="/it-fbw/law"/>
			<test logic="OR" value="2">
				/gear/gear[1]/wow == 1
				/gear/gear[2]/wow == 1
			</test>
		</switch>
	
	</channel>
	
	<channel name="Roll">
	
		<summer name="Roll Trim Sum">
			<input>/controls/flight/aileron-sum</input>
			<input>/controls/flight/aileron-trim</input>
			<clipto>
				<min>-1</min>
				<max>1</max>
			</clipto>
		</summer>

		<aerosurface_scale name="Roll Control">
			<input>fcs/roll-trim-sum</input>
			<range>
				<min>-0.523599</min>
				<max>0.523599</max>
			</range>
			<output>fcs/roll-pos-rad</output>
		</aerosurface_scale>

		<aerosurface_scale name="Roll Control Normalized">
			<input>fcs/roll-pos-rad</input>
			<domain>
				<min>-0.523599</min>
				<max>0.523599</max>
			</domain>
			<range>
				<min>-1</min>
				<max>1</max>
			</range>
			<output>fcs/roll-pos-norm</output>
		</aerosurface_scale>
		
	</channel>
	
	<channel name="Pitch">
	
		<summer name="Pitch Trim Sum">
			<input>/controls/flight/elevator-sum</input>
			<input>/controls/flight/elevator-trim</input>
			<clipto>
				<min>-1</min>
				<max>1</max>
			</clipto>
		</summer>

		<aerosurface_scale name="Pitch Control">
			<input>fcs/pitch-trim-sum</input>
			<range>
				<min>-0.523599</min>
				<max>0.523599</max>
			</range>
			<output>fcs/pitch-pos-rad</output>
		</aerosurface_scale>
		
		<aerosurface_scale name="Pitch Control Normalized">
			<input>fcs/pitch-trim-sum</input>
			<domain>
				<min>-0.523599</min>
				<max>0.523599</max>
			</domain>
			<range>
				<min>-1</min>
				<max>1</max>
			</range>
			<output>fcs/pitch-pos-norm</output>
		</aerosurface_scale>
		
	</channel>
	
	<channel name="Throttle">
	
		<pure_gain name="fcs/throttle1">
			<input>/controls/engines/engine[0]/throttle-output</input>
			<gain>1</gain>
			<output>fcs/throttle-cmd-norm</output>
			<output>fcs/throttle-pos-norm</output>
		</pure_gain>
		
		<pure_gain name="fcs/throttle2">
			<input>/controls/engines/engine[1]/throttle-output</input>
			<gain>1</gain>
			<output>fcs/throttle-cmd-norm[1]</output>
			<output>fcs/throttle-pos-norm[1]</output>
		</pure_gain>
		
	</channel>

	<channel name="Yaw">
	
		<pure_gain name="fcs/rudder-cmd">
			<input>/controls/flight/rudder-fdm</input>
			<gain>-1</gain>
			<output>fcs/rudder-cmd-norm</output>
		</pure_gain>

		<summer name="Rudder Command Sum">
			<input>fcs/rudder-cmd-norm</input>
			<input>fcs/yaw-trim-cmd-norm</input>
			<clipto>
				<min> -0.35 </min>
				<max>  0.35 </max>
			</clipto>
		</summer>

		<scheduled_gain name="Yaw Damper Rate">
			<input>velocities/r-aero-rad_sec</input>
			<table>
				<independentVar lookup="row">velocities/ve-kts</independentVar>
				<tableData>
				30     0.00
				60     2.00
				</tableData>
			</table>
		</scheduled_gain>

		<scheduled_gain name="Yaw Damper Beta">
			<input>aero/beta-rad</input>
			<table>
				<independentVar lookup="row">velocities/ve-kts</independentVar>
				<tableData>
				30     0.00
				60     0.00
				</tableData>
			</table>
		</scheduled_gain>

		<summer name="Yaw Damper Sum">
			<input>fcs/yaw-damper-beta</input>
			<input>fcs/yaw-damper-rate</input>
			<clipto>
				<min> -0.1 </min>
				<max>  0.1 </max>
			</clipto>
		</summer>

		<scheduled_gain name="Yaw Damper Final">
			<input>fcs/yaw-damper-sum</input>
			<table>
				<independentVar lookup="row">velocities/ve-kts</independentVar>
				<tableData>
				30         0.0
				31         1.0
				</tableData>
			</table>
		</scheduled_gain>

		<summer name="Rudder Sum">
			<input>fcs/rudder-command-sum</input>
			<input>fcs/yaw-damper-final</input>
			<clipto>
				<min> -1 </min>
				<max>  1 </max>
			</clipto>
		</summer>

		<aerosurface_scale name="Rudder Control">
			<input>fcs/rudder-sum</input>
			<range>
				<min> -0.35 </min>
				<max>  0.35 </max>
			</range>
			<output>fcs/rudder-pos-rad</output>
		</aerosurface_scale>

		<aerosurface_scale name="rudder normalization">
			<input>fcs/rudder-pos-rad</input>
			<domain>
				<min> -0.35 </min>
				<max>  0.35 </max>
			</domain>
			<range>
				<min> -1 </min>
				<max>  1 </max>
			</range>
			<output>fcs/rudder-pos-norm</output>
		</aerosurface_scale>
		
	</channel>

	<channel name="Flaps">
	
		<kinematic name="Flaps Control">
			<input>/controls/flight/flaps</input>
			<traverse>
				<setting>
					<position>0</position>
					<time>0</time>
				</setting>
				<setting>
					<position>35</position>
					<time>30</time>
				</setting>
			</traverse>
			<output>fcs/flap-pos-deg</output>
		</kinematic>

		<aerosurface_scale name="Flap position normalized">
			<input>fcs/flap-pos-deg</input>
			<domain>
				<min>0</min>
				<max>35</max>
			</domain>
			<range>
				<min>0</min>
				<max>1</max>
			</range>
			<output>fcs/flap-pos-norm</output>
		</aerosurface_scale>
		
	</channel>

	<channel name="Slats">
	
		<kinematic name="Slats Control">
			<input>/controls/flight/slats</input>
			<traverse>
				<setting>
					<position>0</position>
					<time>0</time>
				</setting>
				<setting>
					<position>27</position>
					<time>20</time>
				</setting>
			</traverse>
			<output>fcs/slat-pos-deg</output>
		</kinematic>

		<aerosurface_scale name="Slat position normalized">
			<input>fcs/slat-pos-deg</input>
			<domain>
				<min>0</min>
				<max>27</max>
			</domain>
			<range>
				<min>0</min>
				<max>1</max>
			</range>
			<output>fcs/slat-pos-norm</output>
		</aerosurface_scale>
		
	</channel>

	<channel name="Landing Gear">
	
		<kinematic name="Gear Control">
			<input>gear/gear-cmd-norm</input>
			<traverse>
				<setting>
					<position>0</position>
					<time>0</time>
				</setting>
				<setting>
					<position>1</position>
					<time>10</time>
				</setting>
			</traverse>
			<output>gear/gear-pos-norm</output>
		</kinematic>
		
	</channel>

	<channel name="Speedbrake">
	
		<kinematic name="Speedbrake">
			<input>/controls/flight/speedbrake-output</input>
			<traverse>
				<setting>
					<position>0</position>
					<time>0</time>
				</setting>
				<setting>
					<position>1</position>
					<time>1</time>
				</setting>
			</traverse>
			<output>fcs/speedbrake-pos-norm</output>
		</kinematic>
		
	</channel>
    
	<channel name="Tiller">
        
		<fcs_function name="Nose Wheel Steering 0">
			<function name="fcs/steer-nose-deg[0]">
				<description>Steering command for nose gear</description>
				<product>
					<table>
						<independentVar lookup="row">/velocities/groundspeed-kt</independentVar>
						<independentVar lookup="column">/controls/flight/rudder</independentVar>
						<tableData>
						        -1  0   1
						30.000 -70  0  70
						30.001 -10  0  10
						</tableData>
					</table>
				</product>
			</function>
		</fcs_function>
        
		<actuator name="Gear Nose Actuator">
			<input>fcs/steer-nose-deg[0]</input>
			<rate_limit>70</rate_limit>
			<output>fcs/steer-pos-deg[0]</output>
		</actuator>
		
    </channel>

</system>