From f79382608dd5a050deba9cc613143aa3e6228966 Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 27 Jun 2025 11:05:24 -0600 Subject: [PATCH 1/2] Update LM radar self test behavior to better reflect procedures --- .../ProjectApollo/src_lm/lemsystems.cpp | 41 ++++-- .../samples/ProjectApollo/src_lm/lm_lr.cpp | 111 +++++++++++----- .../samples/ProjectApollo/src_lm/lm_lr.h | 4 + .../samples/ProjectApollo/src_lm/lm_rr.cpp | 124 ++++++++++++++---- .../samples/ProjectApollo/src_lm/lm_rr.h | 2 + 5 files changed, 216 insertions(+), 66 deletions(-) diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp index eca1ba60e6..fc656509f5 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp @@ -2479,6 +2479,8 @@ void LEM::CreateMissionSpecificSystems() aeaa = new LEM_AEAA(); } EventTimerDisplay.SetReverseAtZero(pMission->IsLMEventTimerReversingAtZero()); + LR.SelfTest(pMission->GetLMNumber()); + RR.SelfTest(pMission->GetLMNumber()); } // SYSTEMS COMPONENTS @@ -2580,24 +2582,38 @@ bool LEM_RadarTape::TimingFailure() return false; } - void LEM_RadarTape::Timestep(double simdt) { - + if (!IsPowered()) { return; } - - if( lem->AltRngMonSwitch.GetState()==TOGGLESWITCH_UP ) { - setRange(lem->RR.GetRadarRange()); - setRate(lem->RR.GetRadarRate()); - } + + if (lem->AltRngMonSwitch.GetState()==TOGGLESWITCH_UP) { + if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_UP) + { + setRange(lem->RR.GetRadarRange()); + setRate(lem->RR.GetRadarRate() - 0.6096); // 2 f/s bias from procedures (TM=R2-2) + } + else + { + setRange(lem->RR.GetRadarRange()); + setRate(lem->RR.GetRadarRate()); + } + } else { if (lem->ModeSelSwitch.IsUp()) // LR { if (lem->LR.IsRangeDataGood()) { - setRange(lem->LR.GetAltitude()); + if (lem->LR.antennaAngle == 0) + { + setRange(lem->LR.GetAltitude() * cos(Radians(15))); // Tapemeter slant range bias of cos 15 deg in position 2 + } + else + { + setRange(lem->LR.GetAltitude()); // Position 1 + } } else { @@ -2605,7 +2621,14 @@ void LEM_RadarTape::Timestep(double simdt) { } if (lem->LR.IsVelocityDataGood()) { - setRate(lem->LR.GetAltitudeRate()); + if ((lem->pMission->GetLMNumber()) == 3) + { + setRate(lem->LR.GetAltitudeRate() * 1.82388664); // Generates seen rate signal from LM-3 \\FIXME: This is a hack, need to investigate why LM-3 generates this rate signal + } + else + { + setRate(lem->LR.GetAltitudeRate()); + } } /*else { diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.cpp index aeaf11ea02..34f97482d4 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.cpp @@ -39,6 +39,13 @@ LEM_LR::LEM_LR() lrheat = 0; antennaAngle = 24; // Position 1 + //LM-5 Defaults + rangetest = 8287; + ratetest[0] = -494; + ratetest[1] = 1861; + ratetest[2] = 1331; + altxmtr = 3.5; + velxmtr = 3.6; } void LEM_LR::Init(LEM *s, e_object *dc_src, h_Radiator *ant, Boiler *anheat, h_HeatLoad *hl) { @@ -128,7 +135,7 @@ double LEM_LR::GetAltTransmitterPower() return 0; } - return 3.0; + return altxmtr; } double LEM_LR::GetVelTransmitterPower() @@ -138,11 +145,11 @@ double LEM_LR::GetVelTransmitterPower() return 0; } - return 3.0; + return velxmtr; } void LEM_LR::Timestep(double simdt) { - + if (lem == NULL) { return; } //LR Mesh Animation if (lem->stage < 2) { @@ -250,35 +257,14 @@ void LEM_LR::Timestep(double simdt) { } // Data Determination - if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_DOWN) { - if (antennaAngle == 0) { - // Test Mode POS 2 - // Drive to: - // - // - // - // - range = 8000; - rate[0] = -494; - rate[1] = 1861; - rate[2] = 1331; - rangeGood = 1; - velocityGood = 1; - } - else { - // Test Mode - // Drive to: - // Alt 8287 ft - // Vel -494,1861,1331 ft/sec - // on the LGC - // For some reason this should show up as 8000 ft and -480 fps on the alt/alt-rate monitor? - range = 8287; - rate[0] = -494; - rate[1] = 1861; - rate[2] = 1331; - rangeGood = 1; - velocityGood = 1; - } + if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_DOWN) + { + range = rangetest; + rate[0] = ratetest[0]; + rate[1] = ratetest[1]; + rate[2] = ratetest[2]; + rangeGood = 1; + velocityGood = 1; } else { // Operate Mode @@ -402,6 +388,67 @@ void LEM_LR::SystemTimestep(double simdt) } } +void LEM_LR::SelfTest(int LMNumber) +{ + switch (LMNumber) + { + case 3: //LM-3 + { + rangetest = 8287; + ratetest[0] = -247; + ratetest[1] = 930; + ratetest[2] = 666; + altxmtr = 3.6; + velxmtr = 3.8; + } + break; + case 4: //LM-4 + { + rangetest = 8276; + ratetest[0] = -247; + ratetest[1] = -929; + ratetest[2] = 665; + altxmtr = 3.6; + velxmtr = 3.6; + } + break; + case 5: //LM-5 + { + rangetest = 8275; + ratetest[0] = -494; + ratetest[1] = 1858; + ratetest[2] = 1329; + altxmtr = 3.5; + velxmtr = 3.6; + } + break; + case 6: //LM-6 + case 7: //LM-7 + case 8: //LM-8 + case 11: //LM-11 + case 12: //LM-12 + { + rangetest = 8286; + ratetest[0] = -495; + ratetest[1] = 1862; + ratetest[2] = 1331; + altxmtr = 3.5; + velxmtr = 3.6; + } + break; + case 10: //LM-10 + { + rangetest = 8287; + ratetest[0] = -495; + ratetest[1] = 1862; + ratetest[2] = 1331; + altxmtr = 3.5; + velxmtr = 3.6; + } + break; + } +} + void LEM_LR::DefineAnimations(UINT idx) { //LR Mode Animation diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.h b/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.h index 040da6aaeb..831e185c76 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.h +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lm_lr.h @@ -47,6 +47,7 @@ class LEM_LR : public e_object { void DeleteAnimations(); bool IsPowered(); + void SelfTest(int LMNumber); LEM* lem; // Pointer at LEM h_Radiator* antenna; // Antenna (loses heat into space) @@ -61,4 +62,7 @@ class LEM_LR : public e_object { UINT anim_LR; // LR Animation double lr_proc; // LR Animation State double lr_proc_last; // Previous LR Animation State + +private: + double rangetest, ratetest[3], altxmtr, velxmtr; }; \ No newline at end of file diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.cpp index faaa43116f..391019e389 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.cpp @@ -52,6 +52,11 @@ LEM_RR::LEM_RR() rr_proc[1] = 0.0; rr_proc_last[0] = 0.0; rr_proc_last[1] = 0.0; + + ratetest = -152.4; // 500 feet per second in meters per second + rangetest = 362066; // 195.5 nautical miles in meters + rdrxmtr = 3.7; // Transmitter power + } LEM_RR::~LEM_RR() @@ -109,7 +114,7 @@ void LEM_RR::Init(LEM *s, e_object *dc_src, e_object *ac_src, h_Radiator *ant, B RangeLockTimer = 0.0; tstime = 0.0; - for (int i = 0;i < 4;i++) + for (int i = 0; i < 4; i++) { SignalStrengthQuadrant[i] = 0.0; U_RRL[i] = _V(0.0, 0.0, 0.0); @@ -183,7 +188,7 @@ double LEM_RR::GetTransmitterPower() return 0; } - return 3.7; + return rdrxmtr; } @@ -216,7 +221,7 @@ double LEM_RR::dBm2SignalStrength(double RecvdRRPower_dBm) SignalStrengthRCVD = 0; } } - + return SignalStrengthRCVD; } @@ -314,11 +319,10 @@ void LEM_RR::Timestep(double simdt) { //double trunnionTarget = 0, shaftTarget = 0; // TEST MODE: // NO TRACK light on - // Range Rate to -500 FPS, // Shaft/Trunnion varies between +/- 5 degrees (at 0.015 d/s) - // After 12 seconds, Range to 195.5nm and NO TRACK light out - internalrangerate = -152.4; - internalrange = 362066; // 195.5 nautical miles in meters + // After 12 seconds,NO TRACK light out + internalrangerate = ratetest; + internalrange = rangetest; //Square wave tstime += simdt; @@ -363,11 +367,11 @@ void LEM_RR::Timestep(double simdt) { double RecvdRRPower, RecvdRRPower_dBm, SignalStrengthScaleFactor; double anginc = 0.1*RAD; - + if (!csm) { csm = lem->agc.GetCSM(); } - + if (csm) { @@ -375,7 +379,7 @@ void LEM_RR::Timestep(double simdt) { //need a better solution for multiple CSMs/LEMs in the same sceneriao if (!(lem->lm_rr_to_csm_connector.connectedTo)) { - lem->lm_rr_to_csm_connector.ConnectTo(GetVesselConnector(csm,VIRTUAL_CONNECTOR_PORT,RADAR_RF_SIGNAL)); + lem->lm_rr_to_csm_connector.ConnectTo(GetVesselConnector(csm, VIRTUAL_CONNECTOR_PORT, RADAR_RF_SIGNAL)); } //Global position of Earth, Moon and spacecraft, spacecraft rotation matrix from local to global @@ -385,7 +389,7 @@ void LEM_RR::Timestep(double simdt) { //oapiGetGlobalPos(hMoon, &R_M); lem->GetRotationMatrix(LMRot); csm->GetRotationMatrix(CSMRot); - + //Vector pointing from LM to CSM R = CSMPos - LMPos; @@ -409,7 +413,7 @@ void LEM_RR::Timestep(double simdt) { //sprintf(oapiDebugString(), "ReturnedPower: %lf", RecvdRRPower_dBm); //In LM navigation base coordinates, left handed - for (int i = 0;i < 4;i++) + for (int i = 0; i < 4; i++) { U_RRL[i] = _V(U_RRL[i].y, U_RRL[i].x, U_RRL[i].z); @@ -558,20 +562,20 @@ void LEM_RR::Timestep(double simdt) { //if(lem->RadarTestSwitch.GetState() != THREEPOSSWITCH_UP){ sprintf(oapiDebugString(),"RR SLEW: SHAFT %f TRUNNION %f",shaftAngle*DEG,trunnionAngle*DEG); } break; case 2: // AGC - { - int pulses; + { + int pulses; - pulses = lem->scdu.GetErrorCounter(); + pulses = lem->scdu.GetErrorCounter(); - shaftVel = (RR_SHAFT_STEP*pulses); - shaftAngle += (RR_SHAFT_STEP*pulses)*simdt; + shaftVel = (RR_SHAFT_STEP*pulses); + shaftAngle += (RR_SHAFT_STEP*pulses)*simdt; - pulses = lem->tcdu.GetErrorCounter(); + pulses = lem->tcdu.GetErrorCounter(); - trunnionVel = (RR_SHAFT_STEP*pulses); - trunnionAngle += (RR_SHAFT_STEP*pulses)*simdt; - } - break; + trunnionVel = (RR_SHAFT_STEP*pulses); + trunnionAngle += (RR_SHAFT_STEP*pulses)*simdt; + } + break; } } @@ -725,7 +729,7 @@ void LEM_RR::SystemTimestep(double simdt) { if (abs(shaftVel) > 0.01*RAD) { ac_source->DrawPower(13.8); - rrheat->GenerateHeat(13.8); + rrheat->GenerateHeat(13.8); } if (abs(trunnionVel) > 0.01*RAD) @@ -733,7 +737,77 @@ void LEM_RR::SystemTimestep(double simdt) { ac_source->DrawPower(13.8); rrheat->GenerateHeat(13.8); } - + +} + +void LEM_RR::SelfTest(int LMNumber) +{ + switch (LMNumber) + { + case 3: //LM-3 + { + rangetest = 362454.9; + ratetest = -150.876; + rdrxmtr = 3.1; + } + break; + case 4: //LM-4 + { + rangetest = 361140.0; + ratetest = -148.742; + rdrxmtr = 2.9; + } + break; + case 5: //LM-5 + { + rangetest = 362399.4; + ratetest = -149.047; + rdrxmtr = 2.6; + } + break; + case 6: //LM-6 + { + rangetest = 362066.0; + ratetest = -153.01; + rdrxmtr = 3.7; + } + break; + case 7: //LM-7 + { + rangetest = 362232.7; + ratetest = -151.181; + rdrxmtr = 2.4; + } + break; + case 8: //LM-8 + { + rangetest = 362251.2; + ratetest = -152.4; + rdrxmtr = 2.6; + } + break; + case 10: //LM-10 + { + rangetest = 362047.5; + ratetest = -152.4; + rdrxmtr = 3.5; + } + break; + case 11: //LM-11 + { + rangetest = 360917.8; + ratetest = -152.248; + rdrxmtr = 3.0; + } + break; + case 12: //LM-12 + { + rangetest = 361695.6; + ratetest = -149.504; + rdrxmtr = 3.0; + } + break; + } } void LEM_RR::DefineAnimations(UINT idx) { @@ -777,7 +851,7 @@ void LEM_RR::SaveState(FILEHANDLE scn, char *start_str, char *end_str) { papiWriteScenario_double(scn, "RR_RCVDPOW", RCVDpow); papiWriteScenario_double(scn, "RR_RCVDGAIN", RCVDgain); papiWriteScenario_double(scn, "RR_RCVDPHASE", RCVDPhase); - oapiWriteLine(scn, end_str); + oapiWriteLine(scn, end_str); } void LEM_RR::LoadState(FILEHANDLE scn, char *end_str) { diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.h b/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.h index fdfd141fa1..8ebb1999cb 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.h +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lm_rr.h @@ -63,6 +63,7 @@ class LEM_RR : public e_object { bool IsFrequencyDataGood() { return FrequencyLock; }; bool IsRadarDataGood() { return radarDataGood; }; bool GetNoTrackSignal() { return NoTrackSignal; } + void SelfTest(int LMNumber); private: VESSEL *csm; @@ -87,6 +88,7 @@ class LEM_RR : public e_object { double rate; double internalrange; double internalrangerate; + double rangetest, ratetest, rdrxmtr; int scratch[2]; // Scratch data int mode; //Mode I = false, Mode II = true double hpbw_factor; //Beamwidth factor From 6983ae5d42d5f602fa408869434ec4b9878b644a Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 30 Jun 2025 10:09:52 -0600 Subject: [PATCH 2/2] 2 fps bias --- Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp index fc656509f5..aba768afcd 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp @@ -2590,7 +2590,12 @@ void LEM_RadarTape::Timestep(double simdt) { } if (lem->AltRngMonSwitch.GetState()==TOGGLESWITCH_UP) { - if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_UP) + if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_UP && lem->RR.GetRadarRate() == 0.0) + { + setRange(lem->RR.GetRadarRange()); + setRate(lem->RR.GetRadarRate()); + } + else if (lem->RadarTestSwitch.GetState() == THREEPOSSWITCH_UP) { setRange(lem->RR.GetRadarRange()); setRate(lem->RR.GetRadarRate() - 0.6096); // 2 f/s bias from procedures (TM=R2-2)