'##############
'Getriebe-Script
'##############

'Voith DIWA 8XX.X Series Gearbox - 4-speed
'For MAN SD200 / MAN SD202

'(c) 2008-2010 Rüdiger Hülsmann
'(c) 2012-2014 Naphthalene@HKBF

'Script Version: 2
'Omsi release: 1.0

'Needs:
'- engine
'- bremse

'Revision History:
'			[----Revision history same as the very original Voith DIWA 3-speed gearbox script----]
'- Naphthalene@HKBF	27.03.2012	Auto-neutral allowed when parking brake applied (set via config file, for Voith DIWA.3/.3E gearboxes)
'- Naphthalene@HKBF	16.07.2012	Added 4th gear
'- Naphthalene@HKBF	10.08.2012	Function added: Gear holding to prevent rapid gear shifting
'					Slight bug-fix on retarder behaviour when gearbox version 4 is chosen
'- Naphthalene@HKBF	30.09.2012	Function added: SensoTop
'- Naphthalene@HKBF	02.12.2012	Function added: Anticipatory engine-braking, gear slipping adjustable via config file
'- Naphthalene@HKBF	05.03.2013	Auto-neutral allowed when either parking brake or brakes applied (set via config file, for Voith DIWA.5 gearboxes & .2 variants)
'- Naphthalene@HKBF	08.03.2013	Anticipatory engine-braking allowed to be turned off via config file
'				[---Version 1.0 released---]
'- Naphthalene@HKBF	21.04.2013	Gear shifting scripts adapted to the torque governor
'- Naphthalene@HKBF	30.04.2013	Differential-wandler script made dependent on gear ratios
'- Naphthalene@HKBF	15.06.2013	Anticipatory engine-braking algorithm changed to increase sensitivity
'- Naphthalene@HKBF	09.08.2013	SensoTop algorithm enhanced for more variations in gear shifting program
'- Naphthalene@HKBF	24.08.2013	Kick-down allowed to be disabled via config file
'- Naphthalene@HKBF	05.09.2013	Gear selector script debugged, allowing a max. of 6 buttons (1-2-3-D-N-R)
'- Naphthalene@HKBF	06.09.2013	Anticipatory engine-braking fine-tuned & made adjustable via config file
'					Reverse gear torque converter behaviour fine-tuned
'- Naphthalene@HKBF	30.09.2013	Gear shifting scripts related to torque governor simplified
'- Naphthalene@HKBF	22.10.2013	Selection of gears allowed only below 5 km/h with brakes applied, can be turned off via config file
'- Naphthalene@HKBF	01.11.2013	Further fine-tuning of anticipatory engine-braking
'- Naphthalene@HKBF	06.11.2013	Slight change to adapt to the throttle delay on down-shifting to 1st gear
'- Naphthalene@HKBF	09.11.2013	Added fail-safe mechanism of forced down-shifting when engine rpm is below 600 in 3rd & 4th gear,
'					to prevent engine from stopping due to holding 3rd/4th gear for a designated time before down-shifting
'					[---Version 1.4 released---]
'- Naphthalene@HKBF	08.02.2014	Re-worked auto-neutral to include further minor differences between DIWA.2, .3(E) & .5 gearboxes
'- Naphthalene@HKBF	17.02.2014	Fixed bug: Failure of 1st-person A.I. to engage in gears
'- Naphthalene@HKBF	05.03.2014	Fine-tuned retarder behaviour in D854(.2)G/D864G gearboxes
'- Naphthalene@HKBF	21.03.2014	Fixed bug: Wrong latency of auto-neutral activation in DIWA.3(E) gearboxes
'- Naphthalene@HKBF	07.06.2014	Prevention from up-shifting extended from retarder usage to:
'					1. not applying throttle, AND
'					2. throttling for less than a designated short period
'- Naphthalene@HKBF	01.07.2014	Re-wrote SensoTop algorithm, allowing continuous variation of shifting points according to vehicle acceleration
'- Naphthalene@HKBF	14.07.2014	Moved gear-dependent torque governor from engine script to here, and expanded to vary according to acceleration
'- Naphthalene@HKBF	21.07.2014	Fixed bug: gear_engaged_timer always reset to zero without braking
'- Naphthalene@HKBF	23.07.2014	Improved & corrected calculations for acceleration-dependent torque governor
'- Naphthalene@HKBF	13.08.2014	Further fine-tuning of acceleration-dependent torque governor
'- Naphthalene@HKBF	27.08.2014	Fine-tuned upshifting to 2nd gear for engaging the retarder

'----------------------
'	Init
'----------------------

{macro:antrieb_init}
	1 (S.L.antrieb_getr_gangwahl) (S.L.antrieb_getr_gangvorwahl)
	1 (S.L.antrieb_getr_aktugang)
	
	0 (S.L.antrieb_wandler_moment)
{end}

'----------------------
'	Frame
'----------------------

{macro:antrieb_frame}

'Berechnen der Abtriebsdrehzahl
	(L.L.Wheel_RotationSpeed_1_L) (L.L.Wheel_RotationSpeed_1_R) + 2 / (C.L.antrieb_i_achse) * (S.L.antrieb_n_kardanwelle)

