SSU Development thread (4.0 to 5.0) [DEVELOPMENT HALTED DUE TIME REQUIREMENTS!]

Status
Not open for further replies.

mrozigor

Donator
Donator
Joined
May 14, 2010
Messages
24
Reaction score
0
Points
16
Location
Wrocław

Donamy

Addon Developer
Addon Developer
Donator
Beta Tester
Joined
Oct 16, 2007
Messages
6,917
Reaction score
211
Points
138
Location
Cape

Attachments

  • OMSpods directions.jpg
    OMSpods directions.jpg
    287.7 KB · Views: 184

DaveS

Addon Developer
Addon Developer
Donator
Beta Tester
Joined
Feb 4, 2008
Messages
9,434
Reaction score
689
Points
203

Donamy

Addon Developer
Addon Developer
Donator
Beta Tester
Joined
Oct 16, 2007
Messages
6,917
Reaction score
211
Points
138
Location
Cape
try moving the edge vertices away from the inner ones, to lose the distortion.
 

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Question about I-LOADs and timers: I see that a timer duration I-LOAD is referenced both in the step where the timer is started and in the step where it is checked. I also noticed that the I-LOADs have a "V97U9716C" name, so I'm wondering if the I-LOADs aren't actually "regular variables" that are changed during sw execution, instead of "read-only variables".
 

FordPrefect

Addon Developer
Addon Developer
Donator
Joined
Feb 7, 2008
Messages
407
Reaction score
41
Points
28
Hey SSU folks!

Given the advanced development state of the external SSU model, probably there are no plans to revise it as it is a hell of a lot of work, I know.
Still wanted to share with you this amazing CAD-model of a 3D scan of the Discovery orbiter, as it looks very accurate!

https://grabcad.com/library/nasa-space-shuttle-2
 

Urwumpe

Not funny anymore
Addon Developer
Donator
Joined
Feb 6, 2008
Messages
37,626
Reaction score
2,344
Points
203
Location
Wolfsburg
Preferred Pronouns
Sire
Question about I-LOADs and timers: I see that a timer duration I-LOAD is referenced both in the step where the timer is started and in the step where it is checked. I also noticed that the I-LOADs have a "V97U9716C" name, so I'm wondering if the I-LOADs aren't actually "regular variables" that are changed during sw execution, instead of "read-only variables".

Correct. I-LOADS are just initial loads, which means, the initial value of the variables is written on the magnetic tape during mission preparation. After loading the memory overlay into GPC memory (or DEU RAM), the variable behaves just like any other memory location. You CAN protect some memory regions by memory management. But that is really complex voodoo.
 

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Correct. I-LOADS are just initial loads, which means, the initial value of the variables is written on the magnetic tape during mission preparation. After loading the memory overlay into GPC memory (or DEU RAM), the variable behaves just like any other memory location. You CAN protect some memory regions by memory management. But that is really complex voodoo.

If they are just variables, then a timer could be done by adding the current time to them (which already have the timer duration from loading), and then we just compare with the current time to see when it is up. The problem with this issue is knowing if the timer is set or not... :facepalm:.
I guess I'm better off not re-inventing the wheel, so I'll keep the I-LOADs as consts and have a variable for each timer, initialize it at -1 and start it by adding current time to the I-LOAD duration.
 

Urwumpe

Not funny anymore
Addon Developer
Donator
Joined
Feb 6, 2008
Messages
37,626
Reaction score
2,344
Points
203
Location
Wolfsburg
Preferred Pronouns
Sire
If they are just variables, then a timer could be done by adding the current time to them (which already have the timer duration from loading), and then we just compare with the current time to see when it is up. The problem with this issue is knowing if the timer is set or not... :facepalm:.
I guess I'm better off not re-inventing the wheel, so I'll keep the I-LOADs as consts and have a variable for each timer, initialize it at -1 and start it by adding current time to the I-LOAD duration.

Usually, they are just changed by manual inputs or ground control uplinks. For example, it makes little sense to use the timer like that, if you plan to use the time again.

The 15 seconds for pressing EXEC to confirm a burn for example is an ILoad.
 
Last edited:

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Usually, they are just changed by manual inputs or ground control uplinks. For example, it makes little sense to use the timer like that, if you plan to use the time again.

The 15 seconds for pressing EXEC to confirm a burn for example is an ILoad.

Yes, that would mean the "original time" is lost, but we're still left with the question: why is the I-LOAD referenced both in the timer initialization and when it is checked for expiration? :shrug:
 

Urwumpe

Not funny anymore
Addon Developer
Donator
Joined
Feb 6, 2008
Messages
37,626
Reaction score
2,344
Points
203
Location
Wolfsburg
Preferred Pronouns
Sire
Yes, that would mean the "original time" is lost, but we're still left with the question: why is the I-LOAD referenced both in the timer initialization and when it is checked for expiration? :shrug:

