

{init}
	(M.L.Doors_Init)

	0 (S.L.Fahrschalter)
	0 (S.L.Schaltwerk_Stufe)
	0 (S.L.E-bremse)
	0 (S.L.soundlock_anfahren)
	1 (S.L.soundlock_anhalten)
	0 (S.L.Brakeforce)
	0 (S.L.M_Wheel)

	(M.L.IBIS_init)
	(M.L.Matrix_init)
	(M.L.wiper_init)

'E-Kupplungen aktivieren:

	1 (S.L.E-Kupplung_Front) (S.L.E-Kupplung_KK)

{end}

{frame}

	(M.L.Doors_Frame)
	(M.L.Rollband_Frame)
	(M.L.rain_frame)
	(M.L.dirt_frame)
	(M.L.IBIS_frame)
	(M.L.Matrix_frame)
	(M.L.tacho_frame)
	(M.L.wiper_frame)

	(L.L.AI)
	{if}
		(M.L.ai_frame)
	{endif}

'#########################################
'	Spannungsversorgung und Abrissfunken:
'#########################################

'Prüfen, ob ein Spannungsabfall am Stromabnehmer vorliegt. Falls ja, dann Abrissfunke!

(L.L.Prev_volt_veh_R) (L.L.contactshoe_0_volt_veh) s0 - 750 / 0 max (S.L.Abrissfunke_R)
(L.L.Prev_volt_veh_L) (L.L.contactshoe_1_volt_veh) s1 - 750 / 0 max (S.L.Abrissfunke_L)

'Wenn das der letzte Kontakt war und eingeschaltet war, dann richtig doll!

(L.L.PrePrev_volt_veh_R) (L.L.CCR_750V) - 750 / 5 * (L.L.Schaltwerk_Stufe) (C.L.Schaltwerk_Stufenzahl) / * (L.L.Schaltwerk_Trennschuetz) * (L.L.Abrissfunke_R) max (S.L.Abrissfunke_R)
(L.L.PrePrev_volt_veh_L) (L.L.CCR_750V) - 750 / 5 * (L.L.Schaltwerk_Stufe) (C.L.Schaltwerk_Stufenzahl) / * (L.L.Schaltwerk_Trennschuetz) * (L.L.Abrissfunke_L) max (S.L.Abrissfunke_L)

'Alte Werte speichern:

(L.L.Prev_volt_veh_R) (S.L.PrePrev_volt_veh_R)
(L.L.Prev_volt_veh_L) (S.L.PrePrev_volt_veh_L)

l0 (S.L.Prev_volt_veh_R)
l1 (S.L.Prev_volt_veh_L)

'750-Volt-Leitung versorgen:

l0 l1 max (S.L.CCW_750V)



(L.L.Prev_thirdrail_index_R) (L.L.contactshoe_0_rail_index) = !
(L.L.Prev_thirdrail_index_L) (L.L.contactshoe_1_rail_index) = ! ||
{if}
	(L.L.Velocity) abs 45 >
	{if}
		"auflauf_schnell.wav"
	{else}
		"auflauf_langsam.wav"
	{endif}
	(T.F.ev_contactshoe)
{endif}

(L.L.contactshoe_0_rail_index) (S.L.Prev_thirdrail_index_R)
(L.L.contactshoe_1_rail_index) (S.L.Prev_thirdrail_index_L)


'#########################################
'	Fahrschalter
'#########################################

'Setzen des Fahrschalters als Schmidt-Trigger, abhängig von der Geschwindigkeit:

	(L.L.Velocity) abs 20 >
	(L.L.Throttle) s0 0.5 > &&
	l0 0.8 > ||
	{if}
		1 (S.L.Fahrschalter)
	{endif}
	l0 0.1 <
	{if}
		0 (S.L.Fahrschalter)
	{endif}


'Setzen des Trennschuetzes (binär):
	(L.L.Fahrschalter)
	(L.L.CCR_750V) 0 =