'Engaging the gears - optional safety relay allowing gears to be engaged only when brakes are applied and speed < 5 kph

	(L.S.GetTime) (L.L.antrieb_getr_gangwahlzeitpunkt) - (C.L.antrieb_gangwahlzeit) >
	(L.L.antrieb_getr_gangvorwahl) (L.L.antrieb_getr_gangwahl) = ! &&
	(L.L.antrieb_failure_general) ! &&
	{if}
			
		(L.L.antrieb_getr_gangwahl) 1 =
		{if}
			(L.L.engine_on) 1 = 
			{if}
				(L.L.engine_n) (S.L.antrieb_rucksoundvol)
				(C.L.antrieb_kuppl_M_dn_min) (S.L.antrieb_schaltmoment_soll)

				(L.L.antrieb_getr_gangvorwahl) 1 >
				{if}
					(C.L.antrieb_gear_EngageOnlyWhenBrakesApplied) ! (L.L.AI) ||
					{if}
						(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd4) >
						{if}
							4 (S.L.antrieb_getr_aktugang)
							(T.L.ev_schaltruck)
						{else}
							(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd3) >
							{if}
								3 (S.L.antrieb_getr_aktugang)
								(T.L.ev_schaltruck)
							{else}
								(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd2) >
								{if}
									2 (S.L.antrieb_getr_aktugang)
									(T.L.ev_schaltruck)
								{else}
									1 (S.L.antrieb_getr_aktugang)
									(C.L.antrieb_getr_version) 3 = {if} 1 {else} 0 {endif} (S.L.antrieb_gear_engaged_timer)
									(T.L.ev_schaltruck)
								{endif}
							{endif}
						{endif}
						1 (S.L.antrieb_getr_ForwardGearEngaged)
					{else}
						(L.L.brake) 0.1 > (L.L.velocity) 5 < &&
						{if}
							1 (S.L.antrieb_getr_aktugang) (S.L.antrieb_getr_ForwardGearEngaged)
							(C.L.antrieb_getr_version) 3 = {if} 1 {else} 0 {endif} (S.L.antrieb_gear_engaged_timer)
							(T.L.ev_schaltruck)
						{else}
							0 (S.L.antrieb_getr_ForwardGearEngaged)
						{endif}
					{endif}
				{else}
					(C.L.antrieb_gear_EngageOnlyWhenBrakesApplied) ! (L.L.AI) ||
					{if}
						(L.L.velocity) 5 <
						{if}
							1 (S.L.antrieb_getr_aktugang)
							(C.L.antrieb_getr_version) 3 = {if} 1 {else} 0 {endif} (S.L.antrieb_gear_engaged_timer)
							(T.L.ev_schaltruck)
						{endif}
					{else}
						(L.L.brake) 0.1 > (L.L.velocity) 5 < &&
						{if}
							1 (S.L.antrieb_getr_aktugang)
							(C.L.antrieb_getr_version) 3 = {if} 1 {else} 0 {endif} (S.L.antrieb_gear_engaged_timer)
							(T.L.ev_schaltruck)
						{endif}
					{endif}
				{endif}
			{endif}
		{endif}	
		(L.L.antrieb_getr_gangvorwahl) (S.L.antrieb_getr_gangwahl)
	{endif}

'Gang rausnehmen, wenn Neutral angefordert

	(L.L.antrieb_getr_gangwahl) 1 =
	{if}
		0 (S.L.antrieb_getr_aktugang)
	{endif}

'Reverse only below 5 kph

	(L.L.antrieb_getr_gangvorwahl) 0 =
	(L.L.velocity) 5 >= &&
	{if}
		1 (S.L.antrieb_getr_gangwahl)
	{endif}







'Prüfen, ob Gang gewechselt wird - aber nur, wenn Getriebe heil ist:

	(L.L.antrieb_failure_general) !
	{if}
		(M.L.antrieb_getr_chkNxtGear)
	{endif}

'Berechnung des aktuellen Motordrehmoments:

	(M.L.engine_moment)



'Berechnung des dynamischen Schaltmoments

	(L.L.antrieb_getr_fest) !
	{if}
		(L.L.antrieb_schaltmoment) (L.S.Timegap) (C.L.antrieb_slippingconst) * + (L.L.antrieb_schaltmoment_soll) min (S.L.antrieb_schaltmoment)
	{endif}





'Fallunterscheidung, ob Getriebe reibt oder wandelt oder nicht:

	(L.L.antrieb_getr_fest)
	{if}

'#################################################################################
'	Berechnung der Beschleunigung des Antriebsstrangs (am Motorflansch)
'#################################################################################


		(L.L.n_Wheel) (L.L.antrieb_getr_ratio) * (L.L.engine_n) - 2 * pi * 60 / (L.S.Timegap) / 

'	Berechnung des Momentes am Motor durch Trägheit:

		(C.L.engine_J) * s0

'	Berechnung des vom Antriebsstrang durchgeleiteten Momentes

		l0 /-/ (L.L.engine_M) (L.L.engine_M_additional_load) - + s1


'	Wenn das Antriebsmoment zu gro?ist oder ein Wandlergang eingelegt wird, rutscht die Kupplung durch:

		l1 abs (L.L.antrieb_schaltmoment) > (L.L.antrieb_getr_gangwahl) 1 <= || (L.L.antrieb_getr_aktugang) 1 = || 


		{if}

			0 (S.L.antrieb_getr_fest)

		{else}

'		Setzen des Momentes

			l1 (S.L.antrieb_getr_M_an)


'		Berechnung des Getriebeabtriebmomentes:

			(L.L.antrieb_getr_M_an) (L.L.antrieb_getr_ratio) * (C.L.gear_efficiency) * (S.L.M_Wheel)

'		Drehzahl des Motors ergibt sich aus der Getriebeabtriebswelle:

			(L.L.antrieb_getr_ratio) (L.L.n_Wheel) * (S.L.engine_n)		
		{endif}


		0 (S.L.antrieb_wandler_moment)

	{else}