No idea - unless the timer is reset.
 

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Well, here it is:
Code:
	void RSLS_old::OnPostStep( double simT, double dT, double mjd )
	{
		if (!Active) return;

		/*
		Steps from JSC-16936.
		Changes from diagram:
			- updated I-LOAD times
			- added 0.5s to the ENG_TIMER_FOR_THRUST_OK I-LOAD, to allow for low frame rates
			- updated PIC Arm and Fire commands: added Fire 1 to SSME > 90%, and Fire 2 and Fire 3 commands to PIC fire instant
			- changed step1 to handle sim start
			- "nulled" steps 14 (GLS command/checks), retained goto step15
			- "nulled" steps 17a (GLS command/checks), added goto step18
			- "nulled" steps 18 (GLS command/checks), added goto step19
			- added SSME start timer init in step 28, as it isn't indicated where it is initiated
			- added SRB ignition timer init in step 28, as it isn't indicated where it is initiated
			- added LOX PV timer init in step 30, 31 and 32, as it isn't indicated where it is initiated
		*/
		
	//step1:
		/*if (1st)
		{
			RSCountdownHold = true;
			goto step9;
		}
		else*/ if (CountdownClockCounting) goto step1a;
		else goto step9;

	step1a:
		if (T0UmbilicalReleased)
		{
			// TODO terminate:
			// t0 umb release fire 1&2&3 flags
			// srm ign arm flag
			// t0 umb release arm
			// event timer flag

			pMEC_SOP->SetMECMasterResetFlag();
			oapiWriteLog( "RSLS: MEC RESET" );
			Active = false;
			return;
		}
		else goto step1b;

	step1b:
		if (SRBIgnitionCommand)
		{
			// TODO terminate:
			// srm ign fire 1&2&3 flags

			// TODO issue:
			// t0 umb release fire 3 flag
			pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_T0_UMB_RELEASE_FIRE_2 );
			T0UmbilicalReleased = true;
			oapiWriteLog( "RSLS: T0 UMB FIRE 2" );
			return;
		}
		else goto step1c;

	step1c:
		if (LaunchSequenceAbort)
		{
			// TODO terminate:
			// srm ign arm flag
			// t0 umb release arm flag

			if (firstpass_step1c)
			{
				firstpass_step1c = false;
				// TODO issue (one time only)
				// srb rss safe flag
				pMEC_SOP->SetMECMasterResetFlag();
				oapiWriteLog( "RSLS: MEC RESET" );
			}
			goto step30;
		}
		else goto step1d;

	step1d:
		if (pSSME_SOP->GetShutdownEnableCommandIssuedFlag( 1 ))
		{
			pSSME_SOP->SetShutdownCommandFlag( 1 );
			LaunchSequenceAbort = true;
			goto step30;
		}
		else goto step1e;

	step1e:
		if (pSSME_SOP->GetShutdownEnableCommandIssuedFlag( 2 ))
		{
			pSSME_SOP->SetShutdownCommandFlag( 2 );
			LaunchSequenceAbort = true;
			goto step30;
		}
		else goto step1f;

	step1f:
		if (pSSME_SOP->GetShutdownEnableCommandIssuedFlag( 3 ))
		{
			pSSME_SOP->SetShutdownCommandFlag( 3 );
			LaunchSequenceAbort = true;
			goto step30;
		}
		else goto step2;

	step2:
		if (pSSME_SOP->GetPadDataPathFailureFlag( 1 ))
		{
			ME1PadDataPathFailHold = true;
			goto step2d;
		}
		else goto step2a;

	step2a:
		if (pSSME_SOP->GetElectricalLockupModeFlag( 1 ) || pSSME_SOP->GetHydraulicLockupModeFlag( 1 ) || pSSME_SOP->GetMajorComponentFailureFlag( 1 ))
		{
			ME1ControlFailHold = true;
			goto step2d;
		}
		else goto step2c;

	step2c:
		if (pSSME_SOP->GetChannelFailureFlag( 1 ))
		{
			ME1ControlFailHold = true;
			goto step2d;
		}
		else goto step3;

	step2d:
		if (EngStartCmdIssued)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag

			// TODO issue:
			// cmd ssmes to prestart pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}
		else
		{
			RSCountdownHold = true;
			goto step9;
		}

	step3:
		if (pSSME_SOP->GetPadDataPathFailureFlag( 2 ))
		{
			ME2PadDataPathFailHold = true;
			goto step3d;
		}
		else goto step3a;

	step3a:
		if (pSSME_SOP->GetElectricalLockupModeFlag( 2 ) || pSSME_SOP->GetHydraulicLockupModeFlag( 2 ) || pSSME_SOP->GetMajorComponentFailureFlag( 2 ))
		{
			ME2ControlFailHold = true;
			goto step3d;
		}
		else goto step3c;

	step3c:
		if (pSSME_SOP->GetChannelFailureFlag( 2 ))
		{
			ME2ControlFailHold = true;
			goto step3d;
		}
		else goto step4;

	step3d:
		if (EngStartCmdIssued)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag

			// TODO issue:
			// cmd ssmes to prestart pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 2 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}
		else
		{
			RSCountdownHold = true;
			goto step9;
		}

	step4:
		if (pSSME_SOP->GetPadDataPathFailureFlag( 3 ))
		{
			ME3PadDataPathFailHold = true;
			goto step4d;
		}
		else goto step4a;

	step4a:
		if (pSSME_SOP->GetElectricalLockupModeFlag( 3 ) || pSSME_SOP->GetHydraulicLockupModeFlag( 3 ) || pSSME_SOP->GetMajorComponentFailureFlag( 3 ))
		{
			ME3ControlFailHold = true;
			goto step4d;
		}
		else goto step4c;

	step4c:
		if (pSSME_SOP->GetChannelFailureFlag( 3 ))
		{
			ME3ControlFailHold = true;
			goto step4d;
		}
		else goto step5;

	step4d:
		if (EngStartCmdIssued)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag

			// TODO issue:
			// cmd ssmes to prestart pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 3 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}
		else
		{
			RSCountdownHold = true;
			goto step9;
		}

	step5:
		if (CountdownTime >= SRB_IGN_ARM_TIME)
		{
			pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_SRM_IGNITION_ARM );
			//oapiWriteLog( "RSLS: SRM IGNITION ARM" );
			pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_T0_UMB_RELEASE_ARM );
			//oapiWriteLog( "RSLS: T0 UMB ARM" );
			goto step6;
		}
		else goto step9;

	step6:
		if (CountdownTime >= SRB_PIC_VOLTS_CK_TIME)
		{
			if (0)// TODO any srb ign pic volt low or comm fault
			{
				if (0)// TODO 1st pass flag false
				{
					if (0)// TODO lh srb ign pic cap a volt low or comm fault
					{
						// TODO issue lh srb ign pic cap a hold
					}
					else if (0)// TODO lh srb ign pic cap b volt low or comm fault
					{
						// TODO issue lh srb ign pic cap b hold
					}
					else if (0)// TODO rh srb ign pic cap a volt low or comm fault
					{
						// TODO issue rh srb ign pic cap a hold
					}
					else
					{
						// TODO issue rh srb ign pic cap b hold
					}
					goto step7;
				}
				else
				{
					// TODO set 1st pass flag false
					goto step6a;
				}
			}
			else
			{
				// TODO set 1st pass flag true
				goto step6a;
			}
		}
		else goto step9;

	step6a:
		if (0)// TODO flt crit mdm channel fail
		{
			RSCountdownHold = true;
			goto step7;
		}
		else goto step8;

	step7:
		if (EngStartCmdIssued)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// to umb release arm flag

			// TODO issue:
			// cmd ssme's to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}
		else
		{
			RSCountdownHold = true;
			goto step9;
		}

	step8:
		if (EngStartCmdIssued)
		{
			if (Eng1StartCmdIssued) goto step29;
			else goto step28a;
		}
		else goto step9;

	step9:
		if (LPSCountdownHold || RSCountdownHold)
		{
			if (CountdownTime >= AUTO_RECYCLE_TIME) goto step11_true;
			else
			{
				CountdownClockCounting = false;
				goto step10;
			}
		}
		else goto step12;

	step10:
		if (ResumeCountCommand)
		{
			// TODO clear all rs launch sequence downlist items
			// TODO reset srb rss safe flag
			LPSCountdownHold = false;
			RSCountdownHold = false;
			goto step12;
		}
		else goto step11;

	step11:
		if (RecycleCountCmd) goto step11_true;
		else return;

	step11_true:
		// TODO terminate:
		// srm ign arm flag
		// t0 umb release arm flag

		// TODO issue:
		pMEC_SOP->SetMECMasterResetFlag();
		// srb rss safe flag

		CountdownTime = -540.0;
		CountdownClockCounting = false;
		// TODO re-init rsls
		return;

	step12:
		if (GMTLOSetCommand)
		{
			// TODO read GMTLO (LPS currently writes it in var GMTLO)
			CountdownTime = (mjd - GMTLO) * 86400.0;
			GMTLOSetCommand = false;
			CountdownClockCounting = true;
		}
		else CountdownTime = (mjd - GMTLO) * 86400.0;
		goto step16b;

	step13:
		if (CountdownTime >= LPS_GO_FOR_AUTO_SEQ_TIME)
		{
			if (LPSGoForAutoSequenceStart)
			{
				// TODO set indicator event 6 rs auto seq start
				goto step14;
			}
			else
			{
				LPSGoForAutoSeqStartHold = true;
				RSCountdownHold = true;
				return;
			}
		}
		else return;

	step14:
		/*if (CountdownTime >= OUTBD_FILL_VALVES_CLOSE_TIME)
		{
			// TODO issue:
			// mps lo2 otbd fill vlv cl cmd
			// mps lh2 otbd fill vlv cl cmd

			// TODO terminate:
			// mps lo2 outboard fill valve open cmd
			// mps lh2 outboard fill valve open cmd
		}*/
		goto step15;

	step15:
		if (CountdownTime >= IMU_TO_INERTIAL_TIME)
		{
			// TODO issue cmd imu to inertial flag
		}
		goto step16;

	step16:
		if (CountdownTime >= OPEN_LO2_ACC_RECIRC_VLV_TIME)
		{
			// TODO terminate mps lo2 acc recirc vlv 1 cl cmd b
			pIO_Control->SetCommand( LOX_POGO_RECIRC_1, false );
			// TODO terminate mps lo2 acc recirc vlv 2 cl cmd b
			pIO_Control->SetCommand( LOX_POGO_RECIRC_2, false );
		}
		goto step16a;

	step16a:
		if (CountdownTime >= NAV_INITIALIZATION_TIME)
		{
			if (firstpass_step16a)
			{
				firstpass_step16a = false;
				// TODO issue init nav flag
				pSSME_SOP->SetThrottlePercent( 100 );
				oapiWriteLog( "RSLS: Initialize MEs throttle to 100%" );
			}
		}
		goto step17;

	step16b:
		if (CountdownTime >= CONFIG_VENT_DOORS_FOR_LCH_TIME)
		{
			// TODO issue configure vent doors for launch cmd
		}
		goto step13;

	step17:
		if (CountdownTime >= CHECK_MPS_VALVE_POS_TIME)
		{
			if (FlagA) goto step20;
			else
			{
				if (0)// TODO any comm faults
				{
					CounterA++;
					if (CounterA < 2) return;
					else
					{
						RSCountdownHold = true;
						return;
					}
				}
				else goto step17a;
			}
		}
		else goto step20;

	step17a:
		/*if (0) goto step18;// TODO mps lh2 outboard fill vlv closed
		else if (0) goto step18;// TODO lps bypass of lh2 otbd vlv closed
		else
		{
			CounterA++;
			if (CounterA < 2) return;
			else
			{
				// TODO issue mps lh2 outboard fill vlv hold
				RSCountdownHold = true;
				return;
			}
		}*/
		goto step18;

	step18:
		/*if (0) goto step19;// TODO mps lox outboard fill vlv closed
		else if (0) goto step19;// TODO lps bypass of lo2 otbd vlv closed
		else
		{
			CounterA++;
			if (CounterA < 2) return;
			else
			{
				// TODO issue mps lo2 otbd fill vlv hold
				RSCountdownHold = true;
				return;
			}
		}*/
		goto step19;

	step19:
		if (PV20_OPInd.IsSet() && PV21_OPInd.IsSet()) goto step19a;
		else if (0) goto step19a;// TODO lps bypass of lo2 accum recirc vlv open
		else
		{
			CounterA++;
			if (CounterA < 2) return;
			else
			{
				MPSLOXAccRecircVlvHold = true;
				RSCountdownHold = true;
				return;
			}
		}

	step19a:
		if (pSSME_SOP->GetEngineReadyModeFlag( 1 ) && pSSME_SOP->GetEngineReadyModeFlag( 2 ) && pSSME_SOP->GetEngineReadyModeFlag( 3 ))
		{
			// TODO op cmds b & c
			pIO_Control->SetCommand( ME1_LH2_PVLV_OP, true );
			pIO_Control->SetCommand( ME2_LH2_PVLV_OP, true );
			pIO_Control->SetCommand( ME3_LH2_PVLV_OP, true );
			
			if (firstpass_step19a)
			{
				firstpass_step19a = false;
				pSSME_SOP->SetStartEnableCommandFlag();
			}

			// TODO cl cmds b & c
			pIO_Control->SetCommand( ME1_LH2_PVLV_CL, false );
			pIO_Control->SetCommand( ME2_LH2_PVLV_CL, false );
			pIO_Control->SetCommand( ME3_LH2_PVLV_CL, false );

			FlagA = true;
			goto step20;
		}
		else
		{
			RSSeqSSMEGoForLaunchHold = true;
			RSCountdownHold = true;
			return;
		}

	step20:
		if (CountdownTime >= CLOSE_LO2_OVBD_BV_TIME)
		{
			// TODO issue mps lo2 overboard b/v close cmds b & c
			pIO_Control->SetCommand( LOX_OVBD_BV, true );
		}
		goto step21;

	step21:
		if (CountdownTime >= CHECK_PRE_VALVES_OPEN_TIME)
		{
			if (PV19_CLInd[0].IsSet() || PV19_CLInd[1].IsSet())
			{
				if (0)// TODO close ind comm fault
				{
					MPSLO2OvbdBVCloseHold = true;
					RSCountdownHold = true;
					return;
				}
				else goto step22;
			}
			else
			{
				MPSLO2OvbdBVCloseHold = true;
				RSCountdownHold = true;
				return;
			}
		}
		else return;

	step22:
		if (PV4_OPInd[0].IsSet() || PV4_OPInd[1].IsSet())
		{
			if (0)// TODO open ind comm fault
			{
				MPSE1LH2PrevlvOpenHold = true;
				RSCountdownHold = true;
				return;
			}
			else goto step23;
		}
		else
		{
			MPSE1LH2PrevlvOpenHold = true;
			RSCountdownHold = true;
			return;
		}

	step23:
		if (PV5_OPInd[0].IsSet() || PV5_OPInd[1].IsSet())
		{
			if (0)// TODO open ind comm fault
			{
				MPSE2LH2PrevlvOpenHold = true;
				RSCountdownHold = true;
				return;
			}
			else goto step24;
		}
		else
		{
			MPSE2LH2PrevlvOpenHold = true;
			RSCountdownHold = true;
			return;
		}

	step24:
		if (PV6_OPInd[0].IsSet() || PV6_OPInd[1].IsSet())
		{
			if (0) // TODO open ind comm fault
			{
				MPSE3LH2PrevlvOpenHold = true;
				RSCountdownHold = true;
				return;
			}
			else goto step25;
		}
		else
		{
			MPSE3LH2PrevlvOpenHold = true;
			RSCountdownHold = true;
			return;
		}

	step25:
		if (0)// TODO any orbiter vent door fail flag set
		{
			if (0) goto step26;// TODO lps override set for each fail flag
			else
			{
				RSCountdownHold = true;
				return;
			}
		}
		else goto step26;

	step26:
		if (pSSME_SOP->GetEngineReadyModeFlag( 1 ) && pSSME_SOP->GetEngineReadyModeFlag( 2 ) && pSSME_SOP->GetEngineReadyModeFlag( 3 )) goto step27;
		else
		{
			RSSeqSSMEGoForLaunchHold = true;
			RSCountdownHold = true;
			return;
		}

	step27:
		if (LPSGoForEngineStart) goto step28;
		else
		{
			LPSGoForEngineStartHold = true;
			RSCountdownHold = true;
			return;
		}

	step28:
		if (CountdownTime >= START_SSMES_TIME)
		{
			// TODO issue:
			// mps tvc servo ovrd cmd
			EngStartCmdIssued = true;
			Eng3StartCmdIssued = true;
			pSSME_SOP->SetEngineStartCommandFlag( 3 );
			oapiWriteLog( "RSLS: ME-3 Ignition Command" );

			EngStartTimer = simT;
			SRBIgnitionTimer = simT + SRB_IGN_TIME_DELAY;

			// TODO start:
			// frf cut off time delay
			// flt cntl tvc init time delay
			// frf throttle to 92% delay
			// frf throttle to 100% delay
			EngTimerThrustOK = simT + ENG_TIMER_FOR_THRUST_OK;
		}
		return;

	step28a:
		if ((simT - EngStartTimer) >= 0.12)
		{
			if (!Eng2StartCmdIssued)
			{
				pSSME_SOP->SetEngineStartCommandFlag( 2 );
				Eng2StartCmdIssued = true;
				oapiWriteLog( "RSLS: ME-2 Ignition Command" );
			}

			if ((simT - EngStartTimer) >= 0.24)
			{
				if (!Eng1StartCmdIssued)
				{
					pSSME_SOP->SetEngineStartCommandFlag( 1 );
					Eng1StartCmdIssued = true;
					oapiWriteLog( "RSLS: ME-1 Ignition Command" );
				}
			}
		}
		goto step29;

	step29:
		if (pSSME_SOP->GetShutdownPhaseFlag( 1 ) || pSSME_SOP->GetShutdownPhaseFlag( 2 ) || pSSME_SOP->GetShutdownPhaseFlag( 3 ) ||
			pSSME_SOP->GetPostShutdownPhaseFlag( 1 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 2 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 3 ))
		{
			// TODO terminate prep ssmes for liftoff flag

			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			RSCountdownHold = true;

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			goto step30;
		}
		else goto step37;

	step30:
		if (pSSME_SOP->GetShutdownPhaseFlag( 1 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 1 ))
		{
			if (ME1LOXPrevalveCloseDelayTimer == -1.0) ME1LOXPrevalveCloseDelayTimer = simT + ME1_LOX_PREVALVE_CLOSE_DELAY;
			
			if (simT >= ME1LOXPrevalveCloseDelayTimer) goto step30a;
			else goto step31;
		}
		else goto step31;

	step30a:
		// TODO issue mps e-1 lo2 prevalve cl cmd c
		pIO_Control->SetCommand( ME1_LOX_PVLV_CL_A, true );
		pIO_Control->SetCommand( ME1_LOX_PVLV_CL_B, true );
		// TODO terminate mps e-1 lo2 prevalve op cmd c
		pIO_Control->SetCommand( ME1_LOX_PVLV_OP_A, false );
		pIO_Control->SetCommand( ME1_LOX_PVLV_OP_B, false );

		if (ME1LH2PrevalveCloseDelayTimer == -1.0) ME1LH2PrevalveCloseDelayTimer = simT + ME1_LH2_PREVALVE_CLOSE_TIME_DELAY;

		if (simT >= ME1LH2PrevalveCloseDelayTimer)
		{
			// TODO issue mps e-1 lh2 prevalve cl cmds b & c
			pIO_Control->SetCommand( ME1_LH2_PVLV_CL, true );
			// TODO terminate mps e-1 lh2 prevalve op cmds b & c
			pIO_Control->SetCommand( ME1_LH2_PVLV_OP, false );
			ME1PrevalvesCmddClosed = true;
		}
		goto step31;

	step31:
		if (pSSME_SOP->GetShutdownPhaseFlag( 2 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 2 ))
		{
			if (ME2LOXPrevalveCloseDelayTimer == -1.0) ME2LOXPrevalveCloseDelayTimer = simT + ME2_LOX_PREVALVE_CLOSE_DELAY;

			if (simT >= ME2LOXPrevalveCloseDelayTimer) goto step31a;
			else goto step32;
		}
		else goto step32;

	step31a:
		// TODO issue mps e-2 lo2 prevalve cl cmd c
		pIO_Control->SetCommand( ME2_LOX_PVLV_CL_A, true );
		pIO_Control->SetCommand( ME2_LOX_PVLV_CL_B, true );
		// TODO terminate mps e-2 lo2 prevalve op cmd c
		pIO_Control->SetCommand( ME2_LOX_PVLV_OP_A, false );
		pIO_Control->SetCommand( ME2_LOX_PVLV_OP_B, false );

		if (ME2LH2PrevalveCloseDelayTimer == -1.0) ME2LH2PrevalveCloseDelayTimer = simT + ME2_LH2_PREVALVE_CLOSE_TIME_DELAY;

		if (simT >= ME2LH2PrevalveCloseDelayTimer)
		{
			// TODO issue mps e-2 lh2 prevalve cl cmds b c
			pIO_Control->SetCommand( ME2_LH2_PVLV_CL, true );
			// TODO terminate mps e-2 lh2 prevalve op cmds b & c
			pIO_Control->SetCommand( ME2_LH2_PVLV_OP, false );
			ME2PrevalvesCmddClosed = true;
		}
		goto step32;

	step32:
		if (pSSME_SOP->GetShutdownPhaseFlag( 3 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 3 ))
		{
			if (ME3LOXPrevalveCloseDelayTimer == -1.0) ME3LOXPrevalveCloseDelayTimer = simT + ME3_LOX_PREVALVE_CLOSE_DELAY;

			if (simT >= ME3LOXPrevalveCloseDelayTimer) goto step32a;
			else goto step33;
		}
		else goto step33;

	step32a:
		// TODO issue mps e-3 lo2 prevalve cl cmd c
		pIO_Control->SetCommand( ME3_LOX_PVLV_CL_A, true );
		pIO_Control->SetCommand( ME3_LOX_PVLV_CL_B, true );
		// TODO terminate mps e-3 lo2 prevalve op cmd c
		pIO_Control->SetCommand( ME3_LOX_PVLV_OP_A, false );
		pIO_Control->SetCommand( ME3_LOX_PVLV_OP_B, false );

		if (ME3LH2PrevalveCloseDelayTimer == -1.0) ME3LH2PrevalveCloseDelayTimer = simT + ME3_LH2_PREVALVE_CLOSE_TIME_DELAY;

		if (simT >= ME3LH2PrevalveCloseDelayTimer)
		{
			// TODO issue mps e-3 lh2 prevalve cl cmds b & c
			pIO_Control->SetCommand( ME3_LH2_PVLV_CL, true );
			// TODO terminate mps e-3 lh2 prevalve op cmds b & c
			pIO_Control->SetCommand( ME3_LH2_PVLV_OP, false );
			ME3PrevalvesCmddClosed = true;
		}
		goto step33;

	step33:
		if (LaunchSequenceAbort)
		{
			if (EngShutdownTimer == -1.0) EngShutdownTimer = simT;

			if ((simT - EngShutdownTimer) >= 1.8)
			{
				if (ShtdnEnableCmdsIssued)
				{
					ShtdnEnableCmdsIssued = false;
					pSSME_SOP->ResetShutdownEnableCommandFlag( 1 );
					pSSME_SOP->ResetShutdownEnableCommandFlag( 2 );
					pSSME_SOP->ResetShutdownEnableCommandFlag( 3 );
					pSSME_SOP->SetShutdownCommandFlag( 1 );
					pSSME_SOP->SetShutdownCommandFlag( 2 );
					pSSME_SOP->SetShutdownCommandFlag( 3 );
				}
				else
				{
					ShtdnEnableCmdsIssued = true;
					pSSME_SOP->ResetShutdownCommandFlag( 1 );
					pSSME_SOP->ResetShutdownCommandFlag( 2 );
					pSSME_SOP->ResetShutdownCommandFlag( 3 );
					pSSME_SOP->SetShutdownEnableCommandFlag( 1 );
					pSSME_SOP->SetShutdownEnableCommandFlag( 2 );
					pSSME_SOP->SetShutdownEnableCommandFlag( 3 );
				}
				goto step34;
			}
			else return;
		}
		else return;

	step34:
		if (firstpass_step34)
		{
			firstpass_step34 = false;
			AllEngShutdownTimer = simT + VERIFY_ALL_ENG_SHUTDOWN_TIMER;
			return;
		}
		else goto step35;

	step35:
		if ((pSSME_SOP->GetShutdownPhaseFlag( 1 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 1 )) &&
			(pSSME_SOP->GetShutdownPhaseFlag( 2 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 2 )) &&
			(pSSME_SOP->GetShutdownPhaseFlag( 3 ) || pSSME_SOP->GetPostShutdownPhaseFlag( 3 ))) goto step36;
		else if (simT >= AllEngShutdownTimer)
		{
			EngineShutdownVerificationHold = true;
			RSCountdownHold = true;
			Active = false;
			return;
		}
		else return;

	step36:
		if (ME1PrevalvesCmddClosed && ME2PrevalvesCmddClosed && ME3PrevalvesCmddClosed)
		{
			Active = false;
			return;
		}
		else return;

	step37:
		if (LPSCountdownHold)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}
		else goto step37a;

	step37a:
		if ((pSSME_SOP->GetPercentChamberPressVal( 1 ) > ALL_ENG_PERCENT_CH_PRESS_CHECK) && (pSSME_SOP->GetPercentChamberPressVal( 2 ) > ALL_ENG_PERCENT_CH_PRESS_CHECK) && (pSSME_SOP->GetPercentChamberPressVal( 3 ) > ALL_ENG_PERCENT_CH_PRESS_CHECK))
		{
			// TODO terminate mps tvc servo ovrd cmd
			// TODO issue prep ssmes for liftoff flag

			pATVC_SOP->SetSSMEActPos( 2, LAUNCHCONFIG_2P, LAUNCHCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, LAUNCHCONFIG_3P, LAUNCHCONFIG_3Y );

			pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_SRM_IGNITION_FIRE_1 );
			//oapiWriteLog( "RSLS: SRM IGNITION FIRE 1" );
			pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_T0_UMB_RELEASE_FIRE_1 );
			//oapiWriteLog( "RSLS: T0 UMB FIRE 1" );
			goto step37b;
		}
		else goto step38;

	step37b:
		if (0)// TODO any comm faults
		{
			if (0)// TODO comm fault first pass flag E true
			{
				// TODO set comm fault first pass flag E false
				goto step38;
			}
			else
			{
				// TODO terminate:
				// prep ssmes for liftoff flag
				// srm ign arm flag
				// t0 umb release arm flag
			
				// TODO issue:
				// cmd ssmes to pre-start pos flag
				// mps slew comp flag
				// mps tvc servo ovrd cmd
				pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

				pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
				pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
				return;
			}
		}
		else
		{
			// TODO set comm fault first pass flag E true
			goto step42;
		}

	step38:
		if (pSSME_SOP->GetPercentChamberPressVal( 1 ) > ENG_PERCENT_CH_PRESS_FOR_GO) goto step39;
		else if (simT >= EngTimerThrustOK)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
		}
		return;

	step39:
		if (pSSME_SOP->GetPercentChamberPressVal( 2 ) > ENG_PERCENT_CH_PRESS_FOR_GO) goto step40;
		else if (simT >= EngTimerThrustOK)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 2 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
		}
		return;

	step40:
		if (pSSME_SOP->GetPercentChamberPressVal( 3 ) > ENG_PERCENT_CH_PRESS_FOR_GO) goto step41c;
		else if (simT >= EngTimerThrustOK)
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 3 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
		}
		return;

	step41:
		if (simT >= SRBIgnitionTimer) goto step41a;
		else return;

	step41a:
		if (FRF_TEST_FLAG)
		{
			if (0)// TODO frf c/o time delay > 22.0 secs
			{
				// TODO terminate:
				// prep ssmes for liftoff flag
				// srm ign arm flag
				// t0 umb release arm flag
			
				// TODO issue:
				// cmd ssmes to pre-start pos flag
				// mps slew comp flag
				pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

				pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
				pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
				return;
			}
			else goto step41f;
		}
		else goto step41b;

	step41b:
		// TODO issue:
		// srm ign fire 3 flag
		// terminate lps polling flag
		// mode control met reset cmd
		// read gmt & store flag
		// event timer start flag
		// mps tvc servo ovrd cmd
		pMEC_SOP->SetLaunchSequencerFlag( MECSOP_LAUNCH_SRM_IGNITION_FIRE_2 );
		SRBIgnitionCommand = true;
		oapiWriteLog( "RSLS: SRM IGNITION FIRE 2" );
		SetMajorMode( 102 );// here?
		STS()->pMTU->StartMET();
		return;

	step41c:
		if (0) goto step41;// TODO fascos inh
		else if (0)// TODO me-1 fascos lim exceeded
		{
			if (0)// TODO counter1 < 3
			{
				// TODO set counter2 and counter3 to 0, and counter1++
				goto step41d;
			}
			else
			{
				// TODO terminate:
				// prep ssmes for liftoff flag
				// srm ign arm flag
				// t0 umb release arm flag
			
				// TODO issue:
				// cmd ssmes to pre-start pos flag
				// mps slew comp flag
				// mps tvc servo ovrd cmd
				pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

				pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
				pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
				return;
			}
		}
		else
		{
			// TODO set counter1 to 0
			goto step41d;
		}

	step41d:
		if (0)// TODO me-2 fascos lim exceeded
		{
			if (0)// TODO counter2 < 3
			{
				// TODO set counter1 and counter3 to 0, and counter2++
				goto step41e;
			}
			else
			{
				// TODO terminate:
				// prep ssmes for liftoff flag
				// srm ign arm flag
				// t0 umb release arm flag
			
				// TODO issue:
				// cmd ssmes to pre-start pos flag
				// mps slew comp flag
				// mps tvc servo ovrd cmd
				pSSME_SOP->SetShutdownEnableCommandFlag( 2 );

				pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
				pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
				return;
			}
		}
		else
		{
			// TODO set counter2 to 0
			goto step41e;
		}

	step41e:
		if (0)// TODO me-3 fascos lim exceeded
		{
			if (0)// TODO counter3 < 3
			{
				// TODO set counter1 and counter2 to 0, and counter3++
				goto step41;
			}
			else
			{
				// TODO terminate:
				// prep ssmes for liftoff flag
				// srm ign arm flag
				// t0 umb release arm flag
			
				// TODO issue:
				// cmd ssmes to pre-start pos flag
				// mps slew comp flag
				// mps tvc servo ovrd cmd
				pSSME_SOP->SetShutdownEnableCommandFlag( 3 );

				pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
				pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
				return;
			}
		}
		else
		{
			// TODO set counter3 to 0
			goto step41;
		}

	step41f:
		if (0)// TODO 1st pass
		{
			// TODO issue srm ign fire 1 & 2 flags
			return;
		}
		
		if (0)// TODO 1st pass
		{
			// TODO terminate srn ign fire 1 & 2 flags
			// TODO issue t0 umb release fire 1 & 2 flags
			return;
		}
		else goto step41g;

	step41g:
		if (0)// TODO flt cntl tvc init time = 7.0 sec
		{
			if (0)// TODO 1st pass
			{
				// TODO issue mps gimbal slew check indicator
				return;
			}
			else goto step41h;
		}
		else goto step41h;

	step41h:
		if (0)// TODO frf throttle to 92% time = 18.4 secs
		{
			if (0)// TODO 1st pass
			{
				// TODO issue:
				// k-cmd (92%)
				// mps gimbal slew check indicator
				return;
			}
			else goto step41i;
		}
		else goto step41i;

	step41i:
		if (0)// TODO frf throttle to 100% time = 20.2 secs
		{
			// TODO issue k-cmd (100%)
		}
		return;

	step42:
		if (1)// TODO me-1 actuator ports ok
		{
			// TODO set me-1 act port first pass flag X true
			goto step43;
		}
		else if (0)// TODO me-1 act port fail first pass flag X true
		{
			// TODO set me-1 act port fail first pass flag X false
			goto step43;
		}
		else
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 1 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}

	step43:
		if (1)// TODO me-2 actuator ports ok
		{
			// TODO set me-2 act port first pass flag X true
			goto step44;
		}
		else if (0)// TODO me-2 act port fail first pass flag X true
		{
			// TODO set me-2 act port fail first pass flag X false
			goto step44;
		}
		else
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 2 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}

	step44:
		if (1)// TODO me-3 actuator ports ok
		{
			// TODO set me-3 act port first pass flag X true
			goto step38;
		}
		else if (0)// TODO me-3 act port fail first pass flag X true
		{
			// TODO set me-3 act port fail first pass flag X false
			goto step38;
		}
		else
		{
			// TODO terminate:
			// prep ssmes for liftoff flag
			// srm ign arm flag
			// t0 umb release arm flag
			
			// TODO issue:
			// cmd ssmes to pre-start pos flag
			// mps slew comp flag
			// mps tvc servo ovrd cmd
			pSSME_SOP->SetShutdownEnableCommandFlag( 3 );

			pATVC_SOP->SetSSMEActPos( 2, STARTCONFIG_2P, STARTCONFIG_2Y );
			pATVC_SOP->SetSSMEActPos( 3, STARTCONFIG_3P, STARTCONFIG_3Y );
			return;
		}

		return;
	}