'ENTWEDER es liegt Spannung an, ODER es ist ein KI-Zug - der darf immer fahren können! ;)
	(L.L.AI) || &&
	(L.L.AI_Engine) (L.L.AI) ! || &&
	(S.L.CCW_THR_forward)
	(L.L.CCR_THR_forward)
	(L.L.CCR_THR_back) ||
	(S.L.Schaltwerk_Trennschuetz) s0 


'#########################################
'	Schaltwerk und Trennschütz:
'#########################################


'Wenn Trennschuetz aktiv:
	l0
	{if}
'Schaltwerk auf 1 setzen:
		(L.L.Schaltwerk_Stufe) 0.5 <
		(L.L.Schaltwerk_Schaltzeit) 0 < &&
		{if}
			1 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Trennschuetz_ein)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
'Schaltwerk weiterschalten lassen, wenn Geschwindigkeit erreicht:
		(L.L.Schaltwerk_Stufe) 1 + s1 (F.L.Schaltwerk_Stufe_vmin) (L.L.Velocity) abs <
		(L.L.Schaltwerk_Stufe) (C.L.Schaltwerk_Stufenzahl) < &&
		(L.L.Schaltwerk_Schaltzeit) 0 < &&
		{if}
			l1 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Schaltwerk)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
	{else}
		(L.L.Schaltwerk_Stufe) 0.5 >
		{if}
			0 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Trennschuetz_aus)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
	{endif}

'Schaltzeit verkleinern:
	
	(L.L.Schaltwerk_Schaltzeit) s0 0 >=
	{if}
		l0 (L.S.Timegap) - (S.L.Schaltwerk_Schaltzeit)
	{endif}

'#########################################
'	Traktion:
'#########################################

'Richtungswender:
	(L.L.CCR_THR_back) -2 * 1 + s1

	(L.L.Schaltwerk_Trennschuetz)
	{if}
		1 (L.L.Velocity) abs (C.L.AI_v_max_erreich) (L.L.Schaltwerk_Stufe) * (C.L.Schaltwerk_Stufenzahl) /  / - 0 max (S.L.relMoment) l1 * (C.L.AI_M_gas_max) * (S.L.traction_setvalue)
	{else}
		0 (S.L.traction_setvalue) (S.L.relMoment)
	{endif}

'Gedämpftes Ein- und Ausschalten:

(L.L.traction_setvalue) s0
(L.L.M_Wheel) s1
(C.L.traction_inc_rate) s2
(C.L.traction_dec_rate) s3
(M.L.linear)
(S.L.M_Wheel)

'#########################################
'	Bremskraft:
'#########################################



	(L.L.Brake) s1


	(L.L.CCW_Bremse) s0 0.5 <
	{if}

'Bremsstufe 0:

		l1 0.1 >
		{if}
			1 (S.L.CCW_Bremse)
		{endif}

	{else}
		l0 1.5 <
		{if}

'Bremsstufe 1:

			l1 0.3 >
			{if}
				2 (S.L.CCW_Bremse)
			{else}
				l1 0.001 <
				{if}
					0 (S.L.CCW_Bremse)
				{endif}
			{endif}


		{else}
			l0 2.5 <
			{if}


'Bremsstufe 2:

				l1 0.4 >
				{if}
					3 (S.L.CCW_Bremse)
				{else}
					l1 0.15 <
					{if}
						1 (S.L.CCW_Bremse)
					{endif}
				{endif}



			{else}
				l0 3.5 <
				{if}


'Bremsstufe 3:


					l1 0.5 >
					{if}
						4 (S.L.CCW_Bremse)
					{else}
						l1 0.33 <
						{if}
							2 (S.L.CCW_Bremse)
						{endif}
					{endif}




				{else}

'Bremsstufe 4:


					l1 0.5 <
					{if}
						3 (S.L.CCW_Bremse)
					{endif}

		
				{endif}
			{endif}
		{endif}
	{endif}