'#################################################################################
'	Bestimmen, ob Leerlauf ist...:
'#################################################################################

		(L.L.antrieb_getr_gangwahl) 1 = (L.L.antrieb_getr_aktugang) 0 = ||

		{if}

'		... Antriebs- und Getriebeantriebsmoment sind 0:
			0 (S.L.M_Wheel) (S.L.antrieb_getr_M_an)

			(M.L.engine_acceleration)
			0 (S.L.antrieb_wandler_moment)

'			Wenn Neutralgang beim Bremsen eingelegt wird
			(L.L.antrieb_getr_gangwahl) 1 =
			{if}
				0 (S.L.antrieb_retarder_wasrunning) (S.L.antrieb_gear_engaged_timer)
			{endif}

		{else}

'#################################################################################
'		Bestimmen, ob ein Wandlergang eingelegt ist...:
'#################################################################################

			(L.L.antrieb_getr_aktugang) 1 =
			{if}

				(L.L.antrieb_wandler_moment) abs (L.L.antrieb_getr_M_an) abs >
				{if}
					(L.L.antrieb_wandler_moment) 0 >
					{if}
						(L.L.antrieb_getr_M_an) (C.L.antrieb_wandler_fillrate) (L.S.Timegap) * + (S.L.antrieb_getr_M_an)
						(L.L.antrieb_wandler_moment) (L.L.antrieb_getr_M_an) <
						{if}
							(L.L.antrieb_wandler_moment) (S.L.antrieb_getr_M_an)
						{endif}
					{else}
						(L.L.antrieb_getr_M_an) (C.L.antrieb_wandler_fillrate) (L.S.Timegap) * - (S.L.antrieb_getr_M_an)
						(L.L.antrieb_wandler_moment) (L.L.antrieb_getr_M_an) >
						{if}
							(L.L.antrieb_wandler_moment) (S.L.antrieb_getr_M_an)
						{endif}
					{endif}
				{else}
					(L.L.antrieb_wandler_moment) (S.L.antrieb_getr_M_an)
				{endif}
	
			
			

'#################################################################################
'			Wandler Rückwärtsgang:
'#################################################################################

				(L.L.antrieb_getr_gangwahl) 0 =
				{if}
					(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_ratioGelenk) * 2 * (S.L.antrieb_getr_n_ab) /-/ (L.L.engine_n) / (S.L.antrieb_wandler_ny)



							