Other than the changes indicated at the start of the function, it follows the flow chart very explicitly, and it works as advertised making the vehicle go on its way.
This should be able to do a FRF, but I haven't tested it yet. Holds and cutoffs work, but I still need to play more with them.
For most cutoffs, a specific flag indicating the problem is set in the RSLS (don't ask me why some don't have flags). I'm thinking about having the LCC ask for those flags when the RSLS finds a problem, (the RSLS could "condense" them into an int) to show the appropriate message in the LCC MFD.
The RSLS interaction with the MEC SOP needs some work, that depends on me improving the MEC side of things. Currently the major question is "How do I remove a critical command without a Master Reset?". I also need to add the Fire 3 commands that "enable" the Fire 2 ones. But all of that can wait for a later commit, as this one is already large.
SSME gimballing is another issue: there appear to be maybe 3 or 4 TVC related SOPs, but without info on them I can't tell "which does what when". So for now the ATVC is called directly, as before, to do the work.
 

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Changes are now committed! About the LCC MFD, the operation is simple: on the right side the buttons control manual holds, gray means unavailable, green means no hold, red means hold inserted. On the left, at the top is the resume button, to resume from holds, and at the bottom is the cutoff button to stop the show in the last 31s (no return from that one). Currently the recycle button does nothing as I haven't done that part yet (need to stop the clock at T-9 minutes). In the center the clock and T0 time are displayed, as well as an indication of hold or clock resuming. Anyone wants to write something about it for the manual? :p
Only the last 9 minutes "are done", and before that the clock counts "linearly", without any holds. I still haven't added hold info to the display.

