<?xml version="1.0" encoding="UTF-8" ?>

<!-- Airbus A320 autobrake configuration -->
<!-- Adapated from the Boeing 777-200ER -->

<PropertyList>
	
	<logic>
		<name>Disabled state</name>
		<!-- ensure output is consistent when no mode is selected-->
		<enable>
			<condition>
				<equals>
					<property>/autopilot/autobrake/step</property>
					<value>0</value>
				</equals>
			</condition>
		</enable>
		<input><false/></input>
		<output>/autopilot/autobrake/engaged</output>
	</logic>
	
	<logic>
		<name>Max (RTO in Boeing terms) selected</name>
		<input>
			<equals>
				<property>/autopilot/autobrake/step</property>
				<value>3</value>
			</equals>
		</input>
		<output>/autopilot/autobrake/max-selected</output>
	</logic>
	
	<logic>
		<name>Autobrake Selected</name>
		<input>
			<greater-than>
				<property>/autopilot/autobrake/step</property>
				<value>0</value>
			</greater-than>
		</input>
		<output>/autopilot/autobrake/selected</output>
	</logic>
	
	<logic>
		<name>Throttles At Idle</name>
		<input>
			<!-- engine 0 -->
			<and>
			<or>
				<less-than>
					<property>/controls/engines/engine[0]/throttle</property>
					<property>/autopilot/autobrake/config/idle-throttle</property>
				</less-than>
				<property>/controls/engines/engine[0]/reverser</property>
			</or>
			<!-- engine 1 -->	
			<or>
				<less-than>
					<property>/controls/engines/engine[1]/throttle</property>
					<property>/autopilot/autobrake/config/idle-throttle</property>
				</less-than>
				<property>/controls/engines/engine[1]/reverser</property>
			</or>
			</and>
		</input>
		<output>/autopilot/autobrake/throttles-at-idle</output>
	</logic>

	<logic>
		<name>Airborne</name>
		<input>
			<not><property>/gear/gear/wow</property></not>
		</input>
		<output>/autopilot/autobrake/airborne</output>
	</logic>

	<logic>
		<name>High-speed</name>
		<input>
			<greater-than>
				<property>/instrumentation/airspeed-indicator/indicated-speed-kt</property>
				<value>40</value>
			</greater-than>
		</input>
		<output>/autopilot/autobrake/above-40-kts</output>
	</logic>
	
	<logic>
		<name>Spoilers deployed</name>
		<input>
			<greater-than>
				<property>/surface-positions/speedbrake-pos-norm</property>
				<value>0</value>
			</greater-than>
		</input>
		<output>/autopilot/autobrake/spoilers-deployed</output>
	</logic>

	<!-- pilot brake input -->
	<logic>
		<name>Pilot Input</name>
		<input>
			<less-than>
				<property>/autopilot/autobrake/config/pilot-input</property>
				<expression>
					<max>
						<property>/controls/gear/brake-left</property>
						<property>/controls/gear/brake-right</property>
					</max>
				</expression>		  
			</less-than>
		</input>
		<output>/autopilot/autobrake/pilot-input</output>
	</logic>

	<flipflop>
		<name>Autobrake Engage logic</name>
		<debug>false</debug>
		<type>RS</type>
		<enable>
			<condition>
				<and>
					<property>/autopilot/autobrake/selected</property>
					<not>
						<property>/autopilot/autobrake/max-selected</property>
					</not>
				</and>
			</condition>
		</enable>
		
		<S>
			<and>
				<property>/autopilot/autobrake/throttles-at-idle</property>
				<property>/autopilot/autobrake/spoilers-deployed</property>
				<not>
					<property>/autopilot/autobrake/airborne</property>
				</not>
			</and>
		</S>
		<R>
			<false/>
		</R>
		<output>/autopilot/autobrake/engaged</output>
	</flipflop>

	<filter>
		<name>MAX cancel logic</name>
		<type>gain</type>
		<gain>1.0</gain>
		<debug>false</debug>
 
		<enable>
			<condition>
				<property>/autopilot/autobrake/max-selected</property>
				<property>/autopilot/autobrake/airborne</property>
			</condition>
		</enable>
		
		<input><value>0</value></input> <!-- switch to 'off' -->
		<output>/autopilot/autobrake/step</output>
	</filter>
	
	<flipflop>
		<name>MAX engage logic</name>
		<type>RS</type>
		<debug>false</debug>
		<enable>
			<condition>
				<property>/autopilot/autobrake/max-selected</property>
				<property>/autopilot/autobrake/above-40-kts</property>
			</condition>
		</enable>
		<S>
			<and>
				<property>/autopilot/autobrake/throttles-at-idle</property>
				<property>/autopilot/autobrake/spoilers-deployed</property>
			</and>
		</S>
		<R>
			<false/>
		</R>
		<output>/autopilot/autobrake/engaged</output>
	</flipflop>
	
	<filter>
		<name>Disengage logic</name>
		<debug>false</debug>
		<type>gain</type>
		<gain>1.0</gain>
		<enable>
			<condition>
			<property>/autopilot/autobrake/engaged</property>
			<or>
				<!-- disengage on pilot input -->
				<property>/autopilot/autobrake/pilot-input</property>
				
				<!-- disengage if the throttles are not at idle -->
				<not><property>/autopilot/autobrake/throttles-at-idle</property></not>

				<!-- disengage if the spoilers are retracted -->
				<not><property>/autopilot/autobrake/spoilers-deployed</property></not>
			</or>
			</condition>
		</enable>
		
		<input><value>0</value></input> <!-- switch to 'off' -->
		<output>/autopilot/autobrake/step</output>
	</filter>
	
	<!-- model the accelerometer portion of the AB system.
	  This could differentiate indicated-airspeed, but I suspect real-
	  world systems use accelerometers directly. -->
	<filter>
		<name>Deceleration Sensor</name>
		<type>noise-spike</type>
		<max-rate-of-change>5.0</max-rate-of-change>
		<input>
			<scale>-1</scale> <!-- deceleration, not acceleration -->
			<property>/fdm/jsbsim/accelerations/udot-ft_sec2</property>
		</input>
		<output>/autopilot/autobrake/actual-decel-ftsec2</output>
	</filter>
	
	<!-- translate dial setting levels into target decelerations, based upon
		information in the POH -->
	<filter>
		<name>Target Deceleration Table</name>
		<type>gain</type>
		<debug>false</debug>
		<gain>1.0</gain>
		<output>/autopilot/autobrake/target-decel-ftsec2</output>
		<input>
			<condition>
				<not>
					<property>/autopilot/autobrake/max-selected</property>
				</not>
			</condition> 
			<expression>
				<!-- values taken from http://www.pprune.org/tech-log/304333-a320-autoland-distance-autobrake-vs-manual-landing-distance-autobrake-2.html#post3809602 -->
				<table>
					<property>/autopilot/autobrake/step</property>
					<entry><ind>0</ind><dep>0</dep></entry>
					<entry><ind>1</ind><dep>5.6</dep></entry>
					<entry><ind>2</ind><dep>9.8</dep></entry>
				</table>
			</expression>
		</input>

		<input>
			<condition>
				<property>/autopilot/autobrake/max-selected</property>
			</condition>
			<!-- RTO setting applies max hydraulic pressure, simulate this
			  with a huge value here, to ensure the PI drives to 1.0 output -->
			<value>50</value>
		</input>
	</filter>
	
	<pi-simple-controller>
		<name>Brake Effort Computer</name>
		<debug>false</debug>
		<enable>
			<property>/autopilot/autobrake/engaged</property>
		</enable>
		<input><property>/autopilot/autobrake/actual-decel-ftsec2</property></input>
		<reference>/autopilot/autobrake/target-decel-ftsec2</reference>
		<output>/autopilot/autobrake/output-brake</output>
		<min>0.0</min>
		<max>1.0</max>
		
		<config>
			<Kp>1.0</Kp>
			<Ki>0.0</Ki>
		</config>
	</pi-simple-controller>
	
	<!-- left output summer -->
	<filter>
		<name>Left Output Summer</name>
		<type>gain</type>
		<gain>1.0</gain>
		
		<input>
			<condition>
				<property>/autopilot/autobrake/engaged</property>
			</condition>
			
			<expression>
				<max>
					<property>/controls/gear/brake-left</property>
					<property>/autopilot/autobrake/output-brake</property>
				</max>
			</expression>
		</input>
		<!-- default input -->
		<input>
			<property>/controls/gear/brake-left</property>
		</input>
		
		<output>/autopilot/autobrake/brake-left-output</output>
	</filter>
	
	<!-- right output summer -->
	<filter>
		<name>Right Output Summer</name>
		<type>gain</type>
		<gain>1.0</gain>
		
		<input>
			<condition>
				<property>/autopilot/autobrake/engaged</property>
			</condition>
			
			<expression>
				<max>
					<property>/controls/gear/brake-right</property>
					<property>/autopilot/autobrake/output-brake</property>
				</max>
			</expression>
		</input>
		<!-- default input -->
		<input>
			<property>/controls/gear/brake-right</property>
		</input>
		
		<output>/autopilot/autobrake/brake-right-output</output>
	</filter>
	
</PropertyList>