'	(L.L.Brake) s0 0.1 <
'	{if}
'		0 (S.L.CCW_Bremse)
'	{else}
'		l0 0.3 <
'		{if}
'			1 (S.L.CCW_Bremse)
'		{else}
'			l0 0.5 <
'			{if}
'				2 (S.L.CCW_Bremse)
'			{else}
'				l0 0.7 <
'				{if}
'					3 (S.L.CCW_Bremse)
'				{else}
'					4 (S.L.CCW_Bremse)
'				{endif}
'			{endif}
'		{endif}
'	{endif}

		

		



'Abrissfunken-Test beim E-Bremsen:
'
'	0 (S.L.Abrissfunke)
'		
	(L.L.CCR_Bremse) 0.01 >
	(L.L.E-Bremse) ! &&
	(L.L.Velocity) abs 1 > &&
	{if}
			(T.L.ev_e-bremse_ein)
			1 (S.L.E-Bremse)
'			1 (S.L.Abrissfunke)
	{endif}


	(L.L.CCR_Bremse) 0.01 <
	(L.L.Velocity) 0 = ||
	(L.L.E-Bremse) &&
	{if}
			(T.L.ev_e-bremse_aus)
			0 (S.L.E-Bremse)
'			1 (S.L.Abrissfunke)
	{endif}


	(L.L.Velocity) abs s1

	(L.L.CCR_Bremse) s0 0.5 <
	{if}
		0 s2
	{else}
		l0 1.5 <
		{if}
			l1 (F.L.Bremskraft_E1) s2
		{else}
			l0 2.5 <
			{if}
				l1 (F.L.Bremskraft_E2) s2
			{else}
				l0 3.5 <
				{if}
					l1 (F.L.Bremskraft_E3) s2
				{else}
					l1 (F.L.Bremskraft_E3) s2
				{endif}
			{endif}
		{endif}
	{endif}


	l2 0.7 * (S.L.brake_setvalue)


'Gedämpftes Anlegen und Lösen:

(L.L.brake_setvalue) s0
(L.L.brakeforce_script) s1
(C.L.brake_inc_rate) s2
(C.L.brake_dec_rate) s3
(M.L.linear)
(S.L.brakeforce_script) (S.L.brakeforce)


'#########################################
'	Just for the ultimate sound:
'#########################################


	(L.L.Velocity) abs 1 >
	{if}
		(L.L.soundlock_anfahren) ! 
		{if}
			(T.L.ev_anfahren)
			1 (S.L.soundlock_anfahren)
		{endif}
	{else}
		0 (S.L.soundlock_anfahren)
	{endif}

	(L.L.Velocity) abs 10 <
	{if}
		(L.L.soundlock_anhalten) ! 
		{if}
			(T.L.ev_anhalten)
			1 (S.L.soundlock_anhalten)
		{endif}
	{else}
		0 (S.L.soundlock_anhalten)
	{endif}

'#########################################
'	Kurvenquietschen
'#########################################

	(L.S.timegap) -1 * exp
	(L.L.rad_am_limit_traege) *
	(L.L.boogie_0_wheel_at_limit) abs 0.95 > (L.L.boogie_0_invradius) abs 0.003 / * max
	(L.L.boogie_1_wheel_at_limit) abs 0.95 > (L.L.boogie_1_invradius) abs 0.003 / * max
	(S.L.rad_am_limit_traege)

'#########################################
'	Debug:
'#########################################

	(L.L.M_Wheel) (S.L.Debug_0)
	(L.L.Brakeforce) (S.L.Debug_1)
	(L.L.brake_setvalue) (S.L.Debug_2)




{end}

{macro:tacho_frame}
	(L.L.Velocity) (F.L.cockpit_tacholinie) (S.L.cockpit_tachowinkel)
{end}

{trigger:railbond_0}
	(T.L.ev_railbond_a)
{end}

{trigger:railbond_1}
	(T.L.ev_railbond_a)
{end}