If you mess up after SSME ignition (LCC manual cutoff or panel O17 EIU switches are an easy way to do it ;)), the Firex will be started... well, at least the main of the 3 Firex systems. :shifty:

About the scenario changes for the ground vessels, the new parameters are detailed in the manual.
 

GLS

Well-known member
Orbiter Contributor
Addon Developer
Joined
Mar 22, 2008
Messages
5,925
Reaction score
2,936
Points
188
Website
github.com
Any news either on pad or vc developments from the graphics department?
 

DaveS

Addon Developer
Addon Developer
Donator
Beta Tester
Joined
Feb 4, 2008
Messages
9,434
Reaction score
689
Points
203
Any news either on pad or vc developments from the graphics department?
The pad has been put on hold for the moment while I finish the new properly sized orbiter. The main hold with it is the OMS pod due to their texture mapping difficulty.
 

Urwumpe

Not funny anymore
Addon Developer
Donator
Joined
Feb 6, 2008
Messages
37,626
Reaction score
2,344
Points
203
Location
Wolfsburg
Preferred Pronouns
Sire
I want to compile ssu with VS2017 what should i choose community or professional ?

Contrary to previous versions, there is little you gain by using professional in 2017 regarding Orbiter. There had been some professional modules in past versions that had been interesting for Orbiter, but now you won't miss them.

If you are willed to take a little more pain, there is also VS Code.
 

Urwumpe

Not funny anymore
Addon Developer
Donator
Joined
Feb 6, 2008
Messages
37,626
Reaction score
2,344
Points
203
Location
Wolfsburg
Preferred Pronouns
Sire
ok thank you Urwumpe for suggestion i'll try compile SSU in professional

I'll assume you got it legally for academic purposes via the Dreamspark program of your university. :lol:
 
Status
Not open for further replies.
Top