'					Berechnung des Motor-Antriebsmomentes

						(L.L.engine_n) 2 * 3.14 * 60 / (L.L.engine_n) 2 * 3.14 * 60 / * s1
						0.0042 (L.L.antrieb_wandler_ny) (F.L.antrieb_wandler_lambda) * l1 * (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (S.L.antrieb_wandler_moment)


'					Berechnung des Rad-Abtriebsmomentes
		
						(L.L.antrieb_wandler_ny) (F.L.antrieb_wandler_my_gearR) (L.L.antrieb_getr_M_an) * (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) * 0.9 * /-/ (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (C.L.gear_efficiency) * 
					 	(L.L.antrieb_n_kardanwelle) (F.L.antrieb_reverse_torque_reduction) *
						(S.L.M_Wheel)
					

'#################################################################################
'			Wandler Vorwärtsgang:	
'#################################################################################

				{else}
					(L.L.n_Wheel) (L.L.antrieb_getr_ratio) * (S.L.antrieb_getr_n_ab) (L.L.engine_n) / (S.L.antrieb_wandler_ny)

					(L.L.antrieb_wandler_ny) 1 <
					{if}		

'					Berechnung des Motor-Antriebsmomentes

						(L.L.engine_n) 2 * 3.14 * 60 / (L.L.engine_n) 2 * 3.14 * 60 / * s1
						0.0042 (L.L.antrieb_wandler_ny) (F.L.antrieb_wandler_lambda) * l1 * (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (S.L.antrieb_wandler_moment)


'					Berechnung des Rad-Abtriebsmomentes
		
						(L.L.antrieb_wandler_ny) (F.L.antrieb_wandler_my) (L.L.antrieb_getr_M_an) * (L.L.antrieb_getr_ratio) * 0.77 * (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (C.L.gear_efficiency) * (S.L.M_Wheel)
					{else}
	
'					Berechnung des Motor-Antriebsmomentes
			
						(L.L.engine_n) (L.L.antrieb_getr_n_ab) / (S.L.antrieb_wandler_ny_r)

						(L.L.engine_n) 2 * 3.14 * 60 / (L.L.engine_n) 2 * 3.14 * 60 / * s1
						0.0042 (L.L.antrieb_wandler_ny_r) (F.L.antrieb_wandler_lambda_r) * l1 * (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (S.L.antrieb_wandler_moment)


'					Berechnung des Rad-Abtriebsmomentes
		
						(L.L.antrieb_wandler_ny_r) (F.L.antrieb_wandler_my_r) (L.L.antrieb_getr_M_an) * (L.L.antrieb_getr_ratio) * 0.77 * (L.L.engine_n) (F.L.antrieb_wandler_lowrpmsoftness) * (C.L.gear_efficiency) * (S.L.M_Wheel)
					{endif}
				{endif}
		

'			Vergleich der Ein- und Ausgangsleistungen:
				(L.L.M_Wheel) (L.L.n_Wheel) * 3.14 * 30000 / (S.L.antrieb_gesamtleistung)
				(L.L.antrieb_gesamtleistung) (L.L.antrieb_motorleistung) / (S.L.antrieb_eta)

	
				(M.L.engine_acceleration)

			



'#################################################################################
'			Sonst ist ein normaler Gang eingelegt:
'#################################################################################

			{else}


'			Berechnung der Drehzahldifferenz:

				(L.L.antrieb_getr_ratio) (L.L.n_Wheel) * (L.L.engine_n) - s0



'			An dieser Stelle muss ggf. noch das unterschiedliche Kupplungsmoment eingesetzt werden:

				l0 0 <
				{if}
					(L.L.antrieb_schaltmoment)
				{else}
					(L.L.antrieb_schaltmoment) /-/
				{endif}
				(S.L.antrieb_getr_M_an)
				(L.L.antrieb_getr_ratio) *
				(C.L.gear_efficiency) * (S.L.M_Wheel)

				(M.L.engine_acceleration)

'			Prüfen, ob sich das Vorzeichen der Drehzahldifferenz umgekehrt hat:

				(L.L.antrieb_getr_ratio) (L.L.n_Wheel) * (L.L.engine_n) - l0 * 0 <= (L.L.engine_n) 560 > &&
				{if}
					(L.L.antrieb_getr_ratio) (L.L.n_Wheel) * (S.L.engine_n)
					(L.L.n_Wheel) (L.L.antrieb_getr_ratio) * (L.L.engine_n) - 2 * pi * 60 / (L.S.Timegap) / 

'					Berechnung des Momentes am Motor durch Trägheit:

					(C.L.engine_J) * s0

'					Berechnung des vom Antriebsstrang durchgeleiteten Momentes

					l0 /-/ (L.L.engine_M) (L.L.engine_M_additional_load) - + (S.L.antrieb_getr_M_an)


'					Berechnung des Getriebeabtriebmomentes:

					(L.L.antrieb_getr_M_an) abs (L.L.antrieb_schaltmoment) abs <
					{if}
						(L.L.antrieb_getr_M_an) (L.L.antrieb_getr_ratio) * (C.L.gear_efficiency) * (S.L.M_Wheel)
						1 (S.L.antrieb_getr_fest)
						(C.L.antrieb_kuppl_M_up_max) (S.L.antrieb_schaltmoment)
					{else}
						(L.L.antrieb_schaltmoment) /-/ (S.L.antrieb_getr_M_an) (L.L.antrieb_getr_ratio) * (C.L.gear_efficiency) * (S.L.M_Wheel)
					{endif}
					


				{endif}

				0 (S.L.antrieb_wandler_moment)

			{endif}
		{endif}

	{endif}







'#################################################################################
'	Retarder
'#################################################################################


	(L.L.brake) 0.01 >
	(L.L.antrieb_retarder_sw) &&
	(L.L.antrieb_retarder_sw_direkt) ||
	(L.L.antrieb_getr_gangwahl) 1 > &&
	(L.L.antrieb_getr_ForwardGearEngaged) &&
	(L.L.Throttle) 0.1 < &&
	(L.L.antrieb_n_kardanwelle) 0.1 > &&
	(L.L.antrieb_failure_general) ! &&
	(L.L.bremse_ABS_eingriff) ! &&
	{if}	

		(L.L.antrieb_retarder_armed) !
		{if}
			1 (S.L.antrieb_retarder_armed)
			0 (S.L.antrieb_retarder_armtime_elapsed)
		{endif}

'		Das Hochschalten aus dem 1. Gang (Antriebsstrang nicht fest eingekuppelt) zählt nicht zur Latenzzeit, solange also Armtime auf 0 halten:
		(L.L.antrieb_getr_fest) ! (L.L.antrieb_retarder) ! &&
		{if}
			0 (S.L.antrieb_retarder_armtime_elapsed)
		{endif}
	

		(L.L.antrieb_n_kardanwelle) (C.L.retarder_min_einschaltspeed) > (L.L.antrieb_retarder_armtime_elapsed) (C.L.antrieb_retarder_startdelay) > && (L.L.antrieb_retarder) ! && 
		{if}
			1 (S.L.antrieb_retarder)
			0 (S.L.antrieb_retarder_time_elapsed)
		{endif}


		(L.L.antrieb_retarder_sw_direkt) 
		{if}
			2 (S.L.antrieb_retarderstufe)
		{else}
			1 (S.L.antrieb_retarderstufe)
		{endif}

'Verhaltensweise des Retarders beim Erreichen der Drehzahluntergrenze im 2. Gang:

		(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd2) < 
		(L.L.antrieb_retarder) 1 = &&
		{if}
			(C.L.antrieb_getr_version) 2 = !
			{if}
				0 (S.L.antrieb_retarder) (S.L.antrieb_wendesatz)
				(L.L.engine_n) (S.L.antrieb_rucksoundvol)
				(T.L.ev_schaltruck)
			{else}
				0 (S.L.antrieb_getr_aktugang)
			{endif}
		{endif}
	

		(L.L.antrieb_retarder_armed)
		{if}
			(L.L.antrieb_retarder_armtime_elapsed) (L.S.Timegap) + (S.L.antrieb_retarder_armtime_elapsed)
			(L.L.antrieb_retarder_time_elapsed) (L.S.Timegap) + (S.L.antrieb_retarder_time_elapsed)
		{endif}

' Ausschalten des Retarders:

	{else}
		(L.L.antrieb_retarder) (L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd2) < &&
		{if}
			0 (S.L.antrieb_retarder_offtime) (S.L.antrieb_wendesatz)
			1 (S.L.antrieb_retarder_wasrunning)
		{endif}
		0 (S.L.antrieb_retarder) (S.L.antrieb_retarder_armed) (S.L.antrieb_retarder_armtime_elapsed) (S.L.antrieb_retarder_time_elapsed)	
	{endif}

'Umschaltverzögerung zwischen Bremsen und Traktion:

	(L.L.antrieb_retarder_wasrunning)
	{if}
		(L.L.antrieb_retarder_offtime) (L.S.Timegap) + (S.L.antrieb_retarder_offtime) 
		(C.L.antrieb_retarder_changetime) >
		(L.L.antrieb_getr_gangwahl) 1 > &&
		{if}
			(T.L.ev_retarder_aus)

'3424 soll hier laut rucken!
			(L.$.number) "3424" $=
			{if}
				900
			{else}
				(L.L.engine_n)
			{endif}
			(S.L.antrieb_rucksoundvol)
			(T.L.ev_schaltruck)
			1 (S.L.antrieb_getr_aktugang)
			0 (S.L.antrieb_retarder_wasrunning) (S.L.antrieb_gear_engaged_timer)
		{endif}
	{endif}

	

'Bremsmoment des Retarders:

	(L.L.antrieb_retarder) 1 =
	{if}
		(L.L.antrieb_retarderstufe) 1 =
		{if}
			(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_ratioGelenk) * 29.3 / (F.L.retarder_stufe1) 0.7 * (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) /-/ * (L.L.antrieb_retarder_time_elapsed) (F.L.retarder_fadein) * (S.L.antrieb_retardermoment) (L.L.M_Wheel) + (S.L.M_Wheel) 
		{else}
			(L.L.antrieb_retarderstufe) 2 =
			{if}
				(L.L.antrieb_retardermoment) (L.S.Timegap) 10000 * - s1
				(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_ratioGelenk) * 29.3 / (F.L.retarder_stufe2) 0.7 * (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) /-/ * (L.L.antrieb_retarder_time_elapsed) (F.L.retarder_fadein) * s2
				l1 l2 max (S.L.antrieb_retardermoment) (L.L.M_Wheel) + (S.L.M_Wheel)
			{else}
			(L.L.antrieb_retarderstufe) 3 =
			{if}	
				(L.L.antrieb_retardermoment) (L.S.Timegap) 10000 * - s1
				(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_ratioGelenk) * 29.3 / (F.L.retarder_stufe3) 0.7 * (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) /-/ * (L.L.antrieb_retarder_time_elapsed) (F.L.retarder_fadein) * s2
				l1 l2 max (S.L.antrieb_retardermoment) (L.L.M_Wheel) + (S.L.M_Wheel)
			{endif}
			{endif}
		{endif}
	{else}
'		Ausfaden der Retarder-Bremsstärke
		(L.L.antrieb_retardermoment) (L.S.Timegap) 10000 * + 0 min (S.L.antrieb_retardermoment) (L.L.M_Wheel) + (S.L.M_Wheel)
		(L.L.antrieb_retarder_volume) (L.S.Timegap) 2 * - 0 max (S.L.antrieb_retarder_volume) s0
		l0 0 =
		{if}
			0 (S.L.antrieb_wendesatz)
		{endif}
	
	{endif}



'#################################################################################
'	Automatische Neutralschaltung bei Stillstand
'#################################################################################

(C.L.antrieb_getr_version) 1 >
{if}
	(L.L.antrieb_gear_engaged_timer) (L.S.Timegap) + (S.L.antrieb_gear_engaged_timer)
	
	(L.L.antrieb_n_kardanwelle) (C.L.antrieb_neutral_maxspeed) <
	(L.L.antrieb_getr_gangwahl) 1 > &&
	(L.L.antrieb_getr_ForwardGearEngaged) &&
	(L.L.antrieb_retarder) ! &&
	(L.L.antrieb_retarder_wasrunning) ! &&	
	{if}
		(C.L.antrieb_ANS_TriggeredWithBrakesApplied) (L.L.bremse_p_Brzyl_HA) (C.L.antrieb_neutral_brakepressure) > &&
		(C.L.antrieb_ANS_TriggeredWithHandbrakeApplied) (L.L.bremse_feststell_sw) (L.L.Throttle) 0.1 < && && ||
		{if}
			(L.L.antrieb_neutral_requested) !
			{if}
				1 (S.L.antrieb_neutral_requested)

'The ANS latency is different in different generations of DIWA gearboxes.
'ANS latency in DIWA.2 gearboxes (version 2) is either absent or fixed at the designated latency period.
'It is always present in DIWA.3(E) (version 3), but is 1 sec. shorter if a forward gear (1/2/3/D) is just selected.
'In DIWA.5 (version 4), ANS is triggered whenever the designated latency period is expired (= no need to reset latency timer).

				(C.L.antrieb_getr_version) 2 = (L.L.antrieb_gear_engaged_timer) (C.L.antrieb_ANS_latency) < &&
				{if}
					0 (S.L.antrieb_gear_engaged_timer)
				{else}
					(C.L.antrieb_getr_version) 3 =
					{if}
						(L.L.antrieb_ANS_latency_IncrByOneSec) {if} 0 {else} 1 {endif} (S.L.antrieb_gear_engaged_timer)
					{endif}
				{endif}
			{endif}
			(L.L.antrieb_neutral_requested)
			(L.L.antrieb_gear_engaged_timer) (C.L.antrieb_ANS_latency) >= &&
			{if}
				0 (S.L.antrieb_getr_aktugang)
			{endif}

		{else}		
			1 (S.L.antrieb_getr_aktugang)
			(L.L.antrieb_neutral_requested) (L.L.bremse_feststell_sw) ||
			{if}
				0 (S.L.antrieb_neutral_requested) (S.L.antrieb_gear_engaged_timer)
			{endif}
			(C.L.antrieb_getr_version) 3 =
			{if}
				(C.L.antrieb_ANS_TriggeredWithBrakesApplied) (L.L.bremse_p_Brzyl_HA) (C.L.antrieb_neutral_brakepressure) <= &&
				(C.L.antrieb_ANS_TriggeredWithHandbrakeApplied) (L.L.bremse_feststell_sw) ! && ||
				{if} 1 {else} 0 {endif} (S.L.antrieb_ANS_latency_IncrByOneSec)
			{endif}
		{endif}
	{endif}
{endif}



'#################################################################################
'	Planetengetriebe-Wendesatz (Fj?Sound)
'#################################################################################
	
	(L.L.antrieb_retarder)  
	(L.L.antrieb_getr_gangwahl) 0 = ||
	{if}
		1 (S.L.antrieb_wendesatz) (S.L.antrieb_retarder_volume)
'		Rücksetzen auf 0 erfolgt beim Fadeout des Retarderbremsmoments
	{endif}
{end}



'#################################################################################
'	Bestimmung der Schaltgeschwindigkeiten
'#################################################################################

{macro:antrieb_getr_chkNxtGear}

'	Höchster Gang: s0!

'	Verzögerung der Kickdown-Schaltung:

	(L.L.throttle) 1 =
	(C.L.antrieb_kickdown_on) &&
	{if}
		(L.L.antrieb_kickdown_stellglied) (L.S.Timegap) 2 * + 1 min (S.L.antrieb_kickdown_stellglied)
		1 =
		{if}
			1 (S.L.antrieb_kickdown)
		{endif}
	{else}
		(L.L.antrieb_kickdown_stellglied) (L.S.Timegap) 1 * - 0 max (S.L.antrieb_kickdown_stellglied)
		0 =
		{if}
			0 (S.L.antrieb_kickdown)
		{endif}
	{endif}

'	Verzögerung der gaspedalabhängigen Schaltschwelle:

	
	(L.L.throttle) (L.L.antrieb_throttle_stellglied) >
	{if}
		(L.L.antrieb_throttle_stellglied) (L.S.Timegap) 1 * + (L.L.throttle) min (S.L.antrieb_throttle_stellglied)
	{else}
		(L.L.antrieb_throttle_stellglied) (L.S.Timegap) 0.5 * - (L.L.throttle) max (S.L.antrieb_throttle_stellglied)
	{endif}
	
'	Berechnen der aktuellen Beschleunigung:
	
	(L.L.Velocity) (L.L.antrieb_last_geschwindigkeit) - 3.6 / (L.S.Timegap) / (S.L.antrieb_beschleunigung)
	(L.L.Velocity) (S.L.antrieb_last_geschwindigkeit)
	
'	Variation of torque governor ratio according to acceleration:

	(C.L.antrieb_getr_sensotop_on) (L.L.antrieb_getr_aktugang) 0 > &&
	{if}
		(L.L.antrieb_beschleunigung) (L.L.Throttle) (F.L.antrieb_getr_TargetAcc) <
		{if}
			(L.L.antrieb_TorqGov_ActualRatio) (L.S.Timegap) 0.05 * + 1 min (S.L.antrieb_TorqGov_ActualRatio)
		{else}
			(L.L.antrieb_TorqGov_ActualRatio) (L.S.Timegap) 0.2 * - (L.L.antrieb_getr_aktugang) (F.L.antrieb_getr_TorqGov_ratio) max (S.L.antrieb_TorqGov_ActualRatio)
		{endif}
	{else}
		(L.L.antrieb_getr_aktugang) (F.L.antrieb_getr_TorqGov_ratio) (S.L.antrieb_TorqGov_ActualRatio)
	{endif}


	(L.L.antrieb_getr_gangwahl) 0 =
	{if}
		
	{else}
		(L.L.antrieb_getr_gangwahl) 1 =
		{if}
			
		{else}
			(L.L.antrieb_getr_gangwahl) 2 =
			{if}
				(L.L.antrieb_retarder_armed) 0 =
				{if}
					1 s0
				{else}
					2 s0
				{endif}
			{else}
				(L.L.antrieb_getr_gangwahl) 3 =
				{if}
					2 s0
				{else}
					(L.L.antrieb_getr_gangwahl) 4 =
					{if}
						3 s0
					{else}
						4 s0
					{endif}
				{endif}
			{endif}


			(L.L.antrieb_getr_aktugang) s1

			1 =
			{if}
				(C.L.antrieb_getr_ratio1) (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) * (S.L.antrieb_getr_ratio)
				(L.L.antrieb_kickdown)
				{if}
					(C.L.antrieb_getr_autoSwUpkickdnSpd1) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwUpMinSpd1) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwUpkickdnSpd1) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwUpMaxSpd1) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_upshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_upshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwUpMaxSpd1Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwUpMaxSpd1) s3
						{endif}
					{endif}
				{endif}
		
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) < l0 2 >= && (L.L.antrieb_beschleunigung) 0 > &&
				{if}
					2 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_up_max) s6
					(C.L.antrieb_kuppl_M_up_min) s7
					(M.L.antrieb_getr_schaltmoment) (S.L.antrieb_schaltmoment_soll)	(S.L.antrieb_schaltmoment)
					0 (S.L.antrieb_getr_gearholdtimer)
					(T.L.ev_gear_upshift2)
				{endif}

				(L.L.antrieb_getr_aktugang) 1 = 
				(L.L.antrieb_getr_gangwahl) 1 > &&
				(L.L.antrieb_retarder_armed) 1 = &&
				(L.L.antrieb_n_kardanwelle) (C.L.retarder_min_einschaltspeed) > &&
				{if}
					2 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_up_min) (S.L.antrieb_schaltmoment_soll) (S.L.antrieb_schaltmoment)
					0 (S.L.antrieb_getr_gearholdtimer)
				{endif}
				
			{endif}
			l1 2 =
			{if}
				(C.L.antrieb_getr_ratio2) (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) * (S.L.antrieb_getr_ratio)
				(L.L.antrieb_getr_gearholdtimer) (L.S.Timegap) + (S.L.antrieb_getr_gearholdtimer)
				(L.L.antrieb_kickdown)
				{if}
					(C.L.antrieb_getr_autoSwUpkickdnSpd2) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwUpMinSpd2) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwUpkickdnSpd2) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwUpMaxSpd2) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_upshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_upshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwUpMaxSpd2Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwUpMaxSpd2) s3
						{endif}
					{endif}
				{endif}
				(C.L.antrieb_getr_enginebrake_on) ! (L.L.engine_throttle_timer2) (C.L.antrieb_throttle_MinTimeForUpshift) > ||
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) < && l0 3 >= && (L.L.antrieb_beschleunigung) 0 > &&
				(L.L.antrieb_getr_gearholdtimer) (C.L.antrieb_getr_gearholdmintime) >= &&
				{if}
					3 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_up_max) s6
					(C.L.antrieb_kuppl_M_up_min) s7
					(M.L.antrieb_getr_schaltmoment) (S.L.antrieb_schaltmoment_soll)	(S.L.antrieb_schaltmoment)
					0 (S.L.antrieb_getr_gearholdtimer)
					(T.L.ev_gear_upshift3)			
				{endif}
				(L.L.antrieb_kickdown) l0 1 = ||
				{if}
					(C.L.antrieb_getr_autoSwDnkickdnSpd2) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwDnMinSpd2) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwDnMaxSpd2Pwr) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwDnMaxSpd2) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_downshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_downshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwDnMaxSpd2Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwDnMaxSpd2) s3
						{endif}
					{endif}
				{endif}
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) > (L.L.antrieb_retarder_armed) ! &&
				(L.L.antrieb_n_kardanwelle) (C.L.antrieb_getr_autoSwDnMinSpd2) < ||
				{if}
					1 (S.L.antrieb_getr_aktugang) (S.L.antrieb_getr_SwDn2to1)
					0 (S.L.antrieb_schaltmoment)
				{endif}
			{endif}
			l1 3 =
			{if}
				(C.L.antrieb_getr_ratio3) (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) * (S.L.antrieb_getr_ratio)
				(L.L.antrieb_getr_gearholdtimer) (L.S.Timegap) + (S.L.antrieb_getr_gearholdtimer)
				(L.L.antrieb_kickdown)
				{if}
					(C.L.antrieb_getr_autoSwUpkickdnSpd3) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwUpMinSpd3) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwUpkickdnSpd3) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwUpMaxSpd3) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_upshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_upshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwUpMaxSpd3Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwUpMaxSpd3) s3
						{endif}
					{endif}
				{endif}
				(C.L.antrieb_getr_enginebrake_on) ! (L.L.engine_throttle_timer2) (C.L.antrieb_throttle_MinTimeForUpshift) > ||
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) < && l0 3 >= && (L.L.antrieb_beschleunigung) 0 > &&
				(L.L.antrieb_getr_gearholdtimer) (C.L.antrieb_getr_gearholdmintime) >= &&
				{if}
					4 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_up_max) s6
					(C.L.antrieb_kuppl_M_up_min) s7
					(M.L.antrieb_getr_schaltmoment) (S.L.antrieb_schaltmoment_soll)	(S.L.antrieb_schaltmoment)
					0 (S.L.antrieb_getr_gearholdtimer)
					(T.L.ev_gear_upshift3)			
				{endif}
				(C.L.antrieb_getr_enginebrake_on) (L.L.antrieb_retarder_armtime_elapsed) (C.L.antrieb_getr_enginebrake_timelag) > &&
				(L.L.brake) (F.L.antrieb_getr_enginebraking_acc_thres) (L.L.antrieb_beschleunigung) < &&
				(L.L.antrieb_kickdown) || l0 2 <= ||
				{if}
					(C.L.antrieb_getr_autoSwDnkickdnSpd3) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwDnMinSpd3) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwDnMaxSpd3Pwr) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwDnMaxSpd3) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_downshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_downshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwDnMaxSpd3Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwDnMaxSpd3) s3
						{endif}
					{endif}
				{endif}
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) >
				(L.L.antrieb_getr_gearholdtimer) (C.L.antrieb_getr_gearholdmintime) >= &&
				(L.L.engine_n) 600 < ||
				{if}
					2 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_dn_max) s6
					(C.L.antrieb_kuppl_M_dn_min) s7
					(M.L.antrieb_getr_schaltmoment) (S.L.antrieb_schaltmoment_soll)
					0 (S.L.antrieb_schaltmoment)
					0 (S.L.antrieb_getr_gearholdtimer)
					(T.L.ev_gear_downshift2)
				{endif}
			{endif}
			l1 4 =
			{if}
				(C.L.antrieb_getr_ratio4) (C.L.antrieb_getr_ratioGelenk) * (C.L.antrieb_i_achse) * (S.L.antrieb_getr_ratio)
				(L.L.antrieb_getr_gearholdtimer) (L.S.Timegap) + (S.L.antrieb_getr_gearholdtimer)

				(C.L.antrieb_getr_enginebrake_on) (L.L.antrieb_retarder_armtime_elapsed) (C.L.antrieb_getr_enginebrake_timelag) > && 
				(L.L.brake) (F.L.antrieb_getr_enginebraking_acc_thres) (L.L.antrieb_beschleunigung) < &&
				(L.L.antrieb_kickdown) || l0 2 <= ||
				{if}
					(C.L.antrieb_getr_autoSwDnkickdnSpd4) s3 s4
				{else}
					(C.L.antrieb_getr_autoSwDnMinSpd4) s4
					(C.L.antrieb_getr_sensotop_on)
					{if}
						(C.L.antrieb_getr_autoSwDnMaxSpd4Pwr) (S.L.antrieb_sensotop_MaxPwr_n)
						(C.L.antrieb_getr_autoSwDnMaxSpd4) (S.L.antrieb_sensotop_MaxEco_n)
						(M.L.antrieb_sensotop_calc_downshift)
					{else}
						(L.L.Throttle) (F.L.antrieb_getr_acc_thres_downshift) (L.L.antrieb_beschleunigung) >
						{if}
							(C.L.antrieb_getr_autoSwDnMaxSpd4Pwr) s3
						{else}
							(C.L.antrieb_getr_autoSwDnMaxSpd4) s3
						{endif}
					{endif}
				{endif}
				(M.L.antrieb_getr_chkCh) (L.L.antrieb_n_kardanwelle) >
				(L.L.antrieb_getr_gearholdtimer) (C.L.antrieb_getr_gearholdmintime) >= &&
				(L.L.engine_n) 600 < ||
				{if}
					3 (S.L.antrieb_getr_aktugang)
					(C.L.antrieb_kuppl_M_dn_max) s6
					(C.L.antrieb_kuppl_M_dn_min) s7
					(M.L.antrieb_getr_schaltmoment) (S.L.antrieb_schaltmoment_soll)
					0 (S.L.antrieb_schaltmoment)
					(C.L.antrieb_getr_enginebrake_on) (L.L.antrieb_retarder_armtime_elapsed) (C.L.antrieb_getr_enginebrake_timelag) > &&
					(L.L.brake) (F.L.antrieb_getr_enginebraking_acc_thres) (L.L.antrieb_beschleunigung) < &&
					{if}
						1.5 /-/
					{else}
						0 
					{endif}
					(S.L.antrieb_getr_gearholdtimer)
					(T.L.ev_gear_downshift2)
				{endif}
			{endif}


		{endif}
	{endif}