{trigger:railbond_2}
	(T.L.ev_railbond_b)
{end}

{trigger:railbond_3}
	(T.L.ev_railbond_b)
{end}

{trigger:elec_busbar_main_sw}
    (L.L.elec_busbar_main) ! (S.L.elec_busbar_main)
    (L.L.elec_busbar_main) (S.L.elec_busbar_main_sw)
    (L.L.elec_busbar_main) (S.L.elec_V_battery)
{end}

{trigger:horn}
	
		(L.L.cockpit_hupe) ! (L.L.elec_busbar_main) (C.L.elec_busbar_minV) > &&
		{if}
			(T.L.ev_hupe_an)
		{endif}
		1 (S.L.cockpit_hupe)
	
{end}

{trigger:horn_off}	
	
		(L.L.cockpit_hupe) (L.L.elec_busbar_main) (C.L.elec_busbar_minV) > &&
		{if}
			(T.L.ev_hupe_aus)
		{endif}
		0 (S.L.cockpit_hupe)	
	
{end}

{trigger:cp_wischer_schnell_toggle}
	(L.L.cp_wischer_schnell_sw) ! (S.L.cp_wischer_schnell_sw) s1
	(M.L.kippschaltersound)
{end}

{trigger:kw_wipermode_up}
	(L.L.cp_wischer_einaus_sw) ! (S.L.cp_wischer_einaus_sw) s1
	{if}
		2 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode)
		2 3 / (S.L.cockpit_wischerhebel) (S.L.cockpit_wischer_drehschalter)
		(L.L.cp_wischer_intervall_sw) !
		{if}
			(T.L.ev_wischerhebel)
		{endif}
	{else}
		(L.L.cp_wischer_intervall_sw)
		{if}
			1 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode)
			1 3 / (S.L.cockpit_wischerhebel) 
			0 (S.L.cockpit_wischer_drehschalter)
		{else}
			0 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode) (S.L.cockpit_wischerhebel) 
			1 3 / (S.L.cockpit_wischer_drehschalter)
			(T.L.ev_wischerhebel)
		{endif}
	{endif}
	(C.L.wiper_lever) !
	{if}
		l1 (M.L.kippschaltersound)
	{endif}
{end}

{trigger:cp_wischer_intervall_toggle}
	(L.L.cp_wischer_intervall_sw) ! (S.L.cp_wischer_intervall_sw) s1
	(L.L.cp_wischer_einaus_sw) ! &&
	{if}
		1 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode)
		1 3 / (S.L.cockpit_wischerhebel) 
		0 (S.L.cockpit_wischer_drehschalter)
	{else}
		(L.L.cp_wischer_einaus_sw)
		{if}
			2 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode)
			2 3 / (S.L.cockpit_wischerhebel) (S.L.cockpit_wischer_drehschalter)
		{else}
			0 (S.L.cockpit_wischerhebel_mode) (S.L.cockpit_wischer_drehschalter_mode) (S.L.cockpit_wischerhebel)
			1 3 / (S.L.cockpit_wischer_drehschalter)
		{endif}

	{endif}
	(C.L.wiper_lever) !
	{if}
		l1 (M.L.kippschaltersound)
	{endif}
{end}

{trigger:cp_wischer_wascher_button}
	1 (S.L.cp_wischer_wascher_sw) s1
	(C.L.wiper_lever)
	{if}
		(T.L.ev_wischerhebel)
		1 (S.L.cockpit_wischerhebel_x)
	{else}
		l1 (M.L.kippschaltersound)
	{endif}
{end}

{trigger:cp_wischer_wascher_button_off}
	0 (S.L.cp_wischer_wascher_sw) s1
	(S.L.wiper_wascher_sw)
	(C.L.wiper_lever)
	{if}
		(T.L.ev_wischerhebel)
		0 (S.L.cockpit_wischerhebel_x)
	{else}
		l1 (M.L.kippschaltersound)
	{endif}
{end}

{macro:traegheit}

'Simuliert träges Verhalten (exponentiell)

'(c) Rüdiger Hülsmann, edited by Marcel Kuhnt

'Ladekonventionen:
'	Sollwert		l0
'	Istwert			l1
'	Konstante Anlauf	l2
'	Konstante Ablauf	l3

'Ausgabe:
'	neuer Istwert:		direkt
'	Ableitung:		l5

'Anlauf oder Auslauf?
	l0 l1 > 
	{if}
		l2 s4
	{else}
		l3 s4
	{endif}


'Sollwert:
	l0
'Istwert:
	l1
'Beschleunigung:
	- s4 * s5 (L.S.Timegap) *
'Addition zum Istwert:
	l1 + s1
{end}


{macro:linear}

'Simuliert linearen Anstieg der Istgröße nach Sollwert

'(c) Rüdiger Hülsmann

'Ladekonventionen:
'	Sollwert		l0
'	Istwert			l1
'	Konstante Anlauf	l2
'	Konstante Ablauf	l3

'Ausgabe:
'	neuer Istwert:		direkt

'Anlauf oder Auslauf?
	l0 l1 > 
	{if}
		l1 l2 (L.S.Timegap) * + l0 min s0
	{else}
		l1 l3 (L.S.Timegap) * - l0 max s0
	{endif}	
{end}


'...............................
'AI:

	(L.L.AI_Engine) 0.5 >
	(L.L.engine_on) 0.5 <
	(L.L.antrieb_getr_gangvorwahl) 4 = ! ||
	&&
	{if}
		0 (S.L.bremse_feststell_sw) (S.L.bremse_feststell)
		1 (S.L.engine_injection_on)
		400 (S.L.engine_n)
		4 (S.L.antrieb_getr_gangvorwahl)
		1 (S.L.engine_on)
	{endif}

	(L.L.AI_Engine) -0.5 <
	(L.L.engine_on) 0.5 >
	&&
	{if}
		0 (S.L.engine_on)
		0 (S.L.engine_injection_on)
		1 (S.L.bremse_feststell_sw) (S.L.bremse_feststell)
	{endif}





{end}

{trigger:cp_Fahrertuer_drag}

	1 (S.L.cp_fahrertuer_dragged)
	(L.L.cp_fahrertuer_pos) (S.L.cp_fahrertuer_lastpos)

	(L.S.mouse_x) 500 / (L.L.cp_fahrertuer_pos) + (S.L.cp_fahrertuer_pos) s0
	l0 0 <
	{if}
		0 (S.L.cp_fahrertuer_pos)		
	{endif}
	l0 1 >
	{if}
		1 (S.L.cp_fahrertuer_pos)
	{endif}

	(L.L.cp_fahrertuer_pos) (L.L.cp_fahrertuer_lastpos) - (L.S.Timegap) / (S.L.cp_fahrertuer_speed)
{end}


{trigger:cp_Fahrertuer_off}
	0 (S.L.cp_fahrertuer_dragged)
{end}

{trigger:cp_Innenraumtür_drag}

	1 (S.L.cp_Innenraumtür_dragged)
	(L.L.cp_Innenraumtür_pos) (S.L.cp_Innenraumtür_lastpos)

	(L.S.mouse_x) 500 / (L.L.cp_Innenraumtür_pos) + (S.L.cp_Innenraumtür_pos) s0
	l0 0 <
	{if}
		0 (S.L.cp_Innenraumtür_pos)		
	{endif}
	l0 1 >
	{if}
		1 (S.L.cp_Innenraumtür_pos)
	{endif}

	(L.L.cp_Innenraumtür_pos) (L.L.cp_Innenraumtür_lastpos) - (L.S.Timegap) / (S.L.cp_Innenraumtür_speed)
{end}


{trigger:cp_Innenraumtür_off}
	0 (S.L.cp_Innenraumtür_dragged)
{end}