'	Testweise: Differenzialdrehzahlpfeifen

	(L.L.engine_n) (L.L.antrieb_n_kardanwelle) 2 * - (S.L.antrieb_n_differenz)





{end}

{macro:antrieb_getr_chkCh}
'	Berechnung der aktuellen Hochschaltschwelle: (l3 = bei Vollgas, l4 = bei Leergas)
	(L.L.antrieb_throttle_stellglied) s2 l3 * 1 l2 - l4 * +
{end}

{macro:antrieb_getr_schaltmoment}
'	Berechnung des Schaltmomentes (l6 = bei Vollgas, l7 = bei Leergas)
	(L.L.engine_throttle_injection) s5 l6 * 1 l5 - l7 * +
{end}

{macro:antrieb_sensotop_calc_upshift}
	(L.L.Throttle) (F.L.antrieb_getr_acc_thres2_upshift) s5
	(L.L.Throttle) (F.L.antrieb_getr_acc_thres_upshift) s6 l5 >
	{if}
		(L.L.antrieb_beschleunigung) l5 <
		{if}
			(L.L.antrieb_sensotop_MaxPwr_n) s3
		{else}
			(L.L.antrieb_beschleunigung) l6 >
			{if}
				(L.L.antrieb_sensotop_MaxEco_n) s3
			{else}
				(L.L.antrieb_beschleunigung) l5 - l6 l5 - / s7
				l7 (L.L.antrieb_sensotop_MaxEco_n) * 1 l7 - (L.L.antrieb_sensotop_MaxPwr_n) * + s3
			{endif}
		{endif}
	{else}
		(L.L.antrieb_sensotop_MaxEco_n) s3
	{endif}
{end}

{macro:antrieb_sensotop_calc_downshift}
	(L.L.Throttle) (F.L.antrieb_getr_acc_thres2_downshift) s5
	(L.L.Throttle) (F.L.antrieb_getr_acc_thres_downshift) s6 l5 >
	{if}
		(L.L.antrieb_beschleunigung) l5 <
		{if}
			(L.L.antrieb_sensotop_MaxPwr_n) s3
		{else}
			(L.L.antrieb_beschleunigung) l6 >
			{if}
				(L.L.antrieb_sensotop_MaxEco_n) s3
			{else}
				(L.L.antrieb_beschleunigung) l5 - l6 l5 - / s7
				l7 (L.L.antrieb_sensotop_MaxEco_n) * 1 l7 - (L.L.antrieb_sensotop_MaxPwr_n) * + s3
			{endif}
		{endif}
	{else}
		(L.L.antrieb_sensotop_MaxEco_n) s3
	{endif}
{end